/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Helper Class Library // ---------------------------------------------- // Name: XSCXZGHelper // Description: provides all Indicator // Helper requirements ... // // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // ////////////////////////////////////////////////////// // // Global Properties ... #property library #property copyright "Copyright 2023, SaherElm IT Center" #property link "https://www.saherelm.ir" #property version "1.00" #property strict // // Imports ... #include "../Classes/x-saherelm.xhelper.class.mq5" // // Definitions ... // // How to Calculate Up and Down Price ... enum ENUM_X_ZG_PRICE_MODE { // X_ZG_PRICE_HIGH_LOW_MODE = 1, X_ZG_PRICE_OPEN_CLOSE_MODE = 2, }; // enum ENUM_XZG_BUFFERS { // XZG_MAIN_LINE = 0, XZG_PEAKSANDVALES_LINE = 2, XZG_HIGHS_LINE = 4, XZG_LOWS_LINE = 5, }; // // Input Models ... struct XZGInputs { // // Props ... // // Market ... int depth; // Depth int deviation; // Deviation int backStep; // Back Step ENUM_X_ZG_PRICE_MODE mode; // Mode // // Presentation ... bool showZigZag; // Show ZigZag bool showPeaksAndVales; // Show Peaks and Vales // // Constructor(s) ... XZGInputs() { // Clean(); } // // Tools ... // // Clean ... void Clean() { // // Market ... depth = 0; deviation = 0; backStep = 0; mode = X_ZG_PRICE_HIGH_LOW_MODE; // // Presentation ... showZigZag = false; showPeaksAndVales = false; } // // Default ... void Default() { // // Market ... depth = 12; deviation = 5; backStep = 3; mode = X_ZG_PRICE_HIGH_LOW_MODE; // // Presentation ... showZigZag = true; showPeaksAndVales = true; } // // Validate ... bool IsValid() { // bool result = false; // result = // depth > 0 && deviation > 0 && backStep > 0 // ; // return result; } // // Retrieve MAx Length ... int Max() { // int result = 0; // result = MathMax(backStep, depth); // return result; } }; // // Class ... class XSCXZGHelper : public XSCBaseHelper { // // Public ... public: // // Props ... // // Constructors ... XSCXZGHelper() : XSCBaseHelper(_Symbol, _Period) { } // // Deconstructor ... ~XSCXZGHelper() {} // // Tools ... bool Init( string symbol, // Trading Symbol ENUM_TIMEFRAMES period, // Trading Period XZGInputs &inputs // Inputs ) { // bool result = false; // mSymbol = symbol; mPeriod = period; // result = inputs.IsValid(); if (!result) { return result; } // mInputs = inputs; // ArraySetAsSeries(mainBuffer, true); ArraySetAsSeries(PeaksAndValesBuffer, true); ArraySetAsSeries(highsBuffer, true); ArraySetAsSeries(lowsBuffer, true); // mHandler = iCustom( mSymbol, mPeriod, "x-saherelm.xzg", // // Inputs ... // // Market ... "", mInputs.depth, // Depth mInputs.deviation, // Deviation mInputs.backStep, // Back Step mInputs.mode, // Mode // // Presentation ... "", mInputs.showZigZag, // Show ZigZag mInputs.showPeaksAndVales // Show Peaks and Vales // ); result = mHandler != INVALID_HANDLE; if (!result) { return result; } // return result; } // // Inputs ... // XZGInputs GetInputs() { return mInputs; } // bool SetInputs( XZGInputs &inputs // Configs ) { // return Init( mSymbol, mPeriod, inputs // ); } // // Buffers ... // double GetMain( int barIndex // Bar Index ) { // if (barIndex < 0) { barIndex = 0; } // Calculate(); // int count = ArraySize(mainBuffer); if (barIndex >= count) { barIndex = count - 1; } // return mainBuffer[barIndex]; } // // Copy Required Items ... int CopyMain( int start, // Start int count, // Number of Items for read double &buffer[], // Dest Buffer bool forceClean = true // Force To Clean buffer ) { // // Update Calculations ... Calculate(); // // Copy Items ... return Copy( start, count, mainBuffer, buffer, forceClean // ); } // double GetPeaksAndVales( int barIndex // Bar Index ) { // if (barIndex < 0) { barIndex = 0; } // Calculate(); // int count = ArraySize(PeaksAndValesBuffer); if (barIndex >= count) { barIndex = count - 1; } // return PeaksAndValesBuffer[barIndex]; } // // Copy Required Items ... int CopyPeaksAndVales( int start, // Start int count, // Number of Items for read double &buffer[], // Dest Buffer bool forceClean = true // Force To Clean buffer ) { // // Update Calculations ... Calculate(); // // Copy Items ... return Copy( start, count, PeaksAndValesBuffer, buffer, forceClean // ); } // double GetHigh( int barIndex // Bar Index ) { // if (barIndex < 0) { barIndex = 0; } // Calculate(); // int count = ArraySize(highsBuffer); if (barIndex >= count) { barIndex = count - 1; } // return highsBuffer[barIndex]; } // // Copy Required Items ... int CopyHigh( int start, // Start int count, // Number of Items for read double &buffer[], // Dest Buffer bool forceClean = true // Force To Clean buffer ) { // // Update Calculations ... Calculate(); // // Copy Items ... return Copy( start, count, highsBuffer, buffer, forceClean // ); } // double GetLow( int barIndex // Bar Index ) { // if (barIndex < 0) { barIndex = 0; } // Calculate(); // int count = ArraySize(lowsBuffer); if (barIndex >= count) { barIndex = count - 1; } // return lowsBuffer[barIndex]; } // // Copy Required Items ... int CopyLow( int start, // Start int count, // Number of Items for read double &buffer[], // Dest Buffer bool forceClean = true // Force To Clean buffer ) { // // Update Calculations ... Calculate(); // // Copy Items ... return Copy( start, count, lowsBuffer, buffer, forceClean // ); } // // Protected ... protected: // // Private ... private: // // Props ... XZGInputs mInputs; // Inputs ... // // Buffers ... double mainBuffer[]; double PeaksAndValesBuffer[]; double highsBuffer[]; double lowsBuffer[]; // // Tools ... // // Calculate Values Until Now ... void Calculate() { // int totalBars = CountBars(); // // Main Buffer ... CopyBuffer( mHandler, XZG_MAIN_LINE, 0, totalBars, mainBuffer // ); // // Peaks and Vales Buffer ... CopyBuffer( mHandler, XZG_PEAKSANDVALES_LINE, 0, totalBars, PeaksAndValesBuffer // ); // // Highs Buffer ... CopyBuffer( mHandler, XZG_HIGHS_LINE, 0, totalBars, highsBuffer // ); // // Lows Buffer ... CopyBuffer( mHandler, XZG_LOWS_LINE, 0, totalBars, lowsBuffer // ); } }; // // Tools ...