MT5とスピードの関係 - ページ 52

 

マクロのためのリエンジニアリング

#define  µsSLEEP(µsRange)                              \
        {                                             \
           ulong c = GetMicrosecondCount() + µsRange; \ 
           while(GetMicrosecondCount() < c);          \
        }


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   while(!_StopFlag)
   {
      µsSLEEP(5000000);
      Print("Прошло 5000000 микросекунд");
   }
}
 
Roman:

もちろん、1つのコアだけでなく、それ以上のことも可能です。

Sleepが ない間という意味です。

マイクロ秒を必要とするため、ここではスリップが適さないことは明らかです。でも、それがなくても鼻歌交じりになる...。

 
Andrey Khatimlianskii:

Sleepがない間という意味です。

マイクロ秒が必要なので、スリップがうまくいかないのは明らかです。でも、それがなくても鼻歌が出ます。

もちろん、滑ることなく鼻歌も歌えます。
GetMicrosecondCount カウンタが動作しています。

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong µs = 0;
   
   while(!_StopFlag)
   {
      µs = GetMicrosecondCount();
      
      Comment((string)µs);
      ChartRedraw();      
   }
   
   Comment("");   
}
 
Roman:

もちろんスリップせずに回転しています。
GetMicrosecondCountカウンタが動作しています。

積んでいるのはカウンターだけではありません。空の無限ループも読み込まれます。そういうことなんです。

一般的に悪い解決方法です。しかし、より良いものを提案することはしない。

 
Andrey Khatimlianskii:

積んでいるのはカウンターだけではありません。空のエンドレスループも読み込まれます。そういうことなんです。

すべてにおいて、悪い解決策だと思います。でも、より良いものを提案することはしません。

そのため、空のループは当然、プロセッサのクロックサイクルの可能性を最大限に引き出すことになる。
解答が悪いという文句は理解できない。リソースに適さないとしても、それが悪いというわけではありません。
µsSLEEP は、標準的なSleep(1) よりも短いループレイテンシを与えます; すなわち、ミリ秒ではなくマイクロ秒です。
上記の例の5000000はあくまで例であり、実際の戦闘時の周波数は1ms以下であろう

あなたの問題は理解できない。
ストレスから解放されるために必要な
のか
定期的に置く Sleep(20);単位はミリ秒

 
Roman:

そのため、プロセッサーのクロックサイクルのポテンシャルを最大限に引き出すことができるのです。
解答が悪いという文句は理解できない。自分のリソースに合わなくても、それが悪いというわけではありません。
µsSLEEP は、標準的な Sleep(1) よりも短いループレイテンシを与えます; すなわち、ミリ秒ではなくマイクロ秒です。
上記の例の5000000はあくまで例であり、実際の戦闘時の周波数は1ms以下であろう

あなたの問題は理解できない。
ストレスから解放されるために必要な
のか
通常のSleep(20);をミリ秒単位で入れてください。

不満はなかったんです。
そんなタイマーは必要ない、興味本位で勉強していたのです。しかし、不必要にプロセッサに負荷をかけるので、私は悪い解決策だと思います。

また、どのような目的でマイクロ秒のスリップが必要なのでしょうか?

 
Andrey Khatimlianskii:

不満はなかった。
そんなタイマーは必要ない、興味本位で勉強した。しかし、不必要にプロセッサに負荷をかけるので、私はこの解決策は悪いと思います。

マイクロ秒のスリップは何のために必要なのでしょうか?

なぜ負荷がかかるのか、その理由を考えて解決すれば、このような意見にはならないはずです。
1ms以下を求めるなら、リソースで賄うしかないでしょう。
また、マイクロ秒タイマーで インターバルをカウントする必要があるため、アンロードはできないようです。
一方、マイクロ秒タイマーを常時動作させ、空白の時間と同等の負荷を与える場合、
、なぜこのような遅延が発生するのかという疑問があり、マイクロ秒タイマーを 使用します。とにかく、リリカルなんです。
そこで、ある頻度でサーバーにpingを打ち、その間は遅延がないようにしています。
また、不要な呼び出しが発生するので、マイクロ秒単位のサンプリングが必要です。
私は先に投稿した最初の解決策を使っていますし、μsSleepも書きましたので、便利かもしれません。


 
Andrey Khatimlianskii:


マイクロ秒のスリップはどのような目的で必要なのでしょうか?

ここでは、既成概念を覆す解決策をご紹介します。
Print() はもちろん自分のコードに置き換えます。

#define  SEND_PING                                           \
{                                                           \   
   ulong currCount = GetMicrosecondCount();                 \
   switch((currCount - prevCount) > 5000000)                \
   {                                                        \
      case 0:                                               \
         break;                                             \
      case 1:                                               \
         prevCount = currCount;                             \
         Print("ping");                                     \
         break;                                             \
   }                                                        \
}
       

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong  prevCount = 0;
   
   while(!_StopFlag)
   {
      SEND_PING;
   }  
 
}
 
Renat Fatkhullin:
私たちが書いている新しいテスターでは、これを変更しようと思っています。
fxsaber:

PMに送信されました。

テスターでは、このEAが完全かつ合理的な(スパムではない)取引注文の 記録を修正という形で何百万件も生成しています。このため、テスターのログは破滅的にすぐに詰まってしまう。

これらのログは99%必要ありませんが、Expert AdvisorがPrintで出力する内容が必要になることがよくあります。そのため、TesterでOrderSendの各パックのエントリーを自動生成しないようにすることを再度検討して頂きたいと思います。

もし私の理解が正しければ、そのような文字列の生成を無効にすることで、単一実行のパフォーマンスが向上することになります。つまり、メリットは2つあるのです。

 
Renat Fatkhullin:


しかし、シカゴに物理的なプラットフォームのコアを持つMetaTrader 5のAMPGlobalEU-Live(実際にはAMPGlobalUSA-Liveとして検索する方がよい)は、最も近いサーバーがニューヨークにあるため、実際には19.53msになります。

すべてのポイントを手動で特殊スキャン - 最小値は19ms。

数日中にシカゴにサーバーを置くようにします。まだ手をつけていない。

シカゴのサーバーが展開されました。

24時間以内にすべてのサーバーをスキャンし、配信を開始します。