著者に感謝。考えなければならないことがある。
もしこのクラスが基本的なものであるなら、その名前は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
名前によって。
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
これには 同意する。他は
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)のバッファ充填に何か問題があるようだ。
新しいチャートを開き、TestMSTFMovingAveragesを実行した。そして奇跡的に、画像が修正されたようです。
ログを見る:
さらに、23:00のパネルでは、最初のケースでも2番目のケースでも、MA(EURUSD,H1:10) = 1.056959となって いる。これは正しい。どうやら、最初のケースでは、MA(EURUSD,H1:10)のバッファ充填に何か問題があるようです。
...При работе с данными не текущего графика для исключения "освобождения" таймсерии, необходимо не реже. чем раз в две минуты обращаться к этой таймсерии. В этом случае будет происходить "удержание" таймсерии, что ускорит к ней обращение (не нужно будет каждый раз дожидаться синхронизации данных)...
その 周波数はどのようにして得られたのですか?実験的に決めたのですか?
そのような構造がある:
//--- 構造 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); } };
そして、バッファを操作するメソッドも必要です。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事「多銘柄多期間指標の作成」はパブリッシュされました:
この記事では、多銘柄、多期間の指標を作成する原則について見ていきます。また、エキスパートアドバイザー(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