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

 

小さなストレステストを実施した。インターネットをオフにして、チャート上のパネルでインジケータを起動した。上記のパラメータはすでに提供しました。その後、インターネットをオンにしたところ、以下の結果が得られました:

CL      0       22:29:43.402    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(10) indicator (handle 10) added to the collection
OS      0       22:29:43.402    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(EURUSD,H1:10) indicator (handle 11) added to the collection
DQ      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
QL      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
IO      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
PQ      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
LN      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
KE      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
JH      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
RK      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
OD      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
CR      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
GE      0       22:30:04.495    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::OnTimer::MA(EURUSD,H1:10): Tick emulation. Attempt 1 of 3 ...
II      0       22:30:34.092    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
LD      0       22:30:34.092    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
DH      0       22:30:34.092    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
NH      0       22:30:34.093    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
RG      0       22:30:34.093    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
JM      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
KP      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
CD      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
FL      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
RK      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
OM      0       22:30:37.935    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for a new tick and when the indicator will be calculated...
PI      0       22:30:37.935    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Calculation not completed
ND      0       22:30:37.935    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
PN      2       22:30:39.604    TestMSTFMovingAverages (EURUSD,M15)     array out of range in 'TestMSTFMovingAverages.mq5' (211,34)


インジケータがクラッシュした。

 

また、奇妙なことにも気づいた。USDCHFのM15チャート。



USDCHFのチャートというか、MA(USDCHF, H1)インディケータの赤い曲線を見ると、過去7時間、00分に次の値への移行が5回発生しています。私はそれを赤い縦線で強調しました。そして、最後の2時間だけはすべてが正常です。青い縦線。バッファ・フィルによる明らかなエラーである。

 
Denis Kirichenko #:

小さなストレステストを実施した。インターネットをオフにして、チャート上のパネルでインジケータを起動した。上記のパラメータはすでに提供しました。その後、インターネットをオンにしたところ、次のような結果が得られました:


インジケータがクラッシュしました。

デニス・キリチェンコ#:

私も奇妙なことに気づきました。USDCHFのM15チャート。



USDCHFのチャートというか、MA(USDCHF, H1)インディケータの赤い曲線を見ると、過去7時間、00分に次の値への移行が5回発生しています。私はそれを赤い縦線で強調しました。そして、最後の2時間だけはすべてが正常です。青い縦線。バッファ・フィルによる明らかなエラーである。

ありがとう。
 
Denis Kirichenko #:

小さなストレステストを実施した。インターネットをオフにして、チャート上のパネルでインジケータを起動した。上記のパラメータはすでに提供しました。その後、インターネットをオンにしたところ、次のような結果が得られました:


インジケータがクラッシュしました。

211行目のカーソル位置34で、定義済みの配列time[] にアクセスしています:

DrawData(mouse_bar_index,time[mouse_bar_index]);

配列に渡されたインデックスが正しくない ことが判明しました。

iBarShift()関数がOnChartEventハンドラで値を受け取り、-1を返すことがあるからです:

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- パネルでの作業
//--- パネル・イベント・ハンドラを呼び出す
   panel.OnChartEvent(id,lparam,dparam,sparam);

//--- カーソルが移動したり、グラフがクリックされた場合
   if(id==CHARTEVENT_MOUSE_MOVE || id==CHARTEVENT_CLICK)
     {
      //--- 時間と価格の座標を格納する変数を宣言する。
      datetime time=0;
      double price=0;
      int wnd=0;
      //--- カーソル座標が日付と時刻に変換される場合
      if(ChartXYToTimePrice(ChartID(),(int)lparam,(int)dparam,wnd,time,price))
        {
         //--- カーソルのあるバーのインデックスをグローバル変数に書き込む。
         mouse_bar_index=iBarShift(Symbol(),PERIOD_CURRENT,time);
         //--- パネル上のカーソルの下にバーデータを表示する。
         DrawData(mouse_bar_index,time);
        }
     }

//--- ユーザーイベントを受信したら、それに関するメッセージをログに出力する。
   if(id>CHARTEVENT_CUSTOM)
     {
      //--- パネルのクローズ・ボタンをクリックしたときの処理を示します。
      PrintFormat("%s: Event id=%ld, object id (lparam): %lu, event message (sparam): %s",__FUNCTION__,id,lparam,sparam);
     }
  }


DrawData()では、無効なインデックス値はCopyRates()を呼び出すことで処理され、インデックスが負の場合、データは取得されず、DrawData()を終了します:

//--- 指定したインデックスのバーデータを取得できなかった場合 - 終了
   if(CopyRates(Symbol(),PERIOD_CURRENT,index,1,rates)!=1)
      return;

したがって、time[]配列にアクセスする前に、配列に渡されたバー・インデックスをチェックする必要があります(211行目):

