タイマー - ページ 2

 
TheXpert:

もうひとつ...お前ら兄弟じゃないだろ?

とはいえ、ないとは言い切れませんが。私たちは皆、さまざまな課題を持っています。

さあ、どうぞ...読めるか?インドックにはどうなのか見せてください。


  1. そんなことないですよ、誰だかわからないくらいです :D
  2. 正直なところ、私はそのようなタスクに遭遇したことがありません。
  3. すみません、目を通しました))。どのスレッドがどうなっているのか、あまり入っていない。そのようなことは見たことがないのでわかりませんが、変なスクリプトを実行して表示をタップしない限りは、本当にタスクによりますね。
あるいは、別の選択肢として、別スレッドの計算も何もかもをdllに押し込むというのもありますが、それは倒錯しているように聞こえますね。
 

Interesting:

...前のタイマ処理が終了するまで、タイマ処理を呼び出すことはできません。簡単に言えば、タイマーを処理すべきスレッドがビジー状態になるまで、OnTimer()は実行権を得られないということです。

2番目のスレッドでタイマー処理を開始することが不可能であることを説明するために、次のような例を使うことができます(間抜けですが明確です)。

int OnInit()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
EventSetTimer(1);
//----------------------------------------------------------------------------//
return(0);
//----------------------------------------------------------------------------//
}

void OnTimer()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
Print(TimeLocal());
Sleep(2000);
//----------------------------------------------------------------------------//
}
ということは、NewTick イベントだけでなく、Timer イベントも無視できることが判明したのですねまた、特定の条件下では、Expert Advisorのイベントキューに入れることはできないのですか?
 
Yedelkin:
ということは、Timer イベントもNewTick イベントと同じように無視できることがわかりましたか?また、特定の条件下では、Expert Advisorのイベントキューから除外することができるのですね。
この場合、NewTick イベントは 例外となります。それ以外のタイプはチェックがありません。イベントキューが満たされるよりもイベントハンドラの実行速度が遅い場合、キューがオーバーフローし、いくつかのイベントがスキップされます。上記の例では、EAの実行スレッドが1つであること、イベント処理がキューに入れられた順に順次実行されることだけが確認できます。
Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - Документация по MQL5
 
antt:
この場合、NewTick イベントは 例外となります。その他のイベントタイプについては、チェックを行いません。イベントキューが満たされるよりイベントハンドラが遅い場合、キューはオーバーフローし、いくつかのイベントがスキップされます。上記の例では、EAの実行スレッドが1つであること、イベント処理がキューに入れられた順に順次実行されることだけが確認できます。

素晴らしい、解説をありがとう!論理的で理解しやすく、憶測を呼ぶことはない

興味深い ことに、イベントのマルチスレッド化に関する質問にはある種の回答がありました。そして、OnTimerのことまで推測していました :)

 
Yedelkin:
ということは、Timer イベントもNewTick イベントと同じように無視できることがわかりましたか?また、特定の状況下ではExpert Advisorのイベントにキューイングすることはできないのでしょうか?

私が理解した範囲では、次のような感じです。

1. すべてのイベントは、同じキューに入れられます。キューにNewTickイベントがある場合、またはそのようなイベントが処理された場合、NewTickは無視され、キューに入れられない。

2.どのイベントを処理するかは、プログラマーが選択する。OnTrade、OnTimer、OnTickのハンドラはExpert Advisorで頻繁に使用される基本的なものです。

3.あるイベントの処理中は、他のイベントを処理することができません。

4.イベントスタックがオーバーフローした場合、古いイベントは処理されずにキューから削除されます。

5.上記3種類のイベントのうち、Tradeは発生頻度が低く、NewTickは発生頻度が高い(ただし、上記のようなtickはキューに含まれない場合がある)。

6.この観点から最も興味深いハンドラは OnChartEvent で、これはチャートからのすべてのイベントとカスタム・ イベントを処理します。

また、このようなイベントが大量に発生すると、イベントキューを簡単にオーバーフローさせてしまいます(このようなイベントが大量に発生する場合)。

私の考えでは、この状況での唯一の救いは、OnChartEventイベントが無造作に、非同期に生成されることです。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - Документация по MQL5
 

Yedelkin:

興味深い ことに、マルチスレッドでのイベント処理 についてのご質問は解決されたようです。そして、OnTimerのことまで推測していました :)

Expert Advisor のコード自体がシングルスレッドで実行されるため、原理的にシングルスレッドに疑問はありませんでした。

そして、私が述べたことは、将来(例えばMT6くらい)、MTでマルチスレッドが実現したときの夢のような話です(少なくとも、何らかの理由でイベントストリームが分離されなくなるまでの話です)。

本来なら、せめてChartEventのイベントはすべて別スレッドに分けるべきでしたが、開発者の方がよくご存知で......。

 

EAに 特定の時刻に タイマー イベントを発生させる方法は ありますか?例えば、1時間や1日の最後の1分間の始まりに。

 
Yedelkin:

EAに 特定の時刻に タイマー イベントを発生させる方法は ありますか?例えば、1時間や1日の最後の1分間の始まりに。

もちろんです。
 
TheXpert:
もちろんです。
秘密でないとしたら、それ(方法)はどのようなものなのでしょうか?
 
Yedelkin:
秘密でなければ、それ(方法)はどのようなものですか?

タイマーマネージャーを使用する。記事を書きたかったのですが、なんとなく脱線してしまいました。記事には見えないかもしれませんが。

コードとイベントキューがシングルスレッドであるため、特定の時間は動作しませんが、平均で1秒未満の誤差があります(最大値は、コードによるイベントの最大実行時間によって 制限されます)。

しかも、タイマーは1つだけ。

そうしましょうか?