MQL4中positions变量值无法更新问题求助
问题分析与解决
核心问题原因
你的positions变量始终为0,大概率是**OrderSend下单失败**,导致positions++/positions--代码根本没执行;另外代码结构也存在细节问题,影响变量状态更新:
- 未检查
OrderSend返回值:MQL4中OrderSend下单成功返回正订单号,失败返回-1。如果因账户余额不足、滑点超限、交易时段限制等原因下单失败,后续的positions增减操作不会触发,变量自然保持0。 - 多余代码嵌套:
OnTick内多套了一层无意义的大括号,虽不影响逻辑,但降低可读性,建议移除。 - 持仓同步风险:即使下单成功,若存在手动平仓、其他EA干预平仓的情况,
positions会和实际持仓脱节,但当前变量始终为0的问题优先由下单失败导致。
修复后的代码示例
void OnTick() { double stoch = iStochastic(NULL, 0, 14, 3, 3, 0, 1, 0, 0); int number_of_order = OrdersTotal(); static int positions = 0; // 无持仓时尝试开仓 if(number_of_order == 0) { if(stoch <= 20) { int purchase_order = OrderSend(_Symbol, OP_BUY, 0.01, Ask, 0, 0, 0, NULL, 0, 0, clrNONE); // 仅下单成功时更新positions if(purchase_order > 0) { positions++; } else { // 输出错误码排查问题 Alert("多单下单失败,错误码:", GetLastError()); } } else if(stoch >= 80) { int sales_order = OrderSend(_Symbol, OP_SELL, 0.01, Bid, 0, 0, 0, NULL, 0, 0, clrNONE); // 仅下单成功时更新positions if(sales_order > 0) { positions--; } else { Alert("空单下单失败,错误码:", GetLastError()); } } } Alert(positions); // 平多单逻辑 if(stoch > 70 && positions == 1) { Close_Trade(); positions--; } // 平空单逻辑 if(stoch < 30 && positions == -1) { Close_Trade(); positions++; } } //+------------------------------------------------------------------+
额外建议
- 用
GetLastError()获取OrderSend失败的错误码,可精准排查问题(比如错误码131代表无效止损,2代表账户资金不足)。 - 为避免
positions与实际持仓脱节,建议在OnTick开头主动同步持仓状态:
这样即使有外部操作改变持仓,// 同步实际持仓到positions变量 positions = 0; for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == _Symbol) { if(OrderType() == OP_BUY) positions++; else if(OrderType() == OP_SELL) positions--; } }positions也能保持准确。
内容的提问来源于stack exchange,提问作者Rafał
相关产品推荐
相关产品推荐