//--- パネル上のカーソルの下にバーデータを表示する(カーソルがチャートの外にある場合は現在のバー)
   if(mouse_bar_index>WRONG_VALUE && mouse_bar_index<rates_total)
      DrawData(mouse_bar_index,time[mouse_bar_index]);


一般論として。テーマの続き(マルチ・インディケーターのカラー・バッファなど)の開発で忙しいので、テストしていません。このトピックに関する次の記事が出版された後、私はそれをチェックし、テストします(p.211の変更で私より先にテストしなければ)。

 
Artyom Trishkin #:

211行目では、定義済みの配列time[] がカーソル位置34でアクセスされる

配列のインデックスが正しく渡されていない ようです。

iBarShift()関数によってOnChartEventハンドラで値を受け取る ため、-1を返す可能性があるからです:


DrawData()では、無効なインデックス値はCopyRates()を呼び出すことで処理され、インデックスが負の場合、データは取得されず、DrawData()を終了します:

したがって、time[] 配列にアクセスする前に、配列に渡されたバー・インデックスをチェックする必要があります(211 行目):


一般論として。私はこのトピックの続き(マルチ・インディケータのカラー・バッファなど)を開発するのに忙しいので、まだテストしていません。このトピックに関する次の記事が出版された後、私はそれをチェックし、テストします(p.211の変更で私より先にテストしなければ)。

iBarShift()は0を返しますが、CopyRates()に1より小さい値を入れることはできません。小節番号と小節数は等しくないので、どのような変形でもiBarShift()+1と 書くべきでしょう。

 
Alexey Viktorov #:

iBarShift()は0を返しますが、CopyRates()に1より小さい値を入れることはできません。したがって、バー番号とバーの数は等しくないので、どのような変形でもiBarShift()+1と 書くべきでしょう

この文脈では: インデックスは小節番号である。

 
Artyom Trishkin #:

この文脈では、インデックスは小節番号である。

アーテム、インデックスはゼロでもいいんだ。しかし、コピーされた要素の数

int  CopyRates( 
   string           symbol_name,       // キャラクター名 
   ENUM_TIMEFRAMES  timeframe,         // 期間 
   int              start_pos,         // どこから始めるか 
   int              count,             // コピー量 
   MqlRates         rates_array[]      // データがコピーされる配列 
   );

ゼロにすることはできない。

アイテム数やアイテムリストのインデックスと同じようにね。

 
Alexey Viktorov #:

アーテム、インデックスは......そう、ゼロでもいいんだ。しかし、コピーされた要素の数は

をゼロにすることはできない。

アイテム数やアイテムリストのインデックスと同じように...。

ここで

if(CopyRates(Symbol(),PERIOD_CURRENT,index,1,rates)!=1)

インデックスはどこを指すのか?

 
Artyom Trishkin #:

ここだよ:

インデックスはどこを指しているのか?

以上、黙ります。DrawData(mouse_bar_index,time)関数のコードを見ていなかった。

 

取引、自動取引システム、取引戦略のテストに関するフォーラム

マルチシンボル多期間インジケータの準備 "の記事についての議論

アルチョム・トリシキン, 2023.11.01 04:46 AM

...このトピックに関する次の記事を公開した後、私はチェックし、テストします(あなたが p.211の変更で先に私をテストしない 場合)。


何かをテスト するには、何が起こっているかのパラダイムにいる必要があります)。

私は、現在のアプローチに近くないので、私自身のバージョンをスケッチする方が簡単だと気づきました。特に、CIndMSTFクラスはある種のスーパークラスであるように思える。そして、それをベースにたくさんのインジケーター・クラスが 作られる。IndMSTF.mqhファイルは4,000行のコードです)。私はCIndicators クラスのインスタンスをインジケーター・コレクションとして使う方法をとった。これはとても便利だ。自転車を発明する必要はない。

では、なぜCIndMSTFクラスがバッファ(SBuffer m_buffers[])にデータを保存しなければならないのか?OnCalculate()で一度計算すれば十分だ。つまり、参照によってパラメータとして受け入れられ、計算され、与えられる...。

自分のバージョンが完成したら、反対意見については後で詳しく書きますが...。

そうだね、こういうメカニズムがあるのはいいね:

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


アルテム、もうひとつ。もし記事がマニュアルとして書かれていて、それを勉強したいという願望があるのなら、開発者が作成するクラスの関係のスキームが十分でないと思います。

それなら、なぜすべてのインジケータのコードを記事の素材にするのでしょうか?マルチシンボル・マルチ・ペリオド・インディケータのベース・クラスの全継承クラスの完全なリスト」 です。 何行のコードがあるのか見てみました。

これが始まりです:

そしてこれが最後だ:


ほぼ2,000行だ!