FXのチャートをフーリエ変換するMQL4ソースコード
承知いたしました。「10個の連続した曲線の成分で表す」という表現に沿って、逆フーリエ変換を行い、主要な成分に対応する波形を個別に表示する機能を追加したMQL4のソースコードを以下に提示します。
変更点と説明:
* ExtractTopComponents 関数の修正:
* フーリエ変換の結果の絶対値(magnitude)を計算し、それに基づいて主要な成分を抽出するようにしました。
* Component 構造体と CArrayObj を使用して、成分を大きさでソートしています。
* 抽出した主要な成分の元のインデックス (topIndices) も保存するようにしました。これは、逆フーリエ変換で正しい周波数成分を再構成するために必要です。
* ナイキスト周波数までの成分(n / 2 + 1)のみを考慮するようにしました。
* ReconstructComponent 関数:
* 特定の周波数成分のインデックス、フーリエ係数(実部と虚部)、および時間インデックス t を受け取り、その成分に対応するサイン波(またはコサイン波、あるいはそれらの組み合わせ)の値を計算します。
* DC成分(インデックス 0)の扱いは特別です。
* 他の成分は、逆フーリエ変換の式に基づいて計算されます。係数に 2.0 / n を掛けています。
* インジケータバッファの追加:
* OnInit 関数で、元の価格を表示するためのバッファ(インデックス 0)と、上位 TopComponents 個の成分に対応する波形を表示するためのバッファ(インデックス 1 から TopComponents)を作成しています。
* SetIndexStyle でそれぞれのバッファの描画スタイルを設定し、SetIndexLabel でラベルを設定しています。
* OnCalculate 関数の修正:
* 最新の SamplePeriod 本の終値を取得し、時間順に並び替えます。
* フーリエ変換と主要成分の抽出を行います。
* 各バー (i) において、元の価格を ExtHandle[0][i] に格納します。
* 上位 TopComponents 個の主要成分それぞれについて、ReconstructComponent 関数を呼び出し、その時点の波形の値を ExtHandle[j + 1][i] に格納します。
* t % n を使用して、再構成する波形の時間インデックスをフーリエ変換のサンプル期間内に収めています。
* 入力パラメータ:
* SamplePeriod:フーリエ変換を行うローソク足の期間を設定できます。
* TopComponents:表示する主要な成分の数を設定できます。
使用方法:
* このコードをMetaEditorにコピーしてコンパイルします。
* コンパイル後、ナビゲータウィンドウから任意のチャートにこのインジケータをアタッチします。
* インジケータの設定ウィンドウで、SamplePeriod と TopComponents の値を調整できます。
表示:
インジケータをチャートに適用すると、メインチャートの下の独立したウィンドウに、以下のラインが表示されます。
* Price (黒線): 元の終値の推移。
* Component 1, Component 2, ..., Component N (色分けされた線): それぞれ上位の主要な周波数成分に対応する波形。
これにより、「10個の連続した曲線の成分で表す」という要求に沿って、主要な周波数成分がそれぞれどのような波形を描いているのかを視覚的に確認することができます。
注意点:
* フーリエ変換の性質上、特にサンプル期間の終端付近では、不連続な動きが見られることがあります。
* 表示される各成分の振幅は、元の価格のスケールとは異なる場合があります。
* 上位の成分は、必ずしも直感的で分かりやすい波形を示すとは限りません。複雑な価格変動は、複数の周波数成分の組み合わせによって表現されるためです。
この改善されたコードが、あなたの分析の一助となれば幸いです。
コメント
コメントを投稿