Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
gabaritufa
90
gabaritufa  
Есть код, в котором 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); 
            }
 }  
Alexey Viktorov
11378
Alexey Viktorov  

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

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

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

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

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

Alexey Viktorov
11378
Alexey Viktorov  

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

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

gabaritufa
90
gabaritufa  

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

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

Alexey Viktorov
11378
Alexey Viktorov  

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

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

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

Bicus
2384
Bicus  
gabaritufa:

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

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

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

for (nCounter = OrdersHistoryTotal () - 1; nCounter >= 0; nCounter--)
{
  OrderSelect (nCounter, SELECT_BY_POS, MODE_HISTORY);
  if 
    ...
  else
    ...
}
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий