Проблема ввода нескольких ордеров для реального счета у конкретного брокера

 

Уважаемые пользователи MQL5.

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

Мой советник отлично работает в тестере стратегий. Он также работает с другими брокерами в режиме реальной торговли.

У конкретного брокера мой советник часто исполняет 10 ордеров одинакового размера одновременно.

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

Ниже приведен мой текущий код, который 10 раз проверяет, исполняется ли ордер.

Если советник получит retcode==10009 или retcode==10008 сразу после отправки ордера, то цикл остановится и будет открыт только 1 ордер. Это идеальный случай и хороший рабочий сценарий.

Однако он может открыть 10 ордеров одинакового размера, если терминал не получит retcode==10009 или retcode==10008 сразу после отправки ордера. Я слышал, что некоторые другие люди также испытывают те же проблемы.

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

Любые предложения будут очень признательны.

С уважением.

   for(int i=0;i<10;i++)
   {
     
      volume=NormalizeDouble(volume, lotDigit);
      if(volume<=0.0) break;
     
     
      if(Type==POSITION_TYPE_SELL)
      {
         request.type=ORDER_TYPE_SELL;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_BID);
        
         if(TP!=0) takeprofit = request.price-TP*mPoint;
         if(SL!=0) stoploss = request.price+SL*mPoint;
      }
     
     
      if(Type==POSITION_TYPE_BUY)
      {
         request.type=ORDER_TYPE_BUY;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_ASK);
        
         if(TP!=0) takeprofit = request.price+TP*mPoint;
         if(SL!=0) stoploss = request.price-SL*mPoint;
      }
     
     
      request.action = TRADE_ACTION_DEAL;
      request.symbol = mSymbol;
      request.volume = MathMin(volume,SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_MAX));
      request.sl = stoploss;
      request.tp = takeprofit;
      request.deviation=SymbolInfoInteger(mSymbol,SYMBOL_SPREAD);
     

     
      request.type_filling=ORDER_FILLING_FOK;
      request.comment=DoubleToString(Money,2)+"$";
     
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
     
     
      if(!OrderSend(request,result) || result.deal==0 )
      {
         Print("OrderSend Code: ",result.retcode);
         if(result.retcode==TRADE_RETCODE_TRADE_DISABLED) break;
         if(result.retcode==TRADE_RETCODE_MARKET_CLOSED) break;
         if(result.retcode==TRADE_RETCODE_NO_MONEY) break;
         if(result.retcode==TRADE_RETCODE_TOO_MANY_REQUESTS) Sleep(5000);
         if(result.retcode==TRADE_RETCODE_FROZEN) break;
         if(result.retcode==TRADE_RETCODE_CONNECTION) Sleep(15000);
         if(result.retcode==TRADE_RETCODE_LIMIT_VOLUME) break;
        
      }
      else if(result.retcode==10009 || result.retcode==10008)
      {
          Print("OrderSend Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
         
          if(Type == POSITION_TYPE_BUY) {mBuyPositionCnt = mBuyPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          if(Type == POSITION_TYPE_SELL) {mSellPositionCnt = mSellPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          break;
      }
     
     

      Sleep(1000);
   }
  

 

 
FinanceEngineer:

Уважаемые пользователи MQL5.

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

Мой советник отлично работает в тестере стратегий. Он также работает с другими брокерами в режиме реальной торговли.

У конкретного брокера мой советник часто исполняет 10 ордеров одинакового размера одновременно.

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

Ниже приведен мой текущий код, который 10 раз проверяет, исполняется ли ордер.

Если советник получит retcode==10009 или retcode==10008 сразу после отправки ордера, то цикл остановится и будет открыт только 1 ордер. Это идеальный случай и хороший рабочий сценарий.

Однакоон может открыть 10 ордеров одинакового размера, если терминал не получит retcode==10009 или retcode==10008 сразу после отправки ордера. Я слышал, что некоторые другие люди также испытывают те же проблемы.

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

Любые предложения будут очень признательны.

С уважением.

Какой код вы получили при открытии 10 ордеров?

Форум о трейдинге, автоматических торговых системах и тестировании торговых стратегий


Пожалуйста, используйте кнопку SRC, когда публикуете код. Спасибо.




 
angevoyageur:

Какой код вы получили при открытии 10 заказов?

Здравствуйте

Я получил реткод==10008 для каждого из заказов. Он повторялся 10 раз. С уважением.


 


   for(int i=0;i<10;i++)
   {
      
      volume=NormalizeDouble(volume, lotDigit);
      if(volume<=0.0) break;
      
      
      if(Type==POSITION_TYPE_SELL)
      {
         request.type=ORDER_TYPE_SELL;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_BID);
         
         if(TP!=0) takeprofit = request.price-TP*mPoint;
         if(SL!=0) stoploss = request.price+SL*mPoint;
      }
      
      
      if(Type==POSITION_TYPE_BUY)
      {
         request.type=ORDER_TYPE_BUY;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_ASK);
         
         if(TP!=0) takeprofit = request.price+TP*mPoint;
         if(SL!=0) stoploss = request.price-SL*mPoint;
      }
      
      
      request.action = TRADE_ACTION_DEAL;
      request.symbol = mSymbol;
      request.volume = MathMin(volume,SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_MAX));
      request.sl = stoploss;
      request.tp = takeprofit;
      request.deviation=SymbolInfoInteger(mSymbol,SYMBOL_SPREAD);
      

      
      request.type_filling=ORDER_FILLING_FOK;
      request.comment=DoubleToString(Money,2)+"$";
      
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
      
      
      if(!OrderSend(request,result) || result.deal==0 )
      {
         Print("OrderSend Code: ",result.retcode);
         if(result.retcode==TRADE_RETCODE_TRADE_DISABLED) break;
         if(result.retcode==TRADE_RETCODE_MARKET_CLOSED) break;
         if(result.retcode==TRADE_RETCODE_NO_MONEY) break;
         if(result.retcode==TRADE_RETCODE_TOO_MANY_REQUESTS) Sleep(5000);
         if(result.retcode==TRADE_RETCODE_FROZEN) break;
         if(result.retcode==TRADE_RETCODE_CONNECTION) Sleep(15000);
         if(result.retcode==TRADE_RETCODE_LIMIT_VOLUME) break;
         
      }
      else if(result.retcode==10009 || result.retcode==10008)
      { 
          Print("OrderSend Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
          
          if(Type == POSITION_TYPE_BUY) {mBuyPositionCnt = mBuyPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          if(Type == POSITION_TYPE_SELL) {mSellPositionCnt = mSellPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          break;
      }
      
      

      Sleep(1000);
   }
   

 
 
FinanceEngineer:

Здравствуйте

Я получил реткод==10008 для каждого заказа. Он повторился 10 раз. С уважением.

Значит, он не повторяется в одном и том же цикле, так как у вас здесь есть прерывание:

      else if(result.retcode==10009 || result.retcode==10008)
      { 
          Print("OrderSend Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
          
          if(Type == POSITION_TYPE_BUY) {mBuyPositionCnt = mBuyPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          if(Type == POSITION_TYPE_SELL) {mSellPositionCnt = mSellPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          break;
      }

Можете ли вы опубликовать журналы экспертов для подтверждения?

Перед этим циклом у вас должен быть PositionSelect(Symbol())?

 
angevoyageur:

Тогда он не повторяется в том же цикле, так как у вас есть прерывание здесь:

Можете ли вы опубликовать логи ваших экспертов для подтверждения?

Перед этим циклом у вас должен быть PositionSelect(Symbol())?

Да, конечно. Вот логи экспертов.

PF 0 00:00:02.348 EA_v (EURJPY,H1) OrderSend Code: 10008
CE 0 00:00:03.520 EA_v (EURJPY,H1) OrderSend Code: 10008
DI 0 00:00:04.692 EA_v (EURJPY,H1) OrderSend Code: 10008
FL 0 00:00:05.864 EA_v (EURJPY,H1) OrderSend Code: 10008
HS 0 00:00:07.020 EA_v (EURJPY,H1) OrderSend Code: 10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) OrderSend Code: 10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) OrderSend Code: 10008
KI 0 00:00:10.489 EA_v (EURJPY,H1) OrderSend Code: 10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) OrderSend Code: 10008

QS 0 00:00:12.786 EA_v (EURJPY,H1) OrderSend Code: 10008

Также ваша догадка верна. Перед этим кодом я использовал PositionSelect(Symbol()), чтобы проверить объем текущей позиции.

С уважением.

 
FinanceEngineer:

Да, конечно. Вот журналы экспертов.

PF 0 00:00:02.348 EA_v (EURJPY,H1) OrderSend Code: 10008
CE 0 00:00:03.520 EA_v (EURJPY,H1) OrderSend Code: 10008
DI 0 00:00:04.692 EA_v (EURJPY,H1) OrderSend Code: 10008
FL 0 00:00:05.864 EA_v (EURJPY,H1) OrderSend Code: 10008
HS 0 00:00:07.020 EA_v (EURJPY,H1) OrderSend Code: 10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) OrderSend Code: 10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) OrderSend Code: 10008
KI 0 00:00:10.489 EA_v (EURJPY,H1) OrderSend Code: 10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) OrderSend Code: 10008

