Level Indicator voor MetaTrader 4: Optimaliseer je Trading Strategie

Mike 2022.01.21 03:40 16 0 0
Bijlage

Als je de trigLv niveau instelt in de configuratie, ontvang je een pushmelding op je mobiele apparaat zodra dit niveau wordt overschreden binnen de deviatie. Dit gebeurt alleen als de invoerparameter notification is ingeschakeld. Daarnaast wordt er een alert afgespeeld als de invoerparameter alert is geactiveerd. De triggerlevels van trigLv en de deviatie worden gemarkeerd met horizontale lijnen, waarvan je de stijl, kleur en dikte kunt aanpassen in de instellingen van de indicator. Dit stelt je in staat om meerdere kopieën van de indicator met verschillende niveaus op je grafiek te plaatsen en zo signalen te ontvangen bij hun kruising.

Het opgegeven trigLv niveau wordt slechts één keer geactiveerd per kaar. Heractivatie kan pas plaatsvinden na de opening van de volgende kaar. Hierdoor voorkom je te frequente triggers bij iedere tick.

Level Indicator

//+------------------------------------------------------------------+//|                                               LevelIndicator.mq4 |//|                                       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 strict#property indicator_chart_window#property indicator_plots0#include <ChartObjects\ChartObjectsLines.mqh>

inputbool alert = true; // gebruik alertinputbool notification = true; // gebruik push notificatiesinputdouble trigLv = 0.0; // activeringsniveauinputint deviation = 30; // afwijking van trigLv in punteninputint lineWidth = 1; // lijnbreedteinputENUM_LINE_STYLE lineStyle = STYLE_SOLID; // lijnstijlinputcolor lineColor = clrMediumSpringGreen; // lijnkleurinputcolor inactivityColor = clrLightGray; // inactiviteitskleur

CChartObjectHLine lv, dvH, dvL; 

bool equal(double _v1, double _v2, double _epsilon) { returnfabs(_v1 - _v2) <= fabs(_epsilon); }

//+------------------------------------------------------------------+//| Custom indicator initialisatiefunctie                         |//+------------------------------------------------------------------+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("Level Indicator. Niveau ", lv.Price(0), " is inactief!");
  if (trigLv == 0.0)
    Alert("Level Indicator. Stel parameter \"trigLv\" in op de gewenste waarde!");
  return(INIT_SUCCEEDED);
}

voidOnDeinit(constint reason) {
  //lv.Delete();
  //dvH.Delete();
  //dvL.Delete();
}

//+------------------------------------------------------------------+//| Custom indicator iteratiefunctie                              |//+------------------------------------------------------------------+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[0], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) { 
    if (time_ != time[0])
      time_ = time[0];
    else
      return rates_total;
    if (!triggered) {
      if (alert)
        Alert("Level Indicator. Niveau ", NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " geactiveerd!");
      if (notification)
        SendNotification("Level Indicator. Niveau " + (string)NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " geactiveerd!");
    }
    triggered = true;
  }
  else
    triggered = false;
    
  return(rates_total);
}
//+------------------------------------------------------------------+
    Lijst
    Reactie 0