記事"「新規バー」イベントハンドラ"についてのディスカッション - ページ 2

削除済み  

Prival:

まれにですが、1つの商品の相場が長時間フリーズする状況があります(私は円でそのような状況を見ました)。このペアでExpert Advisorがハングした場合、すべてのコードをOnTime()に翻訳していないと大変なことになります。

OOPに取り組んでいたり、特定のアルゴリズムを使っていたりすれば、コードを翻訳する必要はないだろう。しかし、オーバービューですべてのペアのリアルタイムのティックを取得する方が便利だということには同意します(自分で何かを考案するのではなく)。

Lizar

そのようなイベントはTimeCuurent()を使って受け取ることができますが、それをさらにどうするか、どう同期させるかが問題です。

TimeCuurent()はそれとどんな関係があるのですか?
 
Interesting:
TimeCuurent()はこれと何の関係があるのですか?

ヘルプによると

OnTick() ハンドラでは、この関数は処理されたティックの時刻を返します。その他の場合(例えば、OnInit()、OnDeinit()、OnTimer()ハンドラなどでの 呼び出し)、これは、"Market Watch "ウィンドウで利用可能な任意のシンボルの 最後の気配値の到着 時刻であり、このウィンドウのタイトルに表示されているのと同じ時刻です。

削除済み  
Lizar:

あらすじはこうだ:

OnTick() ハンドラでは、この関数は処理中のティックの到着時刻を返します。その他の場合(例えば、OnInit()、OnDeinit()、OnTimer()などのハンドラで 呼び出された場合)、この関数は、「Market Watch」ウィンドウで利用可能なあらゆるシンボルの 最後のクォートの到着 時刻であり、このウィンドウのヘッダーに表示されているのと同じ時刻です。

OnTime()内に置くと、1分に1回しか時間を更新できず、現在のOnTick()内に置くと、いくつかのペアのティックを見逃す危険性があります(マルチの場合)。

新しい値を取得し、既存の値と比較し、新しいティックがあったかどうかの結論を出します。

しかし、なぜExpert Advisorでそれを行うのでしょうか?

 
Lizar:

あらすじはこうだ:

以下はヘルプの内容です。https://www.mql5.com/ja/docs/basis/function/events

NewTickイベントは、Expert Advisorがアタッチされているチャートのシンボルで新しいティックが受信されたときにExpert Advisorに対してのみ生成されます。

もう一度言います。私たちが話しているのは、あるシンボルにぶら下がっているExpert Advisorについてです。イベント

void OnTick(){} この関数の中にいるとき、このイベントが発生します。

この関数の中にいて、1時間以上このペアのティックがない場合、1時間以内は何もできません。今のところ、唯一の方法はタイマーの中でそれを行うことです、それは楽器のティックの到着に関係なく開始します。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Interesting:

しかし、これをOnTimeに置くと、時刻の更新は1分に1回までとなり、現在のOnTick()に置くと、いくつかのペアのティックを見逃す危険性がある(multsで)。

そこがポイントで、イベントは取得できるが、それを使うことはできない。
 
Prival:

https://www.mql5.com/ja/docs/basis/function/events。

もう一度言います。あるシンボルにハングアップするExpert Advisorについて話しています。イベント

イベントによって起動されます。

この関数の中にいて、1時間以上このペアのティックがない場合、1時間以内は何もできません。今のところ、唯一の解決策は、タイマーの中でそれを行うことです、それは楽器のティックの到着に関係なく開始されます。

はい、このhttps://www.mql5.com/ja/docs/basis/function/events の枠内で行動するならば、今のところ、OnTimeが最良の選択肢であることに同意します。しかし、それはティックの到着に依存することから私たちを救うだけです。また、シングルスレッド化からも解放されません。1つの計器のシグナルを処理している間に、他の計器の処理を見逃したり、遅らせたりするリスクがあります。これは、「取引注文の処理時間が2秒から7秒」+「リクオート」の場合に特に当てはまります。

TimeCuurent()のことを思い出したのは、マーケットレビューでInterestingが すべてのペアのリアルタイムティックについて話し始めたからです。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
削除済み  
良い記事をありがとう。
 
サンクス
 

とても興味深い記事だ。すべてを共有してくれてありがとう。

しかし、いくつか気になることがある:

この 機能について、あなたはこう言っている:

If you call this prototype function from one place, then we have what we need. But if we want to use this function, for example, again in another place in the same calculation loop, it will always return false, which means that there is no bar. And this will not always be true. Static variable in this case imposes an artificial limit on the number of prototype function calls.

  • その通りです。しかし、isnewbar()のような関数を1ティックの間に何度も呼び出すのは悪いやり方です。一度だけ呼び出して、結果を変数に保存してください。
  • 問題なのは、静的変数のないクラスを使うという、あなたが提示した解決策では、あなたが強調したことが解決されないということです。さらに状況は最悪だ。クラスのインスタンスをグローバル変数(オブジェクト)として宣言し、OnInit()で初期化しなければならない。 あなたのクラスを使う人は 、その操作を知って いなければなりません
  1. 常に グローバル 変数を使う
  2. シンボルや ピリオドが デフォルトであっても、必ず初期化する(タイム・チャートの場合)。
  • 最後に、「この関数を、例えば同じ計算ループの別の場所でもう一度使いたい場合」。それでも常にFALSEを返します。

静的なローカル変数をグローバル変数に置き換えただけで、問題は解決していません。


とはいえ、あなたの 記事は 思考を押し進め、 興味深いアイデアを 提供 するメリットがある

削除済み  

良い記事をありがとう!とても役に立ちました!

とにかく、あなたのisNewBar関数を使用したところ、コンパイル時に以下のメッセージが表示されました:「型変換によりデータが失われる可能性が あります。

そこで、この方法でvarの型をdatetimeからlongに変更しました:

//+------------------------------------------------------------------+
//| シンボルと期間のペアに新しいバーが出現した場合、trueを返す。
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- 最後の小節のオープニング時刻を静的変数に記憶する。
   static long last_time=0;
//--- 現在時刻
   long lastbar_time=SeriesInfoInteger(CurrencyPair,Period01,SERIES_LASTBAR_DATE);

//--- 関数の最初の呼び出しである場合
   if(last_time==0)
     {
      //--- 時刻を設定して終了
      last_time=lastbar_time;
      return(false);
     }

//--- 時間が異なる場合
   if(last_time!=lastbar_time)
     {
      //--- 時間を記憶し、trueを返す
      last_time=lastbar_time;
      return(true);
     }
//--- この行を通過した場合、バーは新しいものではない; return false
   return(false);
  }

これで、何の通知もなくコンパイルでき、問題なく動作しているようです。ありがとうございました!


Documentation on MQL5: Language Basics / Data Types / Typecasting
  • www.mql5.com
Language Basics / Data Types / Typecasting - Documentation on MQL5