Problema de entrada de pedidos múltiplos para conta ativa com um corretor específico

 

Prezados usuários da MQL5.

Atualmente estou passando por algum problema de execução de pedidos múltiplos com minha EA, mas apenas para um corretor específico.

Meu EA funciona perfeitamente no testador de estratégia. Ele também trabalha com outros corretores no modo de negociação ao vivo.

Com um corretor específico, meu EA, em algum momento, costuma ter 10 ordens do mesmo tamanho ao mesmo tempo.

Parece que o problema é causado pela comunicação entre os corretores e o terminal.

Abaixo está meu código atual e o código atual verifica 10 vezes se a ordem é executada.

Se a EA receber retcode==10009 ou retcode==10008 imediatamente após o envio do pedido, então o loop irá parar e apenas 1 pedido será aberto. Este é um caso ideal e um bom cenário de trabalho.

Entretanto, ele pode abrir 10 pedidos do mesmo tamanho se o terminal não receber retcode==10009 ou retcode==10008 imediatamente após o envio do pedido. Ouvi dizer que algumas outras pessoas também estão passando pelos mesmos problemas.

Como posso parar este problema de entrada de pedidos múltiplos.

Qualquer sugestão será realmente apreciada.

Cordiais cumprimentos.

   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:

Prezados usuários da MQL5.

Atualmente estou passando por algum problema de execução de pedidos múltiplos com minha EA, mas apenas para um corretor específico.

Meu EA funciona perfeitamente no testador de estratégia. Ele também trabalha com outros corretores no modo de negociação ao vivo.

Com um corretor específico, meu EA, em algum momento, costuma ter 10 ordens do mesmo tamanho ao mesmo tempo.

Parece que o problema é causado pela comunicação entre os corretores e o terminal.

Abaixo está meu código atual e o código atual verifica 10 vezes se a ordem é executada.

Se a EA receber retcode==10009 ou retcode==10008 imediatamente após o envio do pedido, então o loop irá parar e apenas 1 pedido será aberto. Este é um caso ideal e um bom cenário de trabalho.

Entretanto,ele pode abrir 10 pedidos do mesmo tamanho se o terminal não receber retcode==10009 ou retcode==10008 imediatamente após o envio do pedido. Ouvi dizer que algumas outras pessoas também estão passando pelos mesmos problemas.

Como posso parar este problema de entrada de pedidos múltiplos.

Qualquer sugestão será realmente apreciada.

Cordiais cumprimentos.

Qual código você recebeu quando abriu 10 pedidos?

Fórum sobre negociação, sistemas automatizados de negociação e teste de estratégias de negociação


Por favor, use o botão SRC quando você postar o código. Obrigado.




 
angevoyageur:

Qual código você recebeu quando abriu 10 pedidos?

Olá

Eu recebi o retcode==10008 para cada um dos pedidos. Ele o repetiu por 10 vezes. Cordiais cumprimentos.


 


   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:

Olá

Eu recebi o retcode==10008 para cada um dos pedidos. Ele o repetiu por 10 vezes. Cordiais cumprimentos.

Não o repete no mesmo loop então, pois você tem uma pausa aqui :

      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;
      }

Você pode postar seus logs de especialistas para confirmar ?

Antes deste loop você deve ter uma PositionSelect(Símbolo()) ?

 
angevoyageur:

Não o repete no mesmo loop então, pois você tem uma pausa aqui :

Você pode postar seus logs de especialistas para confirmar ?

Antes deste loop você deve ter um PositionSelect(Symbol()) ?

Sim, é claro. Aqui estão os logs dos especialistas.

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

Também seu palpite está certo. Usei PositionSelect(Symbol()) antes deste código para verificar o volume da posição atual.

Com os melhores cumprimentos.

 
FinanceEngineer:

Sim, claro. Aqui estão os registros dos especialistas.

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

Também seu palpite está certo. Usei PositionSelect(Symbol()) antes deste código para verificar o volume da posição atual.

Com os melhores cumprimentos.

Ok, então é bem o mesmo problema que estamos falando em alguns tópicos. PositionSelect() é atualizado a partir do banco de dados local do terminal, e os tiquetaques vêm muito rápido para que isto seja atualizado. Sleep() não é um método confiável, você tem que encontrar uma solução para ter certeza de que sua posição está aberta antes de enviar um novo pedido.

Fórum sobre negociação, sistemas automatizados de negociação e teste de estratégias de negociação

Minha EA faz uma entrada dupla

doshur, 2013.12.21 03:21

Eu me lembro de alguém que tinha o mesmo problema e usava xxxx.

Não consegui encontrar esse fio, se alguém pudesse me ajudar isso seria um grande agradecimento...


 
angevoyageur:

Ok, então é bem o mesmo problema que estamos falando em alguns tópicos. PositionSelect() é atualizado a partir do banco de dados local do terminal, e os carrapatos vêm muito rapidamente para que isto seja atualizado. Sleep() não é um método confiável, você tem que encontrar uma solução para ter certeza de que sua posição está aberta antes de enviar um novo pedido.

Estou vendo. Muito obrigado. Se PositionSelect() não funcionar, que tal limitar o pedido usando PositionsTotal()? PositionsTotal() é atualizado a partir do banco de dados do Corretor?

 
FinanceEngineer:

Estou vendo. Muito obrigado. Se PositionSelect() não funcionar, que tal limitar a ordem usando PositionsTotal()? PositionsTotal() é atualizado do banco de dados do Corretor?

Acho que não, mas você pode tentar e nos avisar.
 
angevoyageur:
Acho que não, mas você pode tentar e nos avisar.
Claro que vou fazer. Cumprimentos.
 

Hi

Alguém já encontrou uma solução funcional para este problema?

É frustrante ter várias ordens executadas quando se tem verificações adequadas no local.

Não faz sentido ter o PositionSelect atualizado a partir de um banco de dados local quando todas as execuções comerciais acontecem em um servidor de corretagem remota.

Acredito que isto deve ser tratado em futuros lançamentos de build.

Por favor, poste sua solução.

Obrigado,

 
BlindMist:

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Problema de entrada de pedidos múltiplos para conta ativa com um corretor específico

BlindMist, 2014.05.15 02:00

Hi

Alguém já encontrou uma solução funcional para este problema?

É frustrante ter várias ordens executadas quando se tem verificações adequadas no local.

Não faz sentido ter o PositionSelect atualizado a partir de um banco de dados local quando todas as execuções comerciais acontecem em um servidor de corretagem remota.

Acredito que isto deve ser tratado em futuros lançamentos de build.

Por favor, poste sua solução.

Obrigado,

OláBlindMist, faz sentido verificar seu banco de dados local para verificar se sua conta está sincronizada com o servidor do corretor.

Por favor, dê uma olhada no post sugerido para resolver este problema.

Razão: