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)。
さもなければ
を返します。
- www.mql5.com
static int BARS; //+------------------------------------------------------------------+ //| NewBar function | //+------------------------------------------------------------------+ bool IsNewBar() { if(BARS!=Bars(_Symbol,_Period)) { BARS=Bars(_Symbol,_Period); return(true); } return(false); }
- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com
こちらもお試しください。
// 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. }
私はこれを使っています...
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
皆さん、こんにちは。
私は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