没有.
这种订单处理中的相关消息除非官方升级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中系统没有提供订单处理流程中的消息,如果你要做也只能是做订单监控,你上面的已经差不多了,建议把手数变化加进去, 把单子的信息组成一个结构体.
还有其他信息,比如挂单的时间也会在成交后改变,所以还涉及如下信息
单子状态:挂单,市价单,已平仓,已删除,触发止损,触发止盈
在MT4,修改一个订单的属性只有:
bool OrderModify( int ticket, // ticket double price, // price double stoploss, // stop loss double takeprofit, // take profit datetime expiration, // expiration color arrow_color // color );
挂单的手数并不能修改,如果被触发止损,触发止盈, 也就意味着,订单总数发生变化了, 所以你所建议的 单子状态:挂单,市价单,已平仓,已删除,触发止损,触发止盈 这些
情况可以忽略了, 谢谢你的讨论
如果没有,你能不能提供类拟这种的功能的方法? 谢谢