Скрипт закрытия ордеров

 

Помогите написать скрипт для закрытия ордеров только по одному инструменту. Написал вот такой код и не работает, что тут не правильно?

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
if (OrdersTotal()>0)
   for(int i=OrdersTotal()-1; i>=0; i--)// функция перебора ордеров 
      if(OrderSelect(i,SELECT_BY_POS))
         if(OrderSymbol()==Symbol())   
         	if (OrderType() == OP_BUY) 
               {
                bool bcl=OrderClose(OrderTicket(), OrderLots(), Bid, 20, Blue);
               }

                if (OrderType() == OP_SELL)
               {
                bool scl=OrderClose(OrderTicket(), OrderLots(), Ask, 20, Red);
               }
  }
//+------------------------------------------------------------------+
 
Seselio:

Помогите написать скрипт для закрытия ордеров только по одному инструменту. Написал вот такой код и не работает, что тут не правильно?

В кривые скобки надо завернуть весь цикл. А там где они сейчас есть не особо нужны.

 
Seselio:

Помогите написать скрипт для закрытия ордеров только по одному инструменту. Написал вот такой код и не работает, что тут не правильно?

По-моему так (индексация ордеров начинается с нуля по-моему):

 for (int i=OrdersTotal()-1; i>-1; i--){
             if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){
                if(OrderSymbol()==Symbol()){
                      bool orderClose=false;
                      while(!orderClose){
                        ResetLastError();
                        orderClose=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage);
                        if(!orderClose){
                           Print("Error orderClose(): ", GetLastError());
                        }
                        
                   }
               }
            }
         }
 
Yevhenii Levchenko:

По-моему так (индексация ордеров начинается с нуля по-моему):

for (int i=OrdersTotal()-1; i>-1; i--){
             if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){
                if(OrderSymbol()==Symbol()){
                      bool orderClose=false;
                      while(!orderClose){
                        orderClose=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage);
                   }
               }
            }
         }

Евгений, так делать нельзя. Если вдруг будет реквота, то цикл уйдёт в бесконечность и подвесит терминал.

Выделенное красным никчёмное излишество. А вот направление перебора ордеров да, я просмотрел. Не обратил внимание.

 
Alexey Viktorov:

Евгений, так делать нельзя. Если вдруг будет реквота, то цикл уйдёт в бесконечность и подвесит терминал.

Выделенное красным никчёмное излишество. А вот направление перебора ордеров да, я просмотрел. Не обратил внимание.

Ааа, ну да... можно и без "труе"...

По поводу бесконечности... не знал... вроде работало, когда тестил своих роботов... Вот так норм?

for (int i=OrdersTotal()-1; i>-1; i--){
             if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
                if(OrderSymbol()==Symbol()){
                      bool orderClose=false;
                      ResetLastError();
                      orderClose=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage);
                      if(!orderClose)
                      Print("Error orderClose(): ", GetLastError());
                   
               }
            }
         }
 
Alexey Viktorov:

В кривые скобки надо завернуть весь цикл. А там где они сейчас есть не особо нужны.

Спасибо, все заработало!)

 
Yevhenii Levchenko:

Ааа, ну да... можно и без "труе"...

По поводу бесконечности... не знал... вроде работало, когда тестил своих роботов... Вот так норм?

MODE_TRADES тоже не играет роли в данном случае. Это значение поставлено по умолчанию.

А зачем так написали? i>-1 разве не проще и понятней написать i==0

И ещё есть такой вариант цикла

for(int i = OrdersTotal(); i-- > 0;)

Сначала выполняется i-- потом тело цикла и только потом проверка >0

Как ни странно, но это работает.

Причина обращения: