如何只开一个挂单,不用time,bar 控制,请教高手

 
如何只开一个挂单,不用time,bar 控制,请教高手。以前在MT4上可以设一个bool变量为false,再用magic或comment来识别,只要开出一个带有 magic或comment 的挂单,bool变量变为true,就不会再开第二个挂单了,但是在MT5上却无法实现。请高手指教。
 
Xiao Qiang Zhao:
如何只开一个挂单,不用time,bar 控制,请教高手。以前在MT4上可以设一个bool变量为false,再用magic或comment来识别,只要开出一个带有 magic或comment 的挂单,bool变量变为true,就不会再开第二个挂单了,但是在MT5上却无法实现。请高手指教。
ulong Sellorder(double orderprice,double lots)  //防重复挂单

{

   ulong a = 0;

   int total_orders = OrdersTotal();

   int total_position = PositionsTotal();

   if (total_position > 0) return(0);

   for(int i = total_orders - 1; i >= 0; i--)

   {

      if(OrderGetTicket(i) > 0)

      {

         if(OrderGetString(ORDER_SYMBOL) == symbol )//&& (OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_LIMIT || OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP || OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP_LIMIT) && OrderGetInteger(ORDER_MAGIC) == magic)

         {

            a = 1;

            return(0);

         }

      }

   }

   if(a == 0)

   {

      a = Sellorder(orderprice,lots);

   }

   return(a);

}

你可以试试是不是你要的,其中注释部分可以按照你需要的选择是否使用。

 

感谢Blur Darkness详细的解答。

我是要开多个单子,同时有多个同向和反向单子存在,不是一单一平仓的。

if (total_position > 0) return(0);

if (total_position > 0) return(0);我看到这段代码,意思应该是:如果总的持仓量大于0,就返回0,返回0也意味着a==0,就会又开出一单。这样就达不到控制只开一个挂单的要求 了。请帮忙再给看一下怎样解决。

现在用我的办法也能实现只开一个挂单,问题是:当同时存在的单子多了以后无法精准控制一次只开出一单。

如何只开一个挂单

Blur Darkness
Blur Darkness
  • 2022.04.21
  • www.mql5.com
交易者的个人资料
 

想要控制開單數量 最簡單的方法就是判斷使否已經存在EA開出的單子 

//----MT4
if(OrdersTotal()!=0)
   int tick=OrderSend(......);

//----MT5
if(OrdersTotal()!=0 || PositionsTotal()!=0)
  if(!OrderSend(request,result))
     ......;

粗略的方法就是用Bar控制 一根K只允許執行一次動作 精準點就用時間控制 在特定時間只允許執行一次動作(可以精準到ms)

另外就是設計開單信號 出現信號執行動作 執行完清除信號 (這個信號成形的條件跟清除的細節很多)

我判斷你的問題 應該在使用MT5的方法有誤區 

MT5分 在單子分為Position(持倉單 MT4為OP_BUY OP_SELL)跟Order(訂單OP_BUYLIMIT OP_SELLSTOP........)

使用MT5一樣只要抓出列表上帶有設定的magic及command的Order數量 這樣應該就可以達到你的要求

 

感谢Hung Wen Lin提出的方法。

一、用bar或time控制开单会出现在一根bar或time时行情大幅上升或大幅下跌,比如3000点或更多,这样就不能用开反向对冲单控制风险了,只能等到下一个bar或time出现了,此时在用对冲又不合适了。从我发的截图可以看到空单已经到了第三层了,所以用PositionsTotal()!=0还是不行。

二、我也用上了magic、comment来识别订单,也达到如果存这个 magic、commen的单子就不要再开这样单子了,但是还是开出同样的单子。

三、在MT4上用 magic、comment来识别订单,就可以控制不再开同样的单子,但在MT5上就无法实现。

四、我现在用的是OrdersTotal()<1,PositionGetTicket(0)<1,来开出第一单,第二单用 OrdersTotal()<1,PositionGetTicket(1)<2, 第三单用 OrdersTotal()<1,PositionGetTicket(2)<3。如果只是开单向的多单或空单这样做是可以开出所需要的很多单子的,但是还需要一边不断的开出空单,还要向上开出对冲的多单,第一个多单浮亏到一定点位时,不平浮亏第一层多单,再开出第二个多单,或再次下跌再开出多单,这时PositionGetTicket()就无法精准控制了。

还望高手们再次指教。

Hung Wen Lin
Hung Wen Lin
  • 2022.04.14
  • www.mql5.com
交易者的个人资料
 
Xiao Qiang Zhao:
如何只开一个挂单,不用time,bar 控制,请教高手。以前在MT4上可以设一个bool变量为false,再用magic或comment来识别,只要开出一个带有 magic或comment 的挂单,bool变量变为true,就不会再开第二个挂单了,但是在MT5上却无法实现。请高手指教。

理解不了你的意思,也无法给你答案。但有一点可以确认,如果mt4能够完成你需求的话,那么mt5也是完全可以实现的。不存在无法实现的问题。

既然你mt4上是好用的,那么你的问题就是一句话,“ mt5上如何实现 ”?

贴出你mt4的代码,转成mt5的即可,这是最快的解决方式,说了一大堆,都没说到关键点上。

 
Xiao Qiang Zhao #:

感谢Hung Wen Lin提出的方法。

一、用bar或time控制开单会出现在一根bar或time时行情大幅上升或大幅下跌,比如3000点或更多,这样就不能用开反向对冲单控制风险了,只能等到下一个bar或time出现了,此时在用对冲又不合适了。从我发的截图可以看到空单已经到了第三层了,所以用PositionsTotal()!=0还是不行。

二、我也用上了magic、comment来识别订单,也达到如果存这个 magic、commen的单子就不要再开这样单子了,但是还是开出同样的单子。

三、在MT4上用 magic、comment来识别订单,就可以控制不再开同样的单子,但在MT5上就无法实现。

四、我现在用的是OrdersTotal()<1,PositionGetTicket(0)<1,来开出第一单,第二单用 OrdersTotal()<1,PositionGetTicket(1)<2, 第三单用 OrdersTotal()<1,PositionGetTicket(2)<3。如果只是开单向的多单或空单这样做是可以开出所需要的很多单子的,但是还需要一边不断的开出空单,还要向上开出对冲的多单,第一个多单浮亏到一定点位时,不平浮亏第一层多单,再开出第二个多单,或再次下跌再开出多单,这时PositionGetTicket()就无法精准控制了。

还望高手们再次指教。

上次跟你說了 應該就是MT5的使用方法有錯誤 所以達不到你要的功能

就如樓上說的 MT4能做到 MT5就一定能完成

你不想將所有代碼公布的話(懂的人也懶得去看太長篇的代碼)可以把你覺得有問題的代碼塊放上來 看看有沒有人願意幫忙修正

原因: