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?
¿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); }
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()) ?
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.
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.
Sí, por supuesto. Aquí están los registros de los expertos.
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
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...
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?
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?
No lo creo, pero puedes probarlo y avisarnos.
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,
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.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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);
}