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

 
Otto Pauser:

素晴らしい記事だ!

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

こんにちは、

情報をありがとう。翻訳は修正しました。

よろしくお願いします。

 

こんにちは、Vasiliy Sokolov です!

リングバッファの助けを借りて作成されたあなたのインジケータは、ChangeValueメソッドが機能していないのか、それとも私が何か誤解しているのでしょうか?

 
Savio Araujo:

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

ありがとうございます。

作者に感謝します。おそらく、サビオさんがご覧になっているバグはここにあると思います:

int RingBuffer::iToRealInd(int iIndex)

{

   if(iIndex >= iNumElements() || iIndex < 0)

      return iBufferSize-1; //previous bug was caused by no -1 here

...

最後の引用行に-1を追加しました。以前はなかったので、不適切なインデックスが返される原因となっていました。変数名やメソッド名は私のプログラミング・スタイルに合わせて変更しましたが、考え方は同じです。

 
なぜCRiStochにはChangeValueというメソッドがないのですか?
 
brisully:

作者に感謝します。おそらく、サビオさんがご覧になっているバグはここにあるのでしょう:

int RingBuffer::iToRealInd(int iIndex)

{

   if(iIndex >= iNumElements() || iIndex < 0)

      return iBufferSize-1; //previous bug was caused by no -1 here

...

最後の引用行に-1を追加しました。以前はなかったので、不適切なインデックスが返される原因となっていました。変数名やメソッド名は私のプログラミングスタイルに合わせて変更しましたが、考え方は同じです。

あなたの修正を試してみましたが、まだ正しく更新されません。何かが欠けているようで、新しいバーの形成時にリングバッファを 実行しようとしても問題が見つかりません。マーケットが動いているとき、High/Lowのラインが完全に混ざってしまいます。このコードは、古いデータを処理している間はとてもうまく、とても速く動作しますが、新しいバーの形成中に新しいデータが到着すると、私の場合、単純に動作しません。

 
申し訳ない。ミンとマックスが正しい。私自身が考えすぎていた。
 
これはまさに私が必要としていたものだ。コードと詳細な記事に感謝します。極値検索を 最適化するというアイデアは素晴らしい!
 

ToRealInd(int index) に間違いがあります。

次のようにすべきです:
if(index >= GetTotal() || index < 0)
return m_max_total-1