新しいバーを表示する

Willbur  

新しいバーが日の目を見たとき、どのように表示するのか不思議です。
主に、私はパフォーマンスを心配しています。いくつかのシンボルでは、20ミリ秒ごとにティックが表示されました。反応する時間はそれほど多くはありません。

一つのアイデアは、rates.tick_volumeです。

Mqlrates rates[1];

OnInit()
    {
    if(CopyRates(_Symbol,_Period,0,1,rates) < 1)
       if(rates[0].tick_volume == 1)
          {
          ... deal with new bar ...
          }

もう一つのアイデアは、バーの数が 増加しているかどうかをチェックすることです。

OnInit()
  {
  if(BarsOld < Bars(_Symbol,_Period))
     {
     BarsOld = Bars(_Symbol,_Period);
     ... deal with new bar ...
     }

OnChartEventもチェックしましたが、新しいバーを他のものと区別する方法は見つかりませんでした。

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

WIllbur

Alain Verleyen  

バーとボリュームは新しいバーを検出 するのに信頼性がありません。

コンピュータはナノ秒単位で動いているので、うまくコード化されたEAは20ミリ秒で多くのことを行うことができます。

The "New Bar" Event Handler
The "New Bar" Event Handler
  • 2010.10.11
  • Konstantin Gruzdev
  • www.mql5.com
MQL5 programming language is capable of solving problems on a brand new level. Even those tasks, that already have such solutions, thanks to object oriented programming can rise to a higher level. In this article we take a specially simple example of checking new bar on a chart, that was transformed into rather powerful and versatile tool. What tool? Find out in this article.
Willbur  

アランさん、ありがとうございます。

非常に興味深いです......まさに私が推測していることです......。10倍速い......うーん。

意味する。TimeCurrent()は、高速で、バーの境界線に同期している?

なぜ......うーん......。

私はそれについて考えるためにしばらく時間が必要です。

ウィルバー

Willbur  

OK - こういうのが好きな人へ:この問題についての私の研究。

私は、OnTickイベントごとに、ある文章をファイルに書きました。

TimeLocal (PC CLock), TimeCurrent(), SymbolInfoTick() を使って、最後に来たティックに関するいくつかの情報と、- CopyRates() を使って、現在のBarに関するいくつかの情報を得ることができます。


USD/JPY "の例 - 期間は "M1 "です。

PC-Clockで19:43:01に43分足の最初のティックが入り、同時に新しいバーが発生しました。
ティックボリュームが1でないのはご愛嬌として、これが通常の流れです。



時にはそれはそう簡単ではありません - この場合のように。

PCは、41分のバーの3つのティックが来たとき、すでに19:42:00を示しています。それらはまだ19:41:59のタイムスタンプを持っています。

今、世界は深呼吸をしています - 8.150ミリ秒の完全な静止状態。

そして、PCはすでに19:42:09を表示しており、新しいバーの最初のティック(42分バー)が入ってきました。
ティックは19:42:07と表示され、19:42のバーであるため、バーのタイムスタンプは19:42:00となります。


さて......うーん............。

1.TimeCurrent() は常にティックのタイムスタンプと等しいのでしょうか?

4万件のレコードをチェックしたところ、TimeCurrentがすでに切り替わっていて、最後のティックのタイムスタンプが切り替わっていないケースは5件だけでした。

2.2. last_tickは常に新しいバーの開始より前にあるのでしょうか?

(続き)

Alain Verleyen  

TimeCurrent()はサーバーからの最後のティックの時間であり、チャートシンボルからかどうかはあなたのコードによります

私はあなたの「最後のティック」の問題を理解していません、あなたはこの出力を生成するコードを表示する必要があります。

Willbur  

こんにちは、アラン

私はOnTick()でTimeCurrent()をチェックし、それが私が扱うシンボルに属していることを確認する必要があります。

これは私の "新しいバー識別子 "になるはずです。

//---  New Bar           
bool   NewBar = false;
long   currPeriodSeconds;
double currPeriodProgress = 0;

int OnInit(void)  //-----------------------------------------------
{
      currPeriodSeconds = PeriodSeconds();
      return(INIT_SUCCEEDED);
}

void OnTick()  //--------------------------------------------------
{
      if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
           NewBar = true;
      else NewBar = false;
     

      currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);

私はこのsequenzでそれを確認するつもりです。

//---  Just for testing
int    ExtHdlFile1=0;
       MqlRates rates[1];
        
//---  New Bar           
bool   NewBar = false;
long   currPeriodSeconds;
double currPeriodProgress = 0;

int OnInit(void) // -------------------------------------------------------
{
      currPeriodSeconds = PeriodSeconds();

      ExtHdlFile1=FileOpen("NewBarTest.csv",FILE_READ|FILE_WRITE|FILE_CSV);
      FileSeek (ExtHdlFile1,0,SEEK_END); 
      FileWrite(ExtHdlFile1,  "TimeLocal",
                              "TimeCurrent",
                              "rates[0].time",
                              "rates[0].tick");
      return(INIT_SUCCEEDED);
}

void OnTick() // -----------------------------------------------------------
{
      if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
           NewBar = true;
      else NewBar = false;
     
      currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);

//--- lets check this

      if(NewBar)
         {
         // last Time Stamp of old Bar
         FileWrite(ExtHdlFile1, " ",
                                " ",
                                TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
                                IntegerToString(rates[0].tick_volume));
         // get the new bar                     
         if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return;
         // first Time Stamp of new Bar       
         FileWrite(ExtHdlFile1,TimeToString(TimeLocal(),TIME_MINUTES|TIME_SECONDS),
                               TimeToString(TimeCurrent(), TIME_MINUTES|TIME_SECONDS),
                               TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
                               IntegerToString(rates[0].tick_volume));
         }

      if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return; // != clean code - just a test
}

void OnDeinit(const int reason)
{
      FileClose(ExtHdlFile1);
      return;
}

Alain Verleyen  
Willbur:

こんにちは、アラン

私はOnTick()でTimeCurrent()をチェックし、それが私が扱うシンボルに属していることを確認する必要があります。

さて、これは私の「新しいバー識別子」であるべきで、小さくて速いです。

興味深いですが、私はそれが普遍的であるとは思わない(すべてのケースで動作)...私はチェック します、現在時間がない。
Willbur  

これが私の最終バージョン です。

あまりに簡単なので、ちょっと心配になりました。

アラン祝福の言葉をかけていただけるとうれしいです。

// -----------------------------------------------------------------------
bool NewBar(void)
{
bool iNewBar = false;
static double currPeriodProgress = 0;

   if(MathMod(TimeCurrent(),PeriodSeconds()) < currPeriodProgress) iNewBar = true;

   currPeriodProgress = MathMod(TimeCurrent(),PeriodSeconds());

   return(iNewBar);
}
// ------------------------------------------------------------------------
void OnTick()
{
    if(NewBar())     PlaySound("tick.wav");


ケルンからご挨拶
ウィルバー

Doerk Hilger  

一番簡単な方法です。

static datetime tlastbar=0;

datetime tnewbar=iTime(NULL,PERIOD_CURRENT,0);

bool isnewbar=tnewbar!=tlastbar;

tlastbar=tnewbar;

理由: