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

C#对接MetaTrader5 API无法处理OnTick事件求助

解决MetaTrader5 .Net版本OnTick回调监听问题

问题核心

MT5 .Net API的OnTick并非标准C#事件,而是通过回调接收器(Sink)机制实现的——你得自定义接收器类并重写OnTick方法,才能捕获新报价事件,而不是像你代码里那样直接调用sink的OnTick方法。

修正后的代码实现

首先自定义一个继承自CIMTTickSink的类,重写OnTick方法来处理报价:

// 自定义Tick接收器类,重写OnTick处理逻辑
public class CustomTickSink : CIMTTickSink
{
    public override void OnTick(string symbol, MTTickShort tick)
    {
        // 这里写你处理新报价的逻辑
        Console.WriteLine($"收到{symbol}报价:买价{tick.bid},卖价{tick.ask},时间{tick.time}");
    }
}

然后在主逻辑里完成注册和订阅:

// 假设m_manager已经完成与MT5服务器的连接初始化
// 创建自定义接收器实例
CustomTickSink customSink = new CustomTickSink();

// 注册接收器
MTRetCode registerCode = customSink.RegisterSink();
if (registerCode != MTRetCode.MT_RET_OK)
{
    Console.WriteLine($"接收器注册失败:{registerCode}");
    return;
}

// 订阅EURUSD的Tick数据
MTRetCode subscribeCode = m_manager.TickSubscribe(customSink, "EURUSD");
if (subscribeCode != MTRetCode.MT_RET_OK)
{
    Console.WriteLine($"订阅EURUSD失败:{subscribeCode}");
    // 失败时记得注销接收器释放资源
    customSink.UnregisterSink();
}

关键注意事项

  • 别直接调用sink.OnTick,这只是手动触发方法,真正的新报价回调会由MT5 API自动调用你重写的OnTick方法。
  • 必须确保m_manager已经完成服务器连接和认证,否则订阅操作会失败。
  • 不再需要监听时,记得调用UnregisterSink()和TickUnsubscribe()释放资源,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Predlona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:15:10