いった面倒なところの判定を勝手にやってくれるようにできるのがEAのいいところです。今回は、はっきりとした論文等が見つからなかったため、調べた結果の私なりの解釈で実装したVLDMIです。Lengthというのは、相場が凪いでいる時は鈍感に、動きだしたら敏感にするという考え方です。この考え方はいろんなオシレータの改良に使えると考えています。今回はVLDMIを実装してみてRSIと比較してみました。水色の線がVLDMI(14)、青色の線がRSI(14)になります。RSIに比べてVLDMIが動き出したときには敏感に反応していることが分かります。※()の中は期間を表しています。VLDMIは期間を大体50%~200%の範囲で変動させます。期間を7~24を標準偏差の変化率から動的に変更しているRSIという事になります。VLDMIの見方ですがRSIと同様に70超えで買われすぎ30以下で売られすぎです。チャートを眺めた感じ、このオシレータ5分足には結構使えるかな?といったところです。短期トレード向けか、押し目狙いのオシレータとなります。あと、ダイバージェンス現象がRSIと比べかなりはっきり出ます。STYLE_DOT//バッファーを指定する。2//プロット数を指定する。標準偏差のStdAvgPeriod間の平均を求める。RSI対象期間を求める。1);}やっていることは割と単純で、標準関数で用意されているiStdDevを使用して標準偏差を求めて、iMAOnArrayの単純平均を利用して平均値を出しています。その後、現在の標準偏差/平均値を元に対象期間を変化させています。最後に用意されているiRSIを使用してRSI値を求めてます。シフト量);標準で用意されているiStdDevですが、なぜか移動平均のパラメータを要求されます。移動平均に対する標準偏差をとる関数のようです。自分で標本標準偏差を計算してVLDMIを表示させてみたのですが、あまりグラフに変化が無かったため、iStdDevを使っています。厳密に標準偏差を取りたい場合や、High/Log/Closeの値も含めてばらつきを見たい場合などは自力で計算する必要があります。シフト量);余談ですが、対象期間を求めるような式のように割り算が続く場合は、なるべく掛け算になるように式を置き換えています。ダントツ割り算が遅くなります。繰り返し演算する場合はなるべく割り算を減らした方がパフォーマンスが良いです。今のPCは性能が高いので誤差の範囲!って言われてしまうとその通りなのですが・・癖です(笑)あと、このオシレータ、標準偏差の計算に時間がかかるためか、MT4のチャート要素数が多くなると、時間足の切り替え動作などが結構重くなります。標準偏差の計算時にルート演算が挟まっている為と思いますが、チャートのバー数などを極端に大きくしている場合などはご注意ください。ゴールデンウィークですね。手持ちのネタが尽きつつあるので、ゴールデンウィーク中に何か探したいと思います。MT4でS/Rオシレータのシグナルを青赤帯でチャートに表示する。その2前回に続いてS/Rオシレータに青赤帯を出したいと思います。組み込んだコードがこちらです。修正箇所は赤字にしてあります。100//バッファーを指定する。2//プロット数を指定する。(INIT_PARAMETERS_INCORRECT);//インジケータバッファを初期化する。1);//サポート/レジスタンス保持用の配列クリアsupports.Clear();supports.Resize(Period);resistances.Clear();resistances.Resize(Period);//インジケータ短縮名を設定する。reason){//オブジェクトを作成する。ObjectsTotal(chartId);//生成したオブジェクトを削除する。//0から削除するとインデックス位置がずれて//正しく削除できないため、後ろから削除するようにする。先頭文字列がWSRO_OBJECT_NAMEと一致する場合、削除する。0;//元となる値を計算する。新しいサポートが構築された場合、Period数保持する。新しいレジスタンスが構築された場合、Period数保持する。シグナルをチャート上に表示する。1);}//------------------------------------------------------------------//売買シグナルを矩形で描画する。//背景色){//オブジェクトを作成する。TimeToStr(time);//チャート縦幅いっぱいに表示する。true;}//------------------------------------------------------------------//オブジェクトを削除する。//表示時間(横軸)){//オブジェクトを作成する。true;}赤字になっている部分が、前回との差分です。組み込んだ関数を、シグナルが出ている時に作成するというコードを作成しています。OnDeinitで作成したオブジェクトを消しています。これをしないと、例えばチャートの時間足を変更した場合などに作った図形がそのまま表示されてしまいます。後始末は忘れず行いましょう。ソースのコメントにも書いてありますが、ObjectsTotal()関数で、チャート上のオブジェクト数を取得して、インデックスの最大値から減らしていく形で消していっています。0から消していってしまうと、MT4が内部で持っているオブジェクトの配列と位置があわなくなり正しく消せなくなるので注意しましょう。シグナルをだしたS/Rオシレータを見てみたいと思います。EURUSDの1時間足です。それっぽく赤い帯が出ていますね。入力パラメータのSellColorで指定してある色で描画しています。矩形を表示すると少し透過効果がでるようです。なんとなくいい感じですが、結構広い幅でシグナルが出てしまっています。敏感に反応してほしいので、HLPeriodの値を9から5に変えてみました。(過去5本のうち2本目が最高値・安値だった場合サポートレジスタンスラインとするという設定になります)まぁありかも?っていうふうな感じでしょうか?このようにチャートの上に帯が出ているとわかりやすくなるのはないかと感じました。ちなみに、時間を変えてもう一枚。