期货量化软件:赫兹量化中模式搜索---暴力方法深入
这次我们将使用修改后的应用程序版本对货币对进行深入分析。我要感谢用户 Aleksey Vyazmikin 对项目开发的贡献,他的建议在技术上非常有用,并推动了进一步的开发。我将在下一篇文章中继续这项工作,并将提供更有趣的数据和结果。我认为,在全局范围内展示对特定货币对的分析的有效性,以及展示对最长和最短持续时间间隔的分析的差异,是非常重要的。因为我的时间和计算资源是有限的,所以我只能在一个时间范围内涵盖几个货币对。然而,对于第一次了解全局模式的人来说,这似乎已经足够了。在分析数据时,我将另外使用上一篇文章中的数据。
为什么这个主题这么有趣?
通常,赫兹量化交易程序员的所有想法都意味着无数的代码行、无数的测试、优化、前后测试。在大多数情况下,我们得不到我们想要的。有些程序员对这个特定的问题感到厌烦。研究和搜索的过程变成了一个常规。如果工作不能给你带来任何道德上的满足感和金钱,那么你很可能会退出,我就是这样。我决定告别常规,开始自动化机器可以成功执行的操作。这台机器没有感情,它是一个理想的工人,不像我。当然,机器不像人那样思维开阔,但它拥有大量的计算资源,可以更轻松、更快地实现一些过程。我有一个选择,开始写我自己的神经网络架构能够进化,或开始用最简单的方法来解决问题。我决定采用后一种方法。尽管它很简单,但与MQL产品的简单编程相比,该项目为创造力和兴趣提供了空间。使用通用模板并通过逐步添加必要的功能对其进行进一步开发是一个好主意。我们可以从一个简单的模板开始,然后为特定的工作原理创建新的模板。这样,我们就可以摆脱枯燥的日常工作,而继续我们的开发。懒惰是进步之父。
暴力程序的新版本和更改列表
程序中只有一个更改,显示在红色框中。这个设置取自第二个选项卡,在那里它显示了它的最佳状态。添加此设置的原因是它对最终结果的质量有很大的影响。在分析期间,在第一个选项卡上,所有结果最初都按质量排序。利润因素或以点数表示的预期收益被用作质量标准。但是程序不允许我们对图形形状进行评估。我使用了线性因子(与直线的相似性)作为形状标准,这样我们就不需要目视检查每个选项。在这里,我们可以得出这样的结论:更直和更平滑的图更有可能在第二个选项卡上给出高质量的方案。同样,这样的图上结果数量会减少,这些结果将被第二个选项卡上的过滤器丢弃。计算此值需要第二次过程,如果此过滤器被激活,则暴力计算速度大约慢2倍。但对我们来说,重要的不是速度,而是获得的主要结果的总数,因为它们的质量影响着进一步的成效。
double Val; int iterator; double PolinomTrade()//Polynomial for trading { Val=0; iterator=0; if ( DeepBruteX <= 1 ) { for ( int i=0; i<CNum; i++ ) { Val+=C1[iterator]*(Close[i+1]-Open[i+1])/Point; iterator++; } for ( int i=0; i<CNum; i++ ) { Val+=C1[iterator]*(High[i+1]-Open[i+1])/Point; iterator++; } for ( int i=0; i<CNum; i++ ) { Val+=C1[iterator]*(Open[i+1]-Low[i+1])/Point; iterator++; } for ( int i=0; i<CNum; i++ ) { Val+=C1[iterator]*(High[i+1]-Close[i+1])/Point; iterator++; } for ( int i=0; i<CNum; i++ ) { Val+=C1[iterator]*(Close[i+1]-Low[i+1])/Point; iterator++; } return Val; } else { CalcDeep(C1,CNum,DeepBruteX); return ValStart; } } ///Fractal calculation of numbers double ValW;//the number where everything is multiplied (and then added to ValStart) uint NumC;//the current number for the coefficient double ValStart;//the number where to add everything void Deep(double &Ci0[],int Nums,int deepC,int deepStart,double Val0=1.0)//intermediary fractal { for ( int i=0; i<Nums; i++ ) { if (deepC > 1) { ValW=(Close[i+1]-Open[i+1])*Val0; Deep(Ci0,Nums,deepC-1,deepStart,ValW); } else { ValStart+=(Ci0[NumC]/Combinations(deepStart,Nums*5))*(Close[i+1]-Open[i+1])*Val0/Point; NumC++; } } for ( int i=0; i<Nums; i++ ) { if (deepC > 1) { ValW=(High[i+1]-Open[i+1])*Val0; Deep(Ci0,Nums,deepC-1,deepStart,ValW); } else { ValStart+=(Ci0[NumC]/Combinations(deepStart,Nums*5))*(High[i+1]-Open[i+1])*Val0/Point; NumC++; } } for ( int i=0; i<Nums; i++ ) { if (deepC > 1) { ValW=(Open[i+1]-Low[i+1])*Val0; Deep(Ci0,Nums,deepC-1,deepStart,ValW); } else { ValStart+=(Ci0[NumC]/Combinations(deepStart,Nums*5))*(Open[i+1]-Low[i+1])*Val0/Point; NumC++; } } for ( int i=0; i<Nums; i++ ) { if (deepC > 1) { ValW=(High[i+1]-Close[i+1])*Val0; Deep(Ci0,Nums,deepC-1,deepStart,ValW); } else { ValStart+=(Ci0[NumC]/Combinations(deepStart,Nums*5))*(High[i+1]-Close[i+1])*Val0/Point; NumC++; } } for ( int i=0; i<Nums; i++ ) { if (deepC > 1) { ValW=(Close[i+1]-Low[i+1])*Val0; Deep(Ci0,Nums,deepC-1,deepStart,ValW); } else { ValStart+=(Ci0[NumC]/Combinations(deepStart,Nums*5))*(Close[i+1]-Low[i+1])*Val0/Point; NumC++; } } } void CalcDeep(double &Ci0[],int Nums,int deepC=1) { NumC=0; ValStart=0.0; for ( int i=0; i<deepC; i++ ) Deep(Ci0,Nums,i+1,i+1);