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

 
fxsaber:

原理的には一行で済むのですが。

1行にした
 
Nikolai Semko:


どこが曖昧なんだ?

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

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

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

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



カレッジという原始的な例を使う意味はあるのでしょうか?

代わりにVERY CORPORATIONのコード例を使ってください。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots   0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   if(ObjectFind(0, "InitDeinit") < 0)                 // ПРОВЕРКА СУЩЕСТВОВАНИЯ ОБЪЕКТА ПЕРЕД ЕГО СОЗДАНИЕМ ОБЯЗАТЕЛЬНА!!!
    {
     ObjectCreate(0,"InitDeinit",OBJ_ARROW_THUMB_UP,0,t,pr);
     Print(__FUNCTION__, " создан InitDeinit");
    }
    
   ObjectSetInteger(0,"InitDeinit",OBJPROP_WIDTH,50); 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(UninitializeReason() != REASON_CHARTCHANGE)      // ПРОВЕРКА ПРИЧИНЫ ДЕИНИЦИАЛИЗАЦИИ РЕШАЕТ ТВОЮ ПРОБЛЕМУ НА РАЗ...
    {
     ObjectDelete(0,"InitDeinit");
     ChartRedraw(0); // ЭТО НУЖНО ТОЛЬКО НА ВЫХОДНЫЕ. В РАБОЧИЕ ДНИ НЕ БУДЕТ ЛИШНИМ, НО С ПРИХОДОМ НОВОГО ТИКА ОБЪЕКТ БУДЕТ НЕДОСТУПЕН.
     Print(__FUNCTION__, "  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);
  }
//+------------------------------------------------------------------+
ファイル:
 
Alexey Viktorov:

事実上正しいコードの例を使った方がいい。

同じです。オブジェクトは、無関係なインジケータ・コピーの Deinit を介して削除することができます。また、実物のOnInitはこのイベントの前に実行される。

しかし、古いコピーのOnDeinitから新しいコピーのOnInitまで、あらゆる情報の転送を 表示する方がずっと良いのです。実は、ここがポイントなんです。

 
fxsaber:
これも同じです。オブジェクトは、無関係なインジケータ・コピーの Deinit を介して削除することができます。また、実物のOnInitはこのイベントの前に実行される。
if(UninitializeReason() != REASON_CHARTCHANGE)
 {
  // Если причина деинициализации смена периода графика сюда не попадаем и объекты не удаляются.
 }

コンピュータの電源プラグを抜いた場合を除き、それ以外の場合はオブジェクトが削除されます。

 
fxsaber:


しかし、古いコピーのOnDeinitから新しいコピーのOnInitに情報を渡す ことを表示する方がずっと良い。実はここがポイントなんです。

ずいぶん前に気づいたのですが、シンプルな解決策はあなたの得意とするところではありませんね。:-)))
 
Alexey Viktorov:

コンピュータの電源プラグを抜いた場合を除き、それ以外の場合はオブジェクトが削除されます。

プライベートディスカッションの問題に対する解決策を示したことになります。一般的なものは次のように定式化される。
fxsaber

古いコピーのOnDeinitから新しいコピーのOnInitへ、あらゆる 情報を確実に渡します。

その結果、OnDeinit/OnInitの明確な実行シーケンスが必要になります。今まで必要なかったのですが、ソリューションアイデアを 問題なく導入することができました。

 
fxsaber:
プライベートディスカッションの問題解決策を示したわけですね。一般的なものは、次のように定式化される。

その結果、OnDeinit/OnInitの明確な実行シーケンスが必要になります。私はこれを必要としませんでしたが、問題なくソリューションアイデアを 実行しました。

まあ、反対はしていないんですけどね。でも、左手の小指で右耳を掻くのは、私には無理です。代わりに"それ"を書くために、このような単純なテスト...何と呼べばいいのかもわからない。マゾヒズムには存在する権利があるのだから、素人向けにして おけよ。プログラミングに対するプロ意識には敬意を表しますが。

 
Alexey Viktorov:

そんな単純なチェックではなく「それ」と書いて・・・。

つまり、このスレッドで議論されている問題のポイントがずれているわけです。
 
fxsaber:
つまり、このスレッドで議論されている問題の本質を理解していなかったということですね。

わかりますが、問題の議論を自分の能力(小手先ではなく)に転嫁してしまっています。

そして結局のところ、私の回答はコルトのコードの具体例に対するものであり、あなたの能力に対するものではなく、On_InitとOn_Deinitの実行順序の規制を伴うデータ転送の例です。

対話を続ける目的は何でしょうか。左手小指で右耳を掻くのが気持ちいい、とでも言いたいのでしょうか。それとも別の目的?

 
Alexey Viktorov:

それとも別のターゲットなのでしょうか?

やり直した例は、議論していた問題と完全に一致するものではありませんでした。UninitializeReasonによる 解決策を持たない別の例を示すことができます。