Вопрос о циклах

 

Здравствуйте! Наткнулся на следующую проблему:

Если несколько ордеров в рынке, допустим, штук 7, мне надо закрыть все эти 7 ордеров. Использую такую конструкцию:

      

if(какое-то мое условия) { 

while(!del && !IsStopped()) // все делаем в цикле while
        {
         for(int i=OrdersTotal()-1; i>=0; i--)//этот цикл крутится пока есть открытые ордера
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))//выбираем ордера
              {
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)// далее выбираем нужные
                 {
                  if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,30,Red);//если это селл-ордер, начинаем долбить сервер
                 }
              }
           }
         if(CountTrades(OP_SELL,Magic)==0) { PlaySound("ok.wav"); del=true; }//если ордеров не осталось, играем музыку и выходим из цикла while
        }

Из-за проскальзывания или какого-нибудь отказа сервера (и пр.), закрываются только 1-2-3 ордера (когда как). Остальные остаются висеть и видно, что цикл while крутится (проверял, print печатает тысячи итераций), но терминал не долбит сервер запросами OrderClose на каждой итерации цикла. Хотя по идее долбить должен до полного закрытия ордеров.

Прошу знатоков помочь в вопросе. заранее спасибо.

 
Evgeniy Zhdan:

Здравствуйте! Наткнулся на следующую проблему:

Если несколько ордеров в рынке, допустим, штук 7, мне надо закрыть все эти 7 ордеров. Использую такую конструкцию:

      

if(какое-то мое условия) { 

while(!del && !IsStopped()) // все делаем в цикле while
        {
         for(int i=OrdersTotal()-1; i>=0; i--)//этот цикл крутится пока есть открытые ордера
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))//выбираем ордера
              {
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)// далее выбираем нужные
                 {
                  if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,30,Red);//если это селл-ордер, начинаем долбить сервер
                 }
              }
           }
         if(CountTrades(OP_SELL,Magic)==0) { PlaySound("ok.wav"); del=true; }//если ордеров не осталось, играем музыку и выходим из цикла while
        }

Из-за проскальзывания или какого-нибудь отказа сервера (и пр.), закрываются только 1-2-3 ордера (когда как). Остальные остаются висеть и видно, что цикл while крутится (проверял, print печатает тысячи итераций), но терминал не долбит сервер запросами OrderClose на каждой итерации цикла. Хотя по идее долбить должен до полного закрытия ордеров.

Прошу знатоков помочь в вопросе. заранее спасибо.

При использовании предопределённой переменной Ask или Bid обязательно нужно перед отсылкой торгового запроса на сервер получить самые последние данные при помощи RefreshRates(). Можете вместо Ask использовать SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK) или SymbolInfoDouble(OrderSymbol(),SYMBOL_BID) - тогда RefreshRates() не нужен, а можете попробовать вместо Ask или Bid просто вписать OderClosePrice() - но это не документированная возможность, и слепо полагаться на её работоспособность не стоит.
 
Artyom Trishkin:
При использовании предопределённой переменной Ask или Bid обязательно нужно перед отсылкой торгового запроса на сервер получить самые последние данные при помощи RefreshRates(). Можете вместо Ask использовать SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK) или SymbolInfoDouble(OrderSymbol(),SYMBOL_BID), а можете попробовать вместо Ask или Bid просто вписать OderClosePrice() - но это не документированная возможность, и слепо полагаться на её работоспособность не стоит.

И ещё есть не документированная фишка, закрывать ордера по OrderClosePeice()

Тогда и делить их на Buy  или Sell не надо.

 
Alexey Viktorov:

И ещё есть не документированная фишка, закрывать ордера по OrderClosePeice()

Тогда и делить их на Buy  или Sell не надо.

???

Я ж разве ж не написал о том?

 
Artyom Trishkin:

???

Я ж разве ж не написал о том?

А у меня сил не хватает читать столько много букафф :))))

ps что касается её работоспособности, я думаю раньше вообще закроют МТ4 чтом отменят эту фишку.

 
Alexey Viktorov:
А у меня сил не хватает читать столько много букафф :))))
РедБул окрыляяеет ...
 
Artyom Trishkin:
РедБул окрыляяеет ...
:::)))
 
Evgeniy Zhdan:

Здравствуйте! Наткнулся на следующую проблему:

Если несколько ордеров в рынке, допустим, штук 7, мне надо закрыть все эти 7 ордеров. Использую такую конструкцию:

Из-за проскальзывания или какого-нибудь отказа сервера (и пр.), закрываются только 1-2-3 ордера (когда как). Остальные остаются висеть и видно, что цикл while крутится (проверял, print печатает тысячи итераций), но терминал не долбит сервер запросами OrderClose на каждой итерации цикла. Хотя по идее долбить должен до полного закрытия ордеров.

Прошу знатоков помочь в вопросе. заранее спасибо.

всё проще чем вы думаете :-)

достаточно посмотреть лог компиляции - там чуть не криком написано "результат OrderClose должен проверяться". Пойдите бедному терминалу навстречу - проверьте результат и в зависимости от кода ошибки примите меры.

 

Спасибо всем.

OderClosePrice() терминал не распознает.

Пропишу SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK), посмотрим что выгорит.

 

Maxim Kuznetsov:

всё проще чем вы думаете :-)

достаточно посмотреть лог компиляции - там чуть не криком написано "результат OrderClose должен проверяться". Пойдите бедному терминалу навстречу - проверьте результат и в зависимости от кода ошибки примите меры.

В логах этого не написано. И  OrderClose не возвращает ошибок, а лишь true/false.

 

Все таки усложнил функцию, посмотрим как запоет:

   if(ProfitPoints<=pointsSell)
     {
      bool del=false;
      while(!del && !IsStopped())
        {
         for(int i=OrdersTotal()-1; i>=0; i--)
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
              {
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
                 {
                  if(OrderType()==OP_SELL && ProfitPoints<=pointsSell)
                    {
                     bool err=true;
                     err=OrderClose(OrderTicket(),OrderLots(),SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK),30,Red);
                     if(!err)
                       {
                        Print("Ошибка закрытия ордеров: ",GetLastError());
                       }
                    }
                 }
              }
           }
         if(CountTrades(OP_SELL,Magic)==0) { PlaySound("ok.wav"); del=true; }
        }
     }
 
Evgeniy Zhdan:

Спасибо всем.

OderClosePrice() терминал не распознает.

Пропишу SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK), посмотрим что выгорит.

 

В логах этого не написано. И  OrderClose не возвращает ошибок, а лишь true/false.

Ну если буква r пропущена только здесь? в этом сообщении, то это "Очевидное не вероятное" у всех работает, а у тебя нет... Так не бывает.

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