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フォーラム
oneilljさん、こんにちは。
私はすでに返信したつもりでしたが、インターネットのエーテルに消えてしまったようです。
あなたが提供したコードの断片は、私が最初に不満に思っていたものとほぼ同じです。なぜこんなに複雑なのか?もっと簡単な方法があるはずだと思ったんです。私はこれを思いついたのですが、これはうまくいきそうです。間違っていたら訂正してください。(BarsCalculatedも使って みましたが、常にBarsと等しかったので、テストは常にfalseと評価されました)
静的 int LastBarCount = 0;
;-)イアンif (Bars(_Symbol, _Period) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period)。
さもなければ
を返します。
可能な限りシンプルなものが必要だということに完全に同意します。
悲しいことに、このコードはMQL5では動作しないようです。
悲しいことに、これはMQL5では動作しないようです。
バーというのは、とにかく新しいバーを検出するのに悪い方法でしょう。
新しいバーを確認 する唯一の信頼できる方法は、時間を使うことです。ボリュームでも なく、価格でもなく、バーでもない。
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
{
printf("New bar: %s",TimeToString(ThisBar));
LastBar = ThisBar;
}
バーというのは、とにかく新しいバーを検出するのに悪い方法でしょう。
新しいバーを確認する唯一の信頼できる方法は、時間を使うことです。出来高でも なく、価格でもなく、バーでもない。
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
{
printf("New bar: %s",TimeToString(ThisBar));
LastBar = ThisBar;
}
バーというのは、とにかく新しいバーを検出するのに悪い方法でしょう。
新しいバーを確認する唯一の信頼できる方法は、時間を使うことです。出来高でも なく、価格でもなく、バーでもない。
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 は時々エラーを返します。
もう何年も前のことですし、この関数を使用/テストしているわけではないので、もしかしたらもっと違うかもしれません。しかし、新しいバーを検出するためにそれを使用したい場合は、おそらくそれをチェックする方がよいでしょう;-)
参考までに、私のリファレンスには以下のようなメモがあります。
//-- SeriesInfoInteger withSERIES_LASTBAR_DATE は時々エラーを返します。
もう何年も前のことですし、この関数を使用/テストしているわけではないので、もしかしたらもっと違うかもしれません。しかし、新しいバーを検出するためにそれを使用したい場合は、おそらくそれを確認する方がよいでしょう;-)
それは非常に不可解ですアランどのような種類のエラーですか?
その場合、SeriesInfoInteger >0 や ResetLastError を呼び出し前にチェックし、呼び出し後に _LastError をチェックします。
あるいは、OnCalculateの場合はtime[]、CopyTimeなど、別の場所で時間のソースを取得する。
なぜこのようなものを使用しないのですか?
datetime lastTime[1];
if (CopyTime(_Symbol,_Period,0,1,lastTime)==1 && prevTime!=lastTime[0])
{
prevTime=lastTime[0];
// ...
}
それはとても不可解なアランですね。どのようなエラーですか?
その場合、SeriesInfoInteger >0 や ResetLastError を呼び出し前にチェックし、呼び出し後に _LastError をチェックする必要があります。
あるいは、OnCalculateの場合はtime[]、CopyTimeなど、別の場所で時間のソースを取得する。
私が数年前に使ったときは、SeriesInfoInteger()はあまり信頼できなかったというだけのことです。この情報をどうするかは、あなた次第です :-D
MT5で新しいバーを検出する必要はありません。 でも、教えてくれてありがとうございます。
私は、人々が過度に複雑にしているように見えたものを単純化しようとしていただけです。
それでも、原則は変わりません:時間を使うこと。注意:Alainの不完全な歴史的メモを考慮して、自分の責任で時間を得る方法を選択してください(ところで、XPサービスパック1はどうですか?)
MT5で新しいバーを検出する必要はないのですが、教えてくれてありがとうございます。
私は、人々が過度に複雑にしているように見えたものを単純化しようとしていただけです。
それでも、原則は変わりません:時間を使うことです。注意:Alainの不完全な歴史的メモを考慮して、自分の責任で時間を得る方法を選択してください(ところで、XP Service Pack 1はどうですか?)