前言
如果有问题可以联系我**:https://gitee.com/xiaoyuren/gpt3
本文讲解一下MT4跟单软件的开发的几种方法以及原理。
一、managerAPI方式跟单
此方法比较常用,需要有manager的管理权限。
1、轮训的方式
定期获取主账户的交易信息,并将这些信息应用到跟单账户上。
实现步骤:
1>、获取主账户的订单信息:定期轮询主账户的订单列表,检查是否有新订单或已修改的订单。每隔固定时间(例如每秒或几秒)进行一次检查。
2>、比对订单状态: 将当前轮询到的主账户订单与之前获取的订单列表进行比对,确定新开仓、平仓或修改的订单。
3>、复制订单到跟单账户: 根据主账户订单的变化,在跟单账户中执行相应的交易操作,例如开仓、平仓、修改止损等。
4>、处理订单差异: 需要处理订单量、止损、止盈等方面的差异,确保跟单账户的操作与主账户保持一致。可能需要根据跟单账户的资金情况调整订单的手数比例。
2、Pumping的方式
pumping是一个用于开启或关闭数据推送模式的功能,
当开启 后,会以推送的方式从服务器获取市场数据和账户信息,而不是采用常规的轮询方式。这样可以显著减少服务器与客户端之间的通信负载,,尤其是在高频交易和数据变化频繁的情况下.因为只有当服务器有新数据时才会推送给客户端.
if (res = CManager::PumpInstance()->PumpingSwitch(PumpingNotify, NULL, 0, 0) != RET_OK)
printf("pumping switch error\n");
在pumping方法中可以对以下类型的事件进行处理:
enum
{
PUMP_START_PUMPING=0, // pumping started
PUMP_UPDATE_SYMBOLS, // update symbols
PUMP_UPDATE_GROUPS, // update groups
PUMP_UPDATE_USERS, // update users
PUMP_UPDATE_ONLINE, // update online users
PUMP_UPDATE_BIDASK, // update bid/ask
PUMP_UPDATE_NEWS, // update news
PUMP_UPDATE_NEWS_BODY, // update news body
PUMP_UPDATE_MAIL, // update news
PUMP_UPDATE_TRADES, // update trades
PUMP_UPDATE_REQUESTS, // update trade requests
PUMP_UPDATE_PLUGINS, // update server plugins
PUMP_UPDATE_ACTIVATION, // new order for activation (sl/sp/stopout)
PUMP_UPDATE_MARGINCALL, // new margin calls
PUMP_STOP_PUMPING, // pumping stopped
PUMP_PING, // ping
PUMP_UPDATE_NEWS_NEW, // update news in new format (NewsTopicNew structure)
};
说明:
PUMP_START_PUMPING (0)
描述:表示启动了数据推送功能。当客户端与服务器建立连接,并开始接收推送数据时,会触发此事件。是推送的起始状态。
PUMP_UPDATE_SYMBOLS
描述:更新符号(交易品种)信息。服务器会推送市场中的交易符号列表,或者交易品种的变化(例如增加或删除品种,或符号参数变化)。
PUMP_UPDATE_GROUPS
描述:更新用户组信息。服务器向客户端推送与用户组(账户组别)相关的更改信息,如修改某个组的权限或规则。
PUMP_UPDATE_USERS
描述:更新用户信息。表示某个用户(账户)的信息发生变化,例如账户的状态或资金变化。
PUMP_UPDATE_ONLINE
描述:更新在线用户信息。服务器推送当前在线的用户信息,或者用户的上线/下线状态发生变化。
PUMP_UPDATE_BIDASK
描述:更新买卖报价(Bid/Ask)。服务器推送某些交易符号的最新买价和卖价信息,供客户端更新市场报价。
PUMP_UPDATE_NEWS
描述:更新新闻。表示服务器推送新的金融市场新闻头条,通常是简要信息或新闻列表。
PUMP_UPDATE_NEWS_BODY
描述:更新新闻正文。服务器推送特定新闻的详细内容,供用户查看新闻的详细信息。
PUMP_UPDATE_MAIL
描述:更新邮件。服务器推送与账户相关的系统邮件,如平台发给交易者的通知或公告。
PUMP_UPDATE_TRADES
描述:更新交易信息。服务器推送账户的交易订单变化(如开仓、平仓、订单修改等),用于更新客户端的交易订单状态。
PUMP_UPDATE_REQUESTS
描述:更新交易请求。服务器推送新的交易请求信息,例如某些订单的处理状态或某些操作请求的结果。
PUMP_UPDATE_PLUGINS
描述:更新服务器插件。表示服务器推送有关安装或卸载某些插件的信息更新,可能涉及服务器功能的扩展。
PUMP_UPDATE_ACTIVATION
描述:推送新订单的激活。与订单的激活(例如挂单的触发、止损止盈的执行、强平等)相关的更新。
PUMP_UPDATE_MARGINCALL
描述:推送新的保证金警告。服务器推送某个账户发生了新的保证金警告(Margin Call)信息,提醒用户注意资金风险。
PUMP_STOP_PUMPING
描述:表示数据推送结束。当客户端与服务器断开连接,或停止接收推送数据时,会触发此事件。是推送的终止状态。
PUMP_PING
描述:心跳包(ping)。服务器定期发送的轻量级数据包,用于维持客户端与服务器的连接并检测延迟,确保连接保持活跃。
PUMP_UPDATE_NEWS_NEW
描述:更新新格式的新闻。服务器推送新格式的新闻(NewsTopicNew 结构),表示新闻内容的数据格式发生变化,通常用于改进后的新闻推送系统。
这些枚举值表示 MT4 服务器在数据推送模式下,向客户端发送的各种类型的数据更新。根据推送的不同类型,客户端可以接收市场报价、用户信息、交易订单等的实时更新,从而对数据变化做出相应的处理。这些事件对开发需要实时数据同步的插件或应用非常重
二、serverAPI方式跟单
这种方式需要有服务器权限。
关于serverAPI的原理前面也有讲过,是通过HOOK的方式拦截用户的所有请求,包括下单 平仓 修改订单等。
可以在MtSrvTradesAdd中拦截用户开仓请求,当用户开仓我们就可以根据跟单规则去调用OrdersOpen开仓。当用户平仓或者修改订单我们可以在MtSrvTradesUpdate中拦截用户请求去做相应的操作。
三、逆向抓包模拟客户端方式跟单
这种方式不需要有manager权限也不需要有服务器权限。只需要有交易的账户就行。
这里不做具体逆向分析 ,后面如果有时间可以专门去讲一下。这里只是将一下实现跟单的方式。
逆向的方式是这几种方式最麻烦的,原理就是抓包解密分析出来MT4客户端的下单平仓修改订单等操作的网络数据,然后我们用软件模拟这些操作。(待续)