私はプロではありませんが、このコードは間違っていると思います。Recount変数は常に真です。したがって、各ティックは新しいバーとして扱われる。なぜこの変数があるのか?なぜCopyCloseを呼び出す のか?投稿されたコードが正しく動作しているかどうか、まったくチェックされていないのでしょうか?もし間違っていたら、訂正して説明してください。
もう一度すべてをチェックし直したところ、エラーが見つかりました。添付ファイル自体にはRecountのfalseへの代入はありませんが、サンプルコードではすべて正しいのです。
私が間違っているのかもしれないが、これが正しいやり方だと思う。
if(TNew>m_TOld)そうでないと、ページング(履歴編集)の際に不正確になってしまいます。
これは何なのか、なぜこのチェックが挿入されるのか説明してもらえますか?
if(... && TNew)私には理解できません。この条件はいつ真で、いつ偽なのでしょうか?ありがとうございます。
これは何なのか、なぜこのチェックが挿入されるのか説明してもらえますか?
私には理解できません。この条件はいつ真で、いつ偽なのでしょうか?ありがとうございます。
TNewがm_TOldと等しくなく、同時にゼロ(つまりD'1970.01.01.01 00:00:00:00')でもないことをチェックしているのだと思います。
2つ目の条件は、関数がゼロとは異なるものを返したかどうかをチェックするものです。
datetime TNew=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));
がゼロとは異なるものを返したかどうかをチェックするものである。
さて、この関数を使ってスクリプトを実行してみた。たぶん週末のせいだろう。
私が間違っているのかもしれないが、これが正しいやり方だと思う。
そうでないと、ページング(履歴編集)時に作業の正確性が損なわれる。
それが何なのか、なぜこのチェックが挿入されるのか説明していただけますか?
私には理解できません。この条件はいつ真で、いつ偽なのでしょうか?ありがとうございます。
予防措置としてこのようにする方が論理的だと思います。
if(TNew>m_TOld && TNew) TNewは履歴が入れ替わったときにゼロのままですが。TNew変数にはいつでもゼロが入る可能性があるので、常にゼロかどうかをチェックする必要があります。
あなたのクラスにはちょっとしたバグが あります 。 最初にIsNewBarメソッドを呼び出すと、 実際の 新しいバーの存在に関係なく 、常に真を返します。
しかし、このような関数には静的変数が含まれているため、この関数を何度も呼び出すことはできない。
2次元の配列を使って、最後のバーのオープン時間を保持することもできます。
class CIsNewBar{
private:
long checkedMs;
datetime lastBarOpenedAt;
bool lastValue;
CTickUtils tickUtils;
public:
CIsNewBar(){}
~CIsNewBar(){}
bool isNewBar(){
MqlTick tick;
SymbolInfoTick(_Symbol, tick);
long tickMs = tick.time_msc;
if(checkedMs >= tickMs){ //このティックで既にこの関数を処理したか?
return lastValue; //バッファリングされた値を返す
}
datetime time[1];
CopyTime(_Symbol, _Period, 0, 1, time);
if(lastBarOpenedAt != time[0]){
lastBarOpenedAt = time[0];
lastValue = true;
} else {
lastValue = false;
}
checkedMs = tickMs;
return lastValue;
}
これは、上記の問題点を解決した、スピーディーで軽量なクラスだと思う。
このバージョンでは
- .isNewBar()関数が 初めて呼び出されたときに偽の警告を出さない。
- スタティック変数を使用することなく、関数が呼び出されるたびに常に新しい変数を再インスタンスする必要がなくなり、実行速度が速くなります。
- バーごとに1回だけ真を返します。
- メモリ・フットプリントが軽い。
class CIsNewBar{ private: datetime lastBarOpenedAt; datetime time[1]; public: CIsNewBar(){CopyTime(_Symbol, _Period, 0, 1, time);lastBarOpenedAt = time[0];} ~CIsNewBar(){} bool isNewBar(){ CopyTime(_Symbol, _Period, 0, 1, time); if(lastBarOpenedAt < time[0]){ lastBarOpenedAt = time[0]; return(true); } else { return(false);} } };
このクラスを実装するには
CIsNewBar someName; void OnTick(){ if(someName.isNewBar()){ /// 新しいバー・イベント・ハンドラを呼び出す /// 新しいバーのために仕事をする。 } }
- www.mql5.com
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
IsNewBar:
作者: Nikolay Kositsin