Разработчики! Ошибка 10024 (Слишком частые запросы)

 

"Переполз" на  OrderSendAsync и

стал получать ошибку TRADE_RETCODE_TOO_MANY_REQUESTS.

Вопросы:

1. Зачем нужна команда  OrderSendAsync, если она не корректно работает?

2. Неужели в серверной части нельзя было поставить очередь из  OrderSendAsync? 

3. Какая же должна быть задержка между отсылкой команд OrderSendAsync?

4. Кто-нибудь решил эту проблему? 

 

 
Mikalas:

"Переполз" на  OrderSendAsync и

стал получать ошибку TRADE_RETCODE_TOO_MANY_REQUESTS.

Вопросы:

1. Зачем нужна команда  OrderSendAsync, если она не корректно работает?

2. Неужели в серверной части нельзя было поставить очередь из  OrderSendAsync? 

3. Какая же должна быть задержка между отсылкой команд OrderSendAsync?

4. Кто-нибудь решил эту проблему? 

 

Никакой задержки не нужно, просто ваши приказы реджектятся а вы без проверки шлёте новый, только в таких условиях появляется ответ сервера слишком частые запросы.

Получите ответ на ваш запрос прежде чем отправлять его повторно.

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

ЗЫ если всё нормально сервер вполне спокойно проглатывает пачку из 100 ордеров. 

 
Urain:

Никакой задержки не нужно, просто ваши приказы реджектятся а вы без проверки шлёте новый, только в таких условиях появляется ответ сервера слишком частые запросы.

Получите ответ на ваш запрос прежде чем отправлять его повторно.

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

ЗЫ если всё нормально сервер вполне спокойно проглатывает пачку из 100 ордеров. 

К сожалению, вы ошибаетесь, я не "долблю" повторными приказами без проверки.

И приказы сразу не реджектятся, просто несколько советников (50) одновременно отсылают команду  OrderSendAsync. 

 

Удаление ордера: 

//+------------------------------------------------------------------+
// Remove order                                                      |
//+------------------------------------------------------------------+
void COrder::Remove()
{
  if ( ticket > 0 )
  {
    if ( OrderSelect( ticket ) )
    {
      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
      {
         state = ORD_REJECTED; 
         Print( "Ордер не удалён! Билет = ", ticket, "; Код возврата = ", GetRetCode( result.retcode ) );
      }
    }
  }
}

 Вызов удаления ордера:

//+------------------------------------------------------------------+
//| Expert timer function                                            |
//+------------------------------------------------------------------+
void OnTimer()
{
  MqlDateTime tick_time;
  
  if ( CheckTradingTime( tick_time ) )
  {
//..............................
  }
  else
  {
    if ( ( BuyOrder.state == ORD_BUY_WORK ) && ( BuyOrder.ticket > 0 ) && ( BuyOrder.req_id == 0 ) ) BuyOrder.Remove();
    if ( ( SellOrder.state == ORD_SELL_WORK ) && ( SellOrder.ticket > 0 ) && ( SellOrder.req_id == 0 ) ) SellOrder.Remove();
  }
}

 Как видите, всё обрабатывается и проверяется!

Ордера первых 2-х советников удаляются, а остальные выдают ошибку

TRADE_RETCODE_TOO_MANY_REQUESTS ( Ордер не удалён! Билет = 6745860; Код возврата = Слишком частые запросы ),

причём её (ошибку) выдаёт терминал, что не должно входить в его функции, при отправке команды OrderSendAsync,

он должен только сообщить, что отправил её (получаем req_id) или нет.( https://www.mql5.com/ru/docs/trading/ordersendasync) 

Проверяя частоту запросов на отсылку команды  OrderSendAsync, теряется смысл её существования вовсе!

Мне, например, кажется странным:

Высокочастотная торговля с проверкой частоты:) 

Документация по MQL5: Торговые функции / OrderSendAsync
Документация по MQL5: Торговые функции / OrderSendAsync
  • www.mql5.com
Торговые функции / OrderSendAsync - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

А сколько транзакций все-таки проходит до того, как срабатывает защита?

Или вы думаете, что сможете флудить на демо без ограничений?

 
Renat:

А сколько транзакций все-таки проходит до того, как срабатывает защита?

Или вы думаете, что сможете флудить на демо без ограничений?

Реальный счёт.

P/S В документации не написано, что стоит защита на кол-во тразакций для

функции OrderSendAsync 

 
Так сколько транзакций успело пройти?
 
Renat:
Так сколько транзакций успело пройти?

2 тразакции

QS 0 23:49:30.773 Trades '11000': cancel order #6745145 sell limit 1.00 TATN-3.15 at 25389

QD 0 23:49:30.774 Trades '11000': cancel order #6743665 sell limit 1.00 RTKM-3.15 at 11978

JH 0 23:49:30.774 Trades '11000': cancel order #6743740 sell limit 1.00 TRNF-3.15 at 88843

 

GL 0 23:49:30.264 Forts_trader (TRNF-3.15,H1) Ордер не удалён! Билет = 6743740; Код возврата = Слишком частые запросы 

 
papaklass:

Наверно ТС погряз в подсчете количества тракзакций. Что то цифру никак озвучить не может.

Так после какого количества тракзаций стала вылетат ошибка? 

papaklass, сарказм не уместен, тем более вы сами имели опыт общения с этой функцией в прошлом году...

( > Попрактиковался. Выстреливает 10 ордеров так быстро, что получаю ошибку 10024 (слишком частые запросы). Получается, что "хрен редьки не слаще".  Правда я немного переделал Ваш скрипт.

 

К сожалению, нет однозначно четкого ответа. Тем более, никакие 10 заявок (а тем более, 2) не попадают в защиты.

Будьте добры, ответьте честно и точно:

  1. с какой даты до секунды начались транзакции?
  2. с какой даты с точностью до секунды вы получили отказ?
  3. сколько транзакций было отправлено за этот промежуток?
Вообще-то ответы на эти вопросы должны были быть приложены к первому сообщению. Правда в этом случае и вопрос бы не состоялся.
 
Renat:

К сожалению, нет однозначно четкого ответа. Тем более, никакие 10 заявок (а тем более, 2) не попадают в защиты.

Будьте добры, ответьте честно и точно:

  1. с какой даты до секунды начались транзакции?
  2. с какой даты с точностью до секунды вы получили отказ?
  3. сколько транзакций было отправлено за этот промежуток?
Вообще-то ответы на эти вопросы должны были быть приложены к первому сообщению. Правда в этом случае и вопрос бы не состоялся.

Renat, реальный счёт, давно и успешно работающий советник.

Я не хочу публично выкладывать свои логи, отправлю их вам с личным сообщением

 
papaklass:

 Не обижайтесь на мой сарказм. Это дружественная попытка вернуть Вас в конструктивное русло. Если Вас это задело, то приношу свои извинения.

По теме:

Mikalas, Вы создаете ВАЖНУЮ тему об ошибках в работе ОСНОВНОЙ ТОРГОВОЙ функции, Вам задают уточняющие вопросы, а Вы пропадаете.

Лично я всегда просматриваю темы, касающиеся работы платформы. А уж такие темы, как ошибки в работе основных торговых функций, в первую очередь. И, естесствено, хочется понять в чем дело. Что не так в работе. Ошибка ли это разработчиков, или косяк в алгоритме программиста. А Вы, вместо ответов на уточняющие вопросы, пропадаете.

Из Вашего лога видно, что отдаются приказы на закрытие РАЗНЫХ ордеров. Поэтому интересен ответ разработчиков. Ответьте на вопросы Рената, это важно не только для Вас.

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

У Вас же совершенно другая ситуация. Интересуют подробности. 

Добрый вечер, papaklass!

Если вы внимательно прочтете мои сообщения, то увидите ВСЮ исчерпывающую информацию.

А вкрадце, происходит следующее:

В терминале 50 советников, выставляющих отложенные ордера.

Перед каждым клирингом и в конце вечерней сеесии советники одновременно снимают ранее выставленные ими ордера.

На ФОРТС часто бывает такое, что котировки не приходят по несколько часов(малоликвидные инструменты ), поэтому торговое время

приходится проверять по таймеру функцией CheckTradingTime( tick_time )

void OnTimer()
{
  MqlDateTime tick_time;
  
  if ( CheckTradingTime( tick_time ) )
  {
//..............................
  }
  else
  {
    if ( ( BuyOrder.state == ORD_BUY_WORK ) && ( BuyOrder.ticket > 0 ) && ( BuyOrder.req_id == 0 ) ) BuyOrder.Remove();
    if ( ( SellOrder.state == ORD_SELL_WORK ) && ( SellOrder.ticket > 0 ) && ( SellOrder.req_id == 0 ) ) SellOrder.Remove();
  }
}
С OrderSend всё работало как часики( десять месяцев ни одной ошибки )
Причина обращения: