オシレーターの有効性について頭を悩ませる日々がありましたが、その値を正規化する必要がよくありました。つまり、指標の振動を範囲[-1;1]に合わせることです。これにより、具体的なレベル(0.5や0.8など)で指標の値を制御する新しい可能性が開かれます。市場に応じておおよその値を推定するのではなく、明確な基準で判断できるのです。もちろん、すでに正規化された指標であればこの製品を考慮する必要はありませんが、そうでない場合はぜひお試しください。生のコードについては厳しく評価しないでくださいね。
パラメーター:
string Indicator - icustom()関数に渡す指標そのものです。残念ながら、MQL4の自動化ツールではここに標準指標を追加するには不十分です。とはいえ、好奇心旺盛なコーダーがプログラム内でエントリを変更するのを誰が止められるでしょうか?
int mode - 初期指標の必要な行番号...
int param1
int param2 - そのパラメーターです。また残念ながら、MQL開発者の想像力は、可変数のパラメーターを持つ関数を書くこと(Printのように)や、アドレス算術をサポートすることにしか及びません。これにより、一般ユーザーが神々と比較して劣等感を感じるように思えます。さあ、手作業で進めましょう。
画像:

コメント:
計算は二段階で行われます:
1. 初期化段階(init()関数、知らない方もいるかもしれませんが)で、指標データの全配列が分析され、特定の周期の計算が行われます。つまり、指標の平均二乗値が全履歴に対するその平均二乗値(MSV)を提供できる周期です。
例を挙げて説明しましょう。オシレーターがあり、いくつかの連続した振動周期の平均二乗を計算しました。例えば、3周期(私の場合は#define PERIODS_CHARACTERISTIC 3を使用しています。これ以上は使わないことをお勧めします、さもないとプロセッサがオーバーロードされます)を前提としましょう。計算の本質は、平均的な一周期の長さ(つまり、指標のゼロ間の平均間隔の2倍)を決定し、その得られた値を3倍することです。
2. 次に、得られた3周期に基づいて、各バーのMSVを計算し、その値で指標を正規化し、最後にそれを動的範囲[-1;1]に合わせるために、圧縮関数f(x)=tanh(x)(双曲線タンジェント)を通します。この関数は自分で書く必要がありました。 :)
これは純粋に技術的な例です。画像の緑の線は、私の非常に古いオシレーターで、市場の活動を示しています(実際にはMACDと同じですが、ボリュームに基づいています)。青い線は、すでに-=ノーマライザー=-を通過したオシレーターです。+-0.75、+-0.5、+-0.25のレベルがはっきりと見え、すべての最大値と最小値、増加と減少の領域、ゼロレベルをクロスするポイントがその位置を保っているのがわかります。
ですので、これが私の提案です。誰かが気に入らなくても、私のせいではありません。