こんばんは、たかはしです。
今回はお気に入りのインジケーターを売買シグナルにする簡単な方法を紹介します。
ちょっとだけインジケーターを修正する必要がありますが、特に難しい話でもないので、これを機会に一度試してみて下さい。
なお、下記にコードを記載していますが、シグナルの条件とかはサンプルですので、そのまま使わないようにしてくださいねw
本気でMT4を触っていきたい方はシグナルの条件とか条件を複合してフィルターするとか色々ありますので、そこはアイデア次第って所です(´∀`*)
単一出力系
最近のお気に入りインジケーター「SVE_RSI_I-Fish」を例にします。
メインウィンドウに出ている矢印達は下記をコンパイルして実行した結果で、サブウィンドウが「SVE_RSI_I-Fish」です。
パット見ただけで分かるように「SVE_RSI_I-Fish」は単一ラインで構成されているインジケーターです。
//+------------------------------------------------------------------+ //| SIG_RsiAve.mq4 | //| Copyright 2016, FX取引に関するあれこれ | //| http://fxtrading.greeds.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, FX取引に関するあれこれ" #property link "http://fxtrading.greeds.net" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 RoyalBlue #property indicator_color2 Crimson double SignalBuy[]; double SignalSel[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { SetIndexStyle(0,DRAW_ARROW,EMPTY,2); SetIndexArrow(0,236); SetIndexBuffer(0,SignalBuy); SetIndexStyle(1,DRAW_ARROW,EMPTY,2); SetIndexArrow(1,238); SetIndexBuffer(1,SignalSel); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int i, limit; int counted_bars = IndicatorCounted(); if(counted_bars < 0) return(-1); if(counted_bars > 0) counted_bars--; limit = Bars - counted_bars; for(i = 0; i < limit; i++) { if(rsi>95) { SignalBuy[i]=iClose(NULL,0,i); } else if(rsi<5) { SignalSel[i]=iClose(NULL,0,i); } } return(rates_total); }
設定値をデフォルトで使う場合は上記の通りで大丈夫ですが、パラメータを変更する場合はちょっと難易度が上がります。
画像で見る限り複数個設定項目がありますので、それらを下記のように全て書く必要があります。
その後、変更したいパラメータに修正するだけで大丈夫です。
double rsi = iCustom(NULL,0,"SVE_RSI_I-Fish",10,4,1,12,88,false,"",500,0,i);
複数出力系
続いては複数出力系です。
サポレジ系のインジケータで例にします。
MT4のメニューバーにデータウィンドウってのがありますので、それをまず確認します。
チャート上にサポートラインとレジスタンスラインが表示されていますので、そのデータがデータウィンドウに表示されています。
そのデータをインジケーターから取得して、チョロチョロといじってシグナルに変えることができるようになるんですね。
//+------------------------------------------------------------------+ //| SIG_RsiAve.mq4 | //| Copyright 2016, FX取引に関するあれこれ | //| http://fxtrading.greeds.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, FX取引に関するあれこれ" #property link "http://fxtrading.greeds.net" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 RoyalBlue #property indicator_color2 Crimson double SignalBuy[]; double SignalSel[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { SetIndexStyle(0,DRAW_ARROW,EMPTY,2); SetIndexArrow(0,236); SetIndexBuffer(0,SignalBuy); SetIndexStyle(1,DRAW_ARROW,EMPTY,2); SetIndexArrow(1,238); SetIndexBuffer(1,SignalSel); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int i, limit; int counted_bars = IndicatorCounted(); if(counted_bars < 0) return(-1); if(counted_bars > 0) counted_bars--; limit = Bars - counted_bars; for(i = 0; i < limit; i++) { double resistance = iCustom(NULL,0,"ZigZagTriad_mtf",0,i); double support = iCustom(NULL,0,"ZigZagTriad_mtf",1,i); if(Close[i]>resistance) { SignalBuy[i]=iClose(NULL,0,i); } else if(Close[i]<support) { SignalSel[i]=iClose(NULL,0,i); } } return(rates_total); }
コレをコンパイルするとこうなります。
お粗末なものですが、ブレイク狙いのインジケータのイメージです。
まとめ
MT4開発はこだわりだすとキリがありませんが、最低限触れる用になっていた方が色々と特をすることが多いです。
はじめは難しく感じることもありますが、誰もが通る道ですし、慣れてしまえばなんてことはありません。
興味がある人は、上記で書いているコードをコピペで自作にチャレンジして欲しいです。
そして、分からないことがあれば遠慮なくメールかコメントをくれれば可能な限り対応しますのでヾ(*´∀`*)ノ
はじめまして。
そかべと申します。
MTFでarrowを出すインジケーターの作り方について検索したらこちらのサイトにたどり着きました。
質問よろしいでしょうか?
例えば、ボリンジャーバンドで1分足は3σ突き抜けている、5分足は2σ突き抜けているといったインジケーターの作り方についてご教示いただけらばと思うのですが、よろしいでしょうか?
ご回答お待ちしております。
そかべさん、こんばんは。
確認ですが、ベースとなるインジケーターはMTFのボリンジャーバンドになりますね。
まずこのコードを下記に記載しますので、コピペして下さい。
コメント欄にコードが上手く載らなく、途中で切れていたので、削除します(;´∀`)
気になる人はコメントか問い合わせから連絡下さい。
そかべさん、先ほどの続きです。
先ほどのインジケーターを用いることでMTFのボリンジャーが再現できます。
次にやりたいこととしては、1画面で各時間足の状況を知りたいとと言うことでOKですか?
迅速なご回答ありがとうございます。
先ほどの条件のarrowを表示させたいのですが可能でしょうか?
もしよろしければメールでの対応はできますでしょうか?
わがままばかり申し訳ありません。。。
メールにて返信しました。
続きはそちらで。
メールでの迅速な対応ありがとうございました。
短時間において、とてもめんどくさいほどの条件のMTFインジを作成していただきました。
何から何までやっていただいて、本当に申し訳ない気持ちでいっぱいです・・・
私自身、MQL4をしっかり学ぶいい機会にもなりました。
本当にありがとうございました。
また、MQLについてご質問などさせていただきたい思います。
これからもどうぞよろしくお願いいたします。