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

期货的订单类型和外汇不一样,国内期货交易所只有限价单和市价单。

限价单就是比如交易者报限价单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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值