記事"MQL5クックブック - スライディングウィンドウ内指標の高速計算のためのリングバッファの作成"についてのディスカッション - ページ 3

 
Vasiliy Sokolov:

最後の指標値だけを計算し、新しいティックが来たときに完全に再計算することは、あなたがそれを議論し始めたことが奇妙なほど標準的な話です。それをあなたが見つけたトリックのように言うのは二重におかしい。実際には、これはすべてのインジケーターを書くための標準です。ドキュメントにも記載されている。だから、誰もが最後のバーやティックで再計算するのです。


もう少し詳しくお答えします:

かなり重いインジケーターがあります。このインジケータは、Expert Advisorでごくまれに、つまりすべての条件がトリガーされるまで要求されます。たとえば、300~1000バーごとに要求されます(実際には、条件演算子で表現されるいくつかの条件によって異なります)。そして、各バーで1回でも値を取得すれば、それは条件演算子の本体で 隠しインジケータを呼び出す 回数よりも多くなります。

if(условие1)
{
if(условие2)
{
if(условие3)
{
if(условие4)
{
 и тут вызываю индикатор(mql4), такая ситуация встречается совсем редко
}
}
}
}

だいたいこんな感じです。

原理的には、この方法による指値は常にPと等しくなるはずです。
 
forexman77:


もう少し詳しくお答えしましょう:

かなり重いインジケーターです。Expert Advisorでは、すべての条件がトリガーされるまで、それはかなり稀に要求されます。例えば、300~1000バーごとに要求されます(実際には、条件演算子で表現されるいくつかの条件によって異なります)。そして、各バーで1回でも値を取得すれば、それは条件演算子の本体で 隠れたインジケータを呼び出す 回数よりも多くなります。

ところで、この方法は必ずしも節約になるとは限りません。なぜなら、インジケータを呼び出すときに、取りこぼしたバーが計算されたままだからです。
 
Andrey Khatimlianskii:
ところで、この方法は必ずしも節約になるとは限らない。なぜなら、インジケータが呼び出されたときに、見逃したバーが計算されるからです。


インジケータが頻繁に呼び出されるのであれば、全履歴をカウントした方がよいでしょう。

もちろん、新しいバーだけを計算すればよい。

今、私は、比較することなく、厳密にPから開始する必要があると思った

if (limit > P)limit=P;//эту строку вообще убрать и сделать сразу  limit=P;

サイクルの中で、計算がPから始まり、それが例えば10に等しければ、計算は10バーから始まることになる。

P=Period_+10;
  
limit=P;
for(int i=limit;i>=0;i--)

しかし、それはそれほど重要なことではないので、そのままにしておけばよい。それは意味がない。

「インジケータが呼び出された ときに、見逃したバーが計算されます。

正直に言うと、現在、私はこのようなインジケータを1つのバーのゼロまたは最初のバーのみに持っています。

例えば、これはそのうちの1つのコードの主要部分です:

int start()
  {
    double summaP,d,Q;

   summaP=0.0;
   for (int k=0;k<Period_;k++)
   {
   d=MathAbs(Close[k]-Close[k+1]);
   summaP=summaP+d;
   }
   if(summaP==0.0) summaP=0.000000001;
   Q=Close[0]-Close[Period_];  
   ExtMapBuffer1[0]=Q/summaP;

   return(0);
  }

つまり、これらはテスター用のインジケーターです。もちろん、可視化には使用しません。)

しかし、インジケータが複数のバッファから構成されている場合、リングバッファが必要になります。

 
forexman77:

「インジケータが 呼び出されたときに、見逃したバーが計算されます。

チャート上に1000本のバーがあるときにインジケータが呼び出され、カウントされたとします。
しかし、次の呼び出しがすでにバーが1500本あるときであれば、新しい (499本)バーをすべてカウントします。


forexman77:

正直に言うと、今、私はそのような指標は、1つのバーゼロまたは最初のバーでのみ意味を持っています。

その後、全く指標のポイントは何ですか?エキスパート-アドバイザーの関数の形でこれらの計算を転送し、それがさらに高速になります。

 
forexman77:


もう少し詳しくお答えします:

インジケータは、呼び出す呼び出さないにかかわらず、すべてのバーで計算されます。仕様書をお読みください。

本当の加速を求めるのであれば、計算を EA 内部に移動してください。それ以外に方法はありません。それしかありません。もし うまく挿入できたらという 投稿は、読んでいて滑稽なだけです。

あなたの話題はこのスレッドのテーマから外れている。ここで終わりにしましょう。

 

親愛なるVasiliy

まず最初に、この素晴らしい記事と様々なインジケータを使った実装に感謝します。

リングバッファで高値/安値を計算するセクションのコードサンプルを掲載することは可能でしょうか?マーケットが動いているときに正しい結果を得るのが難しいと感じています。OnChangeValue()関数で 変化する価格を更新する際に、ポインタを失ってしまうようです。

よろしくお願いします。

 
Savio Araujo:

親愛なるVasiliy

まず最初に、この素晴らしい記事と様々なインジケータを使った実装に感謝します。

リングバッファで高値/安値を計算するセクションのコードサンプルを掲載することは可能でしょうか?マーケットが動いているときに正しい結果を得るのが難しいと感じています。OnChangeValue()関数で 変化する価格を更新する際に、ポインタを失ってしまうようです。

よろしくお願いします。


https:// www.mql5.com/en/articles/3047#c6

 

私はそれを見ました。あなたが提供した例をチェックしました。それらは、市場が動いている間に値を更新することに対処する際に私が抱いたのと同じ問題を示しています。提供されたストキャスティクスを確認してください。新しい値を追加することは問題ありませんが、CRiMaxMinクラスでStoch.ChangeLast()やOnChangeValue()を使おうとすると、うまくいきません。それに応じて値が変更されないのです。もしあなたがそれをチェックするか、動作するコードの例を送っていただけると助かります。

ありがとうございました。

 

素晴らしい記事だ!

ドイツ語の翻訳さえひどくなければ......!

英語版はどこにありますか?

どこかで切り替えることはできますか?

 
リンク先のhttps://www.mql5.com/de/articles/3047 ../en/... を ../en/... に置き換えてください。
Die Rezepte MQL5 - Die Erstellung des Ringpuffers für eine schnelle Berechnung der Indikatoren im gleitenden Fenster
Die Rezepte MQL5 - Die Erstellung des Ringpuffers für eine schnelle Berechnung der Indikatoren im gleitenden Fenster
  • 2017.05.29
  • Vasiliy Sokolov
  • www.mql5.com
Der Ringpuffer — ist die einfachste und zugleich die wirksamste Organisationsart der Daten für die Berechnungen im gleitenden Fenster. Im Artikel ist beschrieben, wie dieser Algorithmus gestaltet ist, und es ist gezeigt, wie mit seiner Hilfe eine Berechnung im gleitenden Fenster ein einfacher und wirksamer Prozess sein wird.