Разработчики! Автообновление! - страница 2

 
Serj_Che:

На сегодняшний день меня такая проблема беспокоит:

DK 0 16:02:03.239 Network '12126': terminal synchronized with ОАО ''Брокерский дом ''ОТКРЫТИЕ''

FO 0 16:04:07.942 Trades '12126': buy limit 1.00 SBPR-9.14 at 5000

QD 0 16:04:08.004 Trades '12126': accepted buy limit 1.00 SBPR-9.14 at 5000

GI 2 16:04:08.020 Trades '12126': failed buy limit 1.00 SBPR-9.14 at 5000 [Invalid price]

А в общем с новым билдом новые сюрпризы ( 

На прошлом билде стакан перестал работать ... 

Дело в том, что биржа для любого контракта может выставлять лимиты цен отложенных ордеров для безопасности.

Вы легко можете сами увидеть эти характеристики в деталях инструмента:


Я специально только что проверил на реальном счете:

  • выставил buy limit на 5200 и получил отказ
    2014.08.12 22:05:43.164 Trades  '10321': failed buy limit 1.00 SBPR-9.14 at 5200 [Invalid price]
    2014.08.12 22:05:43.164 Trades  '10321': accepted buy limit 1.00 SBPR-9.14 at 5200
    2014.08.12 22:05:41.518 Trades  '10321': buy limit 1.00 SBPR-9.14 at 5200
    
  • после чего выставил 5250 при минимально разрешенной цене 5217 и все прошло
    2014.08.12 22:10:59.669 Trades  '10321': buy limit 1.00 SBPR-9.14 at 5250 placed for execution in 648 ms
    2014.08.12 22:10:59.669 Trades  '10321': accepted buy limit 1.00 SBPR-9.14 at 5250
    2014.08.12 22:10:59.020 Trades  '10321': buy limit 1.00 SBPR-9.14 at 5250
    


То есть, ошибки нет.

 
Renat:

А что пишется в логах?

Лимитные ордера, находящиеся близко к исполнению, могут не удаляться - это решают настройки сервера.

Renat, КОД не менялся!

в 930 - НОРМАЛЬНО

в 965 - НОРМАЛЬНО

в 975 периодически не удаляются!

Логи в сервисдеске. 

 
Mikalas:

Renat, КОД не менялся!

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

Обоснование что код не менялся, ничего не значит. Я описал возможную проблему - неправильная работа с тикетами.

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

 
Mikalas:

tol64, ясно же написано, что в 965 ВСЁ РАБОТАЛО!

Но если хочется посмотреть, то пожалуйста:

Ну раз такое дело. Было так.
bool DeleteOrders()
  {
//---
   uint total=OrdersTotal();
   if(total<1) return(true);
   ulong t=0;
//---
   for(uint i=0;i<total;i++) if((t=OrderGetTicket(i))>0) if(!Trade.OrderDelete(t)) return(false); else Sleep(500);
//---
   return(true);
  }
А теперь так.
bool DeleteOrders()
  {
//---
   uint tt=0,total=OrdersTotal();
   ulong t=0;
//---
   for(uint i=0;i<total;i++) if((t=OrderGetTicket(i))>0)
     {
      if(!Trade.OrderDelete(t))
        { 
         tt++;
         Print("Error OrderDelete Ticket=#"+string(t));
        }
      else Sleep(500);
     }
   if(tt>0) return(DeleteOrders());
//---
   return(true);
  }
 
Renat:

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

Обоснование что код не менялся, ничего не значит. Я описал возможную проблему - неправильная работа с тикетами.

LG 0 10:00:10.684 Trades '-----': buy limit 3.00 SNGR-12.14 at 25202

.................................. 

QK 0 10:04:32.311 Trades '-----': cancel order #5129196 buy limit 3.00 SNGR-12.14 at 25202
KE 2 10:04:32.343 Trades '-----': failed cancel order #5129196 buy limit 3.00 SNGR-12.14 at 25202.00000 [Invalid request]
 
svds75:
Ну раз такое дело. Было так.
А теперь так.

Классическая ошибка с выбиванием табуретки из-под ног.

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

Кроме того, этот код рекурсивный и при неудаче удаления вы гарантированно исчерпаете стек и получите остановку эксперта по критической ошибке.

 

Renat,

Вот записть из севисдеск:

Версия и битность терминала

5.0 build 871 64-bit Брокер "Открытие", реальный счёт

Описание проблемы

Достаточно часто не удаляется выставленный ордер

Последовательность действий

Выставляется отложенный ордер ( long ) на фьючерс GOLD-3.14, а затем я его удаляю

Полученный результат

Ордер не удаляется с сообщением "invalid request"

Ожидаемый результат

Ордер удаляется

Это было в 871 билде, потом исправили, а сейчас снова! 

 
Renat:

Классическая ошибка с выбиванием табуретки из-под ног.

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

Тогда пока заберу свои слова обратно. Надо перепроверить.

Полагаю что цикл должен быть таким

for(int i=total-1;i>=0;i--) if((t=OrderGetTicket(i))>0)
А раньше работало.
 
Mikalas:
QK 0 10:04:32.311 Trades '-----': cancel order #5129196 buy limit 3.00 SNGR-12.14 at 25202
KE 2 10:04:32.343 Trades '-----': failed cancel order #5129196 buy limit 3.00 SNGR-12.14 at 25202.00000 [Invalid request]

Только что повторил такой ордер, а потом программно его удалил вашим скриптом:

Удалил
2014.08.12 22:30:51.868 Trades  '10321': cancel order #5146051 buy limit 1.00 SNGR-12.14 at 25202 placed for execution in 80 ms
2014.08.12 22:30:51.787 Scripts script aa (SBPR-9.14,H1) removed
2014.08.12 22:30:51.787 Trades  '10321': cancel order #5146051 buy limit 1.00 SNGR-12.14 at 25202
2014.08.12 22:30:51.774 Scripts script aa (SBPR-9.14,H1) loaded successfully


Открыл позицию
2014.08.12 22:30:26.153 Trades  '10321': buy limit 1.00 SNGR-12.14 at 25202 placed for execution in 73 ms
2014.08.12 22:30:26.150 Trades  '10321': accepted buy limit 1.00 SNGR-12.14 at 25202
2014.08.12 22:30:26.080 Trades  '10321': buy limit 1.00 SNGR-12.14 at 25202

Вот скрипт, чуть упростил и убрал лишнее (для удаления ордера достаточно его номера):

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Remove(ulong ticket)
  {
   if(ticket>0)
     {
      if(OrderSelect(ticket))
        {
         ulong    req_id=0;
         MqlTradeRequest request = {0};
         MqlTradeResult  result  = {0};

         request.action = TRADE_ACTION_REMOVE;
         request.order  = ticket;

         if(OrderSendAsync(request,result))
           {
            if(result.retcode==TRADE_RETCODE_PLACED)
              {
               req_id=result.request_id;
              }
           }
         else
           {
            Print("Ордер не удалён! Билет = ",ticket,"; Код возврата = ",result.retcode);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Remove(5146070);
  }
 
svds75:

Тогда пока заберу свои слова обратно. Надо перепроверить.

Полагаю что цикл должен быть таким

А раньше работало.

Оно теоретически может иногда срабатывать, так как все зависит от скорости обновления базы открытых ордеров с сервера и процессы обновления асинхронные.

Но ошибка классическая, ей минимум 10 лет. Самый простой способ - удалять циклом с конца.

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