求教,MT4同时下达多个挂单有时候会部分失败!!!

 

求大神指点,MT4在达到下单条件后同时下多个挂单会出现部分订单未正确下达。

请问是否下单太快服务器不能同时接受多个订单指令?

该怎么处理?

下单代码如下

OrderSend(Symbol(),OP_BUYLIMIT,0.01,Ask,10,止损,止盈,"Symble+buy",magic,0,clrMediumSpringGreen);

OrderSend(Symbol(),OP_BUYLIMIT,0.02,Ask,10,止损,止损 ,"Symble+buy",magic,0,clrMediumSpringGreen);

 
c15years:

求大神指点,MT4在达到下单条件后同时下多个挂单会出现部分订单未正确下达。

请问是否下单太快服务器不能同时接受多个订单指令?

该怎么处理?

下单代码如下

OrderSend(Symbol(),OP_BUYLIMIT,0.01,Ask,10,止损,止盈,"Symble+buy",magic,0,clrMediumSpringGreen);

OrderSend(Symbol(),OP_BUYLIMIT,0.02,Ask,10,止损,止损 ,"Symble+buy",magic,0,clrMediumSpringGreen);

你掛限價單是不是掛的很近?

當你手動下掛單的時候

通常都會顯示:掛單價必需遠離市價xx點


如果你掛單靠的很近…那市價再滑一下…自然無法掛成功

再來就是…直接看日誌上的錯誤寫啥會更清楚問題在哪

 
x7777748:

你掛限價單是不是掛的很近?

當你手動下掛單的時候

通常都會顯示:掛單價必需遠離市價xx點


如果你掛單靠的很近…那市價再滑一下…自然無法掛成功

再來就是…直接看日誌上的錯誤寫啥會更清楚問題在哪

挂单超过服务器规定的,这点应该没问题。

主要是日志也没报错信息,头大~~~

我的EA是要求下3个挂单,系统下通常下1-3个,很是头疼。

需不需在挂单中间加上时间限制,比如100毫秒下一单,该怎么操作,求解惑!

 
c15years:

求大神指点,MT4在达到下单条件后同时下多个挂单会出现部分订单未正确下达。

请问是否下单太快服务器不能同时接受多个订单指令?

该怎么处理?

下单代码如下

OrderSend(Symbol(),OP_BUYLIMIT,0.01,Ask,10,止损,止盈,"Symble+buy",magic,0,clrMediumSpringGreen);

OrderSend(Symbol(),OP_BUYLIMIT,0.02,Ask,10,止损,止损 ,"Symble+buy",magic,0,clrMediumSpringGreen);

int t1=OrderSend(Symbol(),OP_BUYLIMIT,0.01,Ask+((MarketInfo(Symbol(),MODE_STOPLEVEL)+10)/MarketInfo(Symbol(),MODE_LOTSIZE)),10,止损,止盈,"Symble+buy",magic,0,clrMediumSpringGreen);

int t2=OrderSend(Symbol(),OP_BUYLIMIT,0.02,Ask+((MarketInfo(Symbol(),MODE_STOPLEVEL)+20)/MarketInfo(Symbol(),MODE_LOTSIZE)),10,止损,止盈,"Symble+buy",magic,0,clrMediumSpringGreen);


掛單須跟市價有最小的點差 各平台規定不一樣 後面增加10,20點是避免市價波動劇烈時超出規定點差

 
Hung Wen Lin:

int t1=OrderSend(Symbol(),OP_BUYLIMIT,0.01,Ask+((MarketInfo(Symbol(),MODE_STOPLEVEL)+10)/MarketInfo(Symbol(),MODE_LOTSIZE)),10,止损,止盈,"Symble+buy",magic,0,clrMediumSpringGreen);

int t2=OrderSend(Symbol(),OP_BUYLIMIT,0.02,Ask+((MarketInfo(Symbol(),MODE_STOPLEVEL)+20)/MarketInfo(Symbol(),MODE_LOTSIZE)),10,止损,止盈,"Symble+buy",magic,0,clrMediumSpringGreen);


掛單須跟市價有最小的點差 各平台規定不一樣 後面增加10,20點是避免市價波動劇烈時超出規定點差

感谢回答!但是我的平台挂单可以1点差挂单,而且我的挂单都距离市价有50-100点距离,应该不是这个问题。

 
c15years:

感谢回答!但是我的平台挂单可以1点差挂单,而且我的挂单都距离市价有50-100点距离,应该不是这个问题。

那不然就是你下掛單時要判斷是否下單成功、若不成功再重下一次…直到訂單成功為止、再處理下一個掛單

應該就能解決這個問題了…


以自帶的範例來修改成你的開倉條件就會是…


ticket=OrderSend(Symbol(),OP_BUYLIMIT,0.01,Ask,10,止损,止盈,"Symble+buy",magic,0,clrMediumSpringGreen);

if(ticket>0)

{

  if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){Print("BUY order opened : ",OrderOpenPrice());}

}

else{

  Print("Error opening BUY order : ",GetLastError());

  //這邊加上再次下單的代碼、寫成開倉的函數也許會比較方便

}

 
c15years:

感谢回答!但是我的平台挂单可以1点差挂单,而且我的挂单都距离市价有50-100点距离,应该不是这个问题。

根據你提供的代碼

OrderSend(Symbol(),OP_BUYLIMIT,0.01,Ask,10,止损,止盈,"Symble+buy",magic,0,clrMediumSpringGreen);

就是Price的錯誤 修改過後就能執行

如果編碼沒錯 同時發送三單 一般服務器是會有漏單 編法要修改

你可以用做標記的方式 或是定義一個計算器 讓程序確保三單全都發送

if(OrderSend=="buy")       //接受下單信號
  {
   OrderQTY   = 
下單數量 ;   //確認本次下單的數量
   OrderTimes = 
下單數量 ;   
   OrderSend  = "NoWork";  //終止下單的信號
  }

if(OrderTimes!=0)
  for(int i=OrderQTY;i<=0;i--)
     {
      int Tick=OrderSend(Symbol(),OP_BUYLIMIT,0.01,Ask,10,止损,止盈,"Symble+buy",magic,0,clrMediumSpringGreen);
      if(OrderSelect(Tick,SELECT_BY_TICKET,MODE_TRADES))
         {
          Print("Order Depend")  //確認下單成功
          OrderTimes--;          //下單成功時下單數量減一
         }
      else
         Print("Error opening BUY order : ",GetLastError());  //確認下單失敗
     }
     
         

擷取樓上部分的代碼

代碼順序我沒試過  大概是這樣的邏輯

 
c15years:

求大神指点,MT4在达到下单条件后同时下多个挂单会出现部分订单未正确下达。

请问是否下单太快服务器不能同时接受多个订单指令?

该怎么处理?

下单代码如下

OrderSend(Symbol(),OP_BUYLIMIT,0.01,Ask,10,止损,止盈,"Symble+buy",magic,0,clrMediumSpringGreen);

OrderSend(Symbol(),OP_BUYLIMIT,0.02,Ask,10,止损,止损 ,"Symble+buy",magic,0,clrMediumSpringGreen);

你的代码写的不标准,思路也有问题,Ask即时价格下同时入场2-3单? 正常不应该这么写的,挂单一定要距离现价多少个点,你点告诉电脑,不要让电脑去猜,玩极限距离

这是正规的挂单代码:

            double orderprice3=Bid+200*Point();

            double stoploss3=orderprice3+420*Point();

            if(OrderSend(Symbol(),OP_SELLLIMIT,0.01,orderprice3,50,stoploss3,0,"defencegua1",333,clrNONE)<0)

              {

               Print("OP_SELLLIMIT 333 failed with error #",GetLastError());

              }


            double orderprice4=Bid+400*Point();

            double stoploss4=orderprice4+220*Point();

            if(OrderSend(Symbol(),OP_SELLLIMIT,0.01,orderprice4,50,stoploss4,0,"defencegua2",333,clrNONE)<0)

              {

               Print("OP_SELLLIMIT 333 failed with error #",GetLastError());

              }