跨平台跟单系统的实现方式和技术原理(Manager篇)

发布于 2019-12-27 22:43:06

了解MT4 Manager的肯定知道mt4managerapimt4managerapi是迈达克针对MetaTrader 4 Manager提供的函数库,也就是客户管理端的C++函数库。可以编写mt4与crm之间中间件,提供开户等等功能,其中manager管理端有订单操作的功能,如图:

 图片1.png

同样函数库中也有相关订单操作的接口:

//--- orders
virtual int __stdcall TradeTransaction(TradeTransInfo *info) =0;
virtual TradeRecord* __stdcall TradesRequest(int *total)=0;
virtual TradeRecord* __stdcall TradeRecordsRequest(const int *orders,int *total)=0;
virtual TradeRecord* __stdcall TradesUserHistory(const int login,const __time32_t from,const __time32_t to,int *total)=0;
virtual int __stdcall TradeCheckStops(const TradeTransInfo *trade,const double price)=0;

所以通过该接口实现下单:

相关代码如下:

void ZMt4Utils::mt4UserOrderNew(std::string &_return, const int32_t login, const TradeCMD::type cmd,
                                const std::string &symbol, const int32_t volume, const double price,
                                const double stoploss, const double takeprofit,
                                const std::string &comment) {
    mt4Ping();

    TradeTransInfo info = {0};
    info.type = TT_BR_ORDER_OPEN;
    info.cmd = OP_BUY_LIMIT;
    strcpy(info.symbol, symbol.c_str());
    info.orderby = login;
    info.volume = volume;
    info.price = price;
    info.sl = stoploss;
    info.tp = takeprofit;
    int res = mi_->TradeTransaction(&info);
    if (RET_OK == res) {
        LOG(INFO) << "mt4UserOrderNew success";
        _return = "success:" + lexical_cast<std::string>(res);
    } else {
        LOG(ERROR) << "mt4UserOrderNew failed, return " << mi_->ErrorDescription(res);
        _return = "failure:" + lexical_cast<std::string>(res) + " => " + std::string(mi_->ErrorDescription(res));
    }
}
class ZMt4Utils : public ZNoCopyAble{
public:
    ZMt4Utils(MTAPI_NOTIFY_FUNC fnPUMPING = NULL);
    virtual ~ZMt4Utils();
public:
    static bool EnvInitOnce();
    void mt4Ping();
    void mt4UserOrderNew(std::string &_return, const int32_t login, const TradeCMD::type cmd,
                         const std::string &symbol, const int32_t volume, const double price, const double stoploss,
                         const double takeprofit, const std::string &comment);
private:
    static CManagerFactory fac_;
    CManagerInterface *mi_;

当然这里只有下单的功能,至于信号源,可以编写监听相关账户的订单变化的功能,或使用其他外部信号源来实现。

总之这种跟单方式,最大的优点就是通过官方已编写好的函数来实现,资源消耗小,速度快,但跟单必须使用manager的权限,也是其最大的弊端,如果要实现跨平台需要不同平台的权限,出于平台安全考虑,基本上做不到无限制跨平台,这也是其最大的缺点!!!

0 条评论

发布
问题