首先在meta quote官网找到mt5 server和 manager的应用程序,下载下来之后安装好,在其文件夹目录下就有相关例程文件。
1、随便打开一个plugin工程文件,会发现它都有一个现成的类 CPluginInstance 。里面已经写好了基本框架。而通过查询文档https://support.metaquotes.net/en/docs/mt5/api/hook_list,发现可以引用这些hook
2、在MT5APIServer.h中以及其引用的附属.h文件中找到自己想要的功能,比如我们要添加order相关的控件,那么就找到MT5APIOrder.h,在这里发现四个类定义,分别是 class IMTOrder ,class IMTOrderArray ,class IMTOrderSink ,class IMTHistorySink。其中前两个是功能类,后两个是挂钩类,通过*Sink类的继承可以调用相应方法
3、在PluginInstance.h中继承以上提到的*Sink方法
class CPluginInstance : public IMTServerPlugin,
public IMTConPluginSink,
public IMTConSymbolSink,
public IMTDealSink,
public IMTOrderSink,
public IMTHistorySink,
public IMTPositionSink
{
...
}
在CPluginInstance类public中添加class IMTOrderSink ,class IMTHistorySink方法的实现
virtual void OnOrderAdd(const IMTOrder* /*order*/){ m_api->LoggerOut(MTLogWarn, L"hook OnOrderAdd"); }
virtual void OnOrderUpdate(const IMTOrder* /*order*/){ m_api->LoggerOut(MTLogWarn, L"hook OnOrderUpdate"); }
virtual void OnOrderDelete(const IMTOrder* /*order*/){ m_api->LoggerOut(MTLogWarn, L"hook OnOrderDelete"); }
virtual void OnOrderClean(const UINT64 /*login*/){ m_api->LoggerOut(MTLogWarn, L"hook OnOrderClean"); }
virtual void OnOrderSync(void){ m_api->LoggerOut(MTLogWarn, L"hook OnOrderSync"); }
virtual void OnHistoryAdd(const IMTOrder* /*order*/){ m_api->LoggerOut(MTLogWarn, L"hook OnHistoryAdd"); }
virtual void OnHistoryUpdate(const IMTOrder* /*order*/){ m_api->LoggerOut(MTLogWarn, L"hook OnHistoryUpdate"); }
virtual void OnHistoryDelete(const IMTOrder* /*order*/){ m_api->LoggerOut(MTLogWarn, L"hook OnHistoryDelete"); }
virtual void OnHistoryClean(const UINT64 /*login*/){ m_api->LoggerOut(MTLogWarn, L"hook OnHistoryClean"); }
virtual void OnHistorySync(void){ m_api->LoggerOut(MTLogWarn, L"hook OnHistorySync"); }
4、在CPluginInstance类的Start和Stop方法中添加class IMTOrderSink ,class IMTHistorySink的挂在使能语句
virtual MTAPIRES Start(IMTServerAPI *server);
virtual MTAPIRES Stop(void)
而挂载和卸载语句在MT5APIServer.h中
class IMTServerAPI
{
public:
...
virtual MTAPIRES OrderSubscribe(IMTOrderSink* sink)=0;
virtual MTAPIRES OrderUnsubscribe(IMTOrderSink* sink)=0;
...
virtual MTAPIRES HistorySubscribe(IMTHistorySink* sink)=0;
virtual MTAPIRES HistoryUnsubscribe(IMTHistorySink* sink)=0;
...
}
添加到CPluginInstance类的Start和Stop方法中
MTAPIRES CPluginInstance::Start(IMTServerAPI* api)
{
//--- check pointer
if(!api)
return(MT_RET_ERR_PARAMS);
//--- save pointer to Server API interface
m_api=api;
//--- create plugin config
m_config=m_api->PluginCreate();
if(!m_config)
return(MT_RET_ERR_MEM);
//--- subscribe to plugin config updates
MTAPIRES res=m_api->PluginSubscribe(this);
if(res!=MT_RET_OK)
return(res);
//--- read plugin parameters
res=ParametersRead();
if(res!=MT_RET_OK)
return(res);
//--- subscribe to symbol events
res = m_api->SymbolSubscribe(this);
res = m_api->OrderSubscribe(this);
res = m_api->HistorySubscribe(this);
res = m_api->PositionSubscribe(this);
//--- primary synchronization
OnSymbolSync();
//--- ok
return(res);
}
//+------------------------------------------------------------------+
//| Stop plugin |
//+------------------------------------------------------------------+
MTAPIRES CPluginInstance::Stop(void)
{
//--- clean config object
if(m_config)
{
m_config->Release();
m_config=NULL;
}
//--- check pointer
if(!m_api)
return(MT_RET_OK);
//--- unsubscribe from symbol events
MTAPIRES res=m_api->SymbolUnsubscribe(this);
if((res!=MT_RET_OK) && (res!=MT_RET_ERR_NOTFOUND))
m_api->LoggerOut(MTLogErr,L"failed to unsubscribe from symbol events [%s (%u)]", SMTFormat::FormatError(res),res);
//--- unsubscribe from plugin config updates & clean API
res = m_api->PluginUnsubscribe(this);
res = m_api->HistoryUnsubscribe(this);
res = m_api->OrderUnsubscribe(this);
res = m_api->PositionUnsubscribe(this);
if((res!=MT_RET_OK) && (res!=MT_RET_ERR_NOTFOUND))
m_api->LoggerOut(MTLogErr, L"failed to unsubscribe from plugin config updates [%s (%u)]",SMTFormat::FormatError(res),res);
//--- clear Server API pointer
m_api=NULL;
//--- ok
return(MT_RET_OK);
}