インディケータ: より良い音量 - ページ 2

oomeysh #:
このインジケーターをMT5に適用しましたが、何も表示されません。
インジケータの入力設定で、「使用するボリュームの種類」を「リアルボリューム」から「ティックボリューム」に変更します。

これを『クロード・ソネット 5.5』に入力したところ、次のような結果が出ました:

良い点

  • バッファのレイアウトは正しい:2つのプロット(ヒストグラムデータ+カラーインデックス、さらにMAライン)に対して3つのバッファが用意されている。
  • カラーリストは、従来の「Better Volume」パレットと一致しています。インデックス0~5はコメントと一致しています。
  • IntTimesRange == IntMaxTimesRange のような等価性チェックは、ここでは安全です。ウィンドウの最大値は同一の式で計算されるため、現在のバーが最大値である場合、double型の値は完全に一致します。
  • prev_calculated - 1 からの再計算により、形成中のバーが正しく更新されます。

バグ(最も深刻なものから順に)

1. 履歴が短い場合の範囲外エラーによるクラッシュ(63~69行目)。
の制限は、最初の呼び出し時のみクリップされます。例えば、週足や月足チャートに50本のバーがあり、minbarsが100の場合を考えます。 最初の呼び出しではループをスキップして `rates_total` を返します。次のティックでは、`prev_calculated` が 50 となるため、`limit` は 49 になります。その後、MA ループが `n = -1` と読み取り、「配列の範囲外」というエラーでインジケーターが停止してしまいます。修正方法:

mql5

if(rates_total <= minbars) return(0); limit = (prev_calculated == 0) ? minbars : MathMax(prev_calculated - 1, minbars);

2. クライマックス・チャーン(マゼンタ)が、弱気バーで失われる(116~121行目)。
「クライマックス・セル」ブロックが「クライマックス・チャーン」の後に実行され、上書きしてしまう。 したがって、出来高・レンジの両方でクライマックスであり、かつチャーンバーでもあるバーは、終値が中間点より上にある場合にのみマゼンタ色で表示されます。終値が中間点より下の場合は、無地の白で表示されます。意図された優先順位は、クライマックス・チャーンが他のすべてに優先することです。

3. 「追加のチャーンチェック」は決して発動しない(123~125行目)。
IntCandleRange > IntMiddlePrice * 2 は high - low > high + low に展開されますが、これは low < 0 の場合にのみ真となります。通常の金融商品では、この条件はデッドコードとなります。おそらく平均レンジなどとの比較を意図していたと思われるため、単に修正するのではなく、再定義する必要があります。

4. ハードコーディングされた 20 は InpLookBack を無視しています(105行目)。
他の部分はすべて InpLookBack を使用していますが、低出来高のテストでは i - 19, 20 が使用されています。20 以外の値を使用すると、クラスの一貫性が損なわれます。InpLookBack が 20 以上に設定されている場合でも、低出来高の検出では依然として 20 バーのみが対象となります。

5. 出来高ゼロのデータが誤ったシグナルを引き起こし、デフォルト設定は落とし穴となります。

  • デフォルトはVOLUME_REALであり、これはほとんどのFXおよびCFD銘柄で0となります。
  • 出来高がすべてゼロの場合、IntTimesRange (0) == IntMaxTimesRange (0) および IntDividedRange (0) == IntMaxDividedRange (0) の両方が真となります。チャートはクライマックスおよびクライマックス・チャーンの色で埋め尽くされます。
  • フラグを > 0 で保護し、デフォルトを VOLUME_TICK に設定してください。

6. OnInit での入力検証がない。
InpMAPeriod <= 0 の場合、ゼロ除算が発生する。InpLookBack <= 0 の場合、ウィンドウロジックが破綻する。これらの場合は INIT_PARAMETERS_INCORRECT を返す。

細かい点

  • NormalizeDouble(..., 0) は移動平均(MA)を整数に丸めるため、出来高の少ない銘柄では線が歪んでしまいます。これは不要です。
  • minbarsより前のバーは決して書き込まれず、PLOT_DRAW_BEGINも設定されていません。初期のバーにゴミデータが表示されないよう、これを設定し、バッファを初期化してください。
  • 移動平均(MA)は MAPeriod ではなく、MAPeriod - 1 から開始できます。バーごとに 100 バー分を再集計する代わりに、累積和を使用すれば処理も高速化されます。
  • 繰り返し登場する InpVolumeType == VOLUME_TICK ? ... : ... という三項演算子は、1つの小さなヘルパー関数にまとめるとよりすっきりします。


    クロード氏による修正および英語翻訳版を添付しました。(ファイルを見るには「go to discussion」をクリックしてください)
ファイル: