Не пойму почему открывает ордер

 
Есть код, в котором isCloseLastPosByTake - определяет закрылся текущий ордер по TP или нет. Проблема в том что как только закрывается один ордер тут же открывается второй и только потом значение y меняется. почему y не успевает поменяться до открытия следующего ордера
  if (OrderSelect(OrdersTotal()-1, SELECT_BY_POS, MODE_TRADES) == true)
            {
               if (OrderType()==OP_SELL)    
               {               
                  if (isCloseLastPosByTake()==true)
                          y=2;
                            
               }
            }

  if ((MA2L_Main_1 < MA2L_Signal_1)&& CountTrades()==0 && y==0 && iOpen(Symbol(),0,0)>iClose(Symbol(),0,0))
 {    
    if(Red_2!=Red_1)
            {
              PreClose= iClose(Symbol(),0,1);
              PriceLow = NormalizeDouble(PreClose - Fix * Point,Digits);
              TP       = NormalizeDouble(PriceLow - Takeprofit * Point,Digits);
              SL       = NormalizeDouble(PriceLow + Stoploss * Point,Digits);
              OrderSend(Symbol(),OP_SELLSTOP,Lot,PriceLow,Slippage,SL,TP,Coment,Magic,0,Red); 
            }
 }  
 

Потому, что в isCloseLastPosByTake() свой перебор ордеров и всё сбивается.

Не надо вызывать другую функцию с перебором ордеров. Ведь если тут ордер выбран, его проще здесь проверить на закрытие и принять решение.

 
А как проверить что ТР сработал, ну и для SL аналогично без вызова функций?
 

Ерунда какая-то написана.

OrderSelect (OrdersTotal()-1, SELECT_BY_POS, MODE_TRADES) - выбирает РЫНОЧНЫЙ ордер. Т.е. ордер, который еще не закрыт. И далеко не факт, что OrdersTotal()-1 будет соотвтествовать последнему открытому ордеру.

 

Ну, да. Я что-то не обратил внимания на то что в isCloseLastPosByTake() перебор истории.

Тогда перед вызовом isCloseLastPosByTake() запиши в переменную тикет ордера, а потом после возврата из isCloseLastPosByTake() выбор ордера по этому тикету.

 

(OrderSelect(OrdersTotal(), SELECT_BY_POS,MODE_HISTORY) == true)

Так правильно? (Я хочу выбрать последний закрытый ордер)

 

Конечно не правильно. Во первых для истории есть OrdersHistoryTotal()

OrdersTotal() или OrdersHistoryTotal() это количество открытых ордеров, как рыночных так и отложенных, или закрытых и удалённых отложников. А нумеруются они от 0 до OrdersTotal()-1 соответственно OrdersHistoryTotal()-1

И даже поставив OrdersHistoryTotal()-1 никакой гарантии что он последний или первый нету...

 
gabaritufa:

(OrderSelect(OrdersTotal(), SELECT_BY_POS,MODE_HISTORY) == true)

Так правильно? (Я хочу выбрать последний закрытый ордер)

Нет. Нужно перебором искать ордер с макс. временем закрытия в ИСТОРИИ.
 
...
int nCounter;

for (nCounter = OrdersHistoryTotal () - 1; nCounter >= 0; nCounter--)
{
  OrderSelect (nCounter, SELECT_BY_POS, MODE_HISTORY);
  if 
    ...
  else
    ...
}
Причина обращения: