使用赫兹量化进行基于时间的模式分析

简介

浏览自动交易锦标赛论坛的帖子和访谈总能从噪杂的声音中发现很多有意思的信息。William Boatright (Wackena) 在采访中提出的观点让我对基于时间的方法产生了兴趣,它用于在每日波动交易中选择当日的一个小时进行一次交易。于是我开始搜集基于时间的进入方法的信息,并决定实现一个能够检验该技巧实际有效性的系统。实现本文随附的代码没有实际的退出策略,只是为了给你一个示例,说明使用 MetaTrader 进行数据挖掘和在相对较长的数据序列中进行统计调查可以期待的时间模式类型。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

文献搜索

首先,我在文献中对该理念进行确认,在 Perry J. Kaufman 的《全新交易系统与方法》(New Trading Systems and Methods )中发现了一篇关于该主题的非常有趣的文章,可谓技术分析中的圣经。第 15 章讲述了模式识别,其中首要的一个话题就是每日的时间和交易习惯。在这一章,他提到了 Frank Tubbs 的《股票市场函授课程》( Stock Market Correspondence Lessons)一书,其中他解释了基于美国交易时间的股票市场中的六个主要模式,并在规则 4 中表示:“如果市场直到下午 2 点还在上涨,则很可能会持续到收盘和第二天”。GMT-5 下午 2 点刚好是 GMT+1 晚上 8 点,是 Wackena 对其交易进行检验的时间。这是关于该技巧的有效性的第一个有趣的确认。其他关于该主题的有趣引用出现在 Kaufman 的该章中。

创建基本的 EA

对于创建在一天当中的特定时间捕捉交易方向的系统,第一个考虑是你要寻找的仅仅是那些提供关于趋势方向信息的相关信号,而那些相反趋势方法或突破系统并不适合此目的。本文给出一个基本的 Expert Advisor,下面展示了代表运行流程的程序块示意图。

编辑

添加图片注释,不超过 140 字(可选)

其中:

  • Analyzer 路径调用一系列信号检测程序,对此刻的趋势强度给予反馈。

  • TrailingStopEngine 动态评估下一个获利目标,并根据平均真实范围或类似物评估新的跟踪止损。

  • CurrentOpenOrders 返回已经开始的订单数量。

  • LoopThroughOrders 在所有订单中循环,在必要时应用新的跟踪止损和新的获利目标,或决定因某个特定事件关闭交易。

  • BlockFilterTrading 确定是否存在我们不想进行交易的特定条件。

  • MoneyManagement 返回手数作为风险的函数。

  • PlaceOrder,如果允许,按照 Analyzer 定义的方向开订单。

操作和优化结果

我使用运行在 Parallel Desktop 下的虚拟机在 Apple MacBookPro 上使用赫兹量化引擎,运行快速可靠,我可以在 MS-windows 虚拟机上非常容易的快速截屏用于文档化。回测通过 2007 年 1 月 1 日至 2007 年 12 月 29 日的可用数据在 EURUSD 货币对上进行,时间范围为 15 分钟,结果似乎令人满意。本文中使用的主要运行参数取自第一个优化过程,你可以自己尝试不同的参数组合。关于测试中使用的 Take Profit 和 Stop Loss 参数的选择,唯一的考虑是我们对余额最大化或者对赫兹量化所提供参数的任何其他可能的优化并不感兴趣,赫兹量化只需要将获利交易的数量最大化,以强调进入策略。任何其他结果的优化应在后面阶段进行。下面是 Analyzer 模块的代码,出于测试目的,你可以添加任何其他信号检测程序。

两个不同的信号必须一致选择正确的方向。

 
 

//+------------------------------------------------------------------+ //| Price Direction Analyzer //+------------------------------------------------------------------+ int Analyzer() { int signalCount=0; signalCount += EntrySignal1(); signalCount += EntrySignal2(); return(signalCount); } //+------------------------------------------------------------------+ //| ENTRY SIGNALS BLOCK MODULES //+------------------------------------------------------------------+ int EntrySignal1() { // Long term SMA trend detect int i,Signal; int LongTrend=0; for(i=0;i<3;i++) { if (iMA(Symbol(),PERIOD_H4,S1_MA_FAST,0,MODE_LWMA,PRICE_TYPICAL,i) > iMA(Symbol(),PERIOD_H4,S1_MA_FAST,0, MODE_LWMA,PRICE_TYPICAL,i+1)) LongTrend++; else LongTrend--; } if( LongTrend < 0) Signal=-1; else Signal=1; return(Signal); } int EntrySignal2() { // Daily MACD int Signal; if (iMACD(NULL,PERIOD_D1,S2_OSMAFast,S2_OSMASlow,S2_OSMASignal,PRICE_WEIGHTED,MODE_MAIN,0) > iMACD(NULL,PERIOD_D1,S2_OSMAFast,S2_OSMASlow,S2_OSMASignal,PRICE_WEIGHTED,MODE_MAIN,1) ) Signal=1; else Signal=-1; return (Signal); }

交易时间在一个阻止交易过滤器模块中匹配,可以直接实现如下。所描述的模块化架构可以在操作流程中为新的阻止过滤器留出空间。

 
 

//+------------------------------------------------------------------+ //| FILTER BLOCK MODULES //+------------------------------------------------------------------+ bool BlockTradingFilter1() { bool BlockTrade=false; //trade by default if (UseHourTrade) { if( !(Hour() >= FromHourTrade && Hour() <= ToHourTrade && Minute()<= 3) ) { // Comment("Non-Trading Hours!"); BlockTrade=true; } } return (BlockTrade); }

事实上,我们应该能有很多较小的获利交易,而完全不需要考虑整体余额。下面是主要的优化设置:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

要分析给出最佳结果的时间间隔,你必须把 FromHourTrades 设置为从 0 到 23,步长为 1 小时,启动程序之前在回测设置表中检查优化信号。

编辑

添加图片注释,不超过 140 字(可选)

以下是优化结果:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值