期货的订单类型和外汇不一样,国内期货交易所只有限价单和市价单。
限价单就是比如交易者报限价单4000做多螺纹钢,则交易所只会在4000或4000以下撮合该多单,所以如果能成交,成交价格只会在4000或4000以下。
比如交易者报限价单8000做空苹果,则交易所只会在8000或8000以上撮合该空单,所以如果能成交,成交价格只会在8000或8000以上。
也就是说限价单会在交易者指定的价格上成交,超出了该价格则不成交。
本例子演示了EA如何报限价单做多,成交后10秒平仓。
EA是通过调用mt5ctp.dll进行期货交易,所以EA需要先引用mt5ctp.dll,该DLL头文件mt5ctp.mqh在\MQL5\Include目录下。
#property copyright "www.wewin28.com 1145412@qq.com"
#property version "1.1"
#include <mt5ctp.mqh> //引用MT5CTP头文件
EA获取当前图表的合约。对于非主连合约如rb2209可以通过Symbol()属性获得当前图表的合约,但对于主连合约如rb9999,则需要通过SYMBOL_ISIN属性获得主连合约现在对应的合约(rb2301),当主连合约rb9999随着时间发生换月后,通过SYMBOL_ISIN属性得到的合约就会自动变为rb2305。使用后者的写法可以让EA在主连合约和非主连合约的图表上都能获得当前图表的合约。
通过SYMBOL_EXCHANGE属性获得该合约对应的交易所, 如获得rb2301所属的交易所SHFE(上期所)。
通过SYMBOL_DIGITS属性获得该合约的小数后位数,如螺纹钢是0,股指是1。
splitCommma是代表逗号。
string symbol=SymbolInfoString(Symbol(), SYMBOL_ISIN); //获取合约(如果是主力合约的话取对应的合约) get symbol
string exchange=SymbolInfoString(symbol, SYMBOL_EXCHANGE); //该品种的交易所 get exchange
long digits=SymbolInfoInteger(symbol, SYMBOL_DIGITS); //该品种价格的小数位数 get decimal
ushort splitCommma=StringGetCharacter(",",0); //逗号 comma
定义报单时间全局变量entryTime,用来判断是否已经报单。定义仓位全局变量,如果pos等于0就是空仓,如果大于0就是持仓。eaOrderRef是EA报单编号,作用类似外汇EA的魔术号码。
datetime entryTime=D'1970.01.01 00:00'; //报单时间全局变量 send order datetime
int pos=0; //EA仓位全局变量 position
long eaOrderRef=0; //EA报单编号全局变量 magic number
如果还没有报单和空仓就报单,先取得当前最新的MqlTick结构体:获得现在的格林威治时间,将格林威治时间转成北京时间,获得3个小时之前的时间(比如当前是12点就是9点),将之前3个小时以来的全部跳复制到ticks[]数组(MqlTick结构体)访问ticks[]数组的最后一个元素,即获得并返回最新价格的MqlTick结构体。
MqlTick getLastMQLTick()
{
datetime gmt=TimeGMT();
datetime chinaCurrentDatetime=(datetime)(gmt+8*60*60); //格林威治时间
ulong last3HourMinute=(long)(chinaCurrentDatetime-60*60*3)*1000; //将格林威治时间转成北京时间 convert GMT time to Beijing time
MqlTick ticks[];
MqlTick lastTick;
int copyTick=CopyTicks(symbol,ticks,COPY_TICKS_ALL,last3HourMinute,30000);
if(copyTick>=0)
{
int tickCount=ArraySize(ticks);
if(tickCount>0)
{
lastTick=ticks[tickCount-1];
}
else
{
printf("tick count 0");
}
}
else
{
printf("copyTick 0");
}
return lastTick;
}
通过最新的MqlTick结构体取得最新成交价,设置报单手数1手,调用mt5ctp.dll getOrderRefCTP函数生成EA报单编号并保存在eaOrderRef变量,CTP对报单编号格式有格式要求,不能像外汇EA的魔术号码可随意自行指定, 否则报单会失败,所以EA需先调用getOrderRefCT