QS 0 00:00:12.786 EA_v (EURJPY,H1) OrderSend Code: 10008

Также ваша догадка верна. Перед этим кодом я использовал PositionSelect(Symbol()), чтобы проверить объем текущей позиции.

С уважением.

Хорошо, это та же проблема, о которой мы говорили в некоторых темах. PositionSelect() обновляется из локальной базы данных терминала, а тики приходят слишком быстро для этого. Sleep() не является надежным методом, вы должны найти обходной путь, чтобы убедиться, что ваша позиция открыта перед отправкой нового ордера.

Форум о трейдинге, автоматических торговых системах и тестировании торговых стратегий

Мой советник делает двойную запись

doshur, 2013.12.21 03:21

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

Я не смог найти эту тему, если кто-то может помочь мне, это было бы большое спасибо...


 
angevoyageur:

Итак, это та же проблема, о которой мы говорили в некоторых темах. PositionSelect() обновляется из локальной базы данных терминала, а тики приходят слишком быстро, чтобы это успело обновиться. Sleep() не является надежным методом, вы должны найти обходной путь, чтобы убедиться, что ваша позиция открыта перед отправкой нового ордера.

Понятно. Большое спасибо. Если PositionSelect() не работает, как насчет ограничения ордера с помощью PositionsTotal()? Обновляется ли PositionsTotal() из базы данных брокера?

 
FinanceEngineer:

