損切と利確で迷わない!MT4用オリジナルインジケータ「マルチタイムATR-BAND」

僕はFXを始めた当初、エントリー前に損切値や利益確定の目標値に毎回同じ数値を使っていました。

おじさん
おじさん
損切は20pips、利確は50pipsで固定してました
うさぎ
うさぎ
○○の一つ覚え

この方法だと計算は簡単なのですが、通貨ペアごとの値動きの幅を考慮していないのが難点です。

そのため値動きの大きい通貨ペアではすぐに損切に引っかかったり、値動きの小さい通貨ペアではなかなか利確目標に届かなかったり、といったことが起こります。

そこで、通貨ペアごとに「一日の平均的な値動きの幅」を示すインジケータ「 ATR (Average True Range ) 」を使い始めました。

今回は、MT4に用意されている「ATR」の見方のほか、マルチタイム分析用に改良したオリジナルインジケータ「ATR-BAND」も紹介します。

うさぎ
うさぎ
これで根拠のある損切と利確を設定できます

「ATR」 の見方

MT4に初期インストールされているATRは、下の画像のように表示されます。

ATRの数値は、見たい場所をクリックすると表示されます。

サブウィンドウを表示している場合は、カーソルを合わせるとサブウィンドウにも表示されます。

上の画像で表示された0.0017は、過去5本分の値動きの平均を表しています。

うさぎ
うさぎ
何本分の平均を取るかは、ATRのパラメータで変更できます

つまり、エントリーしたあと上下に値動きがあっても、だいたい0.0017の範囲内で収まることが予想できます。

ただし、値幅が0.0017ということは、一直線に上昇しても上下に変動しても0.0017となるので注意が必要です。

おじさん
おじさん
利確を0.0017に設定した場合、ジグザグな値動きだと同じ値幅でも結果的にプラスマイナス0になってしまうことも考えられますね

ATRを損切と利確に利用する

では、実際のチャートで見てみます。

1時間足のATRは下のようになります。

ただ、ATRで値動きの平均的な数値が分かっても、ローソク足1本ずつを見ると長いものや短いものがあり、ATRを有効に利用するのは難しそうです。

うさぎ
うさぎ
ATRで相場のボラティリティの変化は分かりますね

そこで、マルチタイムフレーム分析をおこないます。

1時間足に日足のATRを表示する

では、日足のATRを1時間足に表示してみます。

言い換えると、「日足のローソク足1本分の値動きの平均値」を1時間足に表示するということになります。

おじさん
おじさん
ATRを別の時間足で表示するこのインジケータ「ATR_BAND」の導入方法は、この記事の下の方で紹介します

赤のラインが始値に1/2ATRをプラスマイナスしてラインを引いたもの、緑が始値にATRをプラスマイナスしてラインを引いたものです。

うさぎ
うさぎ
伝説の投資集団「タートルズ」も、このATRを損切値に活用していました

たとえば今日の始値が100円、日足のATRが0.5だとすると100円に0.25を加減した100.25、99.75に赤のラインを引きます。

同様に、100円に0.5を加減した100.50、99.50に緑のラインを引きます。

チャートを見ると、ほとんどの場合で赤または緑ラインの範囲内に収まり、たまに緑のラインをはみ出しいることが分かります。

おじさん
おじさん
ほんとだ
うさぎ
うさぎ
ATRが平均値なので、収まるのは当然ですね

ATRが損切と利確に使える理由

ATRのラインをよく見ると、赤のラインと緑のラインが抵抗線になっている箇所がいくつもあります。

このことからATRを意識している人が多いことが分かります。

おじさん
おじさん
日本人よりも外国人の方がよく使っているらしいです

つまり、エントリーするときに「第一目標は赤ライン」、「最終目標は緑ライン」のように利確の目標が決めやすいということになります。

また損切についても、予想と逆に行ったとしても「赤のラインに到達するまでは様子を見よう」と損切ラインを設定しやすくなります。

おじさん
おじさん
ATRに他の指標を併せて使うと精度が上がりそうですね

ATRで値動きを予測する

ATRが抵抗線になり利確・損切ラインが決まるということは、他の利用方法も考えられます。

例えば、下の画像の丸印のように緑ラインに到達したのが金曜日の夜だとします。

金曜日の夜ということは、デイトレーダーが手仕舞いすることが考えられます。

また緑のラインに到達していることから、ここから更に上に買い上がるには結構なパワーが必要だと予想できます。

そこで逆張りをすると、比較的小さなリスクで利益を獲得しやすいです。

うさぎ
うさぎ
ラウンドナンバー(115.00のようにキリの良い数字)を意識すると絶好のエントリーポイントになりそうですね
おじさん
おじさん
そのまま上に行ってしまうこともあるので、注意してください

オリジナルインジケータ「マルチタイムATR_BAND」

ご注意

このプログラムは自分用に作成したものです。

プログラムの内容についてはエラーを検査しておりますが、使用環境により想定通りに動作しないこともございます。
当プログラムを実行した結果、なんらかの損害が生じたとしても当方では一切の補償はできませんのでご了承ください。

不具合につきましては、コメント欄よりご連絡いただければ改善に努めます。

では、上で紹介したマルチタイム分析インジケータ「ATR_BAND」の導入方法を紹介します。

下のコードをMT4のメタエディターにコピペし、コンパイルするとMT4で ATR_BANDを表示できます。

ラインの色や太さはMT4上でも変更できますが、プログラムを変更すると 複数のチャート上で利用するときに手間が省けます。

カラーは「//始値+1/2ATR」と書いてある行から下のclrRedとclrGreenを変更してください。

ラインの太さは「width1 2」の「2」の部分を変更してください。

//+------------------------------------------------------------------+
//|                                                  OZ_ATR_BAND.mq4 |
//|                                                             FIFX |
//|                                                  https://fifx.jp |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window
#property indicator_buffers 4         
#property indicator_color1 clrRed      // 始値+1/2ATR
#property indicator_width1 2           
#property indicator_color2 clrRed      
#property indicator_width2 2
#property indicator_color3 clrGreen      // 始値+ATR
#property indicator_width3 2          
#property indicator_color4 clrGreen       
#property indicator_width4 2    
        
extern ENUM_TIMEFRAMES  Timeframe   = PERIOD_D1;
double TFatr_up[]; 
double TFatr_low[]; 
double TFatr_max[]; 
double TFatr_min[];                         
//+------------------------------------------------------------------+
int OnInit()
{
   // Timeframe 設定補正
   if (Timeframe != PERIOD_CURRENT && Timeframe < Period()) Timeframe = PERIOD_CURRENT;
   
   SetIndexBuffer(0, TFatr_up);             
   SetIndexStyle(0, DRAW_LINE); 
   SetIndexLabel(0, "Up-1/2ATR");       
   SetIndexBuffer(1, TFatr_low);            
   SetIndexStyle(1, DRAW_LINE);  
   SetIndexLabel(1, "low-1/2ATR");   
   SetIndexBuffer(2, TFatr_max);            
   SetIndexStyle(2, DRAW_LINE);
   SetIndexLabel(2, "Max-ATR");            
   SetIndexBuffer(3, TFatr_min);            
   SetIndexStyle(3, DRAW_LINE); 
   SetIndexLabel(3, "Min-ATR");         
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
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, j;
   int limit;
   if (prev_calculated == 0)              
      limit = rates_total - 1;              
   else                                   
      limit = rates_total - prev_calculated; 
   
   for (i=limit; i>=0; i--)               
   {
      int bar_shift = iBarShift(NULL, Timeframe, Time[i]);  
      TFatr_up[i] = iOpen(_Symbol, Timeframe,bar_shift)+iATR(_Symbol,Timeframe,14,bar_shift)/2;   
      TFatr_low[i] = iOpen(_Symbol, Timeframe,bar_shift)-iATR(_Symbol,Timeframe,14,bar_shift)/2;
      TFatr_max[i] = iOpen(_Symbol, Timeframe,bar_shift)+iATR(_Symbol,Timeframe,14,bar_shift);         
      TFatr_min[i] = iOpen(_Symbol, Timeframe,bar_shift)-iATR(_Symbol,Timeframe,14,bar_shift);
      
      if (i > 1) continue; 
      for (j=1; i+j<rates_total ;j++)
      {
         if (iBarShift(NULL, Timeframe, Time[i+j]) != bar_shift) break;
         TFatr_up[i+j] = TFatr_up[i];
         TFatr_low[i+j] = TFatr_low[i];
         TFatr_max[i+j] = TFatr_max[i];
         TFatr_min[i+j] = TFatr_min[i];         
      }
   }
   
   return(rates_total);
}
おじさん
おじさん
1時間足に日足のATRを表示するために作成したので、他の時間足の組み合わせだとゴチャゴチャして見にくいかも知れません