インジケータでのOnDeinit - ページ 5

 
mql5:
もう一度(指をくわえて)説明してみます。
  1. 前回の起動からX時間後に端末が起動した
  2. 履歴のダウンロードを開始したが、見つからない(端末が X 分間アイドル状態だった)
  3. 利用可能な履歴のインジケータのOnCalculateを呼び出す prevtime = 最後の既知の履歴時間、インジケータバッファのサイズNバー
  4. サーバーから履歴をダウンロードしている間、チックが入る
  5. Time[0]はtick time、prevtimeとして記憶、バッファサイズはN+1本(NとN+1本の間にヒストリーのギャップがある)です。
  6. 履歴がダウンロードされた後、OnCalculateが再び呼び出されますが、今度は履歴に穴はなく、prevtimeはTime[0]と同じ日付になっています。新しいバーはなく(それぞれ、インディケータのバッファがクリアされていない)、インディケータN+X/タイムフレームのバーのバッファサイズとIndBuffer[0]はステップ5と同じではありません。



prevtimeは何の関係があるのですか?

なぜうまくいかないのかを聞いているのです。

/////////////////////////////////////
void OnDeinit(const int reason)
{
 ArrayInitialize(body_up,EMPTY_VALUE);
ArrayInitialize(body_down,EMPTY_VALUE);
ArrayInitialize(shadow_up,EMPTY_VALUE);
ArrayInitialize(shadow_down,EMPTY_VALUE);
  ArrayInitialize(yell_body_up,EMPTY_VALUE);
ArrayInitialize(yell_body_down,EMPTY_VALUE);
ArrayInitialize(yell_shadow_up,EMPTY_VALUE);
ArrayInitialize(yell_shadow_down,EMPTY_VALUE);


}
 
eevviill:

prevtimeとどう関係があるのでしょうか?

なぜうまくいかないのかを聞いているのです。

そして、それがうまくいっていないとどうしてわかるのでしょうか?どのように確認するのですか?

また、なぜアンロードする前にインジケーターバッファを初期化するのでしょうか?すでにアンロードされているんですよね?

インジケータバッファは、すべてのインジケータ値が完全に再計算されたときに初期化する必要が あります。

int OnCalculate(..)
{
   ...
   if (<необходимо пересчитать все значения индикатора, например, если limit == Bars - 1>)
   {
      ArrayInitialize(...);
   }
   ...
}
 
eevviill:

これです。そのためにバッファーゼロ化をしています。イニテはもう無理だって言ってるじゃん。

ダイニットしたい。しかし、そこでもうまくいかない。なぜ?

init()とdeinit()はどう関係があるのですか?かなり違うところでオペレーションが必要です。もう一度、繰り返します。計算後、履歴が読み込ま れた。

作業用を作りました。

ファイル:
 
Scriptong:

うまくいっていないことをどうやって判断するのですか?どのように確認するのですか?


https://forum.mql4.com/ru/65066/page2#1015138
 
Vinin:

init()、deinit()は何の関係があるのですか?オペレーションは他で必要なのです。繰り返しになりますが計算後、履歴が読み込まれました。

動作するバージョンを作った。

やはり先生のお勧めで一回目はうまくいきました。

なぜdeinitはアレイをゼロにしないのでしょうか?

 
eevviill:
https://forum.mql4.com/ru/65066/page2#1015138

OnCalculateで 動作するコードへのリンクがありましたね。DeInitでの初期化がうまくいかないことをどうやって知るのかについて質問しました。念のため明記しておきますが、OnDeinit()の後は、インジケーターコードは何も動作しません(OnInit()もOnCalculate()も動作しません)。したがって、OnDeinit() 自身でのみ、配列のゼロ化を確認することができます。

 
Scriptong:

OnCalculateで動作するコードへのリンクがありましたね。DeInitでの初期化がうまくいかないことをどうやって知るのかについて質問しました。念のため明記しておきますが、OnDeinit()の後は、インジケーターコードは何も動作しません(OnInit()もOnCalculate()も動作しません)。したがって、OnDeinit() 自身で、配列のゼロ化の事実を確認することができます。

へのリンクを用意しました。

操作チャートを開く- M1インジケータを取り付ける-端子を閉じる-数分で開いた。結果はスクリーンショットで。

こんな感じでテストしています。

 
eevviill:

やはり先生のお勧めで一回目はうまくいきました。

なぜdeinitは配列のゼロ化で動作しないのか不思議です。

それとも、ターミナルを閉じた 状態ではdeinitは動作しないのでしょうか?
 
eevviill:
それとも、ターミナルを閉じた状態ではdeinitは動作しないのでしょうか?
しかし、インジケーターバッファを クリアしても意味がありません。
 
mql5:
動作はしますが、インジケーターバッファをクリアしても意味がありません - 保存されません。

なぜ?

バッファ0の値がゼロにならずに保存されているのはなぜですか?