Ордера исполняются, несмотря на ошибку (4/190 2006_02_06) - страница 2

 
Квотовцы.

Ошибка серьезная. Требуется решение.
 
Интересно, а если повторять попытку только при условии
IsConnected() && IsTradeAllowed() && OrdersTotal()==0 ?
Поможет?
 
Квотовцы.

Ошибка серьезная. Требуется решение.

Приведите, пожалуйста, полный код эксперта, на котором происходила такая ситуация.

При этом задержка исполнения ордеров бывает более 1 минуты - видимо сервер в этот момент бывает сильно загружен.

Скорее всего не сервер загружен, а дилеры еще не приступили к работе или ждут подтверждения цен.
 
Приведите, пожалуйста, полный код эксперта, на котором происходила такая ситуация.


Думаю, этого достаточно.
Выставление ордера происходит при открытии рынка в понедельник (с первым тиком)
            for (i = 0; i < ErrAnz; i++)
            {
      	     ticket = OrderSend(Symbol(),
      			     OP_BUY, 
      			     Lots_MM, 
      			     Ask, 
      			     3, 
      			     orderBUYSTOP_SL,
      			     TPBuy, 
      			     NULL,
      			     0, 
      			     0, 
      			     LightBlue); 
      			     
              if(ticket < 0)
              {
      		     ErrorCode = GetLastError();
      		     
                 Print(i + ". OrderSend error #", ErrorCode, " - ", ErrorDescription(ErrorCode));
   		        RefreshRates();
              }
              else
              {
      	        return(0);
      	     }
      	   }



Скорее все не сервер загружен, а дилеры еще не приступили к работе или ждут подтверждения цен.

Так что же делать? Как можно увеличить тайм-аут?
Может, ввести последним необязательным параметром в такие команды как OrderSend, OrderModify и т.п.

 
Код абсолютно зверский, без каких-либо ожиданий или анализа ответа.
Должен предупредить, что через некоторое время мы программно запретим такое отношение к совершению сделок. Снова введем жесткие ограничения на частоту сделок.

Выставление ордера происходит при открытии рынка в понедельник (с первым тиком)

Вот вот с этого (первый тик) и надо было начинать. Никто просто не желает отрабатывать заявки по первому тику и ждут подтверждений.

В любом случае таймауты будем проверять, спасибо.
 
Должен предупредить, что через некоторое время мы программно запретим такое отношение к совершению сделок. Снова введем жесткие ограничения на частоту сделок.

А вот этого как раз и не хотелось бы..

Хорошо бы опубликовать на сайте несколько "штатных" вариантов обработки ордеров, рекомендуемых разработчиками.
 
Код абсолютно зверский, без каких-либо ожиданий или анализа ответа.
Должен предупредить, что через некоторое время мы программно запретим такое отношение к совершению сделок. Снова введем жесткие ограничения на частоту сделок.
Хорошо, а что мешает ЗАСТАВИТЬ программно всех дожидаться положительного ответа IsTradeAllowed(), например? Просто вшить ее вызов в тело функции OrderSend() - и все, никуда не денешься. На мой взгляд, намного лучше, чем вводить задержки. Или я не учел чего?
 
Прошу прощения, скопировал старый кусок кода.
Вот актуальный:
            for (k = 0; k < ErrAnz; k++)
            {
               for (m = 0; m < ErrAnz; m++)
               {
                  if (!IsTradeAllowed())
                  {  
                     Sleep(SleepZeit);  
                     RefreshRates();
                  }
                  else
                  {
                     break;
                  }
                  if (!IsConnected())
                  {  
                     Sleep(SleepZeit);  
                     RefreshRates();
                  }
                  else
                  {
                     break;
                  }
               }
                 
      	     ticket = OrderSend(Symbol(),
      			     OP_BUY, 
      			     Lots_MM, 
      			     Ask, 
      			     3, 
      			     orderBUYSTOP_SL,
      			     TPBuy, 
      			     NULL,
      			     0, 
      			     0, 
      			     LightBlue); 
      			     
               if(ticket < 0)
               {
                  ErrorCode = GetLastError();
      		     
                  Sleep(SleepZeit);
                  RefreshRates();
                  continue;
               }
            
               return(0);
      	   } 
 
К новому варианту есть претензии?
 
К новому варианту есть претензии?

Конечно есть - он не проверяет коды ошибок ErrorCode. И при любой ошибке идет повторять команду.

Вто что я рекомендовал:
Кстати, я бы рекомендовал повторять торговую операцию только после четких и осознанных кодов ошибок (типа неправильных цен), а не во всех случаях. Если появляются нечеткие коды (timeout, common error и другие), то надо включать блок логики для работы с внештатными ситуациями.

Жесткое повторение попыток до победного конца в ситуации неопределенности - это явно неправильно.