// --- Переменная для хранения текущего ТФENUM_TIMEFRAMES currentTF;
//+---------------------------------------------------------------------------+voidOnInit()
{
currentTF = (ENUM_TIMEFRAMES)Period();
}
//+---------------------------------------------------------------------------+voidOnDeinit(constint reason)
{
// --- на момент выгрузки индикатора уже сменился ТФif(currentTF != Period())
{
// если нужно, удалим объекты имеющие префикс старого ТФ и выходим, не трогаем цвет основного графикаreturn;
}
// раз дошли сюда, ТФ не сменился, восстанавливаем цвет основного графика// удалим объекты имеющие префикс старого ТФ
}
この問題は、2本の指のように解決される...。あのね...
OnDeinitでは、オブジェクトを削除する前に、非初期化の 理由を条件とする必要がある...期間変更でない場合、オブジェクトは削除される。ということで、終了です...
確かに、TF変更時にオブジェクトやリソースを削除することはできませんが、小さな配列であれば、オブジェクト・リソースを通じて保存できますし、TF変更時の情報をリソースに書き込むことも可能です。新しいタイムフレームでユニットが実行された後に、Deunitが実行され始めることがあります。TFが変更され、古いデータを読み込む必要があることをどのようにユニットに通知すればよいでしょうか。間違っているのでは?
どういう理屈で駄々をこねているのか。
タイムフレームを変更すると、以前のコピーについて何も知らないインジケータの新しいコピーが作成されます。ある期間(非常に短い)、インジケーターの両方のコピーが並行して存在します。その後、前のコピーがアンロードされます。
ドキュメントを読むhttps://www.mql5.com/ru/docs/runtime/running
リンク先の説明を読みましたが、あなたがあげたような情報は見つかりませんでした。そして、もし本当にそうだとしたら、インジケータ開発者にとっては大問題である。タイムフレームを変更した際のインジケータのリロードにこのようなロジックが採用されているのは非常に不思議であり、非常にまずいと思います。なぜ、メモリ上に同じインジケータのコピーが2つ存在する必要があるのでしょうか?誰が得をするのか?何を与えるのか?インジケーターの1つのコピーの実行を完了し、それをアンロードしてから次のコピーをロードする方がより論理的でしょう。
で、それだけ!?
この理由コード(REASON_CHARTCHANGE)は、なるべく実験して使っています。また、すべての変数が再び元の状態に設定され、新しいTFのOnInitの後にOnDeinitが実行できるのであれば、何の役に立つのでしょうか?
Slavaさんが回答しています、新しい指標、新しい計算。そして、これはフェアなことです。
そして、どうやらこの問題は永遠に解決されないようです。
そして、開発チームを信頼しています。彼らは素晴らしい人たちで、信じられないほどのことをやってのけたし、もっとやってくれるでしょう。ただ、まだ手をつけていないだけなんです。確かに、常にベルを鳴らしてフィードバックを得る必要がありますね。:))
私の仕事は、それを行う必要があると説得することです。やらないほうがいい」と納得してもらえる可能性もゼロではないが、もしかしたら、私が理解していないことがあるのかもしれない。
そして、開発チームを信頼しています。彼らは素晴らしい人たちで、信じられないほどのことをやってのけたし、もっとやってくれるでしょう。ただ、まだ手をつけていないだけなんです。しかし、彼らからフィードバックを得るのはいつも難しい。:))
私の仕事は、それを行う必要があると説得することです。やらないほうがいい」と納得してもらえる可能性もゼロではないが、もしかしたら、私が理解していないことがあるのかもしれない。
スラワ、ドキュメントにある「Librariesdon't handle any events」というのはどういう意味ですか?
非常に曖昧
-Initeの場合、メイングラフの色を透明に設定します。
自分でチャートを描く(自分のパラメータにしたがって)
インジケーターを削除した後、メインチャートの色を復元したい。
-DeInitで メインチャートの色を復元しています。
TFを変更 する場合、まずDeInit(色を元に戻す)し、次にInit(透明に戻す)ということです。
コマンドの実行は順次ではなく、定期的にTFを変更する際に
をクリックすると、メインチャート(色付き)が私のインジケータにオーバーレイ表示されます。
例えば、一つの 「論理の破綻」を 紹介します。
グラフィカルなオブジェクトに、名前のプレフィックスの構成要素としてTFピリオドを割り当てるようにするといいかもしれません。
というようなものを適用します。
-Initeの場合、メイングラフの色を透明に設定します。
自分でチャートを描く(自分のパラメータにしたがって)
インジケーターを削除した後、メインチャートの色を復元したい。
-DeInitで メインチャートの色を復元しています。
TFを変更 する場合、まずDeInit(色を元に戻す)し、次にInit(透明に戻す)という意味です。
コマンドの実行は順次ではなく、定期的にTFを変更する際に
をクリックすると、メインチャート(色付き)が私のインジケータにオーバーレイ表示されます。
例えば、ここに一つの 「論理の破綻」がある。
で、それだけ!?
この理由コード(REASON_CHARTCHANGE)は、なるべく実験して使っています。また、すべての変数が再び元の状態に設定され、新しいTFのOnInitの後にOnDeinitが実行できるのであれば、何の意味もありません
ターミナルをバージョン1065にアップデートしてみてください。以前のバージョンでは、タイムフレーム変更時にちょうど再初期化のエラーが発生しました。役に立つかもしれません :)
https://www.mql5.com/ru/forum/187690
端末をバージョン1065にアップデートしてみてください。以前のバージョンでは、タイムフレームを変更しただけで再初期化エラーが発生しました。役に立つかもしれません :)
https://www.mql5.com/ru/forum/187690