如何在相同交易条件下持续开单,批量挂单且不重复生成新订单
MQL4挂单逻辑问题修复方案
你的代码存在多个明显的逻辑错误,导致未达到预期效果,具体问题和修正方案如下:
现存问题
- 逻辑判断运算符错误:统计订单时错误使用了
&&(逻辑与),订单类型不可能同时为两种,所以openCount和openpendCount永远为0,应该改为||(逻辑或)。 - 魔术号判断不统一:统计订单时判定魔术号为
0,但发单时使用的是MAGIC常量,若MAGIC不为0则永远统计不到已发挂单,会重复发单。 - 挂单价位冗余且可能出错:
Ask+(upper-Ask)等价于upper,Ask-(Bid-lower)在点差波动时可能偏离你想要的前低价位,直接使用upper和lower作为挂单价更符合你在前高前低挂单的需求。 - 缺少发单结果校验:未判断
OrderSend的返回值,无法感知发单失败的情况。 - 注释错误:统计挂单的代码注释误写为统计市价单。
修正后代码
// 计算前高前低 double upper = iHigh(Symbol(), Period(), iHighest(Symbol(), Period(), MODE_HIGH, periods, 0)); double lower = iLow(Symbol(), Period(), iLowest(Symbol(), Period(), MODE_LOW, periods, 0)); Comment("Upper: ", upper, "\nLower: ", lower); int openCount = 0; int openpendCount = 0; // 遍历所有订单统计数量 for(int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == MAGIC && // 和发单使用的魔术号保持一致 OrderSymbol() == _Symbol) { // 统计市价持仓单 if(OrderType() == OP_SELL || OrderType() == OP_BUY) openCount++; // 统计限价挂单 if(OrderType() == OP_SELLLIMIT || OrderType() == OP_BUYLIMIT) openpendCount++; } } // 无持仓无挂单时发单 if(openCount == 0 && openpendCount == 0) { // 在前高挂SELLLIMIT int sellLimitTicket = OrderSend(Symbol(), OP_SELLLIMIT, 1, upper, 3, 0, 0, "Sub Sell", MAGIC, 0, Blue); if(sellLimitTicket < 0) { Print("SELLLIMIT发单失败,错误码:", GetLastError()); } // 在前低挂BUYLIMIT int buyLimitTicket = OrderSend(Symbol(), OP_BUYLIMIT, 1, lower, 3, 0, 0, "Sub Buy", MAGIC, 0, Blue); if(buyLimitTicket < 0) { Print("BUYLIMIT发单失败,错误码:", GetLastError()); } }
防重复下单逻辑说明
每次触发交易条件前,先遍历所有订单,统计同品种、同魔术号的持仓单和挂单数量,只要数量不为0就跳过发单环节,即可避免重复生成订单。如果需要区分不同类型的挂单避免重复,可以单独统计对应类型的挂单数量即可。
内容的提问来源于stack exchange,提问作者linlin
相关产品推荐
相关产品推荐

