Init()およびDeInit()実行シーケンス

 

皆さん、こんにちは。

私は以下の問題に直面しています。

インジケーターやExpert Advisorを持っています。

その中には、Init()とDeInit()という2つの関数があります。

TF(タイムフレーム)を変更した場合、これらの関数の実行順序はどうなりますか?

インジケータを 起動したり、アタッチ したりすると、Init() が動作するはずなのは理解できるのですが。

チャートから削除する場合は、DeInit()を実行する必要があります。

TFを変更する場合、まず現在のTFのDeInit() が動作し、次に新しいTFのInit() が動作するようにする。

しかし、必ずしもこの順序で実行されるとは限らないので、プログラムを書く論理が損なわれてしまう。

インジケータとログのサンプルを添付します。

この問題を解決した人、あるいは忘れてしまった人にアドバイスをお願いします。

ファイル:
ERROR.mq5  2 kb
Log.txt  1 kb
 

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

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

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

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
時間軸を変更した場合、OnInitが毎回呼び出されるため、不都合が生じる。
 
Slawa:

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

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

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


ご感想ありがとうございました。

"ロジックの甘え "について

メインチャート(ローソク足)を独自の描画タイプに置き換えるインジケータを書きました DRAW_CANDLES

ポイントは、メインの価格チャートを削除して、私のチャートだけを表示することです。

-Inite時に メインチャートの色を透明に設定します。

私は(自分のパラメータに従って)自分のチャートを描きます。


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

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


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


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

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

例えば、こんな 「ロジックの しくじり」があります。


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

Expert Advisor がアタッチされているチャートのシンボルやタイムフレームを変更した場合、Expert Advisor のアンロードとロードは 行われません。この 場合、 古いシンボル/タイム ラインのOnDeinit() と新しいシンボル/タイムラインのOnInit()一貫して 呼ばれ、グローバル変数とスタティック 変数の値は リセット されません。 初期化(OnInit())が完了する前に EA に対して受信したイベントはすべてスキップされる。


Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
nmaratr:


について。

"前のコピーについて何も 知らないインジケーターの新しいコピーが作成される"

なぜかというと、DeInitは新しいInitコピーで作成されたオブジェクトを削除するからです。単なるコピーであれば。



 
Petros Shatakhtsyan:
タイムフレームを変更した場合、その都度OnInitが呼ばれるため、不都合が生じる。


毎回OnInitを呼び出すとはどういうことなのか

OnInitは何のためにあるのか - すべての変数とパラメータを一度に初期化するためです。

例えば

現在のタイムフレームのチャートにテキストマーカーを作成するインジケータを書きたい のですが、どうすればよいでしょうか?

インジケータを削除すると、このテキストマークがチャートから削除されます。

そして、TFを変更する際には、その内容を新しいものに更新する(古いものを削除し、新しいものを作成する)のである。

私たちが手にするもの

何度かTFを変更したところ、テキストマークが消えました。(つまり、最初はOnInit、次にDeInitが動作して、このラベルが削除されたわけです)。

その後、何度かTFを変更したところ、表示されるようになりました。

こんなのおかしいよ。

 
nmaratr:

グラフィカルなオブジェクトであれば、チャットルームに属し、そのチャットルーム上で動作するすべてのソフトウェアからアクセスすることができます。
 
Alexander Bereznyak:

グラフィカルなオブジェクトであれば、チャットに属し、このチャット上で動作するどのプログラムからもアクセス可能です。


では、どうすれば、この問題を解決できるのでしょうか?(誰か持ってないかな?)

あるいはそのまま受け入れる。計算を高速化するために、コマンドを非連続的に実行することが可能であること。

ドキュメントに反しているもの


Expert Advisor がアタッチされているチャートのシンボルやタイムフレームを変更する場合、Expert Advisor のアンロードおよびロードは 行われません。この場合

ちくじょう

古いシンボル/タイムラインのOnDeinit() と新しいシンボル/タイムラインのOnInit() が呼び出されます。

 
nmaratr:


さて、この問題は解決できるのでしょうか?(どなたかに効果があったのでしょうか?)



このスレッドの作者と合流します。問題は、本当にアイドルではないのです。そして、とても具体的です。
この問題を発見したのは、ずいぶん前のことです。私は2016年6月に、このスレッドの著者と絶対に似たような例でservicedeskに連絡しました。無視された......まだ未解決の話題です。

Servicedeskへの応募

もちろん、TFを変更する際に、インジケータでパラメータ転送をすることは、時間をかけて行っています。しかし、私はダイヤモンドで簡単な作業をしたいわけではありません。
しかし、開発者の皆さん、タイムフレームの変更時に再初期化しない特別なグローバル変数をインジケータに作成する可能性を実装してください。エキスパートアドバイザーでは、TFの変更時に再初期化が行われませんが、インジケーターでは再初期化が行われます。もし、インジケータで一部の変数や配列を再初期化しない可能性があれば、OnInitとOnDeinitの同期が発生せず、プログラマにとって新たな面白さが生まれるはずです。この変数の未初期化の可能性が、プログラムの安全性に影響を与えるとは思えません。

何に使うの?
いろいろなシチュエーションがありますね。

例えば、こんな感じです。
-インジケータを起動すると、TFとは独立した変数、インデックス配列、データ配列の計算を行い、かなりの長さとボリュームになることがあります。問題は、なぜTFを交換するたびにやらなければならないのか、ということだ。
- 私はパラメータウィンドウを介して、指標のパラメータを変更することはできませんが、利便性とマウスでチャートから右わかりやすい(あなたが見ることができ、最も複雑な方法でそれを達成するこの指標を 使用しています)。また、TFを交換するたびに設定が失われることはありません。

 

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

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

 
Alexey Viktorov:

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

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

それでいいのか!?
この理由コード(REASON_CHARTCHANGE)を実験的にフルに使っています。すべての変数が再び元の状態に設定され、新しいTFのOnInitの後にOnDeinitが実行できるのであれば、何の役に立つのでしょうか?
理由: