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

 
Alexey Viktorov:

この問題は、2本の指のように解決される...。あのね...

OnDeinitでは、オブジェクトを削除する前に、非初期化の 理由を条件とする必要がある...期間変更でない場合、オブジェクトは削除される。ということで、終了です...


確かに、TF変更時にオブジェクトやリソースを削除することはできませんが、小さな配列であれば、オブジェクト・リソースを通じて保存できますし、TF変更時の情報をリソースに書き込むことも可能です。新しいタイムフレームでユニットが実行された後に、Deunitが実行され始めることがあります。TFが変更され、古いデータを読み込む必要があることをどのようにユニットに通知すればよいでしょうか。間違っているのでは?
 
Slawa:

どういう理屈で駄々をこねているのか。

タイムフレームを変更すると、以前のコピーについて何も知らないインジケータの新しいコピーが作成されます。ある期間(非常に短い)、インジケーターの両方のコピーが並行して存在します。その後、前のコピーがアンロードされます。

ドキュメントを読むhttps://www.mql5.com/ru/docs/runtime/running


リンク先の説明を読みましたが、あなたがあげたような情報は見つかりませんでした。そして、もし本当にそうだとしたら、インジケータ開発者にとっては大問題である。タイムフレームを変更した際のインジケータのリロードにこのようなロジックが採用されているのは非常に不思議であり、非常にまずいと思います。なぜ、メモリ上に同じインジケータのコピーが2つ存在する必要があるのでしょうか?誰が得をするのか?何を与えるのか?インジケーターの1つのコピーの実行を完了し、それをアンロードしてから次のコピーをロードする方がより論理的でしょう。
 
Nikolai Semko:
で、それだけ!?
この理由コード(REASON_CHARTCHANGE)は、なるべく実験して使っています。また、すべての変数が再び元の状態に設定され、新しいTFのOnInitの後にOnDeinitが実行できるのであれば、何の役に立つのでしょうか?
初期化時にオブジェクトを削除することについては、この問題への対応しか読んでいませんでした。過去の計算を保存しておくとより複雑になります。そして、どうやらこの問題は永遠に解決されないようです。スラバはこの質問に対して、新しい指標、新しい計算を回答しました。そして、これはフェアなことです。
 
Alexey Viktorov:
Slavaさんが回答しています、新しい指標、新しい計算。そして、これはフェアなことです。
ポイントは、インジケータは同じでも、タイムフレームが新しいということです。そして、ユニットとデユニットの非同期化、つまり逆(非論理的)な実行順序が発生し、時にはそれが論理的であることが問題です。プログラマーにとって、浮遊エラーとロジックほど悪いものはない。
 
Alexey Viktorov:
そして、どうやらこの問題は永遠に解決されないようです。

そして、開発チームを信頼しています。彼らは素晴らしい人たちで、信じられないほどのことをやってのけたし、もっとやってくれるでしょう。ただ、まだ手をつけていないだけなんです。確かに、常にベルを鳴らしてフィードバックを得る必要がありますね。:))
私の仕事は、それを行う必要があると説得することです。やらないほうがいい」と納得してもらえる可能性もゼロではないが、もしかしたら、私が理解していないことがあるのかもしれない。
 
Nikolai Semko:

そして、開発チームを信頼しています。彼らは素晴らしい人たちで、信じられないほどのことをやってのけたし、もっとやってくれるでしょう。ただ、まだ手をつけていないだけなんです。しかし、彼らからフィードバックを得るのはいつも難しい。:))
私の仕事は、それを行う必要があると説得することです。やらないほうがいい」と納得してもらえる可能性もゼロではないが、もしかしたら、私が理解していないことがあるのかもしれない。


スラワ、ドキュメントにある「Librariesdon't handle any events」というのはどういう意味ですか?

非常に曖昧

 
nmaratr:

-Initeの場合、メイングラフの色を透明に設定します。

自分でチャートを描く(自分のパラメータにしたがって)


インジケーターを削除した後、メインチャートの色を復元したい。

-DeInitで メインチャートの色を復元しています。


TFを変更 する場合、まずDeInit(色を元に戻す)し、次にInit(透明に戻す)ということです。


コマンドの実行は順次ではなく、定期的にTFを変更する際に

をクリックすると、メインチャート(色付き)が私のインジケータにオーバーレイ表示されます。

例えば、一つの 「論理の破綻」を 紹介します。


グラフィカルなオブジェクトに、名前のプレフィックスの構成要素としてTFピリオドを割り当てるようにするといいかもしれません。

というようなものを適用します。

 // --- Переменная для хранения текущего ТФ
ENUM_TIMEFRAMES currentTF;

//+---------------------------------------------------------------------------+
void OnInit()
{
  currentTF = (ENUM_TIMEFRAMES)Period();
}

//+---------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // --- на момент выгрузки индикатора уже сменился ТФ
  if(currentTF != Period()) 
  {
    // если нужно, удалим объекты имеющие префикс старого ТФ и выходим, не трогаем цвет основного графика
    return;
  }

  // раз дошли сюда, ТФ не сменился, восстанавливаем цвет основного графика
  // удалим объекты имеющие префикс старого ТФ
}
 
nmaratr:

-Initeの場合、メイングラフの色を透明に設定します。

自分でチャートを描く(自分のパラメータにしたがって)


インジケーターを削除した後、メインチャートの色を復元したい。

-DeInitで メインチャートの色を復元しています。


TFを変更 する場合、まずDeInit(色を元に戻す)し、次にInit(透明に戻す)という意味です。


コマンドの実行は順次ではなく、定期的にTFを変更する際に

をクリックすると、メインチャート(色付き)が私のインジケータにオーバーレイ表示されます。

例えば、ここに一つの 「論理の破綻」がある。

もちろん、すべてが論理的な順序で起こる方が良いのですが、今あるもので作業しなければならないので、メイン チャートの色を OnCalculateに移動し、現在値をチェックすることができます。
 
Nikolai Semko:
で、それだけ!?
この理由コード(REASON_CHARTCHANGE)は、なるべく実験して使っています。また、すべての変数が再び元の状態に設定され、新しいTFのOnInitの後にOnDeinitが実行できるのであれば、何の意味もありません


ターミナルをバージョン1065にアップデートしてみてください。以前のバージョンでは、タイムフレーム変更時にちょうど再初期化のエラーが発生しました。役に立つかもしれません :)

https://www.mql5.com/ru/forum/187690

Новая версия платформы MetaTrader 4 build 1065
Новая версия платформы MetaTrader 4 build 1065
  • www.mql5.com
Новая версия платформы MetaTrader 4 build 106523 марта 2017 года будет опубликовано обновление платформы MetaTrader 4...
 
Aleksei Radchenko:


端末をバージョン1065にアップデートしてみてください。以前のバージョンでは、タイムフレームを変更しただけで再初期化エラーが発生しました。役に立つかもしれません :)

https://www.mql5.com/ru/forum/187690

MT5についてです