/////////////////////////////////////////////////////// // SaherElm IT Center MQL5 Indicator // ------------------------------------------- // Name: XMGTD // Description: Mega Trend ... // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // ////////////////////////////////////////////////////// // // Global Properties ... #property copyright "Copyright 2023, SaherElm IT Center" #property link "https://saherelm.ir" #property version "1.00" #property description "SaherElm XMGTD Indicator" #property strict // #define ShortName "XMGTD" // // Imports ... #include "../Libraries/x-saherelm.common.lib.mq5" // // Inputs ... // input group "Market"; input int length = 14; // Length input double coeff = 2.0; // Coefficient input double multiplier = 3.0; // Multiplier input ENUM_APPLIED_PRICE appliedTo = PRICE_CLOSE; // Applied To // input group "Presentation"; input bool show = true; // Show input bool showSTR = false; // Show STR input bool showHTD = false; // Show HTR input bool showATSL = false; // Show ATSL // // Buffers ... // #property indicator_chart_window // #property indicator_buffers 13 #property indicator_plots 6 // #define mainBufferIndex 0 double mainBuffer[]; // #define mainBufferColorIndex 1 double mainBufferColor[]; // #define hideColorIDX 0 #define bullColorIDX 1 #define bearColorIDX 2 // #property indicator_label1 "XMGTD" #property indicator_type1 DRAW_COLOR_LINE #property indicator_color1 CLR_NONE, clrGreen, clrDarkRed #property indicator_style1 STYLE_DOT #property indicator_width1 1 // #define atslBufferIndex 2 #define atslBufferPlotIndex 1 double atslBuffer[]; // #define atslBufferColorIndex 3 double atslBufferColor[]; // #property indicator_label2 "XATSL" #property indicator_type2 DRAW_COLOR_LINE #property indicator_color2 CLR_NONE, clrGreen, clrDarkRed #property indicator_style2 STYLE_DOT #property indicator_width2 1 // #define htdBufferIndex 4 #define htdBufferPlotIndex 2 double htdBuffer[]; // #define htdBufferColorIndex 5 double htdBufferColor[]; // #property indicator_label3 "XHTD" #property indicator_type3 DRAW_COLOR_LINE #property indicator_color3 CLR_NONE, clrGreen, clrDarkRed #property indicator_style3 STYLE_DOT #property indicator_width3 1 // #define hlBufferIndex 6 double hlBuffer[]; // #define wmaBufferIndex 7 double wmaBuffer[]; // #define tmpBufferIndex 8 double tmpBuffer[]; // #define diffBufferIndex 9 double diffBuffer[]; // #define upBufferIndex 10 double upBuffer[]; // #define downBufferIndex 11 double downBuffer[]; // #define directionBufferIndex 12 double directionBuffer[]; // // Variables ... // int maPeriod; double kpi; // // Event Handlers ... // // Initialization ... int OnInit() { // // Validate Inputs ... if (!ValidateInputs()) { return INIT_PARAMETERS_INCORRECT; } // maPeriod = int(length < 1 ? 1 : length); double n1 = 2.0 * double(maPeriod - 1); kpi = 2.0 / (n1 + 1); // // Define Index Buffers ... DefineBuffers(); // // Set Indicator ShortName ... SetIndicatorName(); // // Init Succeed ... return INIT_SUCCEEDED; } // // DeInitialization ... void OnDeinit(const int reason) { // // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function // REASON_REMOVE 1 Program removed from a chart // REASON_RECOMPILE 2 Program recompiled // REASON_CHARTCHANGE 3 A symbol or a chart period is changed // REASON_CHARTCLOSE 4 Chart closed // REASON_PARAMETERS 5 Inputs changed by a user // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings // REASON_TEMPLATE 7 Another chart template applied // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value // REASON_CLOSE 9 Terminal closed } // // Calculating what we want ... int OnCalculate( const int rates_total, // Total Bars on Chart ... const int prev_calculated, // Total Calculated Bars on Charts ... const datetime &time[], // History of Open Time ... const double &open[], // History of Open Price ... const double &high[], // History of High Price ... const double &low[], // History of Low Price ... const double &close[], // History of Close Price ... const long &tick_volume[], // History of Tick Volumes on Bar ... const long &volume[], // History of Trade Volumes ... const int &spread[] // History of Spread Price ... ) { // ArraySetAsSeries(high, true); ArraySetAsSeries(low, true); ArraySetAsSeries(close, true); // if (rates_total < maPeriod) { return 0; } // int limit = rates_total - prev_calculated; if (limit > 1) { // limit = rates_total - 2; // ArrayInitialize(atslBuffer, EMPTY_VALUE); ArrayInitialize(hlBuffer, 0); ArrayInitialize(diffBuffer, 0); ArrayInitialize(wmaBuffer, 0); ArrayInitialize(tmpBuffer, 0); } // for (int i = limit; i >= 0 && !IsStopped(); i--) { // hlBuffer[i] = high[i] - low[i]; // double href = 0; double lref = 0; // double sma = MAOnArray(hlBuffer, 0, maPeriod, 0, MODE_SMA, i); double hiLo = fmin(hlBuffer[i], sma); // href = (low[i] <= high[i + 1] ? high[i] - close[i + 1] : (hlBuffer[i] - close[i + 1] + high[i + 1]) / 2); lref = (high[i] >= low[i + 1] ? close[i + 1] - low[i] : (close[i + 1] - low[i + 1] + hlBuffer[i]) / 2); // diffBuffer[i] = fmax(hiLo, fmax(href, lref)); } // for (int i = limit; i >= 0 && !IsStopped(); i--) { // if (i == rates_total - 2) { wmaBuffer[i] = MAOnArray(diffBuffer, 0, maPeriod, 0, MODE_EMA, i); } else { wmaBuffer[i] = (diffBuffer[i] - wmaBuffer[i + 1]) * kpi + wmaBuffer[i + 1]; } } // for (int i = limit; i >= 0 && !IsStopped(); i--) { // double loss = wmaBuffer[i] * coeff; if (close[i] > tmpBuffer[i + 1] && close[i + 1] > tmpBuffer[i + 1]) { // tmpBuffer[i] = fmax(tmpBuffer[i + 1], close[i] - loss); // atslBuffer[i] = tmpBuffer[i]; } else { // if (close[i] < tmpBuffer[i + 1] && close[i + 1] < tmpBuffer[i + 1]) { // tmpBuffer[i] = fmin(tmpBuffer[i + 1], close[i] + loss); // atslBuffer[i] = tmpBuffer[i]; } else { // if (close[i] > tmpBuffer[i + 1]) { // tmpBuffer[i] = close[i] - loss; // atslBuffer[i] = tmpBuffer[i]; } else { // tmpBuffer[i] = close[i] + loss; // atslBuffer[i] = tmpBuffer[i]; } } } // // Define Color Buffer ... double clrValue = !showATSL ? hideColorIDX : atslBuffer[i] > close[i] ? bearColorIDX : bullColorIDX; atslBufferColor[i] = clrValue; } // return rates_total; } // // Custom Functions ... // // Validate Input Args for Initialization ... bool ValidateInputs() { // bool result = false; // result = length >= 2 && coeff > 0; // return result; } // // Set Indicator Short Name and also we can define Buffers Labels ... void SetIndicatorName() { IndicatorSetString(INDICATOR_SHORTNAME, ShortName); } // // Define Indexes and Styles ... // void DefineBuffers() { // // Main ... ENUM_DRAW_TYPE mainDrawType = show ? DRAW_COLOR_LINE : DRAW_NONE; // ArraySetAsSeries(mainBuffer, true); ArraySetAsSeries(mainBufferColor, true); PlotIndexSetInteger(mainBufferIndex, PLOT_SHOW_DATA, show); SetIndexBuffer(mainBufferIndex, mainBuffer, INDICATOR_DATA); PlotIndexSetInteger(mainBufferIndex, PLOT_DRAW_TYPE, mainDrawType); SetIndexBuffer(mainBufferColorIndex, mainBufferColor, INDICATOR_COLOR_INDEX); // // XATSL ... ENUM_DRAW_TYPE atslDrawType = showATSL ? DRAW_COLOR_LINE : DRAW_NONE; // ArraySetAsSeries(atslBuffer, true); ArraySetAsSeries(atslBufferColor, true); SetIndexBuffer(atslBufferIndex, atslBuffer, INDICATOR_DATA); SetIndexBuffer(atslBufferColorIndex, atslBufferColor, INDICATOR_COLOR_INDEX); PlotIndexSetInteger(atslBufferPlotIndex, PLOT_SHOW_DATA, showATSL); PlotIndexSetInteger(atslBufferPlotIndex, PLOT_DRAW_TYPE, atslDrawType); // // XHTD ... ENUM_DRAW_TYPE htdDrawType = showHTD ? DRAW_COLOR_LINE : DRAW_NONE; // SetIndexBuffer(htdBufferIndex, htdBuffer, INDICATOR_DATA); SetIndexBuffer(htdBufferColorIndex, htdBufferColor, INDICATOR_COLOR_INDEX); PlotIndexSetInteger(htdBufferPlotIndex, PLOT_SHOW_DATA, showHTD); PlotIndexSetInteger(htdBufferPlotIndex, PLOT_DRAW_TYPE, htdDrawType); // ArraySetAsSeries(hlBuffer, true); SetIndexBuffer(hlBufferIndex, hlBuffer, INDICATOR_CALCULATIONS); // ArraySetAsSeries(wmaBuffer, true); SetIndexBuffer(wmaBufferIndex, wmaBuffer, INDICATOR_CALCULATIONS); // ArraySetAsSeries(tmpBuffer, true); SetIndexBuffer(tmpBufferIndex, tmpBuffer, INDICATOR_CALCULATIONS); // ArraySetAsSeries(diffBuffer, true); SetIndexBuffer(diffBufferIndex, diffBuffer, INDICATOR_CALCULATIONS); // SetIndexBuffer(upBufferIndex, upBuffer, INDICATOR_CALCULATIONS); SetIndexBuffer(downBufferIndex, downBuffer, INDICATOR_CALCULATIONS); SetIndexBuffer(directionBufferIndex, directionBuffer, INDICATOR_CALCULATIONS); } // // Hull Handler ... double workHull[][2]; double iHull( double price, double period, int r, int bars, int instanceNo = 0 // ) { // if (ArrayRange(workHull, 0) != bars) { ArrayResize(workHull, bars); } // int HmaPeriod = (int)MathMax(period, 2); int HalfPeriod = (int)MathFloor(HmaPeriod / 2); int HullPeriod = (int)MathFloor(MathSqrt(HmaPeriod)); double hma, hmw, weight; instanceNo *= 2; // workHull[r][instanceNo] = price; // hmw = HalfPeriod; hma = hmw * price; for (int k = 1; k < HalfPeriod && (r - k) >= 0; k++) { // weight = HalfPeriod - k; hmw += weight; hma += weight * workHull[r - k][instanceNo]; } workHull[r][instanceNo + 1] = 2.0 * hma / hmw; // hmw = HmaPeriod; hma = hmw * price; for (int k = 1; k < period && (r - k) >= 0; k++) { // weight = HmaPeriod - k; hmw += weight; hma += weight * workHull[r - k][instanceNo]; } workHull[r][instanceNo + 1] -= hma / hmw; // hmw = HullPeriod; hma = hmw * workHull[r][instanceNo + 1]; for (int k = 1; k < HullPeriod && (r - k) >= 0; k++) { // weight = HullPeriod - k; hmw += weight; hma += weight * workHull[r - k][1 + instanceNo]; } // return (hma / hmw); } // double getPrice(ENUM_APPLIED_PRICE price, const double &open[], const double &close[], const double &high[], const double &low[], int i, int bars) { switch (price) { case PRICE_CLOSE: return (close[i]); case PRICE_OPEN: return (open[i]); case PRICE_HIGH: return (high[i]); case PRICE_LOW: return (low[i]); case PRICE_MEDIAN: return ((high[i] + low[i]) / 2.0); case PRICE_TYPICAL: return ((high[i] + low[i] + close[i]) / 3.0); case PRICE_WEIGHTED: return ((high[i] + low[i] + close[i] + close[i]) / 4.0); // case PRICE_AVERAGE: return((high[i]+low[i]+close[i]+open[i])/4.0); } return (0); } //