int N_bar=iBarShift(Symbol(),PERIOD_CURRENT,iTime(Symbol(),PERIOD_H1,0));//номер текущего бараdatetime StopDt=iTime(Symbol(),PERIOD_CURRENT,N_bar+1);//только для минуток и то может быть не корректно!Print("StopDt_Shift=",TimeToString(StopDt,TIME_DATE|TIME_MINUTES));
OnInit()でシンボルの時系列を呼び出す:iTime(Symbol,Timeframe,1)。
OnTick()の冒頭で、対応するiFunc()で必要な時系列の必要なバーを求めるか、if( iTime(Symbol,Timeframe,10)==0) returnを実行します。
この場合、Expert Advisorは新しいバーを検出せず、次のティックを待ちます。
OnInit()では、時系列データを要求し、データのページングを有効にしています。
OnTick()では、EAに最低限必要な履歴があるかどうかをチェックし、まだない場合は次のティックを待ちます。
そして、Expert Advisorが必要とするすべてのデータを受信するまで、次のティックを待ちます。
必要なデータがすべてダウンロードされ、取得されるとすぐに、Expert Advisor は新しいバーと必要な履歴を使用して動作を開始します。
シリアルデータを最新の状態に保つために、少なくとも2分に1回はアクセスするようにしてください。1分半(90秒)程度のタイマーを作り、その中でiTime(Symbol,Timeframe,1)のように任意のシンボルの時系列にアクセスするだけで、受信データをチェックせずに、ただ履歴を「動かす」だけです。そうすれば、シンボル上のすべてのデータは常に最新の状態に保たれます。
もちろん、すべてのTFを使って新しいバーを確認するようにしますが、同期していないのでしょうか、これはMT4ではありません。問題はバーではなく、インジケータから呼び出され、そのインジケータがExpert Advisorから呼び出されるインジケータの非性能にあるのです。
私は分単位で仕事をしているので、履歴は常に最新であるべきです。
そして、これらのチェックはすべてテストのために行われるもので、実際の口座では作業が遅くなるだけです。なぜなら、そこではすべてがテスターの静止状態よりも遅く動作するからです。
今のところ、メインコードの開始前に、失敗したインジケータの準備状態をチェックすることで問題を解決しています。
しかし、この方法はすべての指標をリストアップする必要があるため、普遍的ではありません。テスター環境を正しく動作させるために、もっと普遍的な別の方法はないのでしょうか?
OnTick() では、Expert Advisor に最低限必要な履歴があるかどうかを確認し、まだ利用できない場合は次のティックを待ちます。
そして、EAが必要とするデータがすべて得られるまで、次のティックを待ちます。
必要なデータがすべて吸い上げられ、取得されるとすぐに、Expert Advisorは新しいバーと必要な履歴で動作を開始します。
履歴の有無をどうやって確認するのか、理解できない...。
MQL4関数の前に以下の行を追加します。
で、MT5で動作します。
それは天才的なことです。ありがとうございました。
MT5がそのようなボタンを実装することができます教えてください、多分すでに持っている、コードを共有する...
スリップとリクオートを用意する。
CSymbolInfoクラスの AskとBidの価格がほぼ明確な場合、例えばSessionInterestやSessionBuyOrdersVolume、SessionPriceLimitMinを取得する方法は、ゼロを出力してしまいますが、なぜか理解できません。
CSymbolInfoクラスの AskとBidの価格は大体わかるのですが、SessionInterestやSessionBuyOrdersVolume、SessionPriceLimitMinなどはゼロを出力してしまい、なぜなのかわかりません。
取引サーバーからブロードキャストされると、その情報を受信することができます。
この情報は、原則としてブローカーが株式シンボルについて放送しています(ブローカーとディーリングセンターを混同しないでください)。
取引サーバーからブロードキャストされると、その情報を受信することができます。
この情報は通常、ブローカーが取引所シンボルについて放送しています(ブローカーとディーリングセンターを混同しないでください)。
ブローカーOtkritie、RTS指数先物は、私は、少なくともSessionPriceLimitMinとSessionPriceLimitMax(彼らは私が理解する限り、市場注文で使用される開始価格 であるため)を放送しなければならないと仮定しています。オープニングは訳さないのか...。などと処方しています。
Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - あなたのEAから
ログにはAskの価格しか表示されない
TFの最後のバーの日付を正確に決定し、現在のTFに正確にシフトするコードの一部を記述するのに役立ちます。
このコードは一般的に動作しますが、私の現在のチャートがM1であるように、現在のバーの開始時刻が実際の(分に丸められた)バーと一致する場合にのみ動作します。そして、それが重ならなければ、TFによって異なる誤動作が発生するのです。例えば、直近1時間のM1バーの開始時刻を知りたい場合、12時であれば問題はなく、時刻は12時59分になりますが、13時であれば、1時間足のバーが14時ではなく、14時5分に開いており、iBarShift 関数が14時に一番近いバー、すなわち13時59分を返したため、13時58分となります。
追記:これを作ると、うまくいくようです
Broker Opening, RTS Index Futures, 少なくともSessionPriceLimitMinとSessionPriceLimitMax(始値による 成行注文で使用されると理解しているので)をブロードキャストすべきと考えます。オープニングは訳さないのか...。などと処方しています。
Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - あなたのEAから
ログにはAskの価格しか表示されない