MQL5中OnTick事件绘制垂直直线失败,求代码问题排查
MQL5 OnTick中绘制垂直线不显示的问题排查与修复
问题分析
你的代码存在几个关键问题,导致垂直线无法显示:
- 代码语法不完整:提供的代码缺少
if代码块和OnTick函数的闭合大括号,直接导致编译失败,EA/指标无法正常运行。 ObjectFind返回值判断错误:ObjectFind找到对象时返回索引值(≥0),未找到时返回-1。原代码!ObjectFind(...)的逻辑完全错误——当对象已存在时,返回的索引值(如0)取反后为true,会重复尝试创建对象触发错误;正确判断应为ObjectFind(0, "Line_10AM") == -1。- 时间判断精度不足:
OnTick仅在价格变动时触发,10:00整的瞬间可能没有tick触发,导致错过创建时机。 - 未设置跨时间帧可见性:默认创建的对象仅在当前时间帧可见,若切换时间帧会看不到直线。
修复后的完整代码
void OnTick() { MqlDateTime mqlDateTime; TimeToStruct(TimeCurrent(), mqlDateTime); // 放宽时间判断范围,避免因tick触发时机错过10:00整 if(mqlDateTime.hour == 10 && mqlDateTime.min == 0 && mqlDateTime.sec <= 5 && ObjectFind(0, "Line_10AM") == -1) { datetime targetTime = TimeCurrent(); if(!ObjectCreate(0, "Line_10AM", OBJ_VLINE, 0, targetTime, 0)) { Print("创建直线失败: ", GetLastError()); return; } // 设置直线样式属性 ObjectSetInteger(0, "Line_10AM", OBJPROP_COLOR, clrBlue); ObjectSetInteger(0, "Line_10AM", OBJPROP_STYLE, STYLE_SOLID); ObjectSetInteger(0, "Line_10AM", OBJPROP_WIDTH, 2); // 设置直线在所有时间帧可见 ObjectSetInteger(0, "Line_10AM", OBJPROP_TIMEFRAMES, TIMEFRAME_ALL); } }
更可靠的替代方案:使用OnTimer定时触发
如果依赖OnTick的触发时机不稳定,可以改用OnTimer事件定时检查,确保不会错过创建时间:
input int CheckInterval = 1000; // 检查间隔(毫秒) int OnInit() { EventSetTimer(CheckInterval); return(INIT_SUCCEEDED); } void OnTimer() { MqlDateTime mqlDateTime; TimeToStruct(TimeCurrent(), mqlDateTime); if(mqlDateTime.hour == 10 && mqlDateTime.min == 0 && ObjectFind(0, "Line_10AM") == -1) { datetime targetTime = TimeCurrent(); if(!ObjectCreate(0, "Line_10AM", OBJ_VLINE, 0, targetTime, 0)) { Print("创建直线失败: ", GetLastError()); return; } ObjectSetInteger(0, "Line_10AM", OBJPROP_COLOR, clrBlue); ObjectSetInteger(0, "Line_10AM", OBJPROP_STYLE, STYLE_SOLID); ObjectSetInteger(0, "Line_10AM", OBJPROP_WIDTH, 2); ObjectSetInteger(0, "Line_10AM", OBJPROP_TIMEFRAMES, TIMEFRAME_ALL); // 创建成功后关闭定时器,避免重复检查 EventKillTimer(); } } void OnDeinit(const int reason) { EventKillTimer(); }
内容的提问来源于stack exchange,提问作者lancegoh
相关产品推荐
相关产品推荐

