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
相关产品推荐
相关产品推荐

