機能睡眠代替

 

こんにちは、MQL4コミュニティです。

Sleep()関数を含むEAをストラテジーテスターで 動作させているときに、ある問題に遭遇しました。どうやらテスターではSleep()関数を埋め込んだEAを正しく実行できないようです。

Sleep()関数の代わりに、テスターでEAを実行中に一定時間待機させる方法を発見された方はいらっしゃいますでしょうか?


ありがとうございます。

 
WhooDoo22:

こんにちは、MQL4コミュニティです。

Sleep()関数を含むEAをストラテジーテスターで動作させているときに、ある問題に遭遇しました。どうやらテスターでは、コードにSleep()関数を埋め込んだEAが正しく実行されないようです。

Sleep()関数の代わりに、テスターでEAを実行中に一定時間待機させる方法を発見された方はいらっしゃいますでしょうか?

ストラテジーテスターで sleep()が機能する論理的な理由はありません ... 何をしようとしているのですか? もしイベントの時間を計ろうとしているのであれば、時間を使って必要な時間だけ一時停止するのではなく、それはsleep()のためにあるものではありません。
 

Simonです。

Sleep()という関数を 使った理由は、Seconds()が最後に判明したサーバー時刻から値を返すからです(最後に判明したサーバー時刻からデータを取得すると、秒が飛んだり止まったりする)。私は、一般性ではなく、信頼性を望んでいます。

この点についてはどう思われますか?


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

 
WhooDoo22:

Simonです。

Sleep()関数を使用した理由は、Seconds()は最後に判明したサーバー時刻から値を返すからです (最後に判明したサーバー時刻からデータを取得すると、秒がスキップまたは一時停止されます)

もし30秒間ティックがなければ、30秒間スキップすることになります。ストラテジーテスターの ティックの時間は、実際のティックではなく、合成されたものであるため、合理的に均一であるべきです。
 

サイモン

秒単位で「スキップ」「ポーズ」と呼んでいるのは、[秒x]と[秒y]の間にティックが作成されていないからだと書いていますね。平たく言えば、ティックが作成され、今'秒x'が保存されています。3秒間ティックが作成されないと、ティックが作成されます。今度は'秒y'が保存される。('秒y' = (秒x +3秒)) as ('秒x' = (秒y -3秒)).

皆さんはどう思われますか?


当分の間、選択肢を検討することにします。

ご回答ありがとうございました。

 
  1. スタートから戻るまでテスターではtickはEVERで作成しない。TimeCurrent()をstatic/common(global)変数に保存してください。次のティック int deltaSec = TimeCurrent() - previous.
  2. https://www.mql5.com/en/forum/127483 テスターではDayOfWeek()は常に5を返すと報告されています(AskとBidのように、インジケーターでは間違いなく同じではありません)。私はSeconds()、DayOfWeek()などは一切使いません。なぜなら、現在のサーバ時刻ではなく、テスターのティックの時刻が必要だからです。now = TimeCurrent(), sec = TimeSeconds(now); int DOW=TimeDayOfWeek(now) ...
 
WhooDoo22:

サイモン

秒単位で「スキップ」「ポーズ」と呼んでいるのは、[秒x]と[秒y]の間にティックが作成されていないからだと書いていますね。平たく言えば、ティックが作成され、今'秒x'が保存されています。3秒間ティックが作成されないと、ティックが作成されます。今度は'秒y'が保存される。('秒y' = (秒x +3秒)) として、('秒x' = (秒y -3秒)) となります。

どうでしょう?

そうです、ティックとティックの間に3秒は簡単にあります。現実世界と同じように、GMTの真夜中の通貨ペアを見てください、ティックの間に数秒の大きな時間がたくさんあります ... 1分以上ティックがなく、M1バーがないことさえあります ... それは珍しいことではありません。
 

ウィリアム

ご回答ありがとうございました。

1.スタートから戻るまでテスターでは刻みはEVERで作成しない。 TimeCurrent()をstatic/common(global)変数に保存してください。次のティック int deltaSec = TimeCurrent() - previous.

スタートから戻るまで」というのがよくわかりません。詳しく教えてください。


"テスターでは刻みは一切作成されません"

テスターで本物の ティックが作成されることはない、という意味ではないのでしょうか。人工的な 目盛りはテスターで作られるということでしょうか?


"TimeCurrent()を静的/共通(グローバル)変数に保存してください。次のティック int deltaSec = TimeCurrent() - previous.".

TimeCurrent() を変数に保存します。次のtickが来たら、int deltaSec =TimeCurrent() - previous.

変数 "previous "はTimeCurrent()を保存した変数ではないでしょうか...?

deltaSec = TimeCurrent() -(以前に変数に保存されたTimeCurrent())

Williamを明確にしてください。


https://www.mql5.com/en/forum/127483 テスターではDayOfWeek()は常に5を返すと報告されています。私はSeconds(), DayOfWeek()などは一切使いません。なぜなら、あなたは現在のサーバー時刻が欲しいのではなく、テスターのtickの時刻が欲しいからです。


"あなたは、テスターのティックの時間が必要です。"

そうです、これはストラテジーテスターでEAをテストするときに、秒が飛んだり止まったりする理由を説明したサイモンの投稿のおかげで、まさに私が欲しいものだと信じています。


now = TimeCurrent(), sec = TimeSeconds(now); int DOW=TimeDayOfWeek(now) ....

つまり...

sec = TimeSeconds(TimeCurrent()); and DOW = TimeDayOfWeek(TimeCurrent());

これに対して、あなたはどう思いますか?


ありがとうございました。
 
WhooDoo22:

now = TimeCurrent(), sec = TimeSeconds(now); int DOW=TimeDayOfWeek(now) ....

つまり...

sec = TimeSeconds(TimeCurrent()); and DOW = TimeDayOfWeek(TimeCurrent()) です。

TimeSeconds()が与えてくれるものを見て、TimeCurrent()が与えてくれるものを考えてみてください。どれが必要で、なぜ必要なのでしょうか?
 
WhooDoo22:

スタートから戻るまで」というのがよくわからないのですが。説明していただけませんか。

テスターでダニが発生することはない" テスターで本物の ダニが発生することはない、という意味ではないのでしょうか。人工的な ダニがテスターで作られるのは納得できませんか?

  1. int start(){
       // do something
       return; // Return from start.
    }
    int start(){
       // do something
       // Fall off the end is a Return from start.
    }

  2. あなたが戻り、次のティックが作成され、あなたのstart()が呼ばれるまで、いかなる種類の ティックも作成されません。もし5分間計算してリターンすれば、次のコールでのボリューム(ティック数)は+1されます。ライブチャートでは、5分間計算すると、5分間のティックを見逃し、M1ではいくつかの新しいバーが形成されています。
 
RaptorUK:
Strategy Testerでsleep()が機能する論理的な理由はありません。

テスターでもインジケーターでも、sleep()を実行する論理的な理由は常に存在します。

例えば、テスト中のEAと対話するスクリプトをテストする場合、状態を同期させる必要があるかもしれません。私はミューテックスについて話しています。

2つのスレッドが同期する必要がある場合、両方とも「スリープ」する機能が必要です。そして、sleep()は、与えられたCPUサイクルの量を待つ必要がある場合、唯一のクリーンなソリューションです。

私のEAは注文の状態を表示することができます(自分で描いた矢印など)。コマンドを読むためには、それらのチャート・オブジェクトへのアクセスを同期させる必要があります (create chart object + set text property is not one atomic operation).そしてもちろん、この動作をTesterでテストしたいので、待機のためにsleep()が必要です。

もし同じようなことをしたら、UIスレッドを停止してクリーンな状態にしなければなりませんが、10ミリ秒は問題ではありません。

int seconds;

// run until the lock is aquired
while (true) {
   ...
   // warn every second and cancel after 10 seconds
   duration = GetTickCount() - startTime;
   if (duration >= seconds*1000) {
      if (seconds >= 10)
         return(_false(catch("AquireLock(5)   failed to get lock for mutex \""+ mutexName +"\" after "+ DoubleToStr(duration/1000.0, 3) +" sec., giving up", ERR_RUNTIME_ERROR)));
      warn(StringConcatenate("AquireLock(6)   couldn't get lock for mutex \"", mutexName, "\" after ", DoubleToStr(duration/1000.0, 3), " sec., retrying..."));
      seconds++;
   }
   //debug("AquireLock()   couldn't get lock for mutex \""+ mutexName +"\", retrying...");

   if (IsTesting() || IsIndicator()) SleepEx(100, true);          // expert or indicator under test
   else                              Sleep(100);
}

私は、スクリプトを書いてホットキーを割り当てることで、これらのコマンドを使用しています。また、お気に入りに "start "と "stop "スクリプトを入れておき、マウスクリックでEAをスタート/ストップ/レジュームさせることもできます。

例えば、テスターでVisualMode=Onでフルスピードにした場合、適切に同期されないとすぐにクラッシュします。

理由: