ライブラリ: IsNewBar

 

IsNewBar:

СIsNewBarクラスは、バーの変化の瞬間を決定を可能にします。通常IこのためにはクラスではなくIsNewBar() 関数が使用されます。しかし、そのような関数には静的変数が含まれているので、この関数のいくつかの呼び出しを使用することはできません。エキスパートア ドバイザーコードで繰り返しこのような関数を再利用できるようにするためにはそれをクラスメンバににしたほうがはるかに簡単です。この場合それは IsNewBar.mqh用いて達成されました。

作者: Nikolay Kositsin

 
私はプロではありませんが、このコードは間違っていると思います。Recount変数は常に真です。したがって、各ティックは新しいバーとして扱われる。なぜこの変数があるのか?なぜCopyCloseを呼び出す のか?投稿されたコードが正しく動作しているかどうか、まったくチェックされていないのでしょうか?もし間違っていたら、訂正して説明してください。
 
lordlev:
私はプロではありませんが、このコードは間違っていると思います。Recount変数は常に真です。したがって、各ティックは新しいバーとして扱われる。なぜこの変数があるのか?なぜCopyCloseを呼び出す のか?投稿されたコードが正しく動作しているかどうか、まったくチェックされていないのでしょうか?もし間違っていたら、訂正して説明してください。
もう一度すべてを再チェックし、間違いを見つけました。添付ファイル自体にはRecountのfalseへの代入はありませんが、サンプルコードではすべてが正しいのです。
 
lordlev:
もう一度すべてをチェックし直したところ、エラーが見つかりました。添付ファイル自体にはRecountのfalseへの代入はありませんが、サンプルコードではすべて正しいのです。
まあ、直せるだろう!
 

私が間違っているのかもしれないが、これが正しいやり方だと思う。

if(TNew>m_TOld)

そうでないと、ページング(履歴編集)の際に不正確になってしまいます。

これは何なのか、なぜこのチェックが挿入されるのか説明してもらえますか?

if(...  && TNew)

私には理解できません。この条件はいつ真で、いつ偽なのでしょうか?ありがとうございます。

 
Prival:

これは何なのか、なぜこのチェックが挿入されるのか説明してもらえますか?

私には理解できません。この条件はいつ真で、いつ偽なのでしょうか?ありがとうございます。

TNewがm_TOldと等しくなく、同時にゼロ(つまりD'1970.01.01.01 00:00:00:00')でもないことをチェックしているのだと思います。

2つ目の条件は、関数がゼロとは異なるものを返したかどうかをチェックするものです。

datetime TNew=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));

がゼロとは異なるものを返したかどうかをチェックするものである。

さて、この関数を使ってスクリプトを実行してみた。たぶん週末のせいだろう。

 
Prival:

これは何なのか、なぜこのチェックが挿入されるのか説明してもらえますか?

私には理解できません。この条件はいつ真で、いつ偽なのでしょうか?ありがとうございます。

ゼロのチェックは、開始時および条件の最初のチェックで、新しいバーの 開始(そのバーが開いてからどれだけ時間が経過していても)を取得するのを避けるために必要です。
 
Prival:

私が間違っているのかもしれないが、これが正しいやり方だと思う。

そうでないと、ページング(履歴編集)時に作業の正確性が損なわれる。

それが何なのか、なぜこのチェックが挿入されるのか説明していただけますか?

私には理解できません。この条件はいつ真で、いつ偽なのでしょうか?ありがとうございます。

予防措置としてこのようにする方が論理的だと思います。

if(TNew>m_TOld && TNew)

TNewは履歴が入れ替わったときにゼロのままですが。TNew変数にはいつでもゼロが入る可能性があるので、常にゼロかどうかをチェックする必要があります。

 
Automated-Trading:

IsNewBar

著者Nikolay Kositsin

あなたのクラスにはちょっとしたバグが あります 最初にIsNewBarメソッドを呼び出すと、 実際の 新しいバーの存在に関係なく 、常に真を返します。

しかし、このような関数には静的変数が含まれているため、この関数を何度も呼び出すことはできない。

2次元の配列を使って、最後のバーのオープン時間を保持することもできます。

 
CIsNewBarの代替バージョンを作ってみた。Tick.time_mscを使ってidempotent関数を 作っただけだ


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()){
                /// 新しいバー・イベント・ハンドラを呼び出す
                /// 新しいバーのために仕事をする。 
                }
        }
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5