量化软件——赫兹MT5自然性四边形归纳法

概述:
我们已经通过这些系列文章介绍了范畴论在分类离散数据中的应用,并通过相当多的例子展示了交易算法是如何实现的,主要是管理跟踪止损,也包括处理进场信号和头寸大小的算法;可以无缝地结合到 EA 交易中,以实现其一些概念。IDE中的MQL5向导在这方面发挥了重要作用,因为所有共享源代码都需要与向导一起组装,才能产生可测试的系统。

MQL5脚本实现:
到目前为止,我们已经严格使用MQL5的IDE对这些系列中提供的所有内容进行了编码。强调除了自定义指标、EA交易和MQL5脚本之外,您还可以在此IDE中编码/开发服务、库、数据库甚至python脚本,这可能很有用。

在本文中,我们只是使用一个脚本来演示通过自然性四边形归纳法来分类。EA交易的信号类实例是理想的,而不仅仅是一个脚本。然而,实现多货币信号类虽然可能,但并不像本文所允许的那样可行。因此,我们将在非优化的环境中打印 EURUSD 收盘价的预测和实际变化,并使用这些结果来支持或反驳我们的论点,即自然性四边形归纳法在进行预测时是有用的。

因此,我们的脚本首先创建一个域范畴的实例来保存我们的一系列 USDJPY 收盘价格变化。该范畴可用于训练和标记。尽管使用它进行训练会为从它到共域范畴的函子(我们的两个函子)设置权重,但这些权重对我们的预测并不重要(如上一篇文章中所述),只是在这里简单提一下。

      //create domain series (USDJPY-rates) in first category for training
      CCategory _c_a_train;_c_a_train.Let();
      int _a_size=GetObject(_c_a_train,__currency_a,__training_start,__training_stop);
然后,我们创建一个共域范畴的实例,该实例将以前面提到的两个时间序列为特征,即 EURJPY 和 EURUSD。由于每个价位代表一个对象,我们需要注意通过顺序添加每个系列的对象来“保留”范畴中的两个系列。我们将它们称为b和c。

      //create 2 series (EURJPY and EURUSD rates) in second category for training
      CCategory _c_bc_train;_c_bc_train.Let();
      int _b_trains=GetObject(_c_bc_train,__currency_b,__training_start,__training_stop);
      int _c_trains=GetObject(_c_bc_train,__currency_c,__training_start,__training_stop);
因此,我们像上一篇文章中那样的预测将集中在形成自然性四边形的共域中的对象上。将每个系列连接在一起的态射,以及跨系列连接对象的自然变换,就是我们将映射为RDF的内容。

我们的脚本有一个归纳次数的输入参数,这就是我们如何放大四边形并在下一个柱之外进行投影。因此,我们在n个归纳上的自然性四边形将形成一个四边形,我们认为它有角A、B、C和D,这样AB和CD将是我们的变换,而AC和BD将是态射。

在实现这种映射时,可以选择同时使用MLP和RDF,比如分别用于变换和态射。我将让读者来探讨一下,因为我们已经看到了如何合并MLP。不过,接下来我们需要用数据填充RDF的训练模型,这是通过矩阵完成的。从AB到CD的每个映射的四个RDF将有自己的矩阵,它们由以下列表填充:

      //create natural transformation, by induction across, n squares..., cpi to pmi
      //mapping by random forests
      int _training_size=fmin(_c_trains,_b_trains);
      int _info_ab=0,_info_bd=0,_info_ac=0,_info_cd=0;
      CDFReport _report_ab,_report_bd,_report_ac,_report_cd;
      CMatrixDouble _xy_ab;_xy_ab.Resize(_training_size,1+1);
      CMatrixDouble _xy_bd;_xy_bd.Resize(_training_size,1+1);
      CMatrixDouble _xy_ac;_xy_ac.Resize(_training_size,1+1);
      CMatrixDouble _xy_cd;_xy_cd.Resize(_training_size,1+1);
      
      double _a=0.0,_b=0.0,_c=0.0,_d=0.0;
      CElement<string> _e_a,_e_b,_e_c,_e_d;
      string _s_a="",_s_b="",_s_c="",_s_d="";
      for(int i=0;i<_training_size-__n_inductions;i++)
      {
         _s_a="";_e_a.Let();_c_bc_train.domain[i].Get(0,_e_a);_e_a.Get(1,_s_a);_a=StringToDouble(_s_a);
         _s_b="";_e_b.Let();_c_bc_train.domain[i+_b_trains].Get(0,_e_b);_e_b.Get(1,_s_b);_b=StringToDouble(_s_b);
         _s_c="";_e_c.Let();_c_bc_train.domain[i+__n_inductions].Get(0,_e_c);_e_c.Get(1,_s_c);_c=StringToDouble(_s_c);
         _s_d="";_e_d.Let();_c_bc_train.domain[i+_b_trains+__n_inductions].Get(0,_e_d);_e_d.Get(1,_s_d);_d=StringToDouble(_s_d);
         
         if(i<_training_size-__n_inductions)
         {
            _xy_ab[i].Set(0,_a);
            _xy_ab[i].Set(1,_b);
            
            _xy_bd[i].Set(0,_b);
            _xy_bd[i].Set(1,_d);
            
            _xy_ac[i].Set(0,_a);
            _xy_ac[i].Set(1,_c);
            
            _xy_cd[i].Set(0,_c);
            _xy_cd[i].Set(1,_d);
         }
      }


请注意,我们的脚本输入参数包括3个日期,即训练开始日期、训练停止日期和测试停止日期。这些值最好在使用前进行验证,以确保它们按照我所说的顺序递增。此外,缺少的是测试开始日期,因为训练停止日期也充当了测试开始日期。因此,我们使用以下代码实现了一个前瞻测试:

      //
      if(_info_ab>0 && _info_bd>0 && _info_ac>0 && _info_cd>0)
      {
         //create 2 objects (cpi and pmi) in second category for testing
         CCategory _c_cp_test;_c_cp_test.Let();
         int _b_test=GetObject(_c_cp_test,__currency_b,__training_stop,__testing_stop);
         ...
      
         ...
         
         MqlRates _rates[];
         ArraySetAsSeries(_rates,true);
         if(CopyRates(__currency_c,Period(), 0, _testing_size+__n_inductions+1, _rates)>=_testing_size+__n_inductions+1)
         {
            ArraySetAsSeries(_rates,true);
            
            for(int i=__n_inductions+_testing_size;i>__n_inductions;i--)
            {
               _s_a="";_e_a.Let();_c_cp_test.domain[i].Get(0,_e_a);_e_a.Get(1,_s_a);_a=StringToDouble(_s_a);
               
               double _x_ab[],_y_ab[]; ArrayResize(_x_ab,1); ArrayResize(_y_ab,1);
               ArrayInitialize(_x_ab,0.0); ArrayInitialize(_y_ab,0.0);
               //
               _x_ab[0]=_a; _forest.DFProcess(_rdf_ab,_x_ab,_y_ab);
               
               ...
               
               double _x_cd[],_y_cd[]; ArrayResize(_x_cd,1); ArrayResize(_y_cd,1);
               ArrayInitialize(_x_cd,0.0); ArrayInitialize(_y_cd,0.0);
               //
               _x_cd[0]=_y_ac[0]; _forest.DFProcess(_rdf_cd,_x_cd,_y_cd);
               
    
请记住,我们有兴趣预测 EURUSD 的变化,在我们的正方形中用D表示。 在检查我们对前瞻测试的预测时,我们记录在方向上严格匹配的值,以及在涉及零的情况下可能在方向上匹配的值。最后,我们还记录未命中的值。这一切都在上面显示的代码中得到了体现。

因此,为了总结我们的脚本,我们首先声明训练范畴,我们迫切需要这些范畴来进行数据预处理和训练。我们使用的套利外汇货币对是 USDJPY、EURJPY 和 EURUSD。我们使用在序列中充当态射的RDF和在序列中的自然变换来映射我们的共域范畴中的对象,以对由训练停止日期和测试停止日期定义的测试数据进行预测。

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值