English Русский Español Deutsch 日本語 Português
使用 MetaTrader 4 进行基于时间的模式分析

使用 MetaTrader 4 进行基于时间的模式分析

MetaTrader 4交易系统 | 17 三月 2016, 09:56
2 135 0
Giampiero Raschetti
Giampiero Raschetti

简介

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



文献搜索

首先,我在文献中对该理念进行确认,在 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,下面展示了代表运行流程的程序块示意图。

其中:
  • Analyzer 路径调用一系列信号检测程序,对此刻的趋势强度给予反馈。
  • TrailingStopEngine 动态评估下一个获利目标,并根据平均真实范围或类似物评估新的跟踪止损。
  • CurrentOpenOrders 返回已经开始的订单数量。
  • LoopThroughOrders 在所有订单中循环,在必要时应用新的跟踪止损和新的获利目标,或决定因某个特定事件关闭交易。
  • BlockFilterTrading 确定是否存在我们不想进行交易的特定条件。
  • MoneyManagement 返回手数作为风险的函数。
  • PlaceOrder,如果允许,按照 Analyzer 定义的方向开订单。


操作和优化结果

我使用运行在 Parallel Desktop 下的虚拟机在 Apple MacBookPro 上使用 MetaTrader 引擎,运行快速可靠,我可以在 MS-windows 虚拟机上非常容易的快速截屏用于文档化。回测通过 2007 年 1 月 1 日至 2007 年 12 月 29 日的可用数据在 EURUSD 货币对上进行,时间范围为 15 分钟,结果似乎令人满意。本文中使用的主要运行参数取自第一个优化过程,你可以自己尝试不同的参数组合。关于测试中使用的 Take Profit 和 Stop Loss 参数的选择,唯一的考虑是我们对余额最大化或者对 MetaTrader 所提供参数的任何其他可能的优化并不感兴趣,我们只需要将获利交易的数量最大化,以强调进入策略。任何其他结果的优化应在后面阶段进行。下面是 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);  
}
事实上,我们应该能有很多较小的获利交易,而完全不需要考虑整体余额。下面是主要的优化设置:
要分析给出最佳结果的时间间隔,你必须把 FromHourTrades 设置为从 0 到 23,步长为 1 小时,启动程序之前在回测设置表中检查优化信号。
以下是优化结果:
可以看出,有好几个小时中,使用趋势检测技巧交易会非常危险,而当日的另外几个小时中选择趋势方向的获利性应该好得多,这个时间间隔介于 19:00 和 22:00 GMT+1,这是东部时区的下午,所有的新闻都已被市场消化。在这种情况下,具备了可用的历史数据,从优化程序中获得的峰值时间对应着 21:00 GMT+1(欧洲中部时间)。该结果对于 2007 年的外汇市场无疑是可靠的,但 Frank Tubbs 对交易习惯的过往想法让我们希望它们在更大的时间周期内可靠。以下是优化程序的详细结果:
必须考虑到,该结果同样取决于选择用于决定订单方向的趋势信号,可以说在这个基于时间的策略中,从大量不同的信号中进行选择得到非常相似的结果,但你当然可以测试其他信号,可以跟我们分享你的结果。以下是在 21:00 GMT+1 的回测报告。
可以看出,在一共 160 次交易中,获利交易占了 154 次(96.86%)。该信息确认了 Wackena 在访谈中的观点。

引入基于时间的止损

在一年中的交易数量中,回测程序可能表明我们应该能够通过引入基于时间的止损来改善交易结果,即如果在市场上出现了 23 小时后存在亏损,则应该为新订单留出空间。为此,只要设置 UseTimeBasedStopLoss 信号为真并尝试不同的优化参数。以下报告表显示了该策略变更的结果。

可以看出,该退出策略可以使你想到,一些长期波动交易可以在疲软市场中保护你免于在不利的时刻增加不良订单,所以最好耐心等待市场走出危险。



总结

基于时间的模式识别对交易习惯的分析策略揭示了进一步调查的需要,并向该 Expert Advisor 添加了一个可靠的资金管理策略,尤其是一个可靠的跟踪止损引擎,不过这是另一篇文章的话题了。随附的代码也可以用于对其他模式和货币对进行深入调查,以分析其他基于时间的交易习惯和行为。欢迎分享你对该研究的体验。

参考文献New Trading Systems and Methods,作者 Perry J. Kaufmanhttps://championship.mql5.comThe Encyclopedia of Trading Strategies, 作者 Jeffrey Owen Katz 和 Donna L. McCormickForex conquered,作者 J.L.PersonTrading with the odds,作者 Cynthia A.Kase

本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/1508

附加的文件 |
Sauron_1_3.mq4 (7.15 KB)
使用 MQL4 的 HTML 引导 使用 MQL4 的 HTML 引导
HTML 是当今最广泛使用的文件类型之一。MetaTrader 4 客户终端允许你将语句、测试和优化报告保存为 .htm 文件。有时需要从这些位于 MQL4 程序的文件中获取信息。本文描述了如何从 HTML 获得标记结构和内容的一个形式。
如何编写快速非重绘锯齿形调整浪 如何编写快速非重绘锯齿形调整浪
本文提出了一种编写锯齿形调整浪类型指标的相当通用的方法。这个方法包含了许多已经描述的锯齿形调整浪,你可以相对容易的创建新的锯齿形调整浪。
分组文件的操作 分组文件的操作
有时候需要对一组文件执行相同的操作。如果你有包含在一组中的文件列表,则没有问题。但是,如果你需要自己制作列表,问题就出现了:“我该如何去做呢?”文本提出了利用 kernel32.dll 中包含的 FindFirstFile() 和 FindNextFile() 函数实现的方法。
考虑 T. Demark 方法的趋势线指标 考虑 T. Demark 方法的趋势线指标
指标反映了显示市场近期事件的趋势线。该指标的开发考虑了 Thomas Demark 有关技术分析的建议和方法。指标显示了趋势的最后方向和趋势的倒数第二个相反方向。