亲爱的MQL5用户。
我的EA目前遇到了一些多单执行 的问题,但只针对一个特定的经纪人。
我的EA在策略测试器中完美运行。在实时交易模式下,它也可以与其他经纪商一起工作。
在一个特定的经纪商那里,我的EA有时经常在同一时间执行10个相同大小的订单。
看来这个问题是由经纪商和终端之间的通信引起的。
以下是我目前的代码,目前的代码检查10次订单是否被执行。
如果EA在订单发送后立即收到retcode==10009或retcode==10008,那么循环将停止,只有一个订单将被打开。这是一个理想的情况,也是一个良好的工作场景。
但是,如果终端 在订单发送后没有 立即收到retcode==10009或retcode==10008,它可能会打开10个相同大小的订单。 我听说其他一些人也遇到了同样的问题。
我怎样才能停止这种多单输入问题。
如果有任何建议,我将非常感激。
谨此致意。
当它打开10个订单时,你收到的代码是什么?
当它打开10个订单时,你收到哪个代码?
你好
我收到的retcode==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); }
你好
我在每一个订单中都收到retcode==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()) ?
那么它不会在同一个循环中重复,因为你在这里有一个中断。
你能发布你的专家日志来确认吗?
在这个循环之前,你应该有一个PositionSelect(Symbol())?
当然是的。这里是专家的日志。
QS 0 00:00:12.786 EA_v (EURJPY,H1) OrderSend Code:10008
另外你的猜测是对的。我在这段代码之前使用了PositionSelect(Symbol())来检查 当前位置的成交量。
亲切的问候。
是的,当然,这是专家的日志。
QS 0 00:00:12.786 EA_v (EURJPY,H1) OrderSend Code:10008
另外你的猜测是对的。我在这段代码之前使用了PositionSelect(Symbol())来检查当前位置的成交量。
好心的问候。
好的,所以这和我们在一些主题中谈到的问题是一样的。PositionSelect()是由终端的本地数据库更新的,而点数来得太快了,无法更新。Sleep()不是一个可靠的方法,你必须找到一个变通的方法,在发送新的订单之前确定你的头寸是开放的。
好吧,这和我们在一些主题中谈到的问题是一样的。PositionSelect()是由终端的本地数据库更新的,而点数来得太快了,无法更新。Sleep()不是一个可靠的方法,你必须找到一个变通的方法,在发送新的订单之前确定你的头寸是开放的。
我明白了。 太感谢了。如果PositionSelect()不起作用,使用PositionsTotal() 限制订单如何?PositionsTotal()是否从经纪人的数据库中更新?
我明白了。 非常感谢。如果PositionSelect()不起作用,使用PositionsTotal() 限制订单如何?PositionsTotal()是否从经纪人的数据库中更新?
我不这么认为,但你可以尝试一下,并让我们知道。
亲爱的MQL5用户。
我的EA目前遇到了一些多单执行 的问题,但只针对一个特定的经纪人。
我的EA在策略测试器中完美运行。在实时交易模式下,它也可以与其他经纪商一起工作。
在一个特定的经纪商那里,我的EA有时经常在同一时间执行10个相同大小的订单。
看来这个问题是由经纪商和终端之间的通信引起的。
以下是我目前的代码,目前的代码检查10次订单是否被执行。
如果EA在订单发送后立即收到retcode==10009或retcode==10008,那么循环将停止,只有一个订单将被打开。这是一个理想的情况,也是一个良好的工作场景。
但是,如果终端在订单发送后没有立即收到retcode==10009或retcode==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);
}