新的思路即使你使用30核的服务器,你也要等上好几天。唯一的解决方案是减少用于分析的数据量。这可以通过将整个周期分割成相等的间隔并跳过一些未计算的间隔来实现。这些间隔可以是分钟、小时、天、月和年。此外,这些有条件的领域具有某些交易参数的特征。换言之,除了加速,赫兹量化还可以从模式的角度详细研究一周中的每一天、每一小时、每一分钟。我们不必担心这种模式与什么有关。一般来说,不可能对所有的模式进行分类,因为它们的数量是无限的,而人脑不能理解和描述所有的模式(如果你有一个有效公式的话,这并不是真正必要的)。这就是数学。可以探索固定的时间段和固定的天数,也可以一次探索所有数据。这可以和下面的情况比较:我们有一个单变量函数,然后发现这只是一个多变量函数的特例,我们只是不知道而已。# b8 ]3 H+ [ H4 i/ D
样本分割与样本的可预测性我认为分析这个选项会很有趣,因为模式搜索模式在其上层功能上有很大的不同,因为分析的样本长度不同。除了显著加速计算外,还可以基于初始样本获得更有用(更小)的样本。得到的函数可以用简单的公式或多项式进一步分析。这是因为市场与世界时间紧密相连,交易活动主要是基于交易者的日常活动而形成的。这里赫兹量化也可以参考专家顾问,许多专家顾问可以被认为是可预测的参与者,但不是全部。例如,许多开发人员创建基于时间的夜间剥头皮交易机器人。事实证明,价格变动的性质不仅取决于过去的价格,还取决于某些日子、星期、月份,甚至可能是几年。这些值中的每一个都是量化的,也就是说,它具有某些固定值。当然,这些值可以拆分。例如,时间窗口可以不是以小时和分钟来度量,而是以新的一天开始后经过的秒来度量。这完全取决于哪些量更容易测量。这些量子化的量可以进一步分解到无穷大。在我的程序中,分割只在几天和几周内发生。我认为按年份划分并不那么有效。至于几个月,也许我以后会添加相关的功能。下图展示了上述观点:
7 V. C' j, |' i% R" A5 Z( u$ P) ^, i& ]- p* g% ^, Y
编辑切换为居中添加图片注释,不超过 140 字(可选)我已经为原始样本分割显示了两个任意选项。下面是如果暴力无限期地持续下去会发生什么。第一种情况是当我们实现所有可能的数学模式进行描述时,第二种情况显示了我们从唯一实现的暴力方法(多维泰勒多项式)得到的结果。总会有最可预测的样本和最不可预测的样本。同时,对于每一个多项式类型,都存在一个最优分段截面。这样的片段可能数不清,但我们可以以很小的精度检测到它们。我不考虑秒,因为我们是分析柱的。因此,对于分割参数的每个组合,赫兹量化可以为每个交易参数创建一个函数,我们可以在整个开发周期的输出中获得该函数。例如,预期收益和利润系数:( P# v! G/ y" I! K1 S* X
Ma=Ma(M,D,Ts,Te)
1 B3 }) L% s/ N r3 |4 _$ LPrF=PrF(M,D,Ts,Te)
! h: K* X+ M/ \& YM - 一年中的月份: X8 D% B/ [& y" \% D. h p
D - 星期几; l6 m( Q5 ?, K, ~
Ts - 区间起始时间8 S/ Z- J5 D, t$ n% C
Te - 区间结束时间 (可以过渡到0:00,即第二天)$ j0 J( i% c/ r+ `# U( ~
函数是离散的,所以,参数可以采用严格固定的值。通过修正与一周中的月和日相关的变量,赫兹量化可以大致想象这两个函数的样子。更改的最大数目是三个,这就是为什么只能用两个自由变量创建信息图的原因。我使用的是 "Ts" 和 "Te":
3 J, v- e) V" B* t! q' c4 h2 y' A0 Q& A( g* }
编辑切换为居中添加图片注释,不超过 140 字(可选)赫兹量化用来预测未来的每一个公式或算法都会有这样独特的图表来描述未来交易系统的所有数量特征。我只展示了其中的两个来证明,如果存在最大的利润因素,就不一定会有最大的预期收益。在大多数情况下,你必须在预期收益和利润因子之间取得平衡,因为存在点差、佣金和隔夜息。对于每个公式,这些极值的数目和它们的值是不同的。我们不能手动执行多维极值搜索,但可以使用我们的程序来完成。我想提一件事,在使用我的软件研究市场时,我注意到一个有趣的部分,其中许多货币对高估了可预测性价值。大约在23:30到0:30之间。这肯定与日期点的变化有关。然而,在赫兹量化中表现出良好盈利因素的策略的盈利能力在赫兹量化中测试时并未得到证实。原因在于点差。一定要重复检查确保模式不会落于点差之内,发现的大部分模式都在点差内部。
. b) U* z. T0 S- f0 Q搜索算法的最终修改最终修改的目的是加速程序运行,以及最大限度地提高搜索的可变性和效率。更改列表:
5 j7 o/ A4 a* Z
; n, x7 H- y: ]增加了在固定时间间隔内搜索模式的功能! H9 o3 }8 m. \8 F/ y7 |; q% P
增加了只在选定日期交易的功能
/ Q! l2 p% H; Y& r* L# k增加了根据所选天数为每个新变量生成随机天数集的功能
. `6 d2 e9 _8 A; U通过以分钟为单位指定可能的最小和最大窗口持续时间,增加了生成随机服务器时间窗口的功能
5 u' K: M! S3 `. S" T2 _组合任何这些设置的功能
1 ?/ O0 b( \" @4 Q! @. z& @第二个优化选项卡现在可以在多线程模式下工作+ J r: {9 @ Y! u
优化了优化模式7 C, e' I, E4 O- t3 m3 d) j
更新后的窗口如下所示:
% l% i( F C R5 Y2 P+ b Q" f6 q- M' N7 h
编辑添加图片注释,不超过 140 字(可选)" B4 ~5 p" m/ c1 _" _- R* B
第二个选项卡没有变化:. P& G, f& d6 u* Q: B
, }; f+ G, h* H4 ]6 m5 V$ @# q
编辑添加图片注释,不超过 140 字(可选)下面是第三个选项卡:
- {$ r' j. V% i, w7 }& T4 a
# w! P( w& N, ^; @5 s+ @
编辑添加图片注释,不超过 140 字(可选)界面依旧非常原始,因此设置很难适应表单。我将在下一个程序版本中完全修改界面,这将在下一篇文章中介绍。我还将录制一个视频,内容就是使用我的程序创建一个专家顾问的整个过程。你会看到这是多么简单和快速。您只需要了解界面设置并进行一点练习。
5 ]; Q# q$ P, L2 w模板优化与辅助专家顾问为了实现新任务,我还必须修改专家顾问模板。机器人生成所需格式的报价,该报价可以方便地被程序读取。EA为 赫兹量化生成报价的代码如下:string FileNameString;uint Handle0x;datetime Time0=0;double Open[];double Close[];double High[];double Low[];datetime Time[];void WriteEnd() { FileWriteString(Handle0x,"EndBars"+"\r\n"); MqlDateTime T; TimeToStruct(Time[1],T); FileWriteString(Handle0x,IntegerToString(int(T.year))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.mon))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.day))); }void OpenAndWriteStart() { FileDelete(FileNameString); Handle0x=FileOpen(FileNameString,FILE_WRITE|FILE_TXT|FILE_COMMON|FILE_ANSI,'\t',CP_UTF8); FileSeek(Handle0x,0,SEEK_SET); FileWriteString(Handle0x,"DataXXX"+" "+Symbol()+" "+IntegerToString(Period())+"\r\n"); FileWriteString(Handle0x,DoubleToString(_Point,8)+"\r\n"); MqlDateTime T; TimeToStruct(Time[1],T); FileWriteString(Handle0x,IntegerToString(int(T.year))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.mon))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.day))+"\r\n"); } void WriteBar() { FileWriteString(Handle0x,"\r\n"); FileWriteString(Handle0x,DoubleToString(Close[1],8)+"\r\n"); FileWriteString(Handle0x,DoubleToString(Open[1],8)+"\r\n"); FileWriteString(Handle0x,DoubleToString(High[1],8)+"\r\n"); FileWriteString(Handle0x,DoubleToString(Low[1],8)+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(Time[1]))+"\r\n"); MqlDateTime T; TimeToStruct(Time[1],T); FileWriteString(Handle0x,IntegerToString(int(T.hour))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.min))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.day_of_week))+"\r\n"); //FileClose(Handle0x); } void CloseFile() { FileClose(Handle0x); }bool bNewBar() { ArraySetAsSeries(Close,false); ArraySetAsSeries(Open,false); ArraySetAsSeries(High,false); ArraySetAsSeries(Low,false); CopyOpen(_Symbol,_Period,0,2,Open); CopyClose(_Symbol,_Period,0,2,Close); CopyHigh(_Symbol,_Period,0,2,High); CopyLow(_Symbol,_Period,0,2,Low); ArraySetAsSeries(Close,true); ArraySetAsSeries(Open,true); ArraySetAsSeries(High,true); ArraySetAsSeries(Low,true); if ( Time0 < Time[1] ) { if (Time0 != 0) { Time0=Time[1]; return true; } else { Time0=Time[1]; return false; } } else return false; }//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { ArrayResize(Close,2,0); ArrayResize(Open,2,0); ArrayResize(Time,2,0); ArrayResize(High,2,0); ArrayResize(Low,2,0); FileNameString="DataHistory"+" "+Symbol()+" "+IntegerToString(Period()); OpenAndWriteStart(); return(INIT_SUCCEEDED); }void OnDeinit(const int reason) { WriteEnd(); CloseFile(); }void OnTick() { ArraySetAsSeries(Time,false); CopyTime(_Symbol,_Period,0,2,Time); ArraySetAsSeries(Time,true); if ( bNewBar()) WriteBar(); }它只有几个简单的函数,有些函数在测试开始时编写一些内容,有些函数在测试结束时添加一些关于报价的信息,而主函数只在出现一个新柱时编写关于它的信息。这个 EA 没有输入参数。在历史数据上运行它,它将以适当的格式生成报价文件,该文件可以被程序读取。嗯,这不是一个很好的解决办法。也许,在未来我将能够实现从终端直接读取报价。到目前为止,上述解决方案相当方便,至少对我来说很方便。 |