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

 
Sleep(0);

このようなスリップには数十ミリ秒の時間がかかることがあります。

 
fxsaber:

このようなスリップは数十ミリ秒に及ぶこともある。

どういう意味ですか?

昔、パラレル処理でSleep() が話題になったのを覚えています。

 
Fast528 です。

というと?

まさにその通りです。

 
fxsaber

このようなスリップは数十ミリ秒に及ぶこともある。

数十秒ではなく、15.625ミリ秒です。
工事はずっと使っています。

if(pause>0) Sleep(pause);
 
ニコライ・セムコ

数十秒ではなく、15.625ミリ秒です。
このデザインはずっと使い続けています。

ulong GetSleepTime( const int Pause = 0 )
{
  const ulong StartTime = GetMicrosecondCount();
  
  Sleep(Pause);
  
  return(GetMicrosecondCount() - StartTime);
}

void OnStart()
{
  ulong MaxTime = 0;
  
  while (!IsStopped())
  {
    const ulong SleepTime = GetSleepTime();
    
    if (SleepTime > MaxTime)
    {
      Print(SleepTime);
      
      MaxTime = SleepTime;
    }
  }
}


結果

2542
9983
10033
10041
10148
10348
11982
26116
27529
40066
49915
56319
 
fxsaber


結果

平均時間を算出する。

SleepTimeを積算し、ループ終了後の反復回数で割る。

そうでないと、未熟な頭脳には、いま提示した結果が怖く見えてしまうのです。また、同時に最短時間も表示します。

PS.MQL5のSleep()関数は、win api関数 ::Sleep() へのリダイレクトではありません。というか、値が100以下の場合はリダイレクトになります。しかし、100以上はループでその中にwin api slipが入っているので、IsStoppedで割り込むことができる。

もうひとつ、微妙な点があります。ミリ秒<0の場合、1を頭に付ける。つまり、::Sleep(0)を呼ぶことはない。

PPS kernel32.dllからSleep関数をインポートして、同じ実験をする。

 
スラバ

平均時間を算出する。

SleepTimeを累積し、サイクル終了後に反復回数で割る。

平均的な時間ではなく、急増する可能性があるという話をしたのです。取引履歴とOrderSendの結果の同期を待っているときに遭遇しました。Sleep(0)を使って待機していました。不可能であることが判明した。

スラバ

PS.MQL5のSleep()関数は、win api関数 ::Sleep() へのリダイレクトではありません。まあ、値が100以下ならリダイレクトなんですけどね。しかし、100以上はループでその中にwin api slipが入っているので、IsStoppedで割り込むことができる。

もうひとつ、微妙な点があります。ミリ秒<0の場合、1を頭に付ける。つまり、::Sleep(0)を呼ぶことはない。

詳しく教えていただきありがとうございます。Sleep(5000)をIsStopped()で終了させることができるのは知りませんでした。

 
fxsaber

平均的な時間ではなく、スパイクの可能性があるということでした。OrderSendの結果と取引履歴の同期を待っているときに遭遇しました。Sleep(0)を使って待機していました。そのようにできないことが判明しました。

つまり、Windows OSは決してリアルタイムなシステムではないのです
 

fxsaber

詳細をありがとうございました。Sleep(5000)がIsStopped()で終了できることを知りませんでした。

https://www.mql5.com/ru/docs/common/sleep

この機能には、0.1秒ごとにEAの停止フラグの状態を確認する機能が組み込まれています。

Документация по MQL5: Общие функции / Sleep
Документация по MQL5: Общие функции / Sleep
  • www.mql5.com
Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить. В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды.
 
スラバ
つまり、Windows OSは決してリアルタイムなシステムではないのです

正直、どういう意味なのか、MQL5のどこで遭遇できるのかすらわかりません。

理由: