MQL5 EA开发:MACD指标处于调试模式无法显示振荡器求助
解决MQL5 EA中MACD振荡器无法正常显示的问题
我正在开发一款基于MACD交叉信号的MQL5智能交易系统(EA),代码如下:
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ input double lotSize = 0.1; input int macdFastEMA = 12; input int macdSlowEMA = 26; input int macdSignalSMA = 9; int macdHandle; double macdMain[], macdSignal[]; bool positionOpened = false; //+------------------------------------------------------------------+ int OnInit() { macdHandle = iMACD(_Symbol, _Period, macdFastEMA, macdSlowEMA, macdSignalSMA, PRICE_CLOSE); if(macdHandle == INVALID_HANDLE) { Print("获取MACD句柄失败"); return(INIT_FAILED); } ArraySetAsSeries(macdMain, true); ArraySetAsSeries(macdSignal, true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ void OnTick() { if(!CopyBuffer(macdHandle, 0, 0, 3, macdMain) || !CopyBuffer(macdHandle, 1, 0, 3, macdSignal)) { Print("复制MACD数据失败"); return; } double prevMacd = macdMain[1]; double prevSignal = macdSignal[1]; double currMacd = macdMain[0]; double currSignal = macdSignal[0]; // 检查金叉 if(prevMacd < prevSignal && currMacd > currSignal && !PositionSelect(_Symbol)) { OpenTrade(ORDER_TYPE_BUY); } // 检查死叉 if(prevMacd > prevSignal && currMacd < currSignal && !PositionSelect(_Symbol)) { OpenTrade(ORDER_TYPE_SELL); } } //+------------------------------------------------------------------+ void OpenTrade(ENUM_ORDER_TYPE type) { double price = (type == ORDER_TYPE_BUY) ? SymbolInfoDouble(_Symbol, SYMBOL_ASK) : SymbolInfoDouble(_Symbol, SYMBOL_BID); double sl = 0, tp = 0; trade.Buy(lotSize, _Symbol, price, sl, tp, NULL); if(type == ORDER_TYPE_SELL) trade.Sell(lotSize, _Symbol, price, sl, tp, NULL); } //+------------------------------------------------------------------+ #include <Trade\Trade.mqh> CTrade trade;
当前图表上的MACD指标旁显示“Debugging”标识,振荡器无法正常显示。请问需要补充什么设置或代码才能让MACD振荡器在图表上正常显示?
问题原因
你代码中用iMACD()获取的是指标计算数据的句柄,仅用于EA内部逻辑计算,不会在图表上绘制可视化的MACD振荡器。图表上的“Debugging”标识是EA处于调试运行状态的提示,和指标显示无关。
解决方案
方案1:手动加载MACD指标(最简方式)
直接在MT5图表上操作:
- 点击顶部菜单
插入 -> 指标 -> 振荡器 -> MACD - 在参数设置窗口中,将快速EMA设为12、慢速EMA设为26、信号SMA设为9、应用价格选收盘价,和EA参数完全一致
- 确认后MACD振荡器会正常显示在图表的独立窗口中,不影响EA运行
方案2:让EA自动绘制MACD指标(代码实现)
如果需要EA启动时自动在图表上加载MACD,修改OnInit()函数,添加IndicatorCreate()创建可视化指标实例:
int OnInit() { // 先获取内部计算用的MACD句柄 macdHandle = iMACD(_Symbol, _Period, macdFastEMA, macdSlowEMA, macdSignalSMA, PRICE_CLOSE); if(macdHandle == INVALID_HANDLE) { Print("获取MACD句柄失败"); return(INIT_FAILED); } // 在图表上创建可视化的MACD指标 long chartMACD = IndicatorCreate(_Symbol, _Period, INDICATOR_MACD, INDICATOR_INDICATOR, 0, macdFastEMA, macdSlowEMA, macdSignalSMA, PRICE_CLOSE); if(chartMACD == INVALID_HANDLE) { Print("创建图表MACD指标失败,错误码:", GetLastError()); } ArraySetAsSeries(macdMain, true); ArraySetAsSeries(macdSignal, true); return(INIT_SUCCEEDED); }
额外修复:原代码交易逻辑的错误
你的OpenTrade()函数存在逻辑问题:当执行卖单时,会先触发一次买单,再执行卖单,导致重复交易。修改为:
void OpenTrade(ENUM_ORDER_TYPE type) { double price = (type == ORDER_TYPE_BUY) ? SymbolInfoDouble(_Symbol, SYMBOL_ASK) : SymbolInfoDouble(_Symbol, SYMBOL_BID); double sl = 0, tp = 0; if(type == ORDER_TYPE_BUY) trade.Buy(lotSize, _Symbol, price, sl, tp, NULL); else trade.Sell(lotSize, _Symbol, price, sl, tp, NULL); }
内容的提问来源于stack exchange,提问作者Heli
相关产品推荐
相关产品推荐

