欢迎光临散文网 会员登陆 & 注册

MT5 EA交易期货-市_价单开仓平仓

2022-11-12 18:18 作者:wewin28  | 我要投稿

该例子演示了EA如何报期货市_价单开仓,开仓后10秒钟报市_价单平仓。

在外汇交易里没有市_价单,而期货交易有市_价单。

EA是通过调用mt5ctp.dll进行期货交易,所以EA需要先引用mt5ctp.dll的头文件mt5ctp.mqh,该头文件在\MQL5\Include目录下。

EA获取当前图表的合约。对于非主连合约如rb2209可以通过Symbol()属性获得当前图表的合约,但对于主连合约如rb9999,则需要通过SYMBOL_ISIN属性获得主连合约现在对应的合约(rb2301),当主连合约rb9999随着时间发生换月后,通过SYMBOL_ISIN属性得到的合约就会自动变为rb2305。使用后者的写法可以让EA在主连合约和非主连合约的图表上都能获得当前图表的合约。

通过SYMBOL_EXCHANGE属性获得该合约对应的交易所, 如获得rb2301所属的交易所SHFE即上期所。

通过SYMBOL_DIGITS属性获得该合约报价的小数后位数,如螺纹钢是0,股指是1。

splitCommma是代表逗号。

定义报单时间全局变量entryTime,用来判断是否已经报单。

定义仓位全局变量,如果pos等于0就是空仓,如果大于0就是持仓。

eaOrderRef是EA报单编号,作用类似外汇EA的魔术号码。

如果还没报单还是空仓,就报单手数1手。

调用mt5ctp.dll的接口函数getOrderRefCTP生成EA报单编号并保存在eaOrderRef变量,CTP对报单编号格式有规定,不能像外汇EA的魔术号码可随意自行指定, 否则报单会失败,所以EA需先调用该接口函数生成EA报单编号再报单。

上期所、能源中心和中金所不支持市_价单,所以如果是这些交易所的合约用涨停价报限_价单实现市_价单功能。

通过SYMBOL_SESSION_PRICE_LIMIT_MAX属性获得合约的涨停价。

大商所和郑商所支持市_价单,如果是这些交易所的合约调用mt5ctp.dll的接口函数sendOrderMarket报市_价单。

调用mt5ctp.dll的接口函数sendOrderLimit用涨停价报限_价单,其中第一个参数是合约,第二个参数是mt5ctp.mqh头文件中定义的枚举ENUM_CTP_BUY_ORDER(代表多单),第三个参数是mt5ctp.mqh头文件中定义的枚举ENUM_CTP_OPEN_POSITION(代表开仓),第四个参数是报单的价格(涨停价),第五个参数是报单的手数,第六个参数是EA报单编号,第七个参数是mt5ctp.mqh头文件中定义的枚举ENUM_CTP_ACCOUNT_SPECULATION(代表开户的期货账号是投机)。

sendOrderLimit函数调用后会同步返回本地电脑发送报单请求的结果,0是本地电脑向交易所成功发送报单,-1是网络连接失败,-2是未处理请求超过许可数,-3是每秒发送请求数超过许可数。但即使sendOrderLimit函数返回0(只是完成了下图中的1和2),也不代表已经成功在交易所挂单,还需要等待交易所异步返回对EA报单的撮合结果即报单回调和成交回调(下图中的3)。这与外汇交易有不同,更多请看交易所异步回调

MT5通过mt5ctp.dll得到交易所的各种回调(如报单回调,成交回调,撤单回调,错误回调,仓位回调,资金回调),之后会把这些回调作为图表事件发送给全部图表,EA 通过MQL图表事件响应函数OnChartEvent得到这些回调(即下图中的4)。


成交10秒之后报市_价单平仓,调用mt5ctp.dll的接口函数getOrderRefCTP生成EA报单编号并保存在eaOrderRef变量,CTP对报单编号格式有规定,不能像外汇EA的魔术号码可随意自行指定, 否则报单会失败,所以EA需先调用getOrderRefCTP函数生成EA报单编号再报单。

上期所、能源中心和中金所没有市_价单,所以这些交易所的合约用当前跌停价报限_价单实现市_价单功能。

通过SYMBOL_SESSION_PRICE_LIMIT_MIN属性获得当前跌停价。

用当前跌停价报空单(平多仓)。

大商所和郑商所支持市_价单,如果是这些交易所的合约报市_价单平仓。

EA报单后通过mt5ctp.dll得到交易所对该报单撮合的结果即报单回调,然后mt5ctp.dll会把该报单回调作为图表事件发送给全部图表,EA 通过MQL图表事件响应函数OnChartEvent得到该报单的结果。

期货发出的MQL图表事件的ID都是3000,EA需要在OnChartEvent函数中只处理ID是3000的事件。

EA通过OnChartEvent函数的sparam参数获得图表事件中的交易所报单回调。

报单回调是一个字符串,格式如下:

OnRtnOrder, 交易所, 合约, EA报单编号, CTP报单编号, 多空, 开平, 报单状态枚举, 报单状态信息, 报单价格, 报单手数, 成交手数, 报单时间, 撤单时间,FrontID,SessionID,e

EA通过OnChartEvent函数的sparam参数获得图表事件中的交易所报单回调。把sparam对应的字符串按逗号拆分后保存到字符数组chartEvents[]。

因为在OnChartEvent函数中ID是3000的事件包括了各种的交易所回调(如报单回调,成交回调,撤单回调,错误回调,仓位回调,资金回调), 所以EA需要先根据chartEvents[0]="OnRtnOrder"找出其中的报单回调。

获得报单回调中的EA报单编号。

chartEvents数组的第4个元素是EA报单编号。如果有多个EA同时在不同的图表上运行并报单,本图表的OnChartEvent也会接收到其他图表上的EA产生的报单回调,之前已经生成并记录了EA报单编号在eaOrderRef变量中,所以只有报单回调中的EA报单编号等于eaOrderRef变量才是本EA的本次报单回调(作用类似于外汇EA中的魔术号码)。

获得报单回调中的CTP报单编号、报单做多或做空、报单开仓或平仓、报单的价格、报单的手数,报单的成交手数,报单时间,报单的撤单时间和交易所对这次报单的撮合结果。

EA报单后交易所除了发送报单回调以外,如果成交了紧接着还会发送成交回调,然后mt5ctp.dll会把该报单回调作为图表事件发送给全部图表,EA 通过MQL图表事件响应函数OnChartEvent得到该报单的成交回调。

成交回调是一个字符串,格式如下:

OnRtnTrade, 交易所, 合约, EA报单编号, CTP报单编号, 成交编号, 多空, 开平, 成交价格, 成交手数, 成交时间,e

chartEvents数组的第4个元素是EA报单编号。如果有多个EA同时在不同的图表上运行并报单,本图表的OnChartEvent也会接收到其他图表上的EA报单后产生的成交回调,eaOrderRef变量已经记录了本次的报单编号,所以成交回调中的EA报单编号等于该变量才是本EA的本次报单的成交回调(作用类似于外汇EA中的魔术号码)。

遍历chartEvents数组,取出成交回调中的交易所、合约、CTP报单编号、CTP成交编号、报单做多或是做空,报单开仓或者平仓,报单成交价格,报单成交手数,报单成交时间, 并计算EA仓位。



MT5 EA交易期货-市_价单开仓平仓的评论 (共 条)

分享到微博请遵守国家法律