MT4/MT5 ボラティリティ確認インジケータ
下記の記事でSLをボラティリティから考えようと思って作ったインジケータになります、単純動作なので、コードを置いておきたいと思います。業者によっては、桁数の調整が必要です。

//+——————————————————————+
//| 20240711_Dayvolatility.mq4 |
//| suzi-fx.com |
//| https://suzi-fx.com/ |
//+——————————————————————+
#property copyright “suzi-fx.com”
#property link “https://suzi-fx.com/”
#property version “1.00”
#property strict
#property indicator_chart_window
// input パラメータ
input int n = 5; // 平均するローソク足の本数
input int p = 25; // パーセント表示
// グローバル変数
double avgRange;
double pips=Point()*10;
//+——————————————————————+
//| Custom indicator initialization function |
//+——————————————————————+
int OnInit()
{
// オブジェクトを作成
ObjectCreate(0, “AvgCandleRange”, OBJ_LABEL, 0, 0, 0);
// テキストのプロパティを設定
ObjectSetText(“AvgCandleRange”, “Calculating…”, 12, “Arial”, clrWhite);
ObjectSet(“AvgCandleRange”, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSet(“AvgCandleRange”, OBJPROP_XDISTANCE, 220);
ObjectSet(“AvgCandleRange”, OBJPROP_YDISTANCE, 0);
ObjectSet(“AvgCandleRange”, OBJPROP_COLOR, clrWhite);
ObjectSet(“AvgCandleRange”, OBJPROP_BACK, true);
// タイマーをセット(10秒ごとに更新)
// 平均値を計算
avgRange = CalculateAverageRange(n);
// 平均値を表示
string text = “Ave: ” + DoubleToString(avgRange/pips, 0)+”(“+p+”%=”+DoubleToString(avgRange/pips*p/100,0)+”)”+” Today:”+ DoubleToString((iHigh(NULL, PERIOD_D1, 0) – iLow(NULL, PERIOD_D1, 0))/pips,0);
ObjectSetText(“AvgCandleRange”, text, 10, “Arial”, clrWhite);
EventSetTimer(10);
return(INIT_SUCCEEDED);
}
//+——————————————————————+
//| インジケータのクリーンアップ関数 |
//+——————————————————————+
void OnDeinit(const int reason)
{
// タイマーを解除
EventKillTimer();
}
//+——————————————————————+
//| タイマーイベント処理関数 |
//+——————————————————————+
void OnTimer()
{
// 平均値を計算
avgRange = CalculateAverageRange(n);
// 平均値を表示
string text = “Ave: ” + DoubleToString(avgRange/pips, 0)+”(“+p+”%=”+DoubleToString(avgRange/pips*p/100,0)+”)”+” Today:”+ DoubleToString((iHigh(NULL, PERIOD_D1, 0) – iLow(NULL, PERIOD_D1, 0))/pips,0);
ObjectSetText(“AvgCandleRange”, text, 10, “Arial”, clrWhite);
}
//+——————————————————————+
//| 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[])
{
//—
//— return value of prev_calculated for next call
return(rates_total);
}
//+——————————————————————+
//+——————————————————————+
//| 平均値を計算する関数 |
//+——————————————————————+
double CalculateAverageRange(int numBars)
{
double sumRange = 0.0;
// 日足のローソク足をループ
for (int i = 1; i <= numBars; i++) // i = 1で現在形成中の足を除く
{
// 高値と安値の差分を計算
double range = iHigh(NULL, PERIOD_D1, i) – iLow(NULL, PERIOD_D1, i);
sumRange += range;
}
// 平均値を計算
double avgRange = sumRange / numBars;
return(avgRange);
}
//+——————————————————————+
//+——————————————————————+
//| 20240711_Dayvolatility.mq5 |
//| suzi-fx.com |
//| https://suzi-fx.com/ |
//+——————————————————————+
#property copyright “suzi-fx.com”
#property link “https://suzi-fx.com/”
#property version “1.00”
#property strict
#property indicator_chart_window
// input パラメータ
input int n = 5; // 平均するローソク足の本数
input int p = 25; // パーセント表示
// グローバル変数
double avgRange;
double pips = Point() * 10;
//+——————————————————————+
//| インジケータの初期化関数 |
//+——————————————————————+
int OnInit()
{
// オブジェクトを作成
if (!ObjectCreate(0, “AvgCandleRange”, OBJ_LABEL, 0, 0, 0))
{
Print(“Object creation failed! Error: “, GetLastError());
return INIT_FAILED;
}// テキストのプロパティを設定 ObjectSetString(0, "AvgCandleRange", OBJPROP_TEXT, "Calculating..."); ObjectSetInteger(0, "AvgCandleRange", OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, "AvgCandleRange", OBJPROP_XDISTANCE, 220); ObjectSetInteger(0, "AvgCandleRange", OBJPROP_YDISTANCE, 0); ObjectSetInteger(0, "AvgCandleRange", OBJPROP_COLOR, clrWhite); ObjectSetInteger(0, "AvgCandleRange", OBJPROP_BACK, true); // 平均値を計算 avgRange = CalculateAverageRange(n); // 平均値を表示 string text = "Ave: " + DoubleToString(avgRange / pips, 0) + "(" + IntegerToString(p) + "%=" + DoubleToString(avgRange / pips * p / 100, 0) + ")" + " Today:" + DoubleToString((iHigh(_Symbol, PERIOD_D1, 0) - iLow(_Symbol, PERIOD_D1, 0)) / pips, 0); ObjectSetString(0, "AvgCandleRange", OBJPROP_TEXT, text); // タイマーをセット(10秒ごとに更新) EventSetTimer(10); return INIT_SUCCEEDED;
}
//+——————————————————————+
//| インジケータのクリーンアップ関数 |
//+——————————————————————+
void OnDeinit(const int reason)
{
// タイマーを解除
EventKillTimer();// オブジェクトを削除 ObjectDelete(0, "AvgCandleRange");
}
//+——————————————————————+
//| タイマーイベント処理関数 |
//+——————————————————————+
void OnTimer()
{
// 平均値を計算
avgRange = CalculateAverageRange(n);// 平均値を表示 string text = "Ave: " + DoubleToString(avgRange / pips, 0) + "(" + IntegerToString(p) + "%=" + DoubleToString(avgRange / pips * p / 100, 0) + ")" + " Today:" + DoubleToString((iHigh(_Symbol, PERIOD_D1, 0) - iLow(_Symbol, PERIOD_D1, 0)) / pips, 0); ObjectSetString(0, "AvgCandleRange", OBJPROP_TEXT, text);
}
//+——————————————————————+
//| インジケータの計算関数(今回は不要) |
//+——————————————————————+
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[])
{
return rates_total;
}
//+——————————————————————+
//| 平均値を計算する関数 |
//+——————————————————————+
double CalculateAverageRange(int numBars)
{
double sumRange = 0.0;for (int i = 1; i <= numBars; i++) // i = 1で現在形成中の足を除く { double range = iHigh(_Symbol, PERIOD_D1, i) - iLow(_Symbol, PERIOD_D1, i); sumRange += range; } return sumRange / numBars;
}