我正在做MetaTrader5 Api的工作。有TickSubscribe (订阅与价格数据数据库中的更改相关联的事件)。函数和OnTick (新报价到达事件的处理程序)。事件。但是在.Net版本中,OnTick事件就像void一样工作,不像已知的事件,而且我无法理解它。我想要赶上OnTick事件,并看到每一个到达。
MTTickShort shot = new MTTickShort();
CIMTTickSink sink = new CIMTTickSink();
sink.OnTick("EURUSD", shot);
MTRetCode code = sink.RegisterSink();
code = m_manager.TickSubscribe(sink);
发布于 2022-08-30 13:02:29
从CIMTTickSink
添加派生类的
public class TickSink : CIMTTickSink
{
private readonly Action<string, MTTickShort> _handler;
public TickSink(Action<string, MTTickShort> handler)
{
_handler = handler ?? throw new ArgumentNullException(nameof(handler));
if (RegisterSink() != MTRetCode.MT_RET_OK) throw new Exception();
}
public override void OnTick(string symbol, MTTickShort tick) =>
_handler.Invoke(symbol, tick);
}
在CIMTTickSink
中很少有其他方法可以重写。我觉得你需要这个。分解来观察别人。
CIMTManagerAPI
SMTManagerAPIFactory.Initialize(@".\");
var managerApi = SMTManagerAPIFactory.CreateManager(SMTManagerAPIFactory.ManagerAPIVersion, out var ret);
if (ret != MTRetCode.MT_RET_OK) throw new Exception();
使用credentials:服务器IP和管理器用户连接managerApi
var ret = managerApi.Connect(
_ip,
_user,
_password,
null,
// probably this should not be FULL, but seems like mode affects nothing
CIMTManagerAPI.EnPumpModes.PUMP_MODE_FULL,
5_000);
if (ret != MTRetCode.MT_RET_OK) throw new Exception();
TickSink
作为处理程序,并订阅它:tickSink = new TickSink(_tickHandler);
var ret = managerApi.TickSubscribe(tickSink);
if (ret != MTRetCode.MT_RET_OK) throw new Exception();
CIMTTickSink
和CIMTManagerAPI
是一次性的。用连接包装它是活动的检查和重试等等.https://stackoverflow.com/questions/73408616
复制相似问题