赞
踩
一位量化交易程序员手把手教你入门
上篇介绍完了如何配置量化交易所需要的环境,这篇继续介绍如何写第一个量化交易程序。
MT4提供的sample程序只有基本的功能,不能够自动交易。
我们写一个自动交易程序,逻辑如下
· 下一个多单
· 检查当前盈利情况
· 盈利大于1美金止盈平仓,或者亏损大于1美金止损平仓
· 退出程序
//+------------------------------------------------------------------+ //| QuantSample.mq4 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- int ticket = 0; if(OrdersTotal() == 0) {//检查当前是否有订单,没有则下单 //send order ticket = OrderSend(Symbol(), OP_BUY, 0.01, MarketInfo(Symbol(), MODE_ASK), 100, 0.0, 0.0, "comment", 1024, 0,0xFFFFFFFF); } double profit = 0; for(int i = 0; i < OrdersTotal(); i++){ //计算当前盈亏 if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) break; profit = OrderProfit(); } if(profit > 1.0 || profit < -1.0) { //当前盈亏满足条件则平仓退出 //close order for (int index = OrdersTotal() - 1 ; index >= 0 ; index = index - 1) { if(!OrderSelect(index, SELECT_BY_POS, MODE_TRADES)){ //选择订单 PrintFormat(">>> select failed closing trade <%s> at index %d", Symbol(), index); continue; } bool close_result = true ; switch(OrderType()) { case OP_BUY : close_result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(), MODE_BID),100,0xFFFFFFFF) ; //关闭订单 break; case OP_SELL : close_result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),100,0xFFFFFFFF) ; break; } } ExpertRemove();//退出EA } } //+------------------------------------------------------------------+
这是一个包含了最最基本功能的交易程序,它没有任何量化相关的逻辑,只展示了最基本的交易能力。
复杂的量化交易程序也需要包含这两个功能,
· 下单
· 平仓
区别在于他们的下单依据,量化交易会用复杂的逻辑分析市场上反馈的数据,再决定下单和平仓的时机。我们后面会再介绍。
EA的默认生命周期包括三个函数,
· onInit
· onDeInit
· onTick
和几个可选函数
· onChartEvent
· onTimer
· onTester等
EA被MT4加载时的入口,只会执行一遍。
一般用来做全局变量初始化,UI界面绘制等操作。
MT4在结束一个EA时会调用onDeInit,代表着一个EA的生命周期结束。只会执行一次。
在这个函数里一般会做全局变量释放,和UI控件释放的操作。
MT4运行过程中会在有新数据来到的时候通过tick调用EA的onTick接口。
EA在收到onTick调用之后,需要检查新的数据是否满足设定的逻辑。这是一个极高频的接口,在正式环境上是毫秒级的。
onTick在回测的时候也会被调用,但频率是根据回测时设定的tick级别,从1sec到1h都有。
EA可以在K线图上绘制控件,用户通过控件的点击修改EA的变量等参数。这些点击事件会通过onChartEvent发送给EA处理。
定时接口。EA初始化的时候可以通过 setTimer() 接口设定一个时间间隔,每次到点的时候会调用EA的onTimer接口。我们可以在onTimer里做一些状态校验操作,比如发送邮件,发送告警等操作。
测试接口,一般不需要实现。
MT4是一个运行EA的应用,它可以加载已经编译好的EA程序,程序的后缀是ex4。
GoldFlag28.mq4 编译后-> GoldFlag28.ex4
我们把一个mq4的源码编译后,会在同个目录下得到一个ex4程序。
它的编译需要用MT4提供的应用:MetaEditor
MetaEditor在MT4的安装目录下可以找到。打开后界面是这样的。
MetaEditor提供了全套开发功能,甚至包括断点调试。
通过文件->新建项目,新建一个叫QuantSample的项目,然后把上面的代码复制进去。
编译后就可以在MT4的EA栏里面看到刚刚新建的QuantSample EA了。
操作方式在上一篇里介绍过。如果一切没问题,会看到在交易里有个订单
让它运行一段时间,在满足条件后它会自动平仓。
然后在历史记录里就有一条记录,
MT4需要在有账户的情况下才能交易,我们在运行EA前需要先注册一个模拟账户,然后在左边登录它。
有些MT4第一次打开后会默认有个模拟账户,这种情况就不用管它了
推荐两种申请账户的办法
· 手机下载MT4客户端,申请MT4自带的MetaQuote服务器的模拟账户
· 通过真实交易平台注册模拟账户
这里推荐第二种方式,MetaQuote的服务器速度慢,而且短时间不使用的话会被删除,需要重复申请比较麻烦。
注册后申请开通一个Demo账号,记住账号ID和密码。
第一次登陆MT4需要手动搜索服务器,选择开设模拟账户。
输入刚注册的服务器的名字,点扫描
然后取消,我们只需要它缓存好服务器,这时候再点登陆交易账户,就可以看到注册的服务器了。
输入账号密码,现在就可以正常的交易了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。