MetaTrader5
レベルインジケーター - MetaTrader 5向けの便利なツール
MetaTrader 5のレベルインジケーターは、設定で指定されたtrigLvレベルがdeviationの範囲内をクロスした際に、モバイルデバイスにプッシュ通知を送信します。これは、入力パラメータnotificationが有効である場合に行われ、さらに入力パラメータalertが有効であればアラートも鳴ります。
設定されたtrigLvレベルとdeviationの制限は、横線で表示されます。そのスタイル、色、太さはインジケーター設定で調整可能です。このデザインにより、異なるレベルのインジケーターを複数チャートに追加し、交差した結果としてシグナルを受け取ることができます。
指定されたtrigLvレベルは、1つのバーで1回のみ機能します。再発動は次のバーがオープンした後のみ可能です。このようにして、各ティックでの過剰なトリガーを排除することができました。
//+------------------------------------------------------------------+
//| レベルインジケーター.mq5 |
//| Copyright 2022, © Cyberdev |
//| https://www.mql5.com/en/users/cyberdev/seller |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, © Cyberdev"
#property link "https://www.mql5.com/en/users/cyberdev/seller"
#property version "1.00"
#property indicator_chart_window
#property indicator_plots 0
#include <ChartObjects\ChartObjectsLines.mqh>
input bool alert = true; // アラートを使用
input bool notification = true; // プッシュ通知を使用
input double trigLv = 0.0; // 発動レベル
input int deviation = 30; // trigLvからの乖離(ポイント単位)
input int lineWidth = 1; // 線の太さ
input ENUM_LINE_STYLE lineStyle = STYLE_SOLID; // 線のスタイル
input color lineColor = clrMediumSpringGreen; // 線の色
input color inactivityColor = clrLightGray; // 非アクティブ時の色
CChartObjectHLine lv, dvH, dvL;
bool equal(double _v1, double _v2, double _epsilon) { return fabs(_v1 - _v2) <= fabs(_epsilon); }
//+------------------------------------------------------------------+
//| カスタムインジケーター初期化関数 |
//+------------------------------------------------------------------+
int OnInit() {
string name;
double dv;
color color_;
name = "alert.lv-";
dv = deviation * SymbolInfoDouble(NULL, SYMBOL_POINT);
color_ = (alert || notification) ? lineColor : inactivityColor;
for (int n = 0; n <= INT_MAX && !IsStopped(); n++) {
if (ObjectFind(0, name + (string)n) != 0) {
if (!lv.Create(0, name + (string)n, 0, trigLv))
return INIT_FAILED;
lv.Width(lineWidth);
lv.Style(lineStyle);
lv.Color(color_);
dvH.Create(0, "alert.dvH-" + (string)n, 0, trigLv + dv);
dvH.Width(1);
dvH.Style(STYLE_DOT);
dvH.Color(color_);
dvL.Create(0, "alert.dvL-" + (string)n, 0, trigLv - dv);
dvL.Width(1);
dvL.Style(STYLE_DOT);
dvL.Color(color_);
break;
}
}
if (!alert && !notification)
Print("レベルインジケーター。レベル ", lv.Price(0), " は非アクティブです!");
if (trigLv == 0.0)
Alert("レベルインジケーター。パラメータ"trigLv"を望ましい値に設定してください!");
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) {
//lv.Delete();
//dvH.Delete();
//dvL.Delete();
}
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[]
) {
static bool triggered = false;
static datetime time_ = 0;
if (!alert && !notification)
return rates_total;
if (equal(lv.Price(0), close[rates_total - 1], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) {
if (time_ != time[rates_total - 1])
time_ = time[rates_total - 1];
else
return rates_total;
if (!triggered) {
if (alert)
Alert("レベルインジケーター。レベル ", NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " がトリガーされました!");
if (notification)
SendNotification("レベルインジケーター。レベル " + (string)NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " がトリガーされました!");
}
triggered = true;
}
else
triggered = false;
return rates_total;
}
//+------------------------------------------------------------------+
2022.01.20