スペクトルのピークを表すインジケータ

動機

画像処理と同じように周期帯によるフィルタを売買シグナルに適用できるかどうか。
それと、もし相場の大まかな周期というものがあるのなら、
移り変わる波長の強弱に合わせて、インジケーターのパラメータ側をを適宜最適化する、というやり方もあるんじゃないかと思った。

作成過程

インジケータを作るのは初めてで、ものすごく苦戦した。

フーリエ変換をする

虚数は必要ないので計算しない。

畳み込み積分をする

一般的には端っこの要素は切り捨てるらしいけど、要素数が変わると困るので無理やり処理した。

表示する

ここまでは難なくできたけど、OnCalcurateメソッドで何をどうすればいいのかわからなくて盛大にハマった。

このメソッドで全ての計算を行う。
インジケーターを表示させた時と、OnTickと、新しい足ができた時の全てでこのメソッドが呼び出される。
その区別をするために、

  • 引数 rates_total : 表示されているバーの数

  • 引数 prev_calculated : 前回OnCalculateが呼ばれたときに扱ったバーの数(表示された初回のみ0で、その後は前回のrates_total)

  • 関数 IndicatorCounted() : 確定していない最新のバーを除いた数

を組み合わせる。

これでちゃんと動いてくれるはずなんだけど動いてくれなかった。
というより、MT4が落ちた。
原因はフーリエ変換の処理が重すぎることだった。
過去10数年の4時間足で、それぞれ直近200本のバーを計算させようとしていたので、とてつもない計算量だった。

バーの数を減らし、直近100本の計算でも10秒ほどかかる。

スペクトルのピークを強度の強い順につないだ。
ピンク>オレンジ>黄色>黄緑>緑>グレー
2016081401

上下ほぼ対象の値をとるので0からπまでの値のみを使用。
2016081402

それでも見にくいので平滑移動平均を採用。
2016081403

縦軸をラジアンではなく波長(一周期のバーの数)にした。
それと、やっぱり直近100本じゃ数が足らないので200本に戻す。
2016081404

成果

SpectrumPeaks

縦軸をラジアンとした場合

グラフの上ほど高周波成分、下ほど低周波成分のピークを示す。
レンジ相場ほど高周波成分が強く出ると思ったけどはっきりとわからない。

縦軸を波長とした場合

波長が長いほど大きな値をとる。
値が40とすると40本で半周期一周期の波を示す。
直近の計算期間が長ければ長いほど、長い波長をシグナルとして拾える。

フィルタとして使えそうな雰囲気があるのでこれで良しとする。
問題は処理速度。
相場の波長に合わせて、となると、その分計算量も増える。

備考

ちなみに、ピークしか見ていないのでこの表示方法じゃ強度分布がわからない。
サーモグラフィみたいな感じで三次元方向に強度分布を表現したかったんだけどなー。

追記:
フーリエ変換後のデータの扱いに間違いがあったのでこっちに

About houzkin

Leave a comment


*