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

 
コンスタンチン

また、GetMicrosecondCountの実用化によって、現バージョンのプログラム全体の動作が損なわれることをどのように考えていますか? 実用化について説明してください。

例えば、Renatが説明した、コードの実行時間を mcsで正確に測定するという方法以外では、c++でもここでもバリエーションは見当たりません。

正直言って、あなたのこだわりは理解できません。

この機能の範囲は、便宜上、かなり広範囲に渡っています。
期間の異なる複数のタイマーを同時に動作させることができるマルチタイマーについては、すでに前述 したとおりです。
これもfxsaberさんがすでに書かれて いることです。
ミリ秒関数と比較したマイクロ秒関数は、スピードテストだけでなく、Expert Advisorの実行中に様々なテレメトリ情報を取得するのに有効です。
このような遠隔測定の精度が16ミリ秒(正確には1/64秒=15625マイクロ秒)だとしたら、これは非常に大きな誤差である。

 
アレクセイ・ヴャジミキン

設定したが、役に立たなかった-理由がわからない。True, 私のサーバーは ntp2.stratum2.ru です。

このように長い間隔でGetTickCountを使用すれば、特に問題はないはずです。
GetMicrosecondCountを使用した場合、問題が発生します。
もし、マイクロ秒関数を使うことが原則であれば、この変種を 使った方がよいでしょう。

注意すべき情報

機能の実行時間の目安。

- GetTickCount - ~ 2 ns

- GetMicrosecondCount - ~ 30 ns

-RealMicrosecondCount - ~ 40 ns

 
ニコライ・セムコ

このような長い間隔でGetTickCountを使用するのであれば、特に問題はないはずです。
GetMicrosecondCountを使用した場合、問題が発生します。
もし、マイクロ秒関数を使うことが原則であれば、この変種を 使った方がよいでしょう。

注意すべき情報

関数のおおよその実行時間。

- GetTickCount - ~ 2 ns

- GetMicrosecondCount - ~ 30 ns

-RealMicrosecondCount - ~ 40 ns

他の人のコードを使っていて、そこにはそのような機能は全くないのに、この非同期効果が発生するのです。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

input color ValuesPositiveColor = MediumSeaGreen; // Color for positive timer values
input color ValuesNegativeColor = PaleVioletRed;  // Color for negative timer values
input int   TimeFontSize        = 10;             // Font size for timer
input int   TimerShift          = 7;              // Timer shift

#define  clockName "CandleTimer"
int  atrHandle;
int ObjComplite=0;
int  OnInit()                   { atrHandle = iATR(NULL,0,30); EventSetTimer(1);  return(0); }
void OnDeinit(const int reason) { EventKillTimer(); }
void OnTimer( )                 { refreshClock();  }
int  OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
{
   //refreshClock();
   return(rates_total);
}
void refreshClock()
{
   static bool inRefresh = false;
           if (inRefresh) return;
               inRefresh = true;
                              ShowClock(); ChartRedraw();
               inRefresh=false;
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
void ShowClock()
{
   int periodMinutes = periodToMinutes(Period());
   int shift         = periodMinutes*TimerShift*60;
   int currentTime   = (int)TimeCurrent();
   int localTime     = (int)TimeLocal();
   int barTime       = (int)iTime(Symbol(),PERIOD_CURRENT,0);//iTime();
   int diff          = (int)MathMax(round((currentTime-localTime)/3600.0)*3600,-24*3600);

      color  theColor;
      string time = getTime(barTime+periodMinutes*60-localTime-diff,theColor);
             time = (TerminalInfoInteger(TERMINAL_CONNECTED)) ? time : time+" x";

      if(ObjComplite==0)if(ObjectFind(0,clockName) < 0)
      {            
         ObjectCreate(0,clockName,OBJ_TEXT,0,barTime+shift,0);
         ObjComplite=1;
      }   
         ObjectSetString(0,clockName,OBJPROP_TEXT,time);
         ObjectSetString(0,clockName,OBJPROP_FONT,"Arial");
         ObjectSetInteger(0,clockName,OBJPROP_FONTSIZE,TimeFontSize);
         ObjectSetInteger(0,clockName,OBJPROP_COLOR,theColor);

      
         if (ChartGetInteger(0,CHART_SHIFT,0)==0 && (shift >=0))
               ObjectSetInteger(0,clockName,OBJPROP_TIME,barTime-shift*3);
         else  ObjectSetInteger(0,clockName,OBJPROP_TIME,barTime+shift);

      double price[]; if (CopyClose(Symbol(),0,0,1,price)<=0) return;
      double atr[];   if (CopyBuffer(atrHandle,0,0,1,atr)<=0) return;
             price[0] += 3.0*atr[0]/4.0;
             
      bool visible = ((ChartGetInteger(0,CHART_VISIBLE_BARS,0)-ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0)) > 0);
      if ( visible && price[0]>=ChartGetDouble(0,CHART_PRICE_MAX,0))
            ObjectSetDouble(0,clockName,OBJPROP_PRICE,price[0]-1.5*atr[0]);
      else  ObjectSetDouble(0,clockName,OBJPROP_PRICE,price[0]);
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
string getTime(int times, color& theColor)
{
   string stime = "";
   int    seconds;
   int    minutes;
   int    hours;
   
   if (times < 0) {
         theColor = ValuesNegativeColor; times = (int)fabs(times); }
   else  theColor = ValuesPositiveColor;
   seconds = (times%60);
   hours   = (times-times%3600)/3600;
   minutes = (times-seconds)/60-hours*60;
   
   if (hours>0)
   if (minutes < 10)
         stime = stime+(string)hours+":0";
   else  stime = stime+(string)hours+":";
         stime = stime+(string)minutes;
   if (seconds < 10)
         stime = stime+":0"+(string)seconds;
   else  stime = stime+":" +(string)seconds;
   return(stime);
}


int periodToMinutes(int period)
{
   int i;
   static int _per[]={1,2,3,4,5,6,10,12,15,20,30,0x4001,0x4002,0x4003,0x4004,0x4006,0x4008,0x400c,0x4018,0x8001,0xc001};
   static int _min[]={1,2,3,4,5,6,10,12,15,20,30,60,120,180,240,360,480,720,1440,10080,43200};

   if (period==PERIOD_CURRENT) 
       period = Period();   
            for(i=0;i<20;i++) if(period==_per[i]) break;
   return(_min[i]);   
}
 
スラバ
マイクロ秒単位で時間を測定するために使用されるGetMicrosecondsCountの2回の呼び出しの間に、ローカルコンピュータの時間が変化する確率はどのくらいか?

これは、まず、システム時刻とインターネット時刻の同期期間の設定に依存する。例えば、私は1日に1回同期を設定し、この間1秒以上の差がある。 1時間に1回、あるいはもっと頻繁に同期する人がいる。 そこで、確率を計算する。

 
ニコライ・セムコ

...というのは、GetMicrosecondCount()のそのような機能についてはすでに知っており、この関数がGetTickCountよりも遅いことも知っているからです。

この遅さは、ネイティブのPerfomanceCountを取得するのに加えて、さらにローカルタイムを 狂わせているため、この弱気なサービスにお金を払っているためだと思います。 PerfomanceCountとGetTickCountの速度を直接比較すれば、その差はもっと小さくなるはずです。

とはいえ、2~20ナノ秒の実行速度というのは、正直言ってよくわかりません。 この違いは、ほぼ空のループを(この関数で)1億回繰り返したときに初めて実感できます。 このソリューション自体、設計が間違っているのです。

 
レナト・ファットフーリン

そうそう、純粋なWinAPI関数(GetTickCountかQueryPerformanceCounter)で、秒単位でも日付を変えてチェーンソーにスクラップを滑り込ませると、同じようにぶっ飛んでしまうでしょう。あなたが言っているような保護機能は全くありません。問題と疑惑の解決策として指から吸い出す。

つまり、すべてが真実であり、これがWinAPIのあり方であり、現実なのです。

WinApiを使ったコードをここに 具体的に引用しました。 実行して、途中で時計を変えて、その結果をご覧ください。

あなたの主張が推測に基づいたものであるなら、あなたとどのように対話すればよいのか、よくわかりません。 しかも、あなたはこの問題の議論に親しむ必要さえないと考えているのです。

 
ニコライ・セムコ

この機能の応用範囲は、思いつきで言えば、かなり広い。
期間の異なる複数のタイマーを同時に動作させることができるマルチタイマーについては、すでに前述 したとおりです。
これは、すでにfxsaberさんが書かれて いることでもあります。
ミリ秒関数と比較したマイクロ秒関数は、スピードテストだけでなく、Expert Advisorの実行中に様々なテレメトリ情報を取得するのに有効です。
このテレメトリーが16ミリ秒(正確には1/64秒=15625マイクロ秒)の精度だとすると、かなり大きな誤差になります。

私は常に実行速度を測定しています、Renatが書いたように、私は問題を見たことがありません、あなたは無から巻き上げるように見える、または前に書かれたものを変更したくない、それはあなたがそれをすべて無駄に得るときに起こる、悪気はない、しかしあなたが言った同じマルチタイマーは、エラーなしで簡単に実装できますが、あなたはそれを支払う必要があります、Renatも上記の私の質問に対して説明を与えました。

 
コンスタンチン
真理の口は、不慣れな者には無言である。
 
ニコライ・セムコ
真理の口は、不慣れな者には無言である。

まあそうですね ))

 
アレクセイ・ナヴォイコフ

これは、まず、システム時刻とインターネット時刻の同期期間を設定することによります。例えば、私は1日に1回同期を設定し、その間に1秒以上の乖離がある。 ある人は1時間に1回、あるいはもっと頻繁にある。 ここで、その確率を推定することができる。

本当に質問全体を読んだのでしょうか?

...GetMicrosecondsCountの2回の呼び出しの 間に...