对于EA来说,比较重要的一点是验证其有效性。验证其有效性的最好方法就是回测。回测是指,使用一段比较长的历史时期内的行情数据来验证EA性能的方法。那么我们开发出来的EA是否能用就必须得经过回测的验证。这一章,我们来看看如何使用MT5进行EA的回测。
一些准备
前面我们开发了一个名叫FirstEA的EA,我们在这个基础上添加一些功能:
1、确保前一个订单没有完结,不再进行下一次交易
2、加入一些比较初级的盈亏比的概念,我们设定为1:1.5
需要注意的是:
这一节我仍将提供完整的实例代码,但是,这个代码仍然是一个演示性的代码,不能作为真实交易使用。如果使用后果还请自行承担。
修改后的代码如下(以后以此为基础进行深入讲解):
//+------------------------------------------------------------------+
//| ProjectName |
//| Copyright 2020, CompanyName |
//| http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//--- 输入参数定义部分
input int indicator_param = 50; //MA周期设定
input ulong input_magic = 20210427; //幻数(标识订单)
int m_ma_handle = -1;
//+------------------------------------------------------------------+
//| EA初始化函数,由系统调用,调用场景至少包括:
//| 1、EA首次加载到图表的时候执行
//| 2、参数发生变化的时执行
//| 3、EA重新编译并且EA未从图表中卸载的时候执行
//| 4、图表周期发生变化的时候执行
//+------------------------------------------------------------------+
int OnInit() {
//---
m_ma_handle = iMA(Symbol(), PERIOD_CURRENT, indicator_param, 0, MODE_SMA, PRICE_CLOSE);//初始化均线参数
//输出基本信息:当前Symbol,当前图表周期
PrintFormat("OnInit::symbol= %s, time_peroid= %d", Symbol(), Period());
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| EA析构函数,
//| 系统在环境发生变化或者EA被从所在图表中卸载的时候调用。
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
//输出基本信息:当前Symbol,当前图表周期以及卸载原因
PrintFormat("OnDeinit::symbol= %s, time_peroid= %d, reason= %d", Symbol(), Period(), reason);
IndicatorRelease(m_ma_handle);//释放指标
}
//+------------------------------------------------------------------+
//| 每一次报价发生的时候调用,交易高峰期报价会很频繁,
//| 因此,此函数会非常频繁的被系统调用。
//| 实现的功能:
//| 1、获取15当前图表周期的简单均线(MA)值
//| 2、如果当前一K线的开盘价和收盘价从上