事前計算された

 
バグ、不具合、問題」に関係のないコメントは、このスレッドに移動しました。
 

MT5ビルド1455

テスト用のインジケーターです。

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

int OnCalculate(const int rates_total,
  const int prev_calculated,
  const datetime &Time[],
  const double &Open[],
  const double &High[],
  const double &Low[],
  const double &Close[],
  const long &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1.チャート上にインジケーターを 表示させる

2.端子を閉じる

3. オープン端子

ログです。

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

何か見落としているのか、それともprev_calculatedという変数を信用することができず、松葉杖をつかなければならないのか?

 
Alexander Puzanov:

MT5ビルド1455

テスト用のインジケーターです。

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

int OnCalculate(const int rates_total,
  const int prev_calculated,
  const datetime &Time[],
  const double &Open[],
  const double &High[],
  const double &Low[],
  const double &Close[],
  const long &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1.チャート上にインジケーターを 表示させる

2.端子を閉じる

3. オープン端子

ログです。

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

何か見落としているのか、それともprev_calculatedという変数を信用することができず、松葉杖をつかなければならないのか?

チェックサムが変更された場合、ヒストリーページングがなくても変数prev_calculatedを0にリセットできる(これはservicedeskからのおおよその回答である)。
 
Alexey Kozitsyn:
チェックサムが変更された場合、ヒストリーページングがなくても変数prev_calculatedは0にリセットできる(これはservicedeskからの大まかな回答です)。
了解です、ありがとうございますだから、大工さんに...。
 
Alexander Puzanov:
なるほど、ありがとうございます。 だから、大工さんに...。
誇張する必要はありません。prev_calculateからゼロリターンは非常に一般的なイベントです。プログラマーの仕事は、このようなイベントをキャッチし、そのような場合にインジケータ・バッファを 正しく埋めることである。それ以上でも以下でもない。
 
Ilyas:

演算子 *(Dereference/Inderection)、&(Address-of)を追加、追加の言語変更は行わない予定

以下を明確にしてください。

* 参照による変数の取得 - 適用対象は以下のみです。

1.クラスオブジェクト

2. 構造体オブジェクト

3.基本的なタイプ

この文脈では、rlvalueだけなのか、lvalueもなのか。

 
Karputov Vladimir:
プログラマーの仕事は、このような事象をキャッチすることである

だから、私はプログラマーではないんです。私の仕事は違うんです。大工さん、そうですねー、『松葉杖をついて』、『イベントをキャッチしている』つもりになりますね。

そして、誇張ではなく、この変数の明言された目的があるからです。

prev_calculated  // обработано баров на предыдущем вызове

その目的に加え、履歴の変更フラグにもなるはずで、さらに他のいくつかの変更も追跡するはずです。これらはすべて便利ですが、直接の目的である「前の呼び出しの間に処理されたバー」の数 - prev_calculatedを表示するためには使用できません。

 
Alexander Puzanov:

だから、私はプログラマーではないんです。私の仕事は違うんです。大工さん、そうですねー、『松葉杖をついて』、『イベントをキャッチしている』つもりになりますね。

そして、誇張ではなく、この変数の明言された目的があるからです。

prev_calculated  // обработано баров на предыдущем вызове

その目的に加えて、履歴の中の変更フラグ、さらにその他の変更を把握するためのものだと思われます。これらはすべて便利ですが、直接の目的である「前の呼び出しで処理されたバー」の数を表示するために使うことはできません - prev_calculated

また、単純に0?の時にインジケーター全体を再計算すると、0?私には最適なソリューションのように思えます。
 
Alexander Puzanov:

だから、私はプログラマーではないんです。私の仕事は違うんです。大工さん、そうですねー、『松葉杖をついて』、『イベントをキャッチしている』つもりになりますね。

そして、誇張ではなく、この変数の明言された目的があるからです。

prev_calculated  // обработано баров на предыдущем вызове

その目的に加えて、履歴の中の変更フラグ、さらにその他の変更を把握するためのものだと思われます。これらはすべて便利ですが、直接の目的である「前の呼び出しで処理された」バーの数を表示するために使用することはできません - prev_calculated

prev_calculated=0 ならば、完全な再計算を行うべきことを意味する。この場合、すべての標準指標は完全に再計算されます。

何が明確でないのか?

チェックサムは歴史の中で変化してきたと言われています。チェックサムが変わった理由を調べるより、インジケータを再計算する方が安上がりだろう。

ドキュメントには、以下のように明示的に記載されています。

OnCalculate()の戻り値と2番目の入力パラメータprev_calculatedとの関連に注意してください。関数呼び出しの prev_calculated パラメータには 前の呼び出しで OnCalculate() が 返した 値が格納 される。これにより、この関数の前回の呼び出し以降に変更されていないバーについて、計算を繰り返すことを避けるために、カスタム・インジケータを計算するための経済的なアルゴリズムが可能になります。

そのためには、通常、現在の関数呼び出しのバーの数を含む rates_total パラメータの値を返せば十分である。OnCalculate()の最後の呼び出し以降に価格データが変更された場合(より深いヒストリがポンピングされたか、ヒストリの空白が埋められた)、入力パラメータprev_calculatedの値はターミナルによってゼロに設定 されます。

 
Alexey Kozitsyn:
0の時にインジケータ全体を再計算するのはどうでしょうか?私見ですが、ベストソリューションだと思います。
これはまさにあなたがすべきことです:prev_calculate==0となったとき、インジケータ全体を再計算する必要があります。rev_calculate==0は通常ヒストリースワップなので。また、履歴が入れ替わるということは、見落とされたり、以前に計算されなかった新しいバーが あるかもしれないということです。つまり、指標の読みがすでに間違っていることになります。
 
Karputov Vladimir:
これはまさに、prev_calculate==0を受信したときに、インジケータ全体を再計算する必要があるのです。rev_calculate==0は通常ヒストリースワップなので。また、履歴が入れ替わるということは、見落とされたり、以前に計算されなかった新しいバーが 存在する可能性があるということであり、すなわちインジケーターの読みが不正確になるということです。
:)それが私の仕事です...。