Problema de entrada de órdenes múltiples para la cuenta real con un corredor específico

 

Estimados usuarios de MQL5.

Actualmente estoy experimentando algún problema de ejecución de órdenes múltiples con mi EA pero sólo para un corredor específico.

Mi EA funciona perfectamente en el probador de estrategias. También funciona con otros corredores en el modo de comercio en vivo también.

Con un corredor específico, mi EA a veces 10 órdenes del mismo tamaño al mismo tiempo.

Parece que el problema es causado por la comunicación entre los corredores y el terminal.

Abajo está mi código actual y el código actual comprueba 10 veces si la orden se ejecuta.

Si el EA recibe retcode==10009 o retcode==10008 inmediatamente después de que la orden fue enviada, entonces el bucle se detendrá y sólo se abrirá 1 orden. Este es un caso ideal y un buen escenario de trabajo.

Sin embargo, puede abrir 10 órdenes del mismo tamaño si el terminal no recibe retcode==10009 o retcode==10008 inmediatamente después de que la orden fue enviada. He oído que algunas otras personas también experimentan los mismos problemas.

¿Cómo puedo detener este problema de entrada de órdenes múltiples?

Cualquier sugerencia será muy apreciada.

Saludos cordiales.

   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:

Estimados usuarios de MQL5.

Actualmente estoy experimentando algún problema de ejecución de órdenes múltiples con mi EA pero sólo para un corredor específico.

Mi EA funciona perfectamente en el probador de estrategias. También funciona con otros corredores en el modo de comercio en vivo también.

Con un corredor específico, mi EA a veces 10 órdenes del mismo tamaño al mismo tiempo.

Parece que el problema es causado por la comunicación entre los corredores y el terminal.

Abajo está mi código actual y el código actual comprueba 10 veces si la orden se ejecuta.

Si el EA recibe retcode==10009 o retcode==10008 inmediatamente después de que la orden fue enviada, entonces el bucle se detendrá y sólo se abrirá 1 orden. Este es un caso ideal y un buen escenario de trabajo.

Sin embargo,puede abrir 10 órdenes del mismo tamaño si el terminal no recibe retcode==10009 o retcode==10008 inmediatamente después de que la orden fue enviada. He oído que algunas otras personas también experimentan los mismos problemas.

¿Cómo puedo detener este problema de entrada de órdenes múltiples?

Cualquier sugerencia será muy apreciada.

Saludos cordiales.

¿Qué código recibiste cuando se abrieron 10 órdenes?

Foro sobre trading, sistemas de trading automatizados y prueba de estrategias de trading


Por favor, utilice el botón SRC cuando publique el código. Gracias.




 
angevoyageur:

¿Qué código has recibido cuando se abren 10 pedidos?

Hola

He recibido el retcode==10008 para cada uno de los pedidos. Se repitió durante 10 veces. Saludos cordiales.


 


   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:

Hola

He recibido el retcode==10008 para cada uno de los pedidos. Se repitió durante 10 veces. Saludos cordiales.

No lo repite en el mismo bucle entonces, ya que tienes una pausa aquí:

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

¿Puedes publicar los registros de tus expertos para confirmarlo?

Antes de este bucle debe tener un PositionSelect(Symbol()) ?

 
angevoyageur:

No lo repite en el mismo bucle entonces, ya que tienes una pausa aquí :

¿Puedes publicar los registros de tus expertos para confirmarlo?

¿Antes de este bucle debería tener un PositionSelect(Symbol())?

Sí, por supuesto. Aquí están los registros de los expertos.

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

También tu suposición es correcta. He utilizado PositionSelect(Symbol()) antes de este código para comprobar el volumen de la posición actual.

Saludos cordiales.

 
FinanceEngineer:

Sí, por supuesto. Aquí están los registros de los expertos.

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

También tu suposición es correcta. He utilizado PositionSelect(Symbol()) antes de este código para comprobar el volumen de la posición actual.

Saludos cordiales.

Ok, entonces es bien el mismo problema que estamos hablando en algunos temas. PositionSelect() se actualiza desde la base de datos local del terminal, y los ticks llegan demasiado rápido para que esto se actualice. Sleep() no es un método fiable, tienes que encontrar una solución para estar seguro de que tu posición está abierta antes de enviar una nueva orden.

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Mi EA hace una doble entrada

doshur, 2013.12.21 03:21

Recuerdo a alguien que tenía el mismo problema y que usa xxxx.

No he podido encontrar ese hilo, si alguien me puede ayudar sería un gran agradecimiento...


 
angevoyageur:

Ok, entonces es bien el mismo problema que estamos hablando en algunos temas. PositionSelect() se actualiza desde la base de datos local del terminal, y los ticks llegan demasiado rápido para que esto se actualice. Sleep() no es un método fiable, tienes que encontrar una solución para estar seguro de que tu posición está abierta antes de enviar una nueva orden.

Ya veo. Muchas gracias. Si PositionSelect() no funciona, ¿qué tal si se limita la orden mediante PositionsTotal()? ¿Se actualiza PositionsTotal() desde la base de datos del Broker?

 
FinanceEngineer:

Ya veo. Muchas gracias. Si PositionSelect() no funciona, ¿qué tal si se limita la orden mediante PositionsTotal()? ¿Se actualiza PositionsTotal() desde la base de datos del Broker?

Creo que no, pero puedes probarlo y avisarnos.
 
angevoyageur:
No lo creo, pero puedes probarlo y avisarnos.
Seguro que lo haré. Saludos.
 

Hola

¿Alguien ha encontrado una solución que funcione para este problema?

Es frustrante tener múltiples órdenes ejecut adas cuando se tienen los controles adecuados.

No tiene sentido tener PositionSelect actualizado desde una base de datos local cuando todas las ejecuciones de comercio ocurren en un servidor de broker remoto.

Creo que esto debe ser abordado en futuras versiones de construcción.

Por favor, publique su solución.

Gracias,

 
BlindMist:

Foro sobre trading, sistemas de trading automatizados y prueba de estrategias de trading

Problema de entrada de órdenes múltiples para cuenta real con un broker específico

BlindMist, 2014.05.15 02:00

Hola

Alguien ha encontrado una solución que funcione para este problema?

Es frustrante que se ejecuten múltiples órdenes cuando tienes controles adecuados.

No tiene sentido que PositionSelect se actualice desde una base de datos local cuando todas las ejecuciones de operaciones ocurren en un servidor de broker remoto.

Creo que esto debe ser abordado en futuras versiones de construcción.

Por favor, publique su solución.

Gracias,

HolaBlindMist, tiene sentido comprobar su base de datos local para verificar si su cuenta está sincronizada con el servidor del broker.

Por favor, echa un vistazo al post sugerido para solucionar este problema.