//////////////////////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 XTD Oscillator 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 // #include "..\Libraries\x-saherelm.log.lib.mq5" #include "..\Libraries\x-saherelm.common.lib.mq5" #include "x-saherelm.xmap.provider.inputs.lib.mq5" // // START Enum Definitions ... // // // XTD Oscillator States ... enum ENUM_X_XTD_STATES { X_XTD_BULLISH_CROSSED_OVER_BEARISH = 2, X_XTD_BULLISH_OVER_BEARISH = 1, X_XTD_NEUTURAL = 0, X_XTD_BULLISH_UNDER_BEARISH = -1, X_XTD_BULLISH_CROSSED_UNDER_BEARISH = -2 }; // // XTD Oscillator Buffer Lines ... enum ENUM_X_XTD_BUFFER_LINES { X_XTD_BULLISH_POWER_LINE = 0, X_XTD_BEARISH_POWER_LINE = 1, X_XTD_SIGNAL_LINE = 2, }; // // END Enum Definitions ... // // // START Inputs ... // input group "XTD Oscillator"; input int xTDLength = 28; // Market Length input bool xTDDrawCrosses = false; // Draw Cross Arrows input uchar xTDBullishArrowCode = 228; // Cross Over Arrow Code input color xTDBullishArrowColor = clrAqua; // Cross Over Arrow Color input uchar xTDBearishArrowCode = 230; // Cross Under Arrow Code input color xTDBearishArrowColor = clrMagenta; // Cross Under Arrow Color // // END Inputs ... // // // START Definitions ... // int xTDHandler = INVALID_HANDLE; double xTDBullishBuffer[]; double xTDBearishBuffer[]; double xTDSignalBuffer[]; // // END Definitions ... // // // START Handler Functions ... // // // Init Indicators ... bool XTDInitHandlers() { // bool result = false; // // Initialize Indicator/Oscillator Handlers ... ResetLastError(); // // XTD Handler ... ArraySetAsSeries(xTDBullishBuffer, true); ArraySetAsSeries(xTDBearishBuffer, true); ArraySetAsSeries(xTDSignalBuffer, true); xTDHandler = iCustom( _Symbol, _Period, "x-saherelm.xtd.oscillator", // // Inputs ... xTDLength, xTDDrawCrosses, xTDBullishArrowCode, xTDBullishArrowColor, xTDBearishArrowCode, xTDBearishArrowColor); if (xTDHandler == INVALID_HANDLE) { // LogMessage("failed to Initialize XTD Oscillator: " + (string)GetLastError()); return result; } // result = true; // return result; } // // Release Indicators ... void XTDReleaseHandlers() { IndicatorRelease(xTDHandler); } // // Handle Reading Buffers ... void XTDReadBuffers() { // // XTD Bullish Buffer ... CopyBuffer( xTDHandler, X_XTD_BULLISH_POWER_LINE, 0, xMAPNumberOfItemsPerTick, xTDBullishBuffer); // // XTD Bullish Buffer ... CopyBuffer( xTDHandler, X_XTD_BEARISH_POWER_LINE, 0, xMAPNumberOfItemsPerTick, xTDBearishBuffer); // // XTD Signal Buffer ... CopyBuffer( xTDHandler, X_XTD_SIGNAL_LINE, 0, xMAPNumberOfItemsPerTick, xTDSignalBuffer); } // // END Handler Funcions ... // // // START XTD Custom Functions ... // // // Find Peak based On this Indicator ... bool XTDIsPeak( int loopback // loopback length ) { // bool result = false; // return result; } // // Find Vale based On this Indicator ... bool XTDIsVale( int loopback // loopback length ) { // bool result = false; // return result; } // // Check Bull Crossed Over Bear ... bool XTDIsBullCrossedOverBear( int bar_index // sepcified Bar Index ) { // bool result = false; // result = xTDBullishBuffer[bar_index] > xTDBearishBuffer[bar_index] && xTDBullishBuffer[bar_index + 1] <= xTDBearishBuffer[bar_index + 1]; // return result; } // // Check Bull Crossed Under Bear ... bool XTDIsBullCrossedUnderBear( int bar_index // sepcified Bar Index ) { // bool result = false; // result = xTDBullishBuffer[bar_index] < xTDBearishBuffer[bar_index] && xTDBullishBuffer[bar_index + 1] >= xTDBearishBuffer[bar_index + 1]; // return result; } // // Check Signal Crossed Over Bear ... bool XTDIsSignalCrossedOverBear( int bar_index // sepcified Bar Index ) { // bool result = false; // result = xTDSignalBuffer[bar_index] > xTDBearishBuffer[bar_index] && xTDSignalBuffer[bar_index + 1] <= xTDBearishBuffer[bar_index + 1]; // return result; } // // Check Signal Crossed Under Bear ... bool XTDIsSignalCrossedUnderBear( int bar_index // sepcified Bar Index ) { // bool result = false; // result = xTDSignalBuffer[bar_index] < xTDBearishBuffer[bar_index] && xTDSignalBuffer[bar_index + 1] >= xTDBearishBuffer[bar_index + 1]; // return result; } // // Check Bull Over Bear ... bool XTDIsBullOverBear( int bar_index // sepcified Bar Index ) { // bool result = false; // result = xTDBullishBuffer[bar_index] > xTDBearishBuffer[bar_index]; // return result; } // // Check Bull Under Bear ... bool XTDIsBullUnderBear( int bar_index // sepcified Bar Index ) { // bool result = false; // result = xTDBullishBuffer[bar_index] < xTDBearishBuffer[bar_index]; // return result; } // // Check Signal Over Bear ... bool XTDIsSignalOverBear( int bar_index // sepcified Bar Index ) { // bool result = false; // result = xTDSignalBuffer[bar_index] > xTDBearishBuffer[bar_index]; // return result; } // // Check Signal Under Bear ... bool XTDIsSignalUnderBear( int bar_index // sepcified Bar Index ) { // bool result = false; // result = xTDSignalBuffer[bar_index] < xTDBearishBuffer[bar_index]; // return result; } // // Check Bull is Going Up in Loopback ... bool XTDIsBullIncreaseInLoopback( int loopback // loopback length ) { // bool result = false; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDBullishBuffer) < loopback) { return result; } // double value1 = xTDBullishBuffer[1]; double valueLast = xTDBullishBuffer[loopback - 1]; result = value1 > valueLast; for (int i = 2; i < loopback; i++) { // double valuei = xTDBullishBuffer[i]; bool isResult = value1 >= valuei; // result = result && isResult; if (!result) { break; } } // return result; } // // Check Bull is Going Down in Loopback ... bool XTDIsBullDecreaseInLoopback( int loopback // loopback length ) { // bool result = false; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDBullishBuffer) < loopback) { return result; } // double value1 = xTDBullishBuffer[1]; double valueLast = xTDBullishBuffer[loopback - 1]; result = value1 < valueLast; for (int i = 2; i < loopback; i++) { // double valuei = xTDBullishBuffer[i]; bool isResult = value1 <= valuei; // result = result && isResult; if (!result) { break; } } // return result; } // // Check Bear is Going Up in Loopback ... bool XTDIsBearIncreaseInLoopback( int loopback // loopback length ) { // bool result = false; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDBearishBuffer) < loopback) { return result; } // double value1 = xTDBearishBuffer[1]; double valueLast = xTDBearishBuffer[loopback - 1]; result = value1 > valueLast; for (int i = 2; i < loopback; i++) { // double valuei = xTDBearishBuffer[i]; bool isResult = value1 >= valuei; // result = result && isResult; if (!result) { break; } } // return result; } // // Check Bear is Going Down in Loopback ... bool XTDIsBearDecreaseInLoopback( int loopback // loopback length ) { // bool result = false; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDBearishBuffer) < loopback) { return result; } // double value1 = xTDBearishBuffer[1]; double valueLast = xTDBearishBuffer[loopback - 1]; result = value1 < valueLast; for (int i = 2; i < loopback; i++) { // double valuei = xTDBearishBuffer[i]; bool isResult = value1 <= valuei; // result = result && isResult; if (!result) { break; } } // return result; } // // Check Signal is Going Up in Loopback ... bool XTDIsSignalIncreaseInLoopback( int loopback // loopback length ) { // bool result = false; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDSignalBuffer) < loopback) { return result; } // double value1 = xTDSignalBuffer[1]; double valueLast = xTDSignalBuffer[loopback - 1]; result = value1 > valueLast; for (int i = 2; i < loopback; i++) { // double valuei = xTDSignalBuffer[i]; bool isResult = value1 >= valuei; // result = result && isResult; if (!result) { break; } } // return result; } // // Check Signal is Going Down in Loopback ... bool XTDIsSignalDecreaseInLoopback( int loopback // loopback length ) { // bool result = false; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDSignalBuffer) < loopback) { return result; } // double value1 = xTDSignalBuffer[1]; double valueLast = xTDSignalBuffer[loopback - 1]; result = value1 < valueLast; for (int i = 2; i < loopback; i++) { // double valuei = xTDSignalBuffer[i]; bool isResult = value1 <= valuei; // result = result && isResult; if (!result) { break; } } // return result; } // // Get Max Bull in Loopback ... double XTDGetMaxBullInLoopback( int loopback // loopback length ) { // double result = 0; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDBullishBuffer) < loopback) { return result; } // for (int i = 2; i < loopback; i++) { // double value = xTDBullishBuffer[i]; result = result == 0 || result < value ? value : result; } // return result; } // // Get Min Bull in Loopback ... double XTDGetMinBullInLoopback( int loopback // loopback length ) { // double result = 0; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDBullishBuffer) < loopback) { return result; } // for (int i = 2; i < loopback; i++) { // double value = xTDBullishBuffer[i]; result = result == 0 || result > value ? value : result; } // return result; } // // Get Max Bear in Loopback ... double XTDGetMaxBearInLoopback( int loopback // loopback length ) { // double result = 0; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDBearishBuffer) < loopback) { return result; } // for (int i = 2; i < loopback; i++) { // double value = xTDBearishBuffer[i]; result = result == 0 || result < value ? value : result; } // return result; } // // Get Min Bear in Loopback ... double XTDGetMinBearInLoopback( int loopback // loopback length ) { // double result = 0; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDBearishBuffer) < loopback) { return result; } // for (int i = 2; i < loopback; i++) { // double value = xTDBearishBuffer[i]; result = result == 0 || result > value ? value : result; } // return result; } // // Get Max Signal in Loopback ... double XTDGetMaxSignalInLoopback( int loopback // loopback length ) { // double result = 0; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDSignalBuffer) < loopback) { return result; } // for (int i = 2; i < loopback; i++) { // double value = xTDSignalBuffer[i]; result = result == 0 || result < value ? value : result; } // return result; } // // Get Min Signal in Loopback ... double XTDGetMinSignalInLoopback( int loopback // loopback length ) { // double result = 0; // // Validate Args ... if ( loopback == 0 || ArraySize(xTDSignalBuffer) < loopback) { return result; } // for (int i = 2; i < loopback; i++) { // double value = xTDSignalBuffer[i]; result = result == 0 || result > value ? value : result; } // return result; } // // Count Bull Over Bear Crosses In Loopback ... int XTDCountBullOverBearCrossesInLoopback( int loopback // loopback length ) { // int result = 0; // // Validate Args ... if ( loopback < 0 || ArraySize(xTDBullishBuffer) < loopback) { return result; } // // Loop through Loopback ... for (int i = 0; i < loopback - 1; i++) { // bool isCrossed = XTDIsBullCrossedOverBear(i); if (isCrossed) { result++; } } // return result; } // // Count Bull Under Bear Crosses In Loopback ... int XTDCountBullUnderBearCrossesInLoopback( int loopback // loopback length ) { // int result = 0; // // Validate Args ... if ( loopback < 0 || ArraySize(xTDBullishBuffer) < loopback) { return result; } // // Loop through Loopback ... for (int i = 0; i < loopback - 1; i++) { // bool isCrossed = XTDIsBullCrossedUnderBear(i); if (isCrossed) { result++; } } // return result; } // // Count Signal Over Bear Crosses In Loopback ... int XTDCountSignalOverBearCrossesInLoopback( int loopback // loopback length ) { // int result = 0; // // Validate Args ... if ( loopback < 0 || ArraySize(xTDSignalBuffer) < loopback) { return result; } // // Loop through Loopback ... for (int i = 0; i < loopback - 1; i++) { // bool isCrossed = XTDIsSignalCrossedOverBear(i); if (isCrossed) { result++; } } // return result; } // // Count Signal Under Bear Crosses In Loopback ... int XTDCountSignalUnderBearCrossesInLoopback( int loopback // loopback length ) { // int result = 0; // // Validate Args ... if ( loopback < 0 || ArraySize(xTDSignalBuffer) < loopback) { return result; } // // Loop through Loopback ... for (int i = 0; i < loopback - 1; i++) { // bool isCrossed = XTDIsSignalCrossedUnderBear(i); if (isCrossed) { result++; } } // return result; } // // Find First Bull Cross Over Bear in Loopback ... int XTDFindBullOverBearCrossIndexInLoopback( int loopback // loopback length ) { // int result = -1; // // Validate Args ... if ( loopback < 0 || ArraySize(xTDBullishBuffer) < loopback) { return result; } // // Loop through Loopback ... for (int i = 0; i < loopback - 1; i++) { // bool isCrossed = XTDIsBullCrossedOverBear(i); if (isCrossed) { // result = i; break; } } // return result; } // // Find First Bull Cross Under Bear in Loopback ... int XTDFindBullUnderBearCrossIndexInLoopback( int loopback // loopback length ) { // int result = -1; // // Validate Args ... if ( loopback < 0 || ArraySize(xTDBullishBuffer) < loopback) { return result; } // // Loop through Loopback ... for (int i = 0; i < loopback - 1; i++) { // bool isCrossed = XTDIsBullCrossedUnderBear(i); if (isCrossed) { // result = i; break; } } // return result; } // // Find First Signall Cross Over Bear in Loopback ... int XTDFindSignalOverBearCrossIndexInLoopback( int loopback // loopback length ) { // int result = -1; // // Validate Args ... if ( loopback < 0 || ArraySize(xTDSignalBuffer) < loopback) { return result; } // // Loop through Loopback ... for (int i = 0; i < loopback - 1; i++) { // bool isCrossed = XTDIsSignalCrossedOverBear(i); if (isCrossed) { // result = i; break; } } // return result; } // // Find First Signal Cross Under Bear in Loopback ... int XTDFindSignalUnderBearCrossIndexInLoopback( int loopback // loopback length ) { // int result = -1; // // Validate Args ... if ( loopback < 0 || ArraySize(xTDSignalBuffer) < loopback) { return result; } // // Loop through Loopback ... for (int i = 0; i < loopback - 1; i++) { // bool isCrossed = XTDIsSignalCrossedUnderBear(i); if (isCrossed) { // result = i; break; } } // return result; } // // END XTD Custom Functions ... //