Init()およびDeInit()実行シーケンス - ページ 20

 
Комбинатор:

fを変更したとき。

インジケーターのバッファに古いタイムフレームのゴミが残っていると、タイマーにも影響が出る場合があります。

より美しくなる

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MetaTrader 4の新バージョン(ビルド1065)。

セルゲイ・クリモフ さん 2017.04.14 16:34

アカウントを切り替えても、インジケーターの変数_Digitsは変化しません。

 
fxsaber:
よりかわいくなりました。
桁が違うので、あちこちに行きそうなので、5年ほど前に同じ端末でそのようなアカウントを横断するのをやめました。
 
fxsaber:
よりかわいくなりました。

MT4で正しい整合性を語る人向けです。

MT4では、すべてがそれほどきれいではないことを見て、理解してください。

 
fxsaber:
キューは曖昧なものではありません。


さて、どこが曖昧なのでしょうか?

この原始的な例を試してみてください。TFを交換すると "らしさ "がわかる。

この例では、OnInitで現在時刻と 価格の座標を持つオブジェクトが作成されます。OnCalculateでは、このオブジェクトは価格と一緒に移動します。

OnDeinitでは単純に(論理的に)削除される。

TFを切り替えると、オブジェクトが現れ、そして消える。
なぜ、このようなことが起こるのでしょうか。
なぜなら、古いTFのOnDeinitで、新しいTFのOnInitですでに作成されたものを削除して しまうことが あるからです。バグではありません!この例を作ったプログラマは、このブランチを読まずにどう考えるべきでしょうか?

OnInitとOnDeinitのシーケンスの曖昧さを示すデモ


#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);

   ObjectCreate(0,"InitDeinit",OBJ_ARROW_THUMB_UP,0,t,pr);
   ObjectSetInteger(0,"InitDeinit",OBJPROP_WIDTH,15); 

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"InitDeinit");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   ObjectMove(0,"InitDeinit",0,t,pr);
   return(rates_total);
  }
//+------------------------------------------------------------------+
ファイル:
 
Nikolai Semko:

さて、彼女はどこに一心不乱にいるのだろう。

そこで話題になったのが、タイマーです。
 
fxsaber:
そこにタイマーのことが書かれていました。

何が違うのか。オブジェクトの生成の代わりにEventSetTimerをUniteに、オブジェクトの削除の代わりにEventKillTimerをDeuniteに配置すればよい。そして、これは不確実性を減らすことはできません。なぜなら、設定されたタイマーは 古いTFのDeuniteによって殺されるし、そうでない場合もあるからです。そして、さらに悪いことに、少なくとも対象物は見えますが、タイマーは見えないのです。
 

もしかしたら、もう発明しているかもしれない、全部読んでないけど。インジケータがパネルを作成する場合、ターミナルのグローバル変数を 使用し、initでその値を1増加させ、グラフィカルオブジェクトの名前への加算として使用することができます。

私の仕事は、パネルのパラメータを保存することで、そのためにdeinitで端末のグローバル変数を作成しました。解決策は簡単で、端末のグローバル変数をiniteで作成し、グラフィックパネルでパラメータが変更されたときにそれぞれを更新することです。インジケータの削除により非初期化が発生した場合のみ、deinit で変数を削除する。

 
Dmitry Fedoseev

インジケータがパネルを作成する場合、ターミナルのグローバル変数を 使用し、その値を1だけ増やし、グラフィカルオブジェクトの名前の追加として使用することができます。
これは松葉杖です。端末で正しい注文をすればそれでいいのです。まず、前のインスタンスを終了させ、それから新しいインスタンスを開始させます。
ニコライ・セムコ


この例を作ったプログラマは、このスレッドを読んでないのに何を考えているのだろう?

全く同感です。読者以外の人はこの機能を知らず、それを理解するために時間を浪費してしまうでしょう。それも数百人単位で...。...特に初心者の方。

必要なのは、一度バグを修正すること、それだけです。

 
Nikolai Semko:

何が違うのか。オブジェクトの生成の代わりにEventSetTimerをUniteに、オブジェクトの削除の代わりにEventKillTimerをDeuniteに配置すればよい。また、旧TFのDeuniteによってセットタイマーが 殺されることもあれば、そうでないこともあるので、不確実性は減らないでしょう。さらに悪いことに、少なくともオブジェクトは見えますが、タイマーが動作しているかどうかがわからないのです。
バカみたいですね。インジケーターコピーのタイマーは互いに関係ない。
 
elibrarius:
すべて松葉づえです。端末で正しい順序を作るだけで、それだけでいいのです。まず、前のインスタンスをdeinitし、その後で新しいインスタンスを初期化するのみです。

全く同感です。読者以外の人はこの機能を知らず、それを理解するために時間を浪費してしまうでしょう。それも数百人単位で...。特に初心者の方には申し訳ないです。

一回バグを直せばそれでいいのです。


さすがです!
個人的には、言葉だけでなく行動でも対処法を知っているので、大多数より有利だと感じており、調子に乗っています。すでにパッチを作成し、プログラムに松葉杖を追加しています。

ただ、開発者がこの「機能」をバグとみなすことを頑なに拒むのは理解できない。
例えば。

スラワ

指標は本来の目的のために使用されるべきものである。

つまり、チャートの シンボル期間が変わったときのOnInitとOnDeinitの実行順序は、誰も気にする必要はないはずです。

しかし、上記のアニメーションGIFの例では、このトピックを読んでいないプログラマにとっては、決定的なバグがありますね。意図したとおりに行われないこととは?