Я вижу. Спасибо большое. Если PositionSelect() не работает, как насчет ограничения ордера с помощью PositionsTotal()? Обновляется ли PositionsTotal() из базы данных брокера?

Я так не думаю, но вы можете попробовать и сообщить нам об этом.
 
angevoyageur:
Я так не думаю, но вы можете попробовать и сообщить нам.
Конечно, я так и сделаю. С уважением.
 

Привет

Кто-нибудь нашел рабочее решение этой проблемы?

Очень неприятно, когда исполняется несколько ордеров, когда у вас есть надлежащие проверки.

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

Я считаю, что этот вопрос должен быть решен в будущих релизах сборки.

Пожалуйста, опубликуйте ваше решение.

Спасибо,

 
BlindMist:

Форум о трейдинге, автоматических торговых системах и тестировании торговых стратегий

Проблема ввода нескольких ордеров для реального счета у конкретного брокера

BlindMist, 2014.05.15 02:00

Здравствуйте

Кто-нибудь нашел рабочее решение этой проблемы?

Очень неприятно, когда при наличии надлежащих проверок исполняется несколько ордеров.

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

Я считаю, что этот вопрос должен быть решен в будущих релизах сборки.

Пожалуйста, опубликуйте ваше решение.

Спасибо,

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

Пожалуйста, посмотрите предложенный пост для решения этой проблемы.