初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 986

 
Artyom Trishkin:

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から呼び出されるインジケータの非性能にあるのです。

私は分単位で仕事をしているので、履歴は常に最新であるべきです。

そして、これらのチェックはすべてテストのために行われるもので、実際の口座では作業が遅くなるだけです。なぜなら、そこではすべてがテスターの静止状態よりも遅く動作するからです。

 

今のところ、メインコードの開始前に、失敗したインジケータの準備状態をチェックすることで問題を解決しています。

//При появлении нового бара проверяем корректность расчета индикаторов
      if(isNewBar_Predv_Calc_Ind()==true)Predv_Calc_Ind=true;
      if(Predv_Calc_Ind==true)
      {
      double arr_DonUp=ZZ_Vibor(0,2,0);
      double arr_DonDown=ZZ_Vibor(0,3,0);
      double arr_DonUp_m2=ZZ_Vibor(1,2,0);
      double arr_DonDown_m2=ZZ_Vibor(1,3,0);
      double arr_DonUp_m5=ZZ_Vibor(2,2,0);
      double arr_DonDown_m5=ZZ_Vibor(2,3,0);
      double arr_DonUp_m15=ZZ_Vibor(3,2,0);
      double arr_DonDown_m15=ZZ_Vibor(3,3,0);
      if (arr_DonUp<1     || arr_DonDown<1    ||
          arr_DonUp_m2<1  || arr_DonDown_m2<1 ||
          arr_DonUp_m5<1  || arr_DonDown_m5<1 ||
          arr_DonUp_m15<1 || arr_DonDown_m15<1
         )return;
      else{Predv_Calc_Ind=false;}      
      }
//Операции выполняются только при появлении следующего бара   
   if(!isNewBar()) return;

しかし、この方法はすべての指標をリストアップする必要があるため、普遍的ではありません。テスター環境を正しく動作させるために、もっと普遍的な別の方法はないのでしょうか?

 
Artyom Trishkin:

OnTick() では、Expert Advisor に最低限必要な履歴があるかどうかを確認し、まだ利用できない場合は次のティックを待ちます。

そして、EAが必要とするデータがすべて得られるまで、次のティックを待ちます。

必要なデータがすべて吸い上げられ、取得されるとすぐに、Expert Advisorは新しいバーと必要な履歴で動作を開始します。

履歴の有無をどうやって確認するのか、理解できない...。

 
fxsaber:

MQL4関数の前に以下の行を追加します。

で、MT5で動作します。

それは天才的なことです。ありがとうございました。

 
こんにちは、MT5でこんなボタンを作ってみたいと思っている若隠居です。

MT5がそのようなボタンを実装することができます教えてください、多分すでに持っている、コードを共有する...


開始」ボタンと「すべての注文を閉じる」 ボタンです。MT5、全ペア、全タイムフレーム、4/5サイン。 初期ロット0.01(セント含む)。
スリップとリクオートを用意する。

スタート "ボタンに関する機能
手動でFiboを解除したら、現在の価格でBAYまたはSELLで1~11の注文を一度に出してください。
事前に設定で、展開されたフィボの方向にいくつ、どの注文(1、2、5、7、または11個すべて)を出すか選択している場合。
設定では、注文ごとに手動でロットサイズを指定したり、動的に増減させたりすることが可能でした。

TP - Take Profitは、61.8; 78.6; 100.0のフィボレベルで1〜11のオーダーから昇順に設定されます。
161.8; 185.4; 200.0; 261.8; 285.0; 423.6; 561,8; 685.4

SL - フィボのゼロラインから-2スプレッド(自動計算)の大きさのストップロス

TS - トレーリングストップは、すべての注文をその後ろに引き込みます。
1.トレーリングストップは、価格が61.8レベルに達した場合、すべての注文のSLを38.2 + 2スプレッドに移動させます。
2.トレーリングストップは、価格が100.0レベルに達した場合、残りのすべての注文のSLを50.0レベル+2スプレッドに移動させます。
3. 価格が161.8レベルに達した場合、残りのすべての注文を78.6+2スプレッドにトレーリングSL。
4. 価格が261.8レベルに達したとき、残りのすべての注文を100.0+2スプレッドレベルにSLをトレールする。
5.価格が423.6レベルに達したときに、残りのすべての注文を200.0+2スプレッドレベルまでSLをトレールする。
6. 価格が561.8に達した場合、残りのすべての注文のSLを423.6+2スプレッドレベルにトレイリング移動させる。

Close all orders "ボタンの機能は、すべての注文を強制的に閉じることです。
 

CSymbolInfoクラスの AskとBidの価格がほぼ明確な場合、例えばSessionInterestやSessionBuyOrdersVolume、SessionPriceLimitMinを取得する方法は、ゼロを出力してしまいますが、なぜか理解できません。

 
Александр Юрин:

CSymbolInfoクラスの AskとBidの価格は大体わかるのですが、SessionInterestやSessionBuyOrdersVolume、SessionPriceLimitMinなどはゼロを出力してしまい、なぜなのかわかりません。

取引サーバーからブロードキャストされると、その情報を受信することができます。

この情報は、原則としてブローカーが株式シンボルについて放送しています(ブローカーとディーリングセンターを混同しないでください)。

 
Vladimir Karputov:

取引サーバーからブロードキャストされると、その情報を受信することができます。

この情報は通常、ブローカーが取引所シンボルについて放送しています(ブローカーとディーリングセンターを混同しないでください)。

ブローカーOtkritie、RTS指数先物は、私は、少なくともSessionPriceLimitMinとSessionPriceLimitMax(彼らは私が理解する限り、市場注文で使用される開始価格 であるため)を放送しなければならないと仮定しています。オープニングは訳さないのか...。などと処方しています。

Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - あなたのEAから

ログにはAskの価格しか表示されない

ファイル:
y2a4cgbfjw.png  63 kb
 

TFの最後のバーの日付を正確に決定し、現在のTFに正確にシフトするコードの一部を記述するのに役立ちます。

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));

このコードは一般的に動作しますが、私の現在のチャートがM1であるように、現在のバーの開始時刻が実際の(分に丸められた)バーと一致する場合にのみ動作します。そして、それが重ならなければ、TFによって異なる誤動作が発生するのです。例えば、直近1時間のM1バーの開始時刻を知りたい場合、12時であれば問題はなく、時刻は12時59分になりますが、13時であれば、1時間足のバーが14時ではなく、14時5分に開いており、iBarShift 関数が14時に一番近いバー、すなわち13時59分を返したため、13時58分となります。

追記:これを作ると、うまくいくようです

datetime         StopDt=iTime(Symbol(),PERIOD_CURRENT,Bars(Symbol(),PERIOD_CURRENT,iTime(Symbol(),TF_iDeltaP,_Shift-1),iTime(Symbol(),PERIOD_CURRENT,0)));
 
Александр Юрин:

Broker Opening, RTS Index Futures, 少なくともSessionPriceLimitMinとSessionPriceLimitMax(始値による 成行注文で使用されると理解しているので)をブロードキャストすべきと考えます。オープニングは訳さないのか...。などと処方しています。

Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - あなたのEAから

ログにはAskの価格しか表示されない

サーバーは本物ですか、それともデモですか?
理由: