////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Indicator // --------------------------------------------- // Name: X121_XSTR // Description: Super Trend Indicator ... // // // 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 X121_XAMA Indicator" #property strict // // START Constants ... // #define ShortName "X121_XSTR" // // END Constants ... // // // START Inputs ... // // // Market ... input group "ATR"; input int atrLength = 14; // Length input double atrMultiplier = 3.0; // Multiplier // // Presentation ... input group "Presentation"; input bool showTrueRange = true; // Show True Range input bool showAverageTrueRange = true; // Show Average True Range // // END Inputs ... // // // Includes Common Library ... #include #include "../Libraries/x-saherelm.common.lib.mq5" // // START Buffers ... // // #property indicator_separate_window // #property indicator_buffers 4 #property indicator_plots 4 // #define atrBUfferIndex 0 double atrBuffer[]; // #define atrColorBUfferIndex 1 double atrColorBuffer[]; // #property indicator_label1 "X121_XSTR ATR" #property indicator_type1 DRAW_COLOR_LINE #property indicator_color1 clrGreen, CLR_NONE #property indicator_style1 STYLE_DOT // #define trBUfferIndex 2 double trBuffer[]; // #define trColorBUfferIndex 3 double trColorBuffer[]; // #property indicator_label2 "X121_XSTR TR" #property indicator_type2 DRAW_COLOR_LINE #property indicator_color2 clrGainsboro, CLR_NONE #property indicator_style2 STYLE_DOT // // END Buffers ... // // // START Global Definitions: Variables, Properties and etc ... // // int maxLength; // // // END Global Definitions: Variables, Properties and etc ... // // // START Event Handlers ... // // // Initialization ... int OnInit() { // // Validate Inputs ... if (!ValidateInputs()) { return INIT_PARAMETERS_INCORRECT; } // // because in some cases we may have more than one input for // calculation and we must prevent any calculation // untill we pass the biggest input length, here we get max Input length // and then wait until pass it ... maxLength = ExtractMaxLengthOfInputs(); // // 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 // // Here we can handle De Initialization Reasons ... } // // Calculating what we want ... int OnCalculate( // // total Candles on chart ... const int rates_total, // // total calculated Candles on charts ... const int prev_calculated, // // history of Candles Open Time ... const datetime &time[], // // history of Candles Open Price ... const double &open[], // // history of Candles High Price ... const double &high[], // // history of Candles Low Price ... const double &low[], // // history of Candles Close Price ... const double &close[], // // history of Tick Volumes on Candle ... const long &tick_volume[], // // history of Trade Volumes ... const long &volume[], // // history of Candles Spread Price ... const int &spread[]) { // // Prepare Buffers ... // ArraySetAsSeries(time, true); // ArraySetAsSeries(open, true); // ArraySetAsSeries(high, true); // ArraySetAsSeries(low, true); // ArraySetAsSeries(close, true); // ArraySetAsSeries(tick_volume, true); // ArraySetAsSeries(volume, true); // ArraySetAsSeries(spread, true); // // this counts Available Bars ... int limit; // if (rates_total <= maxLength) { return 0; } // if (prev_calculated == 0) { // trBuffer[0] = 0.0; // for (int i = 1; i < rates_total && !IsStopped(); i++) { // double iTr = MathMax(high[i], close[i - 1]) - MathMin(low[i], close[i - 1]); trBuffer[i] = iTr; } // // Calculate First ATR Value ... double firstATRValue = 0.0; for (int i = 1; i < atrLength; i++) { // atrBuffer[i] = 0.0; firstATRValue += trBuffer[i]; } firstATRValue /= atrLength; atrBuffer[atrLength] = firstATRValue; // limit = atrLength + 1; } else { limit = prev_calculated -1; } // // Main Loop ... for (int i = limit; i = 2 // ; // return result; } // // Retrieve all Exists Input Max Length ... // use for Start Of Drawing ... int ExtractMaxLengthOfInputs() { // int result = 0; // result = atrLength; // 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() { // // PLOT Buffers ... // // AVERAGETRUERANGE ... // // Buffer ... // ArraySetAsSeries(atrBuffer, true); SetIndexBuffer(atrBUfferIndex, atrBuffer, INDICATOR_DATA); PlotIndexSetInteger(atrBUfferIndex, PLOT_SHOW_DATA, showAverageTrueRange); // // Color ... // ArraySetAsSeries(atrColorBuffer, true); SetIndexBuffer(atrColorBUfferIndex, atrColorBuffer, INDICATOR_COLOR_INDEX); // // TRUERANGE ... // // Buffer ... // ArraySetAsSeries(trBuffer, true); SetIndexBuffer(trBUfferIndex, trBuffer, INDICATOR_DATA); PlotIndexSetInteger(trBUfferIndex, PLOT_SHOW_DATA, showTrueRange); // // Color ... // ArraySetAsSeries(trColorBuffer, true); SetIndexBuffer(trColorBUfferIndex, trColorBuffer, INDICATOR_COLOR_INDEX); // // DATA Buffers ... } // // END Functions ... //