エキスパート: New Candle or Bar formation. - ページ 2

 
Maxim Kuznetsov # :

1.previous_timeが不適切に初期化され、コード起動時にすぐに誤報が発生します。

2.ティックごとにiTimeへのアクセスが高価。

3.すべてのティックがバーを形成しない(まれに、オフの日にティックが発生し、トランザクションではなく、何らかの内部サーバーの手続きが発生する場合がある)。

コードの作業は、OntickやOnTimer関数の内部で記述することでしかできない新たなローソク足形成を検出することです
 

ローソク足がいつ閉じるかはわかりません。新しいバーを開始する新しいティックが到着したときのみ、古いバーは閉じられ、そのティックはバーの期間のほぼ終わりに到着する可能性があります。

新しいバーのテストでは、Barsは 信頼できません(チャートの更新/再接続でバーの数が変わる可能性があります)、Volumeは信頼できません(ティックを見逃します)、Priceは信頼できません(価格の重複と==オペランド。 - MQL4プログラミングフォーラム。)常にtimeを 使用してください。
MT4:New candle - MQL4 programming forum #3 (2014)
MT5:Accessing variables - MQL4 programming forum #3 (2022)

新しいバー関数を作ることには反対です。なぜなら、1ティックにつき1回しか呼び出すことができないからです(2回目の呼び出しはfalseを返します)。変数は複数回テストすることができます。
各バーの開始時に一度だけEAを実行する - MQL4プログラミングフォーラム (2011)

 static datetime curDT=0; datetime preDT=curDT; curDT=iTime(_Symbol,_Period,0);
 if(curDT != preDT){ … }
 
William Roeder #:

新しいバー関数を作ることには反対です。なぜなら、1ティックにつき1回しか呼び出すことができないからです(2回目の呼び出しは偽を返します)。変数は何度もチェックできます。

私は、1つのEA内でシンボルとタイムフレームの異なる組み合わせに対して正しく機能し、1ティックの処理内で複数回呼び出すことができ、2回目(およびそれ以降 )も1回目と同じものを返す汎用関数IsNewBar(symbol, timeframe) を作ることに成功 しました。