新しいバーを検出する方法

 

皆さん、こんにちは。

私はMQL5の完全な初心者ですが、他のプラットフォームでかなりの量のコーディングをしてきました。

新しいバーのみで実行するEAがなぜそんなに難しいのか不思議に思っています。新しいバー」イベントハンドラなど、いくつかの記事を見てみましたが、非常に難しいようです

もしそれがうまくいかず、"new bar" イベントハンドラを使わなければならないのであれば、関連ファイルを donwload して Files(?) フォルダにコピーし、それを #include するだけでいいのでしょうか。私のように基本的に何をやっているのかわからない人のために、これが文書化されている場所はありますか?

私は https://www.mql5.com/en/articles/100 のチュートリアルを進めていますが、最初に気づいたのは、「Bars」関数が、計算を実行するのに十分なバーがあることを確認するために使われていることです。しかし、次のコード片は、明らかに新しいバーを検出するために設計されていて、(とにかく私の理解では)非常に複雑なコード片になっています。Bars関数で 新しいバーを検出することはできないのでしょうか? if(Bars > int LastBarCount) {bool IsNewBar = true; LastBarCount = Bars;} else {IsNewBar = false;} のような ものです。 このようなものが動作するでしょうか?

ウィッシュリストに一つ。OnTickの代わりに、OnNewBarイベントをオーバーライドできたらいいんじゃないでしょうか?私が今まで見てきたすべてのインジケータは、ティックではなく、バー上で動作するので、私はそれが皆の生活をより簡単になると思います。

もう一つの可能性を見つけました。"BarsCalculated "です。また、説明から何を意味するのか完全にはわかりませんが、EAがすでに処理したバーの数のようです。もしそれが本当なら、私がチェックする必要があるのは if(Bars > BarsCalculated), if true then go and do my processing, otherwise return ということだけでしょうか?私は何かを見逃しているのでしょうか?

ありがとうございます。

Ian

Step-By-Step Guide to writing an Expert Advisor in MQL5 for Beginners
  • 2010.06.09
  • Samuel
  • www.mql5.com
The Expert Advisors programming in MQL5 is simple, and you can learn it easy. In this step by step guide, you will see the basic steps required in writing a simple Expert Advisor based on a developed trading strategy. The structure of an Expert Advisor, the use of built-in technical indicators and trading functions, the details of the Debug mode and use of the Strategy Tester are presented.
 


EAのOnTick関数の冒頭で、これを試してみてください。

// 静的変数Old_Timeを使用して、バータイムを保存します。

// OnTickの実行ごとに、現在のバータイムと保存されたバータイムをチェックします。

// バータイムが保存された時間と等しくない場合、新しいティックがあることを示します。


静的な datetime Old_Time;

datetime New_Time[1];

bool IsNewBar=false;


// 最後のバー時刻を要素New_Time[0]にコピーする

int copied=CopyTime(_Symbol,_Period,0,1,New_Time);

if(copied>0) // OK, データは正常にコピーされました。

{

if(Old_Time!=New_Time[0]) // 古い時刻が新しいバータイムと等しくない場合。

{

IsNewBar=true; // 最初の呼び出しでない場合、新しいバーが出現しています。

if(MQL5InfoInteger(MQL5_DEBUGGING))Print("We have new bar here ",New_Time[0]," old time was ",Old_Time);

Old_Time=New_Time[0]; // バーの時間を保存する

}

}

さもなくば

{

Alert("Error in copying historical times data, error =",GetLastError());

ResetLastError()を実行します。

を返します。

}


//--- EAは新しいバーがあるときだけ新しい取引をチェックする必要があります。

if(IsNewBar==false)

{

を返します。

}

//--- 作業するのに十分な数のバーがあるかどうか

int Mybars=Bars(_Symbol,_Period);

if(Mybars<60) // もし、バーの合計が60本以下であれば

{

Alert("We have less than 60 bars, EA will now exit!!!");

を返します。

}


 

oneilljさん、こんにちは。

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

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

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

;-)イアン
Documentation on MQL5: Timeseries and Indicators Access / BarsCalculated
  • www.mql5.com
Timeseries and Indicators Access / BarsCalculated - Documentation on MQL5
 
私が使っているのは、これ...
static int BARS;
//+------------------------------------------------------------------+
//| NewBar function                                                  |
//+------------------------------------------------------------------+
bool IsNewBar()
   {
      if(BARS!=Bars(_Symbol,_Period))
        {
            BARS=Bars(_Symbol,_Period);
            return(true);
        }
      return(false);
   }
 
"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.
 
ssn:
私はこれを使っています...
この方法のリスクは、シンボルの価格データが1971年1月4日から始まっていない場合、エキスパートがチャートに接続されている間に読み込まれた履歴 データは新しいバーとして読み込まれることです...
 
このトピックに関係のないコメントは、「MT4でmql5は使えるか」に移動されました。
 

iTime関数は、バーの時刻を表示します。

これが変化すると新しいバーとなります。

 
Nathan5:

iTime関数は、バーの時刻を表示します。

これが変化すると新しいバーとなります。

このトピックは、mql5に関するものです。iTime() 数はありません。
 

こちらもお試しください。


// Rates structure array for last two bars 
   MqlRates mrate[2];                 
   CopyRates(Symbol(), Period(), 0, 2, mrate);

// NEW BAR CHECK.
//---------------
   static double   dBar_Open;     
   static double   dBar_High;
   static double   dBar_Low;
   static double   dBar_Close;
   static long     lBar_Volume;
   static datetime nBar_Time;

// Boolean for new BAR confirmation. 
   bool bStart_NewBar = false;

// Check if the price data has changed tov the previous bar.   
   if(mrate[0].open != dBar_Open || mrate[0].high != dBar_High || mrate[0].low != dBar_Low || mrate[0].close != dBar_Close || mrate[0].tick_volume != lBar_Volume || mrate[0].time != nBar_Time)
         {
         bStart_NewBar = true; // A new BAR has appeared!        

// Update the new BAR data.     
         dBar_Open   = mrate[0].open;      
         dBar_High   = mrate[0].high;
         dBar_Low    = mrate[0].low;
         dBar_Close  = mrate[0].close;                 
         lBar_Volume = mrate[0].tick_volume;
         nBar_Time   = mrate[0].time;
         }

// Check if a new bar has formed.   
   if(bStart_NewBar == true)
         {
         
// Your code.          
         
         }
 
Stephen Njuki:
私はこれを使っています...
悲しいかな、これはMQL5では動作しないようです。
理由: