市场价格波动过于频繁,不便于使用价格变动图,即技术分析中所谓的价格变动图。 为了便于观察价格变动以及在分析时使用较长的时间范围,我们使用柱状图或蜡烛图。 每个柱展示了在某个时间周期开始和结束处的价格值,以及该期间内的最大和最小价格值。 通常使用以下期间或时间范围: 1 分钟、5 分钟、15 分钟、30 分钟、1 小时、4 小时、日、周和月。 这些时间范围可以在 MetaTrader 4 终端工具栏找到。
尽管通常使用的时间范围已经成为标准,但从技术上讲没有理由不能使用任何其他时间范围来显示价格变动。 从实践的角度,终端提供了一个允许终端用户创建非标准时间范围图表的脚本(period_converter),例如,2 分钟、7 分钟、45 分钟、2 小时和几乎任何其他时间范围,并可以添加相应的指标。 但是,终端的“策略测试程序”只允许选择标准周期进行测试。
这可谓是近在眼前远在天边——我们可以创建非标准的时间范围图表,但却无法用来测试 Expert Advisor 实际上,状况比看起来要好得多。 在非标准时间范围上测试 Expert Advisor 是可能的! 我们需要做的只是用非标准时间范围数据替换标准时间范围数据。 另外,我们甚至能使用来自多个非标准时间范围的数据测试 Expert Advisor。
我们的行动计划如下:
1. 准备离线工作的额外终端,这样新的标准时间范围数据不会添加到非标准时间范围图表。
2. 利用终端的 period_converter 脚本准备非标准时间范围数据。终端具有足够的可用分钟数据档案。
3. 将准备的数据导入做好测试准备的终端。
现在我们来仔细观察一下:
1. 准备用于测试非标准时间范围的终端。
安装额外的终端。 启动终端,打开模拟账户并等待至“市场报价”窗口出现交易品种列表。
禁用保存账户信息:在终端右下角的“连接状态”图标上左键单击并选择“登录”。 取消选择“保存账户信息”选项,单击“登录”并等待终端连接账户。
这样做是必要的,以防止终端自动连接账户以及防止新数据添加到历史档案。 关闭终端。
在历史文件夹内,打开跟模拟账户开户的交易中心的名称相对应的文件夹,并从中删除所有的 *.hst 文件。
2. 准备非标准时间范围数据
利用 period_converter 脚本(可以在标准版本的 MetaTrader 4 终端中找到),创建非标准时间范围,例如,M2 和 M7,其他一些终端具有所需交易品种(例如,EURUSD)的足够 M1 数据量。 为此,打开 EURUSD M1 图表并在上面运行 period_converter 脚本。 运行脚本之前,在属性窗口将 ExtPeriodMultiplier 设置为 2。 在脚本完成数据转换后,在终端窗口的“Expert Advisors”选项卡上应显示一条关于向文件添加的条目数量的信息,例如:
"2009.03.19 18:28:09 period_converter EURUSD,M1: 25378 record(s) written"
随后可以从图表移除脚本(在运行脚本的图表上右击并选择“移除脚本”)。 打开得到的图表: 主菜单 - 文件- 打开离线历史数据(在“历史数据”栏查找 EURUSD,M2)。 类似的,创建 M7 时间范围(在运行 period_converter 脚本之前将 ExtPeriodMultiplier 设置为 7)。
编写一个将图表数据保存到 *.csv 文件的脚本(s_ExportChartToCSV_v1.mq4作为附件):
int start(){ int h=FileOpen(Symbol()+Period()+".csv",FILE_WRITE|FILE_CSV,","); for(int i=Bars-1;i>=0;i--){ FileWrite(h,TimeToStr(Time[i],TIME_DATE),TimeToStr(Time[i],TIME_MINUTES),Open[i],High[i],Low[i],Close[i],Volume[i]); } FileClose(i); return(0); }
在非标准时间范围图表上执行脚本。 于是我们在 experts/files 文件夹中得到具有非标准时间范围数据的标准 *.csv 文件。
3. 导入数据。
打开上述步骤 1 中准备的终端和“历史数据中心”(主菜单 - 工具 - 历史数据中心或 F2 键)。 在左手侧交易品种列表内为导入的交易品种扩展时间范围列表并选择 M1(在上面双击,使相应的文本显示在窗口标题栏):
在以打开的“历史数据中心”窗口单击“导入”,选择上面步骤 2 产生的 EURUSD2.csv 并单击“确认”。 类似的,将数据从 EURUSD7.csv 导入到 M5 并关闭“历史数据中心”窗口。 就是这样!
打开 EURUSD M1 图表,你将会看到 M2 数据:
EURUSD M5 与之类似——你会看到显示的是 M7 而不是 M5。
为了在“策略测试程序”中测试 Expert Advisor,测试 M2 数据时需要选择 M1,测试 M7 数据时需要选择 M5。 为了从经过测试的 Expert Advisor 调用的指标中访问 M7 数据,你需要指定 M5 时间范围。
4. 检查。
我们将使用一个简单的 Expert Advisor,在两条移动平均线交叉时打开和关闭订单(2MA.mq4 作为附件)。 注意! 该 Expert Advisor 仅用于“策略测试程序”。
extern int TimeFrame=0; extern double Lots=0.1; extern int FastMAPeriod=13; extern int FastMAMethod=0; extern int FastMAPrice=0; extern int SlowMAPeriod=21; extern int SlowMAMethod=0; extern int SlowMAPrice=0; int start(){ double fast_ma_1=iMA(NULL,TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,1); double slow_ma_1=iMA(NULL,TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,1); double fast_ma_2=iMA(NULL,TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,2); double slow_ma_2=iMA(NULL,TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,2); static int bt=0; static int st=0; if(fast_ma_1>slow_ma_1){ if(fast_ma_2<=slow_ma_2){ if(st>0)OrderClose(st,Lots,Ask,0,CLR_NONE); st=0; if(OrdersTotal()==0)bt=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,0,"",0,0,CLR_NONE); } } if(fast_ma_1<slow_ma_1){ if(fast_ma_2>=slow_ma_2){ if(bt>0)OrderClose(bt,Lots,Bid,0,CLR_NONE); bt=0; if(OrdersTotal()==0)st=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,0,"",0,0,CLR_NONE); } } return(0); }
4.1. 在单个非标准时间范围上的 Expert Advisor。
打开“策略测试程序”(主菜单 - 查看- 策略测试程序或 Ctrl+R)。 选择 Expert Advisor - 2MA,交易品种 - EURUSD,时间范围 - M1,打开 Expert Advisor 属性窗口(“策略测试程序”中的“EA 属性”按钮)并将 TimeFrame 变量值设为 1 或 0。 开始测试,完成后打开图表(“策略测试程序”中的“打开图表”按钮)以确保测试进行无误。
4.2. 不同于“策略测试程序”的时间范围的单个时间范围上的 Expert Advisor
在 Expert Advisor 的属性窗口,设置 TimeFrame 变量等于 5 并开始测试。 打开图表,将图表时间范围更改为 M5 并设置两条基于收盘价且周期为 13 和21 的简单移动平均线,以确保测试进行无误。
4.3. 两个时间范围的 Expert Advisor。
我们将要使用的 Expert Advisor 在一个时间范围上两条移动平均线交叉时打开订单,由两条移动平均线在更长的时间范围上的位置进行确认(2MA2TF.mq4 作为附件)。 注意! 该 Expert Advisor 仅用于“策略测试程序”。
int start(){ double fast_ma_1=iMA(NULL,TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,1); double slow_ma_1=iMA(NULL,TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,1); double fast_ma_2=iMA(NULL,TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,2); double slow_ma_2=iMA(NULL,TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,2); double _fast_ma_1=iMA(NULL,MA2TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,1); double _slow_ma_1=iMA(NULL,MA2TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,1); static int bt=0; static int st=0; if(fast_ma_1>slow_ma_1){ if(fast_ma_2<=slow_ma_2){ if(_fast_ma_1>_slow_ma_1){ if(st>0)OrderClose(st,Lots,Ask,0,CLR_NONE); st=0; if(OrdersTotal()==0)bt=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,0,"",0,0,CLR_NONE); } } } if(fast_ma_1<slow_ma_1){ if(fast_ma_2>=slow_ma_2){ if(_fast_ma_1<_slow_ma_1){ if(bt>0)OrderClose(bt,Lots,Bid,0,CLR_NONE); bt=0; if(OrdersTotal()==0)st=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,0,"",0,0,CLR_NONE); } } } return(0); }
下面的值为默认设置: TimeFrame - 1,MA2TimeFrame - 5。 在“策略测试程序”中选择 M1 时间范围并开始测试。 然后打开图表并在从 M1 切换到 M5 时使用订单打开点的垂线和没有导致打开订单的移动平均线的交叉点的垂线,以确保测试进行无误。
这些简单的操作拓宽了 Expert Advisor 测试的领域。 唯一的不足是缺少自动更新。 1 到 3 项中描述的不时反复的操作(例如每周一次),包括出于测试目的从终端删除所有数据,以及导出和导入非标准时间范围到终端以进行测试,相对于“策略测试程序”能力的极大增强,可以说是轻而易举。
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
移动端课程