記事「多銘柄多期間指標の作成」についてのディスカッション

 

新しい記事「多銘柄多期間指標の作成」はパブリッシュされました:

この記事では、多銘柄、多期間の指標を作成する原則について見ていきます。また、エキスパートアドバイザー(EA)や他の指標から、このような指標のデータにアクセスする方法も紹介します。EAや指標でマルチ指標を使用する主な特徴について考察し、カスタム指標バッファを使用してそれらをプロットする方法を見ていきます。

テスト用指標をコンパイルした後、M1周期のチャートで起動し、設定で現在の銘柄と指標の計算期間M5を選択します。この場合、指標の設定で選択した2本の移動平均線が作成されます。そのうちの1つは現在のチャートデータを使用して計算され、もう1つは5分足チャートのデータに基づいて計算されます。チャートの時間枠を切り替えると、M1に2本の線が引かれているのがわかります。1本はM1で計算された移動平均線に対応し、2本目はM5で計算された移動平均線に対応します。チャートをM5に切り替えると、2つ目の指標は1つ目の指標と同じになるため、1つの指標しか作成されません。チャートをM15に切り替えると、1つの指標がM15用に計算され、2つ目の指標がM5用に計算され、チャートにも表示されます。


ご覧のように、宣言された機能は動作し、メインチャートウィンドウに指標を見ることができます。1つのバッファを使用しながら、複数の指標が作成されます。

作者: Artyom Trishkin

 

著者に感謝。考えなければならないことがある。

もしこのクラスが基本的なものであるなら、その名前はCBaseIndMSTF であるべきだと思う。あるいはCBaseIndMSMTFでも いい。MSMTF -マルチシンボル・マルチタイムフレーム

名前は

ENUM_IND_CATEGORYは良い。

以下はあまりよくない。

enum_compare_mode --> enum_ind_compare_mode

enum_line_state --> enum_ind_line_state

enum_err_type --> enum_ind_calc_err_type


enum ENUM_ERR_TYPE            // 指標計算におけるエラーの種類
  {
   ERR_TYPE_NO_ERROR,         // エラーなし
   ERR_TYPE_NO_CYNC,          // データが同期されていない
   ERR_TYPE_NO_DATA,          // データが読み込まれない
   ERR_TYPE_NO_CALC,          // 計算が完了していない
  };

err_type_no_cync--> err_type_no_sync

 
Denis Kirichenko マルチシンボル・マルチタイムフレーム。

名前によって。

ENUM_IND_CATEGORYでよい。

以下は良くない。

enum_compare_mode --> enum_ind_compare_mode

enum_line_state --> enum_ind_line_state

enum_err_type --> enum_ind_calc_err_type


err_type_no_cync--> err_type_no_sync

これには 同意する。他は

 
同期 する
 
Denis Kirichenko #:
同期する/ 同期させる

意味がわからない。2つの "s "が強調表示されていますが、それが何か?

"No Sync" - 同期していない。どうしたんだ?「エラー:同期されていません

ああ!

最後の最後でSの代わりにCを見た...ありがとう。直しておくよ。

 

Artem、EURUSDチャートでTestMSTFMovingAveragesインディケータを 実行。オフの日。Tf1 = M15、Tf2 = H1

入力パラメータ:

InpIndicator=26
InpSymbol=
InpTimeframe=16385
InpPrice=1
InpMethod=0
InpShift=0
InpAsSeries=true

これが出てきたものです:

ログ:

HD      0       20:22:12.149    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(10) indicator (handle 10) added to the collection
PJ      0       20:22:12.150    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(EURUSD,H1:10) indicator (handle 11) added to the collection
CG      0       20:22:12.179    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Start downloading data by EURUSD/H1. Waiting for the next tick...
OG      0       20:22:12.179    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data not loaded
HQ      0       20:22:12.179    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
QH      0       20:22:12.224    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::DataToBuffer::MA(EURUSD,H1:10) First start, or historical data has been changed. Initialize Buffer(0)


23:00のローソク足を十字線でハイライト。赤いSMA10ラインは、23:00の次のローソク足でのみ値が変化していることがわかります。つまり、23:00と23:15で 値が変化しているのです

私の理解では、Tf2の 現在の値から次の値への遷移は22:45と23:00に 起こるはずです


すると、このようになりました。別のEURUSD-H1チャート 上で、オフセット=1でSMA10インジケータを実行します。

新しいチャートを開き、TestMSTFMovingAveragesを実行します。そして奇跡的に、画像が修正されたようです。


ログを見る:

2023.10.29 20:38:42.583 TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(10) indicator (handle 10) added to the collection
2023.10.29 20:38:42.584 TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(EURUSD,H1:10) indicator (handle 11) added to the collection
2023.10.29 20:38:42.622 TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::DataToBuffer::MA(10) First start, or historical data has been changed. Initialize Buffer(0)
2023.10.29 20:38:42.654 TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::DataToBuffer::MA(EURUSD,H1:10) First start, or historical data has been changed. Initialize Buffer(0)


そして、最初のケースでも2番目のケースでも、23:00のパネルではMA(EURUSD,H1:10) = 1.056959となって いる。これは正しい。どうやら最初のケースでは、MA(EURUSD,H1:10)のバッファ充填に何か問題があるようだ。

 
Denis Kirichenko EURUSD-H1チャート 上で、オフセット=1でSMA10インジケータを実行しました。

新しいチャートを開き、TestMSTFMovingAveragesを実行した。そして奇跡的に、画像が修正されたようです。


ログを見る:


さらに、23:00のパネルでは、最初のケースでも2番目のケースでも、MA(EURUSD,H1:10) = 1.056959となって いる。これは正しい。どうやら、最初のケースでは、MA(EURUSD,H1:10)のバッファ充填に何か問題があるようです。

ありがとう、デニス。このトピックを続けるのに忙しく、残念ながらまだ時間がありません。
 

...При работе с данными не текущего графика для исключения "освобождения" таймсерии, необходимо не реже. чем раз в две минуты обращаться к этой таймсерии. В этом случае будет происходить "удержание" таймсерии, что ускорит к ней обращение (не нужно будет каждый раз дожидаться синхронизации данных)...

その 周波数はどのようにして得られたのですか?実験的に決めたのですか?

 
Denis Kirichenko #:

その 周波数はどのようにして得られたのですか?実験的に決めたのですか?

フォーラムでの開発者からのメッセージ

 

そのような構造がある:

//--- 構造
struct SBuffer                // インジケーター・バッファーの構造
  {
   double            array[];    // インジケータ配列バッファ
   double            init_value; // 値の初期化
   int               shift;      // バッファを水平方向にシフトする
   string            descript;   // バッファの説明
   //--- (1) 設定、(2) 初期化値を返す、
   void              SetInitValue(const double value) { init_value=value;                             }
   double            InitValue(void)                  { return init_value;                            }
   //--- (1) バッファシフトを設定、(2) バッファシフトを返す
   void              SetShift(const int value)        { shift=value;                                  }
   int               Shift(void)                      { return shift;                                 }
//--- (1) バッファ配列のサイズを変更し、(2) バッファ配列のサイズを返す、
//--- (3) 配列を「空」の値で初期化する。
   bool              BuffResize(const int new_size)   { return(ArrayResize(array,new_size)==new_size);}
   uint              BufferSize(void)                 { return array.Size();                          }
   int               InitBuffer(void)                 { return ArrayInitialize(array,init_value);     }
  };

setget-methodsがあるので、private アクセス 指定子が足りない:

//--- 構造
struct SBuffer                // インジケーター・バッファーの構造
   {
   private:
      double            array[];    // インジケータ配列バッファ
      double            init_value; // 値の初期化
      int               shift;      // バッファを水平方向にシフトする
      string            descript;   // バッファの説明
   public:
      //--- (1) 設定、(2) 初期化値を返す、
      void              SetInitValue(const double value)
         {
         init_value = value;
         }
      double            InitValue(void)
         {
         return init_value;
         }
      //--- (1) バッファシフトを設定、(2) バッファシフトを返す
      void              SetShift(const int value)
         {
         shift = value;
         }
      int               Shift(void)
         {
         return shift;
         }
//--- (1) バッファ配列のサイズを変更し、(2) バッファ配列のサイズを返す、
//--- (3) 配列を「空」の値で初期化する。
      bool              BuffResize(const int new_size)
         {
         return(ArrayResize(array, new_size) == new_size);
         }
      uint              BufferSize(void)
         {
         return array.Size();
         }
      int               InitBuffer(void)
         {
         return ArrayInitialize(array, init_value);
         }
   };


そして、バッファを操作するメソッドも必要です。

 
Denis Kirichenko #:

そういう構造がある:

setget-methodsがある以上、private アクセス 指定子が欠けている:


そして、バッファを操作するメソッドも必要です。

当初、私は物事を複雑にしないように努めた。