mql5言語の特徴、微妙なニュアンスとテクニック - ページ 204

 
Andrey Khatimlianskii:

他のイベントハンドラが中断される(実行されない)ことは、誰も保証していない。

アラートの後、deinitとinitの両方が起こりますよね?

そう、完全なリブートが行われているのです。ただ、タイマー(2回目でも)がとんでしまうのは、バグではなく特徴です。

 
fxsaber:

口座切り替え時にアラートを出すアドバイザーです。ルールからすると、してはいけないことだと思われます。

しかし、これはタイマーを使っているからこそ起こることです。

この特異性を利用して、定式化は簡単だが実装は複雑 な問題を解決することができる。

// Если произошла смена счета, советник выгружается.

const bool Init = EventSetMillisecondTimer(1);

void OnTimer()
{
  static const long Account = AccountInfoInteger(ACCOUNT_LOGIN);
  
  if (Account != AccountInfoInteger(ACCOUNT_LOGIN))
    ExpertRemove();
}
 
fxsaber:

この機能を使えば、定式化は単純でも実装が複雑 な問題を解決することができる。

各On-functionの入力でアカウント変更を確認するのではダメなのでしょうか?

なぜミリ秒タイマーなのか?実行中に再ログインが発生しても、とりあえずプログラムの実行を中断することはない。

 
Andrey Khatimlianskii:

各On-functionの入力でアカウント変更を確認するのではダメなのでしょうか?

なぜミリ秒タイマーなのか?実行中に再ログインが起こっても、とにかくプログラムの実行を中断させない。

試してみてください。このテーマについては、上のリンクに長い議論があります。

 
fxsaber:

そう、完全なリブートが行われているのです。ただ、タイマー(セカンドタイマーでも)がぶつかるのは、バグではなく、機能です。

ExpertRemove()コマンドの後、ストップフラグは単に上がり、EAは次のティックまで動作を継続します。新しいティックでは、ストップフラグが立つとEAがアンロードされます。新しいティックが来るまでは、すべてのOn機能は通常モードで動作し続けるということです。

従って、このフラグの状態をプログラム的に取得できないのであれば(特にこの機能を探したわけではありません)、グローバルにカスタムフラグを用意する必要があるのです。ExpertRemove()コマンドの前に独自のフラグを設定し、各On関数でチェックします。フラグが立っていれば、出発する。そうすると、タイマーに書き込まれたコードは実行されません。

それとも私の勘違いで、質問が違うのでしょうか?

 
Artyom Trishkin:

ExpertRemove()コマンドの後、停止フラグが単に設定され、EAは次のティックまで動作し続けます。新しいティックでストップフラグが立つと、EAがアンロードされます。新しいティックが来るまでは、すべてのOn機能は通常モードで動作し続けるということです。

したがって、もしこのフラグの状態をプログラム的に取得できないのであれば(特にこの機能を探したわけではありません)、グローバルにカスタムフラグを用意する必要があります。ExpertRemove()コマンドの前に独自のフラグを設定し、各On関数でチェックします。フラグが立っていれば、出発する。そうすると、タイマーに書き込まれたコードは実行されません。

それとも、私の勘違いで、質問が違うのでしょうか?

どのような問題があるのかわからない。

 
Artyom Trishkin:

ExpertRemove()コマンドの後、停止フラグが単に設定され、EAは次のティックまで動作し続けます。新しいティックで ストップフラグが立つと、EAがアンロードされます。新しいティックが来るまでは、すべてのOn機能は通常モードで動作し続けるということです。

したがって、もしこのフラグの状態をプログラム的に取得できないのであれば(特にこの機能を探したわけではありません)、グローバルにカスタムフラグを用意する必要があるのです。ExpertRemove()コマンドの前に独自のフラグを設定し、各On関数でチェックします。フラグが立っていれば、出発する。そうすると、タイマーに書き込まれたコードは実行されません。

それとも、私の勘違いで、質問が違うのでしょうか?

新しいティックではなく、次のリターンで。

OnInit()にExpertRemove()を入れて、デバッグで一歩一歩確認してください。

 
Alexey Viktorov:

新しいティックではなく、次のリターンで。

OnInit()にExpertRemove()を入れて、デバッグで順次確認してください。

はい、私のミスです。次のイベントは実行されません。必要のない機能のヘルプを見るのは久しぶりです :)

 
fxsaber:

どのような問題があるのかわからない。

回答の意味は不明です。そんなことはどうでもいいんです。

 
Artyom Trishkin:

回答の意味は不明です。

ExpertRemoveは起動 されていません。