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_plots0#include <ChartObjects\ChartObjectsLines.mqh> inputbool alert = true; // アラートを使用inputbool notification = true; // プッシュ通知を使用inputdouble trigLv = 0.0; // 発動レベルinputint deviation = 30; // trigLvからの乖離(ポイント単位)inputint lineWidth = 1; // 線の太さinputENUM_LINE_STYLE lineStyle = STYLE_SOLID; // 線のスタイルinputcolor lineColor = clrMediumSpringGreen; // 線の色inputcolor inactivityColor = clrLightGray; // 非アクティブ時の色 CChartObjectHLine lv, dvH, dvL; bool equal(double _v1, double _v2, double _epsilon) { returnfabs(_v1 - _v2) <= fabs(_epsilon); } //+------------------------------------------------------------------+//| カスタムインジケーター初期化関数 |//+------------------------------------------------------------------+intOnInit() { 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)) returnINIT_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); } voidOnDeinit(constint reason) { //lv.Delete(); //dvH.Delete(); //dvL.Delete(); } intOnCalculate(constint rates_total, constint prev_calculated, constdatetime &time[], constdouble &open[], constdouble &high[], constdouble &low[], constdouble &close[], constlong &tick_volume[], constlong &volume[], constint &spread[] ) { staticbool triggered = false; staticdatetime 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; } //+------------------------------------------------------------------+

コメント 0