Indikator Level: Memudahkan Perdagangan Anda di MetaTrader 4

Mike 2022.01.21 03:40 11 0 0
Lampiran

Halo para trader! Kali ini kita nak bincangkan tentang Indikator Level yang sangat berguna untuk platform MetaTrader 4. Indikator ini berfungsi dengan cara yang sangat mudah; apabila trigLv yang ditetapkan dalam tetapan dilanggar dalam jarak deviation, indikator ini akan menghantar notifikasi push ke peranti mudah alih anda jika parameter notification diaktifkan. Selain itu, ia juga akan memainkan amaran jika parameter alert diaktifkan. Garis horizontal yang menunjukkan tahap trigLv dan deviation juga boleh disesuaikan dengan tetapan warna, gaya dan ketebalan dalam indikator.

Dengan reka bentuk ini, anda boleh menambah beberapa salinan indikator dengan tahap yang berbeza pada carta dan menerima isyarat berdasarkan persilangan mereka. Anda tidak perlu risau, kerana tahap trigLv ini hanya akan berfungsi sekali pada satu bar. Pengaktifan semula hanya boleh berlaku selepas pembukaan bar seterusnya, jadi anda tak perlu risau tentang terlalu banyak isyarat yang sering muncul.

Indikator Level

//+------------------------------------------------------------------+
//|                                               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_plots 0

#include <ChartObjects\ChartObjectsLines.mqh>

input bool alert = true; // gunakan amaran
input bool notification = true; // gunakan notifikasi push
input double trigLv = 0.0; // tahap pengaktifan
input int deviation = 30; // deviasi dari trigLv dalam poin
input int lineWidth = 1; // ketebalan garis
input ENUM_LINE_STYLE lineStyle = STYLE_SOLID; // gaya garis
input color lineColor = clrMediumSpringGreen; // warna garis
input color inactivityColor = clrLightGray; // warna ketidakaktifan

CChartObjectHLine lv, dvH, dvL; 

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

//+------------------------------------------------------------------+
//| Fungsi inisialisasi indikator khusus                         |
//+------------------------------------------------------------------+
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("Indikator Level. Level ", lv.Price(0), " tidak aktif!");
  if (trigLv == 0.0)
    Alert("Indikator Level. Tetapkan parameter \"trigLv\" kepada nilai yang diingini!");
  return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason) {
  //lv.Delete();
  //dvH.Delete();
  //dvL.Delete();
}

//+------------------------------------------------------------------+
//| Fungsi pengiraan indikator khusus                              |
//+------------------------------------------------------------------+
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[0], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) { 
    if (time_ != time[0])
      time_ = time[0];
    else
      return rates_total;
    if (!triggered) {
      if (alert)
        Alert("Indikator Level. Level ", NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " terpicu!");
      if (notification)
        SendNotification("Indikator Level. Level " + (string)NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " terpicu!");
    }
    triggered = true;
  }
  else
    triggered = false;
    
  return(rates_total);
}
//+------------------------------------------------------------------+
    Senarai
    Komen 0