記事「知っておくべきMQL5ウィザードのテクニック(第23回):CNN」についてのディスカッション

 

新しい記事「知っておくべきMQL5ウィザードのテクニック(第23回):CNN」はパブリッシュされました:

畳み込みニューラルネットワーク(Convolutional Neural Network: CNN)もまた、多次元のデータセットを主要な構成要素に分解することに特化した機械学習アルゴリズムです。一般的にどのように達成されるかを見て、別のMQL5ウィザードシグナルクラスのトレーダーへの応用の可能性を探ります。

本連載では、MQL5ウィザードが提供する迅速なテストとプロトタイピング環境を利用して、トレーダーにとって有益な機械学習と統計のアイデアを見ていきます。ゴールは1つの記事で1つのアイデアを見ることに変わりはなく、この作品については当初、少なくとも2つの記事が必要だと考えていたが、どうやら1つの記事に絞ることができそうです。 畳み込みニューラルネットワーク(CNN)は、その名が示すように、カーネルによって多次元のデータを畳み込み処理します。 

これらのカーネルはネットワークの重みを持ち、多次元の入力データと同様に、通常は行列形式です。後述するように、フィードフォワード中に入力データ行列を反復することで、各反復は実質的に入力データをサイクルします。この「サイクル」が「畳み込み」という名前の由来となっています。 

そこでこの記事では、CNNに関与する主要なステップを紹介し、これらのステップを実装する簡単なMQL5クラスを構築し、このクラスをカスタムMQL5ウィザードシグナルクラスに統合し、最後にこのシグナルクラスから組み立てたEAでテスト実行をおこないます。

作者: Stephen Njuki

 

多くのファイルが失われたため、 コンパイルできません。


//--- 利用可能な末尾

#include <ExpertTrailingNone.mqh>.
#define <ExpertMoneyFixedMargin.mqh>

 
Somkait Somsanitungkul //--- 資金管理
#define <ExpertMoneyFixedMargin.mqh>

こんにちは。

あなたが参照しているファイルはMQL5 IDEに付属しています。ウィザードの使い方についてはこちらと こちらに ガイドがあります。

お読みいただきありがとうございます。

MQL5 Wizard: Creating Expert Advisors without Programming
MQL5 Wizard: Creating Expert Advisors without Programming
  • www.mql5.com
Do you want to try out a trading strategy while wasting no time for programming? In MQL5 Wizard you can simply select the type of trading signals, add modules of trailing positions and money management - and your work is done! Create your own implementations of modules or order them via the Jobs service - and combine your new modules with existing ones.
 
2024.08.30 19:02:07.453 2020.01.28 00:00:00 'SignalWZ_23_.mqh'のインデックスが範囲外(191,38)

 
Israel Goncalves Moraes De Souza 範囲外です(191,38)

私も同じ現象が発生しています。このエラーは、_c[]ベクトルがコピーされていないことに起因しています。_ma[0]が移動平均の直近のバー価格を表すのと同様に、_c[]は直近の終値を表します。その数行下で更新されているのですが、何らかの理由で更新が漏れてしまったようです。


double CSignalCNN::GetOutput()
  {
   int _index = 5;
   matrix _inputs;
   vector _ma, _h, _l, _c;
   _inputs.Init(m_input_size, m_input_size);
   for(int g = 0; g < m_epochs; g++)
     {
      for(int h = m_train_set - 1; h >= 0; h--)
        {
         _inputs.Fill(0.0);
         _index = 0;
         for(int i = 0; i < m_input_size; i++)
           {
            for(int j = 0; j < m_input_size; j++)
              {
               if(_ma.CopyIndicatorBuffer(m_ma[_index].Handle(), 0, h, __KERNEL + 1)
                  && _h.CopyRates(m_symbol.Name(), m_period, 2, h, __KERNEL + 1)
                  && _l.CopyRates(m_symbol.Name(), m_period, 4, h, __KERNEL + 1)
                  && _c.CopyRates(m_symbol.Name(), m_period, 8, h, __KERNEL + 1))
                 {
                  _inputs[i][j] = _c[0] - _ma[0];
                  _index++;
                 }
              }
           }
         //

         //Print(" 入力は次のとおりです: \n", _inputs);
         CNN.Set(_inputs);
         CNN.Pad();
         //Print(" パディングが適用された入力は次のとおりです: \n", CNN.inputs);
         CNN.Convolve();
         CNN.Activate();
         CNN.Pool();
         // 各行列における最終的な価格変動を、強気、弱気、あるいはウィップソー現象の指標として扱う
         // eventual には行列が想定されている:
         // 価格の大幅な変動
         // 低価格の変更
         // 終値の変動、
         // それぞれ
         //
         // 各列の価格変動は、それぞれ1バー、2バー、3バーにわたるものです
         // また、各行における価格変動は、適用された価格と他の適用価格との異なる重み付けに基づいています
         // 最高値は、最高値のみ(H)、(最高値+最高値+終値)÷3(HHC)、および(最高値+終値)÷3(HC)である
         // ここで、「low」とは、安値のみ(L)、(安値+安値+終値)÷3(LLC)、および(安値+終値)÷3(LC)を指す。
         // 終値は、単に「終値のみ(C)」、(高値 + 安値 + 終値 + 終値)/3(HLCC)、および (高値 + 安値 + 終値)/3(HLC)である。
         //
         // ここでの前提は以下の通りです:
         // 高値圏での大きな値は強気傾向を示す
         // 低値圏での大きな数値は弱気傾向を示す
         // 変動幅が小さく、値動きが狭い状況では、相場が乱高下する傾向にある
         matrix _targets[];
         ArrayResize(_targets, __KERNEL_SIZES.Size());
         for(int i = 0; i < int(__KERNEL_SIZES.Size()); i++)
           {
            _targets[i].Init(__KERNEL_SIZES[i], __KERNEL_SIZES[i]);
            //
            for(int j = 0; j < __KERNEL_SIZES[i]; j++)
              {
               if(i == 0)// 「強気度」の最高値
                 {
                  _targets[i][j][0] = _h[j] - _h[j + 1];
                  _targets[i][j][1] = ((_h[j] + _h[j] + _c[j]) / 3.0) - ((_h[j + 1] + _h[j + 1] + _c[j + 1]) / 3.0);
                  _targets[i][j][2] = ((_h[j] + _c[j]) / 2.0) - ((_h[j + 1] + _c[j + 1]) / 2.0);
                 }
               else
                  if(i == 1)// 「弱気度」の最低値
                    {
                     _targets[i][j][0] = _l[j] - _l[j + 1];
                     _targets[i][j][1] = ((_l[j] + _l[j] + _c[j]) / 3.0) - ((_l[j + 1] + _l[j + 1] + _c[j + 1]) / 3.0);
                     _targets[i][j][2] = ((_l[j] + _c[j]) / 2.0) - ((_l[j + 1] + _c[j + 1]) / 2.0);
                    }
                  else
                     if(i == 2)// 「ウィップソー」を終了
                       {
                        _targets[i][j][0] = _c[j] - _c[j + 1];
                        _targets[i][j][1] = ((_h[j] + _l[j] + _c[j] + _c[j]) / 3.0) - ((_h[j + 1] + _l[j + 1] + _c[j + 1] + _c[j + 1]) / 3.0);
                        _targets[i][j][2] = ((_h[j] + _l[j] + _c[j]) / 2.0) - ((_h[j + 1] + _l[j + 1] + _c[j + 1]) / 2.0);
                       }
              }
            //
            //Print(" " + IntegerToString(i) + " のターゲットは次のとおりです: \n", _targets[i]);
           }
         CNN.Get(_targets);
         CNN.Evolve(m_learning_rate);
        }
     } // Forループの終了

   _index = 0;
   _h.CopyRates(m_symbol.Name(), m_period, 2, 0, __KERNEL + 1);
   _l.CopyRates(m_symbol.Name(), m_period, 4, 0, __KERNEL + 1);
   _c.CopyRates(m_symbol.Name(), m_period, 8, 0, __KERNEL + 1);
   for(int i = 0; i < m_input_size; i++)
     {
      for(int j = 0; j < m_input_size; j++)
        {
         if(_ma.CopyIndicatorBuffer(m_ma[_index].Handle(), 0, 0, __KERNEL + 1))
           {
            _inputs[i][j] = _c[__KERNEL] - _ma[__KERNEL];
            _index++;
           }
        }
     }
   CNN.Set(_inputs);
   CNN.Pad();
   CNN.Convolve();
   CNN.Activate();
   CNN.Pool();
   double _long = 0.0, _short = 0.0;
   if(CNN.output[0].Median() > 0.0)
     {
      _long = fabs(CNN.output[0].Median());
     }
   if(CNN.output[1].Median() < 0.0)
     {
      _short = fabs(CNN.output[1].Median());
     }
   double _neutral = fabs(CNN.output[2].Median());
   if(_long + _short + _neutral == 0.0)
     {
      return(0.0);
     }
   return((_long - _short) / (_long + _short + _neutral));
  }

このメソッドを置き換えてください

 
Tobias Johannes Zimmer #:

私も同じ現象が発生しています。このエラーは、_c[] ベクトルがコピーされていないことに起因しています。_ma[0] が移動平均の直近のバー価格を表すのと同様に、_c[] は直近の終値を表しています。その数行下で更新されているはずですが、何らかの理由で更新が漏れてしまったようです。


このメソッドを置き換えてください

修正した添付ファイルをご確認ください。

ファイル:
 
デバッグ済みの添付ファイルをご確認ください。
ファイル: