0

需求描述

客户本来有一个交易系统,要求mt4与该系统交互,做到与该系统数据同步。 
以下是客户的需求原文。

MT4只作为一个桌面版的交易工具,和WebTrader共用一个账号体系,MT4的所有功能最终都通过Web API连接券商系统的后台实现。MT4终端需要实现以下功能: 
●登录 
用户可以在MT4终端登录券商系统,登录后可以进行查询、下单、平仓等操作,MT4终端需要正确保存用户的登录状态,超时后需要重新登录。 
●查询账号保证金 
用户可以在MT4终端查询自己交易账号的保证金情况 
●查询持仓 
用户可以在MT4终端查询到自己交易账号的持仓情况 
●查询挂单 
用户可以在MT4终端查询到自己交易账号委托的LIMIT和STOP类型订单 
●查询交易记录 
用户可以在MT4终端查询到自己交易账号的历史交易记录 
●下单 
用户可以在MT4终端下单,订单抛给通过券商系统执行,成交后通过查询持仓和保证金更新用户的账号信息 
●撤单 
用户可以在MT4终端撤销自己委托的LIMIT和STOP类型的订单 
●平仓 
用户可以在MT4终端对交易账号中持仓的订单进行平仓,平仓成功后通过查询持仓和保证金更新用户的账号信息 
●设置止损 
用户可以在MT4终端对持仓中的订单设置或修改止损价位 
●设置止盈 
用户可以在MT4终端对持仓中的订单设置或修改止盈价位

实现细节

本文中将原有系统WebTrade简称为web接口.

1)登录

MT4的登录事件

int  APIENTRY        MtSrvUserLogin(const UserInfo *info)
  • 1

由于此事件需要在mt4验证过用户名密码后才能触发,所以用户帐号和密码必须已经存在于MT4中。 
MT4帮助对此事件的说明,如下

int APIENTRY MtSrvUserLogin(const UserInfo *info) 
Purpose- 
filter connections by clients. 
The hook is called after the client has successfully authorized by the server. This hook can be used to filter the client’s access to the server on basis of the own internal data. 
Parameters: 
info - client info 
Return values: 
TRUE - default value - allow login for this client 
FALSE - block the client’s login, return “account disabled” (RET_ACCOUNT_DISABLED), and close the connection

进入此事件后,插件根据UserInfo中的用户名与密码,去调用web接口进行用户名与密码验证,根据验证的结果返回此事件的结果值,从而决定MT4客户端是否能登录成功。如果web接口验证通过,则同时将用户的相关信息(余额,单据历史,单据)都全部同步到MT4中来, 需要用到以下几个MT4服务端接口。

int         __stdcall ClientsChangeBalance(const int login,const ConGroup *grp,const double value,LPCSTR comment);
int         __stdcall OrdersAdd(const TradeRecord *start,UserInfo* user,const ConSymbol *symb);
int         __stdcall OrdersUpdate(TradeRecord *order,UserInfo* user,const int mode);
  • 1
  • 2
  • 3

2)动态刷新数据

在服务的启动事件中开一个线程

int APIENTRY MtSrvStartup(CServerInterface *server)  
{
    //---- check version
    if(server==NULL)                        return(FALSE);
    if(server->Version()!=ServerApiVersion) return(FALSE);
    //---- save server interface link
    ExtServer=server;

    if (hThread == 0)
    {
        UINT     id;
        runing = true;
        hThread = _beginthreadex(NULL, 256000, DoCheckData, NULL, 0, &id);
    }

    return(TRUE);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在线程中定时向web接口请求当前在线的MT4用户的相关数据(余额,持仓单据等),然后与MT4内的数据进行比较,将有差异的地方进行修正。

3)下单相关处理

交易事件

int APIENTRY MtSrvTradeTransaction(TradeTransInfo *trans,const UserInfo *user,int *request_id)
{
    if (trans->type == TT_ORDER_IE_OPEN 
        || trans->type == TT_ORDER_IE_CLOSE
        || trans->type == TT_ORDER_PENDING_OPEN
        || trans->type == TT_ORDER_DELETE
        || trans->type == TT_ORDER_MODIFY
        )
    {
        return TradeTransaction(trans, user);
    }

    return(RET_ERROR);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

如果是下单请求,则先调用web接口下单,根据web的下单结果(成功/失败), 决定此事件的返回值,影响MT4下单的结果。

转自:https://blog.csdn.net/MT4Develop/article/details/51925398

关闭 返回顶部
联系我们
Copyright © 2011. 聚财吧. All rights reserved.