在特定经纪商的真实账户中存在多个订单输入问题

 

亲爱的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);
   }
  

 

 
FinanceEngineer:

亲爱的MQL5用户。

我的EA目前遇到了一些多单执行 的问题,但只针对一个特定的经纪人。

我的EA在策略测试器中完美运行。在实时交易模式下,它也可以与其他经纪商一起工作。

在一个特定的经纪商那里,我的EA有时经常在同一时间执行10个相同大小的订单。

看来这个问题是由经纪商和终端之间的通信引起的。

以下是我目前的代码,目前的代码检查10次订单是否被执行。

如果EA在订单发送后立即收到retcode==10009或retcode==10008,那么循环将停止,只有一个订单将被打开。这是一个理想的情况,也是一个良好的工作场景。

但是,如果终端 在订单发送后没有 立即收到retcode==10009或retcode==10008,它可能会打开10个相同大小的订单。 我听说其他一些人也遇到了同样的问题。

我怎样才能停止这种多单输入问题。

如果有任何建议,我将非常感激。

谨此致意。

当它打开10个订单时,你收到的代码是什么?

关于交易、自动交易系统和测试交易策略的论坛


当你发布代码时,请使用SRC按钮。谢谢你。




 
angevoyageur:

当它打开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);
   }
   

 
 
FinanceEngineer:

你好

我在每一个订单中都收到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()) ?

 
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()不是一个可靠的方法,你必须找到一个变通的方法,在发送新的订单之前确定你的头寸是开放的。

关于交易、自动交易系统和测试交易策略的论坛

我的EA做了一个重复输入

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,检查你的本地数据库以验证你的账户是否与经纪商服务器同步 有意义的。

请看一下建议的帖子,解决这个问题。