mt5 plugin 编程步骤

首先在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);
  }
发布了64 篇原创文章 · 获赞 3 · 访问量 4588

猜你喜欢

转载自blog.csdn.net/qq_37631516/article/details/102501738