MT4のEAについての質問です.
start関数はティックが動く毎に処理が実行されますが,1tick中で処理が終わらないうちに新たなtickが起こった場合,実行中の処理はどうなってしまいますか?
たとえば
int start()
{
処理1
処理2
・・・
処理i
・・・
処理n
return(0)
}
というEAを稼動している最中,全部終わらずに処理i の途中で新たなtickが始まってしまった場合です.考えられることとしては
(1)新たなtickが始まった時点で処理を中断してstart()関数の最初から(上記では処理1から)実行する.
(2)とにかく処理nまで実行するが,次のtickがすでに始まっているので,休む間もなく(?),処理1に戻って実行する
が考えられますが,(2)の場 合は,追いつかずにやり残しの処理がたまって行き,どんどん遅れていくわけですが,いつ解消されるかというと,tickの動きが静かになったときに,だんだん追いついていく,というそんな感じになりますか?
また,(1)(2)のいずれでもないなら,それはどんな動きになるのでしょうか?
無駄に重い処理をいれて(Sleep(1000)とかいれてもおんなじか?)やってみればわかりますが,土日はtickが動かないので実験ができませんです.詳しい方,ご回答よろしくお願いします.
回答1
知らへんで〜〜
でも面白い発想だな
ま、直感的にはリターン後に起きた新しいティックでコールされスタックされないだとは思うがな〜
ティック間隔は各社のサーバーによるから限りなくゼロに近ずく場合もあるから1では誤動作
1はファーム書いてる奴っぽい発想じゃの〜
ま、実験してみるのが早かろうの〜
ウエイトか無限ループにしてモニターかティックカウントのアップがシリアルかを監視したら直ぐだろボケナス
回答2
(1)は無いでしょう。
start()関数の多重コールが許されるとマルチスレッドの動作を考慮したプログラミングが必要になり、変数へのアクセス時等に他スレッドとの排他制御が必要になってしまいます。
基本的には(2)のような感じでしょうね。
start()やOnTick()関数が実行中に発生したtickは無視するのがシステム的に簡単でEAプログ ラマーにもやさしく現実的だと思います。
長時間処理をしていて新しいtickが発生してレートが変化してしまったかもしれない場合等、最新のデータを必要とする場合は、RefreshRates()を呼び出して事前定義された変数と時系列配列のデータを更新します。
http://yukifx.web.fc2.com/sub/reference/14_timeseries/cone/timeind_…
>追いつかずにやり残しの処理がたまって行き,どんどん遅れていく
きっと無視されますので、後で一気に連続呼び出しという事は無いと思います。(たぶん…(^_^;)
Originally posted 2019-09-09 18:55:02.