///////////////////////////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 XAMA 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 ... // // // XAMA Indicator States ... enum ENUM_X_XAMA_STATES { X_XAMA_BULLISH = 1, X_XAMA_BEARISH = -1, X_XAMA_NEUTURAL = 0, }; // // XAMA Indicator Buffer Lines ... enum ENUM_X_XAMA_BUFFER_LINES { X_XAMA_MA_LINE = 0, X_XAMA_MC_COLOR_LINE = 1, X_XAMA_STATE_LINE = 2, }; // // END Enum Definitions ... // // // START Inputs ... // // input group "XAMA Indicator"; // // input int xAMALength = 18; // Market Length // input int xAMAFastEMA = 2; // Fast EMA Period // input int xAMASlowEMA = 30; // Slow EMA Period // input int xAMAShift = 0; // Shift // input ENUM_APPLIED_PRICE xAMAAppliedTo = PRICE_CLOSE; // Applied To // // Configurations ... int xAMALength = 18; // Market Length int xAMAFastEMA = 2; // Fast EMA Period int xAMASlowEMA = 30; // Slow EMA Period int xAMAShift = 0; // Shift ENUM_APPLIED_PRICE xAMAAppliedTo = PRICE_CLOSE; // Applied To // // END Inputs ... // // // START Definitions ... // int xAMAHandler = INVALID_HANDLE; double xAMAMaBuffer[]; double xAMAStateBuffer[]; // // END Definitions ... // // // START Handler Functions ... // // // Validate Inputs ... bool XAMAValidateInputs() { // bool result = false; // result = xAMALength > 2 && xAMAFastEMA < xAMALength && xAMAFastEMA < xAMASlowEMA && xAMAShift >= 0; // if (!result) { // LogMessage("XAMA Indicator Inputs Validation Failed ..."); } // return result; } // // Init Indicators ... bool XAMAInitHandlers() { // bool result = false; // // Initialize Indicator/Indicator Handlers ... ResetLastError(); // // XAMA Handler ... ArraySetAsSeries(xAMAMaBuffer, true); ArraySetAsSeries(xAMAStateBuffer, true); xAMAHandler = iCustom( _Symbol, _Period, "x-saherelm.xama.indicator", // // Inputs ... xAMALength, xAMAFastEMA, xAMASlowEMA, xAMAShift, xAMAAppliedTo // ); if (xAMAHandler == INVALID_HANDLE) { // LogMessage("failed to Initialize XAMA Indicator: " + (string)GetLastError()); return result; } // result = true; // return result; } // // Release Indicators ... void XAMAReleaseHandlers() { IndicatorRelease(xAMAHandler); } // // Handle Reading Buffers ... void XAMAReadBuffers( int xAMAItemsPerTick // Number Of Reading Buffer Items Per Tick ) { // // XAMA Ma Buffer ... CopyBuffer( xAMAHandler, X_XAMA_MA_LINE, 0, xAMAItemsPerTick, xAMAMaBuffer); // // XAMA State Buffer ... CopyBuffer( xAMAHandler, X_XAMA_STATE_LINE, 0, xAMAItemsPerTick, xAMAStateBuffer); } // // END Handler Funcions ... // // // START XAMA Custom Functions ... // // // Check SC is Peak ... bool XAMAIsPeak( int bar_index, // Specified Index ... int length = 10 // Specified Length ... ) { // bool result = false; // if ( length <= 0 || bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + length + 1)) { return result; } // // Must Decreasing ... bool isIncreasing = IsIncreasing( bar_index + length, bar_index, xAMAMaBuffer // ); // return result; } // // Check SC is Vale ... bool XAMAIsVale( int bar_index, // Specified Index ... int length = 10 // Specified Length ... ) { // bool result = false; // if ( length <= 0 || bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + length + 1)) { return result; } // result = IsDecreasing( bar_index + length, bar_index, xAMAMaBuffer // ); // return result; } // // Check TM Crossed Up ... bool XAMAIsStartBullish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xAMAStateBuffer[bar_index] == X_XAMA_BULLISH && xAMAStateBuffer[bar_index + 1] != X_XAMA_BULLISH // ; // return result; } // // Check TM Crossed Up After Neutural State ... bool XAMAIsStartBullishAfterNeutural( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xAMAStateBuffer[bar_index] == X_XAMA_BULLISH && xAMAStateBuffer[bar_index + 1] == X_XAMA_NEUTURAL // ; // return result; } // // Check TM In Up State ... bool XAMAIsBullish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + 1)) { return result; } // result = // xAMAStateBuffer[bar_index] == X_XAMA_BULLISH // ; // return result; } // // Check TM Ends Up State ... bool XAMAIsEndBullish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xAMAStateBuffer[bar_index] != X_XAMA_BULLISH && xAMAStateBuffer[bar_index + 1] == X_XAMA_BULLISH // ; // return result; } // // Check TM Ends Up State By Neutural ... bool XAMAIsEndBullishByNeutural( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xAMAStateBuffer[bar_index] == X_XAMA_NEUTURAL && xAMAStateBuffer[bar_index + 1] == X_XAMA_BULLISH // ; // return result; } // // Check TM Crossed Down ... bool XAMAIsStartBearish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xAMAStateBuffer[bar_index] == X_XAMA_BEARISH && xAMAStateBuffer[bar_index + 1] != X_XAMA_BEARISH // ; // return result; } // // Check TM Crossed Down After Neutural State ... bool XAMAIsStartBearishAfterNeutural( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xAMAStateBuffer[bar_index] == X_XAMA_BEARISH && xAMAStateBuffer[bar_index + 1] == X_XAMA_NEUTURAL // ; // return result; } // // Check TM In Down State ... bool XAMAIsBearish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + 1)) { return result; } // result = // xAMAStateBuffer[bar_index] == X_XAMA_BEARISH // ; // return result; } // // Check TM Ends Down State ... bool XAMAIsEndBearish( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xAMAStateBuffer[bar_index] != X_XAMA_BEARISH && xAMAStateBuffer[bar_index + 1] == X_XAMA_BEARISH // ; // return result; } // // Check TM Ends Down State By Neutural ... bool XAMAIsEndBearishByNeutural( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + 2)) { return result; } // result = // xAMAStateBuffer[bar_index] == X_XAMA_NEUTURAL && xAMAStateBuffer[bar_index + 1] == X_XAMA_BEARISH // ; // return result; } // // Check TM In Neutural State ... bool XAMAIsNeutural( int bar_index // Specified Index ... ) { // bool result = false; // if ( bar_index <= 0 || !XAMAIsValidBuffersSize(bar_index + 1)) { return result; } // result = // xAMAStateBuffer[bar_index] == X_XAMA_NEUTURAL // ; // return result; } // // Check all Buffers has valid Size ... bool XAMAIsValidBuffersSize( int size // the size of buffers which min size for requirements ) { // bool result = false; // if ( size <= 0 || // ArraySize(xAMAMaBuffer) < size // ) { result = false; } else { result = true; } // return result; } // // END XAMA Custom Functions ... //