Установка замка при открытой позиции.

 
Помогите решить проблему. Суть такова, при открытой длинной позиции если цена пошла в другом направлении через определённое количество пунктов выставляется ещё одна позиция по ходу цены с большим объёмом . В коде реализовал вот так:
int f;
     int w=0;
     for (f=0;f<OrdersTotal();f++)
         {
         if (!OrderSelect(f,SELECT_BY_POS,MODE_TRADES)) break;
         if (OrderMagicNumber()!=1 || OrderSymbol()!=Symbol()) continue;
         
         if ((OrderType()==OP_BUY) && (Bid< (OrderOpenPrice() - 250*Point)) && w<1) 
            {
             w = w+1;
             OrderSend(Symbol(),OP_SELL,1,Bid,3,Ask+100*Point,Ask-200*Point,"zamok",16384,0,Red);
             
            }
            }
Но проблема в том, что необходимо чтобы в период открытой длинной сделки открывалась лишь одна короткая. А в моём случае их открывается несколько пока открыта длинная позиция. Спасибо.
 

мне кажется нужно реализовать функцию, проверяющую - был ли выставлен замок на эту позицию.


В данном случае мне виднеется простой алгоритм с использованием времени:

за пределы старта:

int timelast;


а то что Вы реализовали

int w=0;

дык он жн всегда равен 0 :-) его надо было тогда хотя бы за пределы старта выносить.


старт:

int f;
     
     for (f=0;f<OrdersTotal();f++)
         {
         if (!OrderSelect(f,SELECT_BY_POS,MODE_TRADES)) break;
         if (OrderMagicNumber()!=1 || OrderSymbol()!=Symbol()) continue;
         
         if ((OrderType()==OP_BUY) && (Bid< (OrderOpenPrice() - 250*Point)) && OrderOpenTime()>timelast && OrderComment()!="zamok") 
            {
             timelast=OrderOpenTime();
            
             OrderSend(Symbol(),OP_SELL,1,Bid,3,Ask+100*Point,Ask-200*Point,"zamok",16384,0,Red);
             
            }
            }
 

введите флаг / признак выставления лока, т.е. выставили flag_lok = true и перед выставление нового ордера проверяйте выставлялся ли лок или нет

сбрасывать это флаг, думаю целесообразно когда закрыты все ордера, ну или как вариант - два флага flag_lok_buy = true или flag_lok_sell = true

 
Или еще вариант: пишем отдельную функцию, в которой находим все ордера с комментарием "zamok", функция возвращает количество открытых сделок с таким коментом (if(StringFind(OrderComment(),"zamok",0)!=-1) number++ например, ну и обычная проверка символа, магика и т.д.) (по желанию можно еще добавить проверку чтобы OrderOpenPrice()>=iTime(Symbol(),Period(),0) )н. После этого в условие открытия лока добавляете if(Наша_Функция()==1), то ордер выставляем.
 

https://www.mql5.com/ru/code/9465 я реализовал такую функцию так...

"новой" позиции присваивается МАГИК равный ТИКЕТУ "первого" ордера....

правда я ставил "новый" ордер на откат и пересчитывал стопы для усреднения.... 

 
В чем проблема не пойму, я указал код, который работает так как надо Топикастеру.
Причина обращения: