FX自動売買基礎と応用

ATRでボラティリティ判定ツールの作成方法|数値の表示方法や表示の色を変化させる方法


1.ATRの期間と許容値をパラメーターとして設定


この記事では、ATRでボラティリティを判定するツールを作る方法を解説します。ツールの機能としては、ATRの数値をチャート上に表示し、その数値が許容値未満のときは表示の色を変化させたり、トレンドラインを使ってチャート上に大きく×マークを表示したりするというものです。

まずファイルの新規作成で「カスタムインディケータ」を選択し、ファイル名を「ATR_Judge」とします。そしてATRの期間と許容値をパラメーターとして設定しましょう。期間は名前を「PERIOD」、タイプを「int」、初期値を「14」、許容値は名前を「LEVEL」、タイプを「double」、初期値を「1.5」とします。「カスタムインディケータのイベントハンドラ」の画面では「OnChartEvent」にチェックを入れ、次の画面で「完了」をクリックすれば、ひな形の完成です。

カスタムインディケータの設定画面


2.オブジェクトを削除できるように接頭辞を定義


今回はオブジェクトを使うので、それをまとめて削除できるようにファイル上部のプロパティ「property indicator_chart_window」の下に接頭辞として「PREFIX」を定義します。「MQLInfoString(MQL_PROGRAM_NAME)」がインジケーターのファイル名を示します。


#define PREFIX MQLInfoString(MQL_PROGRAM_NAME) + "_"

そして「Custom indicator initialization function」の下に「Custom indicator deinitialization function」を設けて、OnDeinit関数を使った次のコードを記述します。これでインジケーターをチャートから削除したときに、関連オブジェクトが消えるようになります。


void OnDeinit(const int reason)
{
   ObjectsDeleteAll(0, PREFIX);
}

また、列挙型の「ENUM_TIMEFRAMES」を使って時間足を指定できるようにしておきましょう。ここでは5分足を初期設定で指定します。「input int PERIOD=14;」の上に次のコードを追記すればOKです。


input ENUM_TIMEFRAMES TF = PERIOD_M5; // 時間足


3.オブジェクトの描画を処理する関数を作成


続いて、オブジェクトの描画関係の処理を関数として定義します。「ChartEvent function」の下に「Draw function」を設けて「DrawX()」という関数を新たに作りましょう。


//+------------------------------------------------------------------+
//| Draw function                                                    |
//+------------------------------------------------------------------+
void DrawX()
{
}

DrawX()の中で、まずiATR関数を使ってATRを定義します。通貨ペアは表示しているものを使うので「NULL」、タイムフレームと期間はパラメーターで定義したもの、ATRの値を取得するバーの位置としては確定した足にしたいので「1」を指定し、ATRの値はpips単位に変換しておきます。


double atr = iATR(NULL, TF, PERIOD, 1) / _Point / 10;

そのATRの値がLEVEL(許容値)未満の場合、ボラティリティが「小さい」と判定します。表示するオブジェクトの色に関しては、三項演算子を使ってATRの値が小さいときは「赤」、小さくないときは「白」とします。


bool small = atr < LEVEL;
color clrATR = small ? clrRed : clrWhite;


4.LABELオブジェクトのサンプルコードを流用


上記では、接頭辞を設定してオブジェクトの描画を処理する関数「DrawX()」を作り、その中でATRを定義するところまで解説しました。続いて、LABELオブジェクトを用いてATRの数値をチャートに表示するようにします。

LABELオブジェクトのサンプルコードは、MQL4リファレンスからコピーして使いましょう。MQL4リファレンスの目次にある「Constants, Enumerations and Structures」→「Objects Constants」→「Object Types」をクリックするとオブジェクトの一覧が表示されるので、その中から「OBJ_LABEL」を選択し、あらかじめ用意されている「Create a text label」のコードをコピーしてファイル下部に貼り付けます。

「Print(__FUNCTION__,」「": failed to create text label! Error code = ",GetLastError());」の2行は不要なので「/*」「*/」をつけてコメント扱いとし、その下にATRの数字の変化が反映されるように「ObjectSetString(chart_ID, name, OBJPROP_TEXT, text);」を、色の変化が反映されるように「ObjectSetInteger(chart_ID, name, OBJPROP_COLOR, clr);」を加えます。


//+------------------------------------------------------------------+
//| Create a text label                                              |
//+------------------------------------------------------------------+
bool LabelCreate(const long              chart_ID = 0,             // chart's ID
                 const string            name = "Label",           // label name
                 const int               sub_window = 0,           // subwindow index
                 const int               x = 0,                    // X coordinate
                 const int               y = 0,                    // Y coordinate
                 const ENUM_BASE_CORNER  corner = CORNER_LEFT_UPPER, // chart corner for anchoring
                 const string            text = "Label",           // text
                 const string            font = "Arial",           // font
                 const int               font_size = 10,           // font size
                 const color             clr = clrRed,             // color
                 const double            angle = 0.0,              // text slope
                 const ENUM_ANCHOR_POINT anchor = ANCHOR_LEFT_UPPER, // anchor type
                 const bool              back = false,             // in the background
                 const bool              selection = false,        // highlight to move
                 const bool              hidden = true,            // hidden in the object list
                 const long              z_order = 0)              // priority for mouse click
{
//--- reset the error value
   ResetLastError();
//--- create a text label
   if(!ObjectCreate(chart_ID, name, OBJ_LABEL, sub_window, 0, 0)) {
      /*      Print(__FUNCTION__,
                  ": failed to create text label! Error code = ",GetLastError());*/
      ObjectSetString(chart_ID, name, OBJPROP_TEXT, text);
      ObjectSetInteger(chart_ID, name, OBJPROP_COLOR, clr);
      return(false);
   }
//--- set label coordinates
   ObjectSetInteger(chart_ID, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(chart_ID, name, OBJPROP_YDISTANCE, y);
//--- set the chart's corner, relative to which point coordinates are defined
   ObjectSetInteger(chart_ID, name, OBJPROP_CORNER, corner);
//--- set the text
   ObjectSetString(chart_ID, name, OBJPROP_TEXT, text);
//--- set text font
   ObjectSetString(chart_ID, name, OBJPROP_FONT, font);
//--- set font size
   ObjectSetInteger(chart_ID, name, OBJPROP_FONTSIZE, font_size);
//--- set the slope angle of the text
   ObjectSetDouble(chart_ID, name, OBJPROP_ANGLE, angle);
//--- set anchor type
   ObjectSetInteger(chart_ID, name, OBJPROP_ANCHOR, anchor);
//--- set color
   ObjectSetInteger(chart_ID, name, OBJPROP_COLOR, clr);
//--- display in the foreground (false) or background (true)
   ObjectSetInteger(chart_ID, name, OBJPROP_BACK, back);
//--- enable (true) or disable (false) the mode of moving the label by mouse
   ObjectSetInteger(chart_ID, name, OBJPROP_SELECTABLE, selection);
   ObjectSetInteger(chart_ID, name, OBJPROP_SELECTED, selection);
//--- hide (true) or display (false) graphical object name in the object list
   ObjectSetInteger(chart_ID, name, OBJPROP_HIDDEN, hidden);
//--- set the priority for receiving the event of a mouse click in the chart
   ObjectSetInteger(chart_ID, name, OBJPROP_ZORDER, z_order);
//--- successful execution
   return(true);
}


5.LabelCreateでATRの数値を表示


設定したLabelCreateは、DrawX()内で実行します。LabelCreateのパラメーターについては、チャートIDを「0」、名前を「PREFIX + "ATR"」、ウインドウはメインウインドウなので「0」、X位置とY位置も「0」、基準位置は左下にしたいので「CORNER_LEFT_LOWER」を指定します。ATRの数値は少数点1以下で表示し、フォントを「Arial Bold」、サイズを「20」、色を先ほど定義した「clrATR」、アングルを「0」、アンカーを左下「ANCHOR_LEFT_LOWER」としましょう。


LabelCreate(0, PREFIX + "ATR", 0, 0, 0, CORNER_LEFT_LOWER, DoubleToString(atr, 1), "Arial Bold", 20, clrATR, 0, ANCHOR_LEFT_LOWER);

そして作ったDrawX()は、OnCalculate関数配下で宣言します。「//--- return value of prev_calculated for next call」の上に「DrawX();」を置きましょう。


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[])
{
//---
   DrawX();
//--- return value of prev_calculated for next call
   return(rates_total);
}

これでコンパイルしてチャートにセットすると、チャートの左下にATRの数値が表示されます。許容値の初期値「1.5」よりも小さいので、数値が赤になっていることが分かります。

チャートの左下にATRの数値が表示される


6.チャートの四隅の時間情報と価格情報を定義


次に、ATRの数値が許容値より小さいときは、チャートにトレンドラインで×マークを描画するため、チャートの四隅の時間情報と価格情報を定義します。まず「ChartGetDouble」でチャートの最大値と最小値を取得しましょう。


double max = ChartGetDouble(0, CHART_PRICE_MAX);
double min = ChartGetDouble(0, CHART_PRICE_MIN);

そして時間を指定するためにバーの位置を取得します。「CHART_FIRST_VISIBLE_BAR」でチャートの左端のバーを取得し、そこからチャート全体のバーの本数「CHART_WIDTH_IN_BARS」を引くことで右端のバーを取得することが可能です。


int barL = (int)ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR);
int barR = barL - (int)ChartGetInteger(0, CHART_WIDTH_IN_BARS);

これを時間に直す上で、左端のバーはそのまま定義できますが、右端のバーに関しては0より小さいときに「Time[0] - barR * PeriodSeconds()」とする必要があります。配列(Time[])の要素番号には、マイナスを指定することができないからです。


datetime timeL = Time[barL];
datetime timeR = barR >= 0 ? Time[barR] : Time[0] - barR * PeriodSeconds();

トレンドラインの色は、ATRの数値が許容値より小さいときはオレンジ、そうでないときは表示しないので色無しとしましょう。


color clrX = small ? clrOrange : clrNONE;

トレンドラインを用いてチャートに×マークを描画する方法については、以下の記事を参考にしてください。

参考:ATRでボラティリティ判定ツールの作成方法|チャートに×マークを描画する方法


本記事の監修者・HT FX


2013年にFXを開始し、その後専業トレーダーへ。2014年からMT4/MT5のカスタムインジケーターの開発に取り組む。ブログでは100本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。

EA(自動売買)を学びたい方へオススメコンテンツ

EA運用の注意点

OANDAではEA(自動売買)を稼働するプラットフォームMT4/MT5の基本的な使い方について、画像や動画付きで詳しく解説しています。MT4/MT5のインストールからEAの設定方法までを詳しく解説しているので、初心者の方でもスムーズにEA運用を始めることが可能です。またOANDAの口座をお持ちであれば、独自開発したオリジナルインジケーターを無料で利用することもできます。EA運用をお考えであれば、ぜひ口座開設をご検討ください。


本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。

この記事をシェアする

ホーム » FX自動売買基礎と応用 » ATRでボラティリティ判定ツールの作成方法|数値の表示方法や表示の色を変化させる方法