こんばんは、たかはしです。

今回はお気に入りのインジケーターを売買シグナルにする簡単な方法を紹介します。

ちょっとだけインジケーターを修正する必要がありますが、特に難しい話でもないので、これを機会に一度試してみて下さい。

なお、下記にコードを記載していますが、シグナルの条件とかはサンプルですので、そのまま使わないようにしてくださいねw

本気でMT4を触っていきたい方はシグナルの条件とか条件を複合してフィルターするとか色々ありますので、そこはアイデア次第って所です(´∀`*)

単一出力系

最近のお気に入りインジケーター「SVE_RSI_I-Fish」を例にします。

gbpjpy-d1-trading-point-of

メインウィンドウに出ている矢印達は下記をコンパイルして実行した結果で、サブウィンドウが「SVE_RSI_I-Fish」です。

パット見ただけで分かるように「SVE_RSI_I-Fish」は単一ラインで構成されているインジケーターです。

<br />
//+------------------------------------------------------------------+<br />
//|                                                   SIG_RsiAve.mq4 |<br />
//|                                     Copyright 2016, FX取引に関するあれこれ |<br />
//|                                      http://fxtrading.greeds.net |<br />
//+------------------------------------------------------------------+<br />
#property copyright &quot;Copyright 2016, FX取引に関するあれこれ&quot;<br />
#property link      &quot;http://fxtrading.greeds.net&quot;<br />
#property version   &quot;1.00&quot;<br />
#property strict<br />
#property indicator_chart_window<br />
#property indicator_buffers 2<br />
#property indicator_color1 RoyalBlue<br />
#property indicator_color2 Crimson</p>
<p>double SignalBuy[];<br />
double SignalSel[];</p>
<p>//+------------------------------------------------------------------+<br />
//| Custom indicator initialization function                         |<br />
//+------------------------------------------------------------------+<br />
int OnInit()<br />
{<br />
   SetIndexStyle(0,DRAW_ARROW,EMPTY,2);<br />
   SetIndexArrow(0,236);<br />
   SetIndexBuffer(0,SignalBuy);<br />
   SetIndexStyle(1,DRAW_ARROW,EMPTY,2);<br />
   SetIndexArrow(1,238);<br />
   SetIndexBuffer(1,SignalSel);   </p>
<p>   return(INIT_SUCCEEDED);<br />
}<br />
//+------------------------------------------------------------------+<br />
//| Custom indicator iteration function                              |<br />
//+------------------------------------------------------------------+<br />
int OnCalculate(const int rates_total,<br />
                const int prev_calculated,<br />
                const datetime &amp;time[],<br />
                const double &amp;open[],<br />
                const double &amp;high[],<br />
                const double &amp;low[],<br />
                const double &amp;close[],<br />
                const long &amp;tick_volume[],<br />
                const long &amp;volume[],<br />
                const int &amp;spread[])<br />
  {<br />
  int i, limit;<br />
  int counted_bars = IndicatorCounted();<br />
  if(counted_bars &lt; 0) return(-1);<br />
  if(counted_bars &gt; 0) counted_bars--;<br />
  limit = Bars - counted_bars;<br />
  for(i = 0; i &lt; limit; i++)<br />
  {</p>
<p>    if(rsi&gt;95)<br />
    {<br />
      SignalBuy[i]=iClose(NULL,0,i);<br />
    }<br />
    else if(rsi&lt;5)<br />
    {<br />
      SignalSel[i]=iClose(NULL,0,i);<br />
    }<br />
  }<br />
  return(rates_total);<br />
}<br />

設定値をデフォルトで使う場合は上記の通りで大丈夫ですが、パラメータを変更する場合はちょっと難易度が上がります。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-06-22-06-10

画像で見る限り複数個設定項目がありますので、それらを下記のように全て書く必要があります。

その後、変更したいパラメータに修正するだけで大丈夫です。

<br />
double rsi  = iCustom(NULL,0,&quot;SVE_RSI_I-Fish&quot;,10,4,1,12,88,false,&quot;&quot;,500,0,i);<br />

複数出力系

続いては複数出力系です。

サポレジ系のインジケータで例にします。

MT4のメニューバーにデータウィンドウってのがありますので、それをまず確認します。

チャート上にサポートラインとレジスタンスラインが表示されていますので、そのデータがデータウィンドウに表示されています。

そのデータをインジケーターから取得して、チョロチョロといじってシグナルに変えることができるようになるんですね。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-06-22-15-31

<br />
//+------------------------------------------------------------------+<br />
//|                                                   SIG_RsiAve.mq4 |<br />
//|                                     Copyright 2016, FX取引に関するあれこれ |<br />
//|                                      http://fxtrading.greeds.net |<br />
//+------------------------------------------------------------------+<br />
#property copyright &quot;Copyright 2016, FX取引に関するあれこれ&quot;<br />
#property link      &quot;http://fxtrading.greeds.net&quot;<br />
#property version   &quot;1.00&quot;<br />
#property strict<br />
#property indicator_chart_window<br />
#property indicator_buffers 2<br />
#property indicator_color1 RoyalBlue<br />
#property indicator_color2 Crimson</p>
<p>double SignalBuy[];<br />
double SignalSel[];</p>
<p>//+------------------------------------------------------------------+<br />
//| Custom indicator initialization function                         |<br />
//+------------------------------------------------------------------+<br />
int OnInit()<br />
{<br />
   SetIndexStyle(0,DRAW_ARROW,EMPTY,2);<br />
   SetIndexArrow(0,236);<br />
   SetIndexBuffer(0,SignalBuy);<br />
   SetIndexStyle(1,DRAW_ARROW,EMPTY,2);<br />
   SetIndexArrow(1,238);<br />
   SetIndexBuffer(1,SignalSel);   </p>
<p>   return(INIT_SUCCEEDED);<br />
}<br />
//+------------------------------------------------------------------+<br />
//| Custom indicator iteration function                              |<br />
//+------------------------------------------------------------------+<br />
int OnCalculate(const int rates_total,<br />
                const int prev_calculated,<br />
                const datetime &amp;time[],<br />
                const double &amp;open[],<br />
                const double &amp;high[],<br />
                const double &amp;low[],<br />
                const double &amp;close[],<br />
                const long &amp;tick_volume[],<br />
                const long &amp;volume[],<br />
                const int &amp;spread[])<br />
  {<br />
  int i, limit;<br />
  int counted_bars = IndicatorCounted();<br />
  if(counted_bars &lt; 0) return(-1);<br />
  if(counted_bars &gt; 0) counted_bars--;<br />
  limit = Bars - counted_bars;<br />
  for(i = 0; i &lt; limit; i++)<br />
  {<br />
    double resistance  = iCustom(NULL,0,&quot;ZigZagTriad_mtf&quot;,0,i);<br />
    double support     = iCustom(NULL,0,&quot;ZigZagTriad_mtf&quot;,1,i);<br />
    if(Close[i]&gt;resistance)<br />
    {<br />
      SignalBuy[i]=iClose(NULL,0,i);<br />
    }<br />
    else if(Close[i]&lt;support)<br />
    {<br />
      SignalSel[i]=iClose(NULL,0,i);<br />
    }<br />
  }<br />
  return(rates_total);<br />
}<br />

コレをコンパイルするとこうなります。

お粗末なものですが、ブレイク狙いのインジケータのイメージです。

gbpjpy-h4-trading-point-of

まとめ

MT4開発はこだわりだすとキリがありませんが、最低限触れる用になっていた方が色々と特をすることが多いです。

はじめは難しく感じることもありますが、誰もが通る道ですし、慣れてしまえばなんてことはありません。

興味がある人は、上記で書いているコードをコピペで自作にチャレンジして欲しいです。

そして、分からないことがあれば遠慮なくメールかコメントをくれれば可能な限り対応しますのでヾ(*´∀`*)ノ