请问mql4 有没有类拟 mql5 里的 OnTrade() 函数

 
请问mql4 有没有类拟 mql5 里的 OnTrade() 函数, 当增加\ 减少\ 修改 订单时再调用一次

如果没有,你能不能提供类拟这种的功能的方法? 谢谢
 

没有.

这种订单处理中的相关消息除非官方升级MT4提供对应函数, 别无他法.

 
Ziheng Zhuang #:

没有.

这种订单处理中的相关消息除非官方升级MT4提供对应函数, 别无他法.

如果是这样,只能自己写一个方法,来处理交易事件了
 

版主,我写了一个方法,目前亲测有效, 如果你有更好的建议,请指正, 谢谢!


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(OnTrades())
      Print(__FUNCTION__, " ", TimeCurrent());
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool OnTrades()
  {
   static int    last_total = WRONG_VALUE; // 初始化记录最后订单单数
   static double price[];                  // 静态储存所有单子的开仓价,包括挂单
   static double sl[];                     // 静态储存所有单子的止损价,包括挂单
   static double tp[];                     // 静态储存所有单子的止盈价,包括挂单
   int           total = OrdersTotal();    // 当前单子总数
   if(total != last_total)                 // 加载EA时,保证至少运行一次
     {
      Comment("Last Change Time: ", TimeCurrent());
      ArrayResize(price, total);           // 订单总数增加或减少时,重新格式化数组长度
      ArrayResize(sl, total);              // 订单总数增加或减少时,重新格式化数组长度
      ArrayResize(tp, total);              // 订单总数增加或减少时,重新格式化数组长度
      for(int i = 0; i < total; i++)       // 重新记录
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            price[i] = OrderOpenPrice();
            sl[i]    = OrderStopLoss();
            tp[i]    = OrderTakeProfit();
           }
      last_total = total;
      return(true);
     }
   else
     {
      // 订单总数没变化时,检查所有单子的挂单价,止损价,止盈价是否发生变化
      for(int i = 0; i < total; i++)
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            if(OrderOpenPrice() != price[i] ||
               OrderStopLoss() != sl[i] ||
               OrderTakeProfit() != tp[i])
              {
               Comment("Last Change Time: ", TimeCurrent());
               price[i] = OrderOpenPrice(); // 有变化,重新写入
               sl[i]    = OrderStopLoss();  // 有变化,重新写入
               tp[i]    = OrderTakeProfit();// 有变化,重新写入
               return(true);
              }
     }
   return(false);
  }
 

你看错了拉  我不是版主

MT5的OnTrade()过时了,有更好的替换函数OnTradeTransaction(...),订单处理过程中的消息由系统提供的三个参数trans,request,result来获取

void  OnTradeTransaction() 
   const MqlTradeTransaction&    trans,     // trade transaction structure 
   const MqlTradeRequest&        request,   // request structure 
   const MqlTradeResult&         result     // response structure 
   );


MT4中系统没有提供订单处理流程中的消息,如果你要做也只能是做订单监控,你上面的已经差不多了,建议把手数变化加进去, 把单子的信息组成一个结构体.

 
Ziheng Zhuang #:

你看错了拉  我不是版主

MT5的OnTrade()过时了,有更好的替换函数OnTradeTransaction(...),订单处理过程中的消息由系统提供的三个参数trans,request,result来获取


MT4中系统没有提供订单处理流程中的消息,如果你要做也只能是做订单监控,你上面的已经差不多了,建议把手数变化加进去, 把单子的信息组成一个结构体.

谢谢你的提醒,确实挂单的手数可以更改,这也算是交易事件,嗯,谢谢
 

还有其他信息,比如挂单的时间也会在成交后改变,所以还涉及如下信息

单子状态:挂单,市价单,已平仓,已删除,触发止损,触发止盈

 
Ziheng Zhuang #:

还有其他信息,比如挂单的时间也会在成交后改变,所以还涉及如下信息

单子状态:挂单,市价单,已平仓,已删除,触发止损,触发止盈

在MT4,修改一个订单的属性只有:

bool  OrderModify( 
   int        ticket,      // ticket 
   double     price,       // price 
   double     stoploss,    // stop loss 
   double     takeprofit,  // take profit 
   datetime   expiration,  // expiration 
   color      arrow_color  // color 
   );

挂单的手数并不能修改,如果被触发止损,触发止盈, 也就意味着,订单总数发生变化了, 所以你所建议的 单子状态:挂单,市价单,已平仓,已删除,触发止损,触发止盈 这些
情况可以忽略了, 谢谢你的讨论

原因: