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

 
figurelli:
你好,FinanceEngineer,也许最好开始检查你的原始代码的多单问题,因为如果我们这样做,可能会解决这里的其他关键点,不会失去重点,你怎么看?

你好,figurelli

这是我的新代码。我改变了,因为我在这个主题上提出了多个订单的问题。

到目前为止,这段代码在几个经纪商那里运行良好。BlindMist可以试试这段代码,看看他是否能避免该经纪人的多单问题。

for(int i=0;i<10;i++)
   {

      
 
      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     = strComment;
      request.magic         = EAMagic;
      
      
      
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
      

      
      bool checkOrderSend = OrderSend(request, result);
      
      if(result.retcode==10009 || result.retcode==10008)
      { 
          Print("OrderSend was successful. Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.

          
          break;
      }
      else
      {
          Print(ResultRetcodeDescription(result.retcode));
      }
      

      Sleep(1000);
      
   }
   

 

 
 
FinanceEngineer:

你好,figurelli

这是我的新代码。我改变了,因为我在这个主题上提出了多个订单的问题。

到目前为止,这段代码在几个经纪商那里运行良好。BlindMist可以试试这段代码,看看他是否能避免该经纪人的多单问题。

发布代码时请使用SRC按钮。

你发布的代码不能避免(所有的)双重订单,相反,它在某些情况下会引发双重订单。

 
angevoyageur:

在发布代码时,请使用SRC按钮。

你发布的代码不能避免(所有的)重复订单,相反,它在某些情况下会引起重复订单。

如果有解决方案,除了在循环内设置10小时的睡眠时间,还有什么更好的方法?
 
FinanceEngineer:

你好,figurelli

这是我的新代码。我改变了,因为我在这个主题上提出了多个订单的问题。

到目前为止,这段代码在几个经纪商那里运行良好。BlindMist可以试试这段代码,看看他是否能避免该经纪人的多单问题。

你好,FinanceEngineer,注意在你的原始代码中,你在if { }和else { }处有Print("OrderSend Code: "...) 。

但是else { }有一个break,而你的调试代码显示retcode = 10008 (TRADE_RETCODE_PLACED) x 10。

所以,根据推论,你是在打印if { }条件下的调试,而你的break从未被使用。

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

现在你改变了你的代码,看起来更清晰了,但是请注意,你没有再测试OrderSend()的返回值,只是测试了result.retcode。你可以使用变量checkOrderSend(***看这里)来纠正这个问题,我之前问过这个问题。

      bool checkOrderSend=OrderSend(request,result);

      if(checkOrderSend) // (*** look here)
        {
         if(result.retcode==10009 || result.retcode==10008)
           {
            Print("OrderSend was successful. Code: ",result.retcode);
            volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
            break;
           }
         else
           {
            Print(ResultRetcodeDescription(result.retcode));
           }
        }
      else 
        {
         Print("OrderSend execution error.");
        }

所以,在我看来,首先要做的是纠正这个测试,并使用你报告的同一个有问题的经纪人再次检查。如果问题不再发生,恭喜你,你真的解决了这个错误,也就是说,这并不表明你的代码是未来的证明或最安全的,而是表明我们找到了这个错误。

事实上,你可以忘记或避免再次修改你的代码,因为错误没有发生,然而,在这种情况下,你必须注意你没有再测试OrderSend()的返回值。

希望这些信息能帮助你。

 
figurelli:

你好,FinanceEngineer,请注意在你的原始代码中,你在if { }和else { }处有Print("OrderSend Code: "...) 。

但是else { }有一个中断,而你的调试代码显示retcode = 10008 (TRADE_RETCODE_PLACED) x 10。

所以,根据推论,你是在打印if { }条件下的调试,而你的break从未被使用。

现在你改变了你的代码,看起来更清晰了,但是请注意,你没有再测试OrderSend()的返回值,只是测试了result.retcode。你可以用我之前问过的变量checkOrderSend(***看这里)来纠正这个问题。

所以,在我看来,首先要做的是纠正这个测试,并使用你报告的同一个有问题的经纪人再次检查。如果问题不再发生,恭喜你,你真的解决了这个错误,也就是说,这并不表明你的代码是未来的证明或最安全的,而是表明我们找到了这个错误。

事实上,你可以忘记或避免再次修改你的代码,因为错误没有发生,然而,在这种情况下,你必须注意你没有再测试OrderSend()的返回值。

希望这些信息能帮助你。

返回代码10010怎么办?

任何经纪商都有可能出现双份订单,Alpari出现双份订单的概率更大,因为你收到的点数更多。

 
angevoyageur:

那么返回的代码10010呢?

在任何经纪商上都可能发生双份订单,在Alpari上发生的概率更大,因为你收到的点数更多。

如果你问的是我,正如我之前说的,我不认为这个代码有足够的未来性和安全性,这只是关于缺乏回报代码的一个例子,所以请再读一遍。

然而,如果你要问代码作者,直接问他怎么样?

 
figurelli:

你好,FinanceEngineer,请注意在你的原始代码中,你在if { }和else { }处有Print("OrderSend Code: "...) 。

但是else { }有一个中断,你的调试代码显示retcode = 10008 (TRADE_RETCODE_PLACED) x 10。

所以,根据推论,你是在打印if { }条件下的调试,而你的break从未被使用。

现在你改变了你的代码,看起来更清晰了,但是请注意,你没有再测试OrderSend()的返回值,只是测试了result.retcode。你可以使用变量checkOrderSend(***看这里)来纠正这个问题,我之前问过这个问题。

所以,在我看来,首先要做的是纠正这个测试,并使用你报告的同一个有问题的经纪人再次检查。如果问题不再发生,恭喜你,你真的解决了这个错误,也就是说,这并不表明你的代码是未来的证明或最安全的,而是表明我们找到了这个错误。

事实上,你可以忘记或避免再次修改你的代码,因为错误没有发生,然而,在这种情况下,你必须注意,你不再测试OrderSend()的返回值了。

希望这些信息能帮助你。

你好

我知道这听起来很奇怪。当我在以前的代码中检查OrderSend(request,result)的返回值时,我得到了多个订单问题。 现在在我的新代码中,我没有检查OrderSend(request,result)的返回值(但我仍然将返回值分配给一些变量,以避免在新的终端构建中出现错误。

在新的代码中,我没有得到多个订单的问题。我使用的是英国Alpari公司,该公司以发送大量的ticks而闻名。 我的代码可能并不完美,但可以这样想。在Meta Trader 5中,有相当数量的返回代码需要检查。

首先是OrderCheck的返回值,其次是OrderSend的返回值,第三是在result.retcode分配的返回值。我认为无论前两个返回值是什么,我们真正应该关心的是最后一个加上实际执行的数量。

所以基于这个事实,我把我的代码简化了,直接去检查result.retcode。如果我说错了,请纠正我。我认为MT5的订单执行肯定比MT4要复杂得多,我们很多人都很困惑。

如果我们不能只用逻辑建立一个清晰的案例,那么我们可以用实验建立一个清晰的案例。所以我建议BlindMist或其他任何人用他们的经纪商试试这段代码,看看跳过检查OrderSend功能是否真的有帮助。

谨此致意。

 
figurelli:
如果你问的是我,正如我之前所说的,我不认为这个代码是未来的和足够安全的,这只是关于缺乏返回代码的一个例子,所以请再次阅读。

然而,如果你问的是代码的作者,那么直接问他怎么样?

我问参与这个主题的每个人。我错过了你关于代码10010的信息,它在哪里?

 
angevoyageur:

我问参与这个主题的每个人。我错过了你关于代码10010的信息,它在哪里?

你好,阿兰。

我不清楚你需要知道什么,因为我们只是在讨论FinanceEngineer 的新代码,以及关于测试OrderSend()的返回代码的建议,该代码已从原始代码中改变。

请注意,无论是他的原始代码还是他的新代码都没有代码10010的测试,所以如果这与你有关,你为什么不在他的第一篇帖子中就问?

总之,你能解释一下为什么你需要代码10010测试来填补 FOK政策 吗?

因为这不是我第一次看到你和其他版主谈论,你是否知道在某些情况下确实需要对FOK(Fill Or Kill)订单进行这种代码测试,你可以与我们分享?

谢谢你。

 
FinanceEngineer:

你好

我知道这听起来很奇怪。当我在以前的代码中检查OrderSend(request,result)的返回值时,我得到了多个订单问题。现在在我的新代码中,我没有检查OrderSend(request,result)的返回值(但我仍然将返回值分配给一些变量,以避免在新的终端构建中出现错误。

在新的代码中,我没有得到多个订单的问题。我使用的是英国Alpari公司,该公司以发送大量的ticks而闻名。我的代码可能并不完美,但可以这样想。在Meta Trader 5中,有相当数量的返回代码需要检查。

首先是OrderCheck的返回值,其次是OrderSend的返回值,第三是在result.retcode分配的返回值。我认为无论前两个返回值是什么,我们真正应该关心的是最后一个加上实际执行的数量。

所以基于这个事实,我把我的代码简化了,直接去检查result.retcode。如果我说错了,请纠正我。我认为MT5的订单执行肯定比MT4要复杂得多,我们很多人都很困惑。

如果我们不能只用逻辑建立一个清晰的案例,那么我们可以用实验建立一个清晰的案例。所以我建议BlindMist或其他任何人用他们的经纪商试试这段代码,看看跳过检查OrderSend功能是否真的有帮助。

衷心的问候。

  • 跳过OrderSend()的返回代码与双重订单问题无关。一个简单的巧合。
  • OrderCheck()也无关紧要,因为它只是在发送订单前防止一些错误。
  • 如果OrderSend()返回false,你就知道有问题了,所以你可以检查 哪个问题并根据你的需要进行处理。
  • 如果OrderSend()返回true,困难就开始了......见下一条信息。