MQL4编写的EA调用OrderSend()下单后,图表不显示订单标记线
解决MQL4 EA下单后图表不显示开仓价/SL/TP水平线的问题
以下是几个排查和解决的方向:
1. 确认MT4平台的交易水平显示设置
打开MT4顶部菜单栏的「工具」→「选项」→「图表」标签,确保勾选了「显示交易水平」选项。虽然你提到手动下单能显示,但仍需确认这个全局开关未被意外关闭。
2. 检查SL/TP参数是否有效
你的OrderSend代码中,sl和tp参数若赋值为0,订单将不会设置止损/止盈,自然不会显示对应的水平线。请确认这两个变量:
- 已赋值为有效的价格(比如多单的SL要低于当前ask价,空单的SL要高于当前bid价,且满足平台最小止损距离要求)
- 未被错误设为0或无效值
3. 手动通过代码绘制水平线
如果平台设置正常且订单有有效SL/TP,但仍不显示,可在EA中手动调用绘图函数生成水平线。开仓成功后添加以下逻辑:
if(OrderNumber > 0) { // 获取订单关键价格 double openPrice = OrderOpenPrice(); double stopLoss = OrderStopLoss(); double takeProfit = OrderTakeProfit(); string ticketStr = IntegerToString(OrderNumber); // 绘制开仓价水平线 ObjectCreate(0, "Open_" + ticketStr, OBJ_HLINE, 0, 0, openPrice); ObjectSetInteger(0, "Open_" + ticketStr, OBJPROP_COLOR, clrGreen); ObjectSetInteger(0, "Open_" + ticketStr, OBJPROP_STYLE, STYLE_SOLID); ObjectSetInteger(0, "Open_" + ticketStr, OBJPROP_WIDTH, 1); // 绘制止损线(仅当SL有效时) if(stopLoss > 0) { ObjectCreate(0, "SL_" + ticketStr, OBJ_HLINE, 0, 0, stopLoss); ObjectSetInteger(0, "SL_" + ticketStr, OBJPROP_COLOR, clrRed); ObjectSetInteger(0, "SL_" + ticketStr, OBJPROP_STYLE, STYLE_DASH); ObjectSetInteger(0, "SL_" + ticketStr, OBJPROP_WIDTH, 1); } // 绘制止盈线(仅当TP有效时) if(takeProfit > 0) { ObjectCreate(0, "TP_" + ticketStr, OBJ_HLINE, 0, 0, takeProfit); ObjectSetInteger(0, "TP_" + ticketStr, OBJPROP_COLOR, clrBlue); ObjectSetInteger(0, "TP_" + ticketStr, OBJPROP_STYLE, STYLE_DASH); ObjectSetInteger(0, "TP_" + ticketStr, OBJPROP_WIDTH, 1); } }
注意:订单平仓后要记得删除对应的水平线,避免图表杂乱。可以在EA的deinit()函数或订单平仓逻辑中调用ObjectDelete(0, "Open_" + ticketStr)等语句清理对象。
4. 确认下单品种与当前图表一致
如果你的EA在A品种图表运行,但order_symbol参数指定的是B品种,MT4只会在B品种的图表显示该订单的水平线,当前A品种图表不会显示。请确保下单品种与EA运行的图表品种一致。
内容的提问来源于stack exchange,提问作者rerat
相关产品推荐
相关产品推荐

