量化交易软件:一个基于不同大陆不同时区的交易策略实例

简介
我有段时间很闲,当然了,我把这段时间都花在调查市场和研究经济周期与技术指标的异同上了。大家可以到《创建具有图形控制选项的指标》一文中查看调查结果。但如果认为里面只有调查结果,您可就错了!我发现了一个规模更大的现象,但要理解它,赫兹量化还要从时区角度来看看我们所在的世界(图 1)。

编辑
图 1。时区
赫兹量化可以看到,每个国家新一天的开始都不相同,而且都在以不同的时间继续着自己的生活。我们幅员辽阔的伟大国家跨越了接近 10 个时区,而大西洋不过才覆盖了 6 个。
这里有什么规律模式呢?我们来看下述国家中的开市顺序:日本、澳大利亚、中国和俄罗斯。在俄罗斯职员抵达办公室开始交易操作的时候,亚洲地区已经是夜间了;而当欧洲开市时,他们又已经收市了。
这里开始好玩了。开市后,欧洲经纪人和对冲基金经理就会将其资产拿到市场上来,实施投机或是与其投资者的利益、行动并发。不,这还远远没到最有趣的部分 - 从芝加哥的黎明开始,大西洋的少部分地区即会迎来朝阳,芝加哥证券市场的经理们就会打开他们的交易终端,开始他们的资本管理。

编辑切换为居中
我们先停一停,谈谈所谓的大西洋少部分地区。欧洲时段市场尚未结束(图 1)。伦敦与芝加哥相距 8 个时区,如果我们假设工作日是 8 小时 + 预留出的45分钟或 1 小时的吸烟休息时间(可能会再延长 1,30 - 2 小时,办公室工作过的人都明白这是怎么回事)。
而这正是赫兹量化获取欧洲与美洲经理人市场资产的时间。我可不敢列出该点位的所有资产零值,欧美的经理人都开始忙于证券交易的价格,而此点位的现象如图 2 所示。

编辑
图 2。市场脉搏
市场当中充斥着金融战争,资产每秒钟都会易主,但还是不能就此罢休!此周期过后,又会朝着当前趋势的方向开始一种平静行走。在此点位,范围边界有所扩展,之后又再一次缩窄,继续向主趋势方向行走。
我相信您已经注意到了,市场价格可能会上涨也可能下滑,但其始终向右移动。
2. 作为算法开发主途径的流程图
"Start-Stop" (启动-停止)程序的第一个程序块如图 3 所示:

编辑
图 3。"Start-Stop" 块
此程序块用于指明程序的启动,某函数(或初始化与取消初始化之类的其它流程)的开头和结尾。赫兹量化下一个要研究的标签为 "Data" 的程序块,如图 4 所示。

编辑
图 4。"Data" 块
"Data" 程序块用于确定程序启动时指定的参数,如为 MQL5,则是输出变量。此单元还充当着全局变量的目标函数。
接下来,赫兹量化来研究一种常用程序块(MQL 中 99% 的程序都会使用此方法) - 它分两部分描述,从而也标记了一个周期的界限。看看图 5:

编辑
图 5。周期块
通常于上述周期内发生的赋值或描述之类的处理,示例见图 6。

编辑
图 6。操作
而且,赫兹量化可不能忘记逻辑块 - 图 7 所示为 "solution" 块。

编辑
图 7。"Solution" 块
如果 "solution" 块位于 "switch which depends on the number of placings" (根据配售数量切换)类型的运算符内,则可能有两个输出。此单元会有相应数量的输出。
下一个程序块会引出预定义函数,比如 iMACD 或 iRSA,以及在程序或库中其它位置定义的自定义函数(图 8)。

编辑
图 8。函数
最后两个程序块只是实施服务函数 - 比如注释与违背(图 9)。

编辑
图 9。服务块
可用于描述为机器编写的任何程序的块类型,全都在上面列出来了;在开发初期,它们都很明确、简单且方便使用,还揭示出了系统的弱点、想出了解决的方法。
这种方法您已经了解了,但我可不是让您照本宣科地对照这些计划来实施,而只是简单地了解一下流程图的初始值,如此则足够理解某些类型的计算方法了。此方法有助于我快速形成一个理念,而这个理念一度从我的脑中一闪而过、捕捉不及。
3. 算法的构造
那么,赫兹量化现在就继续基于流程图策略来准备“EA 交易”。
第一个程序块要求输入参数。我们已经清楚,于主战争时刻的等待至关重要,即,美国开市之后 2 小时,界时欧洲市场已收市。我们会就此监控全局时钟(即终端时间),因此,我们会自行计算开市时间。
之后,我们来确定仓位的大小和盈利与损失水平,而这些将来都还有优化的潜力。要格外注意幻数参数,因为“EA 交易”会用它来确定其订单和开盘交易。再进一步,赫兹量化会制作一个追踪止损,以限制就我们所知的仓位风险。
还有一个我们需要的有趣参数 - 安全水平。赫兹量化要根据它来观察此刻有无重大经济新闻,不管新闻能否构成威胁,都要认真考量这两个小时内出现的主要市场恐慌。

编辑
图 10。输入参数
//--- 输入参数 input int America=16; input double Lots=0.1; input int TakeProfit=500; input long MagicNumber=665; input int Limited=600; input int TrailingStop=100;
我们继续讲解策略形成的下一部分。
赫兹量化需要确定时段是否有交叉、订单是否已设置或正被设置。(图 11)。

编辑切换为居中
图 11。交易时间
您可以看到,给定的算法是一个带有输入参数、完整计算与输出结果的封闭式程序。这种迷你程序被称为函数,且通过封装于主程序保护起来。
封装与各程序或程序各个部分之间的屏障,通过 Get 和 Set (获取与设置)之类的方法分隔开来,避免其突破其它 Get 与 Set 的界限。该过程的本质在于,函数中的变量名称可能与主程序中的相同。但当 Get 方法试图从带有一个变量名称的单元格获取时,它就会面临封装 - 只赋予其访问(分配给该函数或程序的)存储单元某特定部分。
Set 方法也适用,只是与 Get 不同。它会将单元内存中的值设置为变量名称,如果程序中的变量名称与函数中的一致,则封装不允许 Set 方法为另一程序或函数内的变量赋值。
bool time2trade(int TradeHour,int Number) { MqlDateTime time2trade; TimeTradeServer(time2trade); if(time2trade.hour!=TradeHour) return(false); time2trade.hour= 0; time2trade.min = 0; time2trade.sec = 1; for(int ii=OrdersTotal()-1;ii>=0;ii--) { OrderGetTicket(ii); long ordmagic=OrderGetInteger(ORDER_MAGIC); if(Number==ordmagic) return(false); } HistorySelect(StructToTime(time2trade),TimeTradeServer()); for(int ii=HistoryOrdersTotal()-1;ii>=0;ii--) { long HistMagic=HistoryOrderGetInteger(HistoryOrderGetTicket(ii),ORDER_MAGIC); if(Number==HistMagic) return(false); } return(true); }
我们已经识别了所需的时段,并确定了是否已经设置订单。我们考虑一下接下来要做什么。
此前,赫兹量化注意到,大波动是在美国开市时段之后 2 个小时发生的。美洲开市时段之后,我们得到了 9 个十五分钟柱。我们找到该周期的最大范围,并仔细研究 - 如果此变化足够大,则市场中很有可能会出现大范围的恐慌,未来趋势也不好判断。因此,我们这里将需要一些限制。
当市场冷静下来时,则该时段就会加大其波动。这样就会赋予我们一个机会,确定于主趋势的最大偏差,把订单陷阱(会因主趋势继续而产生作用)放到一个安全的距离。前面我们已经讲过,价格可能上涨也可能下滑,但会始终向右移动。(图 12)。

编辑
图 12。下单算法
修改程序代码,注意交易终端赫兹量化 不允许接近上一次交易价格的订单设置。如果此刻价格绘制出了一个新的最小值或最大值,赫兹量化会通过退到上一次交易价格最小距离的方式来坚持自己的立场,以实现订单的可靠确认。而且,我们还会在一天结束之前设置自己订单的持续期,因为它们稍后就要过期了。