///////////////////////////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 XTM Indicator Helper for Signal Providers // -------------------------------------------------------------------------- // // 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 // // Includes ... #include "..\Libraries\x-saherelm.log.lib.mq5" #include "..\Libraries\x-saherelm.common.lib.mq5" // // START Enum Definitions ... // // // XTM Indicator States ... enum ENUM_X_XTM_STATES { X_XTM_BULLISH = 1, X_XTM_BEARISH = -1, X_XTM_NEUTURAL = 0, }; // // XTM Indicator Buffer Lines ... enum ENUM_X_XTM_BUFFER_LINES { X_XTM_MA_LINE = 0, X_XTM_MC_COLOR_LINE = 1, X_XTM_STATE_LINE = 2, }; // // END Enum Definitions ... // // // START Inputs ... // input group "XTM Indicator"; input int xTMMaPeriod = 18; // Period input int xTMMaShift = 0; // Shift input ENUM_MA_METHOD xTMMaMethod = MODE_EMA; // Method input ENUM_APPLIED_PRICE xTMMaAppliedTo = PRICE_OPEN; // Applied To // // END Inputs ... // // // START Definitions ... // int xTMHandler = INVALID_HANDLE; double xTMMaBuffer[]; double xTMStateBuffer[]; // // END Definitions ... // // // START Handler Functions ... // // // Init Indicators ... bool XTMInitHandlers() { // bool result = false; // // Initialize Indicator/Oscillator Handlers ... ResetLastError(); // // XTM Handler ... ArraySetAsSeries(xTMMaBuffer, true); ArraySetAsSeries(xTMStateBuffer, true); xTMHandler = iCustom( _Symbol, _Period, "x-saherelm.xtm.indicator", // // Inputs ... xTMMaPeriod, xTMMaShift, xTMMaMethod, xTMMaAppliedTo); if (xTMHandler == INVALID_HANDLE) { // LogMessage("failed to Initialize XTM Indicator: " + (string)GetLastError()); return result; } // result = true; // return result; } // // Release Indicators ... void XTMReleaseHandlers() { IndicatorRelease(xTMHandler); } // // Handle Reading Buffers ... void XTMReadBuffers( int xTMItemsPerTick // Number Of Reading Buffer Items Per Tick ) { // // Ma Buffer ... CopyBuffer( xTMHandler, X_XTM_MA_LINE, 0, xTMItemsPerTick, xTMMaBuffer); // // State Buffer ... CopyBuffer( xTMHandler, X_XTM_STATE_LINE, 0, xTMItemsPerTick, xTMStateBuffer); } // // END Handler Funcions ... // // // START XTM Custom Functions ... // // // Find Peak based On this Indicator ... bool XTMIsPeak( int bar_index, // Specified Index ... int length = 10 // Specified Length ... ) { // bool result = false; // if ( length <= 0 || bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + length + 1)) { return result; } // // Must Decreasing ... bool isIncreasing = IsIncreasing( bar_index + length, bar_index, xTMMaBuffer // ); // return result; } // // Find Vale based On this Indicator ... bool XTMIsVale( int bar_index, // Specified Index ... int length = 10 // Specified Length ... ) { // bool result = false; // if ( length <= 0 || bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + length + 1)) { return result; } // result = IsDecreasing( bar_index + length, bar_index, xTMMaBuffer // ); // return result; } // // Check TM Crossed Up ... bool XTMIsStartBullish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xTMStateBuffer[bar_index] == X_XTM_BULLISH && xTMStateBuffer[bar_index + 1] != X_XTM_BULLISH // ; // return result; } // // Check TM Crossed Up After Neutural State ... bool XTMIsStartBullishAfterNeutural( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xTMStateBuffer[bar_index] == X_XTM_BULLISH && xTMStateBuffer[bar_index + 1] == X_XTM_NEUTURAL // ; // return result; } // // Check TM In Up State ... bool XTMIsBullish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + 1)) { return result; } // result = // xTMStateBuffer[bar_index] == X_XTM_BULLISH // ; // return result; } // // Check TM Ends Up State ... bool XTMIsEndBullish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xTMStateBuffer[bar_index] != X_XTM_BULLISH && xTMStateBuffer[bar_index + 1] == X_XTM_BULLISH // ; // return result; } // // Check TM Ends Up State By Neutural ... bool XTMIsEndBullishByNeutural( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xTMStateBuffer[bar_index] == X_XTM_NEUTURAL && xTMStateBuffer[bar_index + 1] == X_XTM_BULLISH // ; // return result; } // // Check TM Crossed Down ... bool XTMIsStartBearish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xTMStateBuffer[bar_index] == X_XTM_BEARISH && xTMStateBuffer[bar_index + 1] != X_XTM_BEARISH // ; // return result; } // // Check TM Crossed Down After Neutural State ... bool XTMIsStartBearishAfterNeutural( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xTMStateBuffer[bar_index] == X_XTM_BEARISH && xTMStateBuffer[bar_index + 1] == X_XTM_NEUTURAL // ; // return result; } // // Check TM In Down State ... bool XTMIsBearish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + 1)) { return result; } // result = // xTMStateBuffer[bar_index] == X_XTM_BEARISH // ; // return result; } // // Check TM Ends Down State ... bool XTMIsEndBearish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xTMStateBuffer[bar_index] != X_XTM_BEARISH && xTMStateBuffer[bar_index + 1] == X_XTM_BEARISH // ; // return result; } // // Check TM Ends Down State By Neutural ... bool XTMIsEndBearishByNeutural( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xTMStateBuffer[bar_index] == X_XTM_NEUTURAL && xTMStateBuffer[bar_index + 1] == X_XTM_BEARISH // ; // return result; } // // Check TM In Neutural State ... bool XTMIsNeutural( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XTMIsValidBuffersSize(bar_index + 1)) { return result; } // result = // xTMStateBuffer[bar_index] == X_XTM_NEUTURAL // ; // return result; } // // Check all Buffers has valid Size ... bool XTMIsValidBuffersSize( int size // the size of buffers which min size for requirements ) { // bool result = false; // if ( size <= 0 || // ArraySize(xTMMaBuffer) < size || ArraySize(xTMStateBuffer) < size // ) { result = false; } else { result = true; } // return result; } // // END XTM Custom Functions ... //