You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:33:29