新しいバーを検出する方法 - ページ 2

 
Ian Harris:

oneilljさん、こんにちは。

私はすでに返信したつもりでしたが、インターネットのエーテルに消えてしまったようです。

あなたが提供したコードの断片は、私が最初に不満に思っていたものとほぼ同じです。なぜこんなに複雑なのか?もっと簡単な方法があるはずだと思ったんです。私はこれを思いついたのですが、これはうまくいきそうです。間違っていたら訂正してください。(BarsCalculatedも使って みましたが、常にBarsと等しかったので、テストは常にfalseと評価されました)

静的 int LastBarCount = 0;
if (Bars(_Symbol, _Period) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period)。
さもなければ
を返します。

;-)イアン

可能な限りシンプルなものが必要だということに完全に同意します。

悲しいことに、このコードはMQL5では動作しないようです。

 
RoboSpider:
悲しいことに、これはMQL5では動作しないようです。

バーというのは、とにかく新しいバーを検出するのに悪い方法でしょう。

新しいバーを確認 する唯一の信頼できる方法は、時間を使うことです。ボリュームでも なく、価格でもなく、バーでもない。

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }
 
honest_knave:

バーというのは、とにかく新しいバーを検出するのに悪い方法でしょう。

新しいバーを確認する唯一の信頼できる方法は、時間を使うことです。出来高でも なく、価格でもなく、バーでもない。

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }
あなたは私のヒーローです
 
honest_knave Barsはとにかく新しいバーを検出するのに悪い方法でしょう。新しいバーを確認する唯一の信頼できる方法は、時間を使うことです。出来高でも なく、価格でもなく、バーでもない。
  1. Bars is unreliable (a refresh/reconnect can change of bars on the chart,) volume is unreliable (miss ticks,) Price is unreliable (duplicate prices andThe == operand. - MQL4 forum.) Always use time.Bars is unreliable (refresh/reconnect a bar number of chart,) Volume is unreliable (miss ticks,) Price is unreliable (duplicate prices andThe == operand. 新しいキャンドル - MQL4フォーラム
 
honest_knave:

バーというのは、とにかく新しいバーを検出するのに悪い方法でしょう。

新しいバーを確認する唯一の信頼できる方法は、時間を使うことです。出来高でも なく、価格でもなく、バーでもない。

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }

参考までに、私のリファレンスには次のようなメモがあります。

//-- SeriesInfoInteger withSERIES_LASTBAR_DATE は時々エラーを返します。

もう何年も前のことですし、この関数を使用/テストしているわけではないので、もしかしたらもっと違うかもしれません。しかし、新しいバーを検出するためにそれを使用したい場合は、おそらくそれをチェックする方がよいでしょう;-)

 
Alain Verleyen:

参考までに、私のリファレンスには以下のようなメモがあります。

//-- SeriesInfoInteger withSERIES_LASTBAR_DATE は時々エラーを返します。

もう何年も前のことですし、この関数を使用/テストしているわけではないので、もしかしたらもっと違うかもしれません。しかし、新しいバーを検出するためにそれを使用したい場合は、おそらくそれを確認する方がよいでしょう;-)

それは非常に不可解ですアランどのような種類のエラーですか?

その場合、SeriesInfoInteger >0 や ResetLastError を呼び出し前にチェックし、呼び出し後に _LastError をチェックします。

あるいは、OnCalculateの場合はtime[]、CopyTimeなど、別の場所で時間のソースを取得する。

 

なぜこのようなものを使用しないのですか?

   static datetime prevTime=0;
          datetime lastTime[1];
          if (CopyTime(_Symbol,_Period,0,1,lastTime)==1 && prevTime!=lastTime[0])
          {
               prevTime=lastTime[0];
              
               // ...
          }
すべてのケースで動作するはずです(CopyTime()でエラーが発生した場合でも、トラップを回避することができます)。
 
honest_knave:

それはとても不可解なアランですね。どのようなエラーですか?

その場合、SeriesInfoInteger >0 や ResetLastError を呼び出し前にチェックし、呼び出し後に _LastError をチェックする必要があります。

あるいは、OnCalculateの場合はtime[]、CopyTimeなど、別の場所で時間のソースを取得する。

私が数年前に使ったときは、SeriesInfoInteger()はあまり信頼できなかったというだけのことです。この情報を使って何をするかはあなた次第です :-D
 
Alain Verleyen:
私が数年前に使ったときは、SeriesInfoInteger()はあまり信頼できなかったというだけのことです。この情報をどうするかは、あなた次第です :-D

MT5で新しいバーを検出する必要はありません。 でも、教えてくれてありがとうございます。

私は、人々が過度に複雑にしているように見えたものを単純化しようとしていただけです。

それでも、原則は変わりません:時間を使うこと。注意:Alainの不完全な歴史的メモを考慮して、自分の責任で時間を得る方法を選択してください(ところで、XPサービスパック1はどうですか?)

 
honest_knave:

MT5で新しいバーを検出する必要はないのですが、教えてくれてありがとうございます。

私は、人々が過度に複雑にしているように見えたものを単純化しようとしていただけです。

それでも、原則は変わりません:時間を使うことです。注意:Alainの不完全な歴史的メモを考慮して、自分の責任で時間を得る方法を選択してください(ところで、XP Service Pack 1はどうですか?)

理由: