/////////////////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 XTEST Signal Provider Indicators Library // ---------------------------------------------------------------- // // 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 Provider Inputs ... #include "x-saherelm.xtest.provider.inputs.lib.mq5"; // // START Define Enums ... // // // Represent Signals Methods ... enum ENUM_X_SIGNAL_METHODS { X_SIGNAL_METHOD_1, X_SIGNAL_METHOD_2, X_SIGNAL_METHOD_3, }; // // Represent Market Conditions ... struct X_TEST_MARKET_CONDITIONS { // // XTM ... bool isXTMPeak; bool isXTMVale; // // XTD ... bool isXTDSignalPeak; bool isXTDSignalVale; bool isXTDSignalOverBear; bool isXTDSignalUnderBear; bool isXTDSignalCrossedOverBear; bool isXTDSignalCrossedUnderBear; // // XRSI ... bool isXRSIPeak; bool isXRSIVale; bool isXRSICrossedOverLongExit; bool isXRSICrossedOverLongEntry; bool isXRSICrossedUnderShortExit; bool isXRSICrossedUnderShortEntry; // // XOBD ... bool isXOBDPeak; bool isXOBDVale; bool isXOBDSignalOverSwingHigh; bool isXOBDSignalUnderSwingHigh; bool isXOBDSignalCrossedOverSwingHigh; bool isXOBDSignalCrossedUnderSwingHigh; // // XCHLH ... // bool isXCHLHSignalBOverSignalT; bool isXCHLHSignalBUnderSignalT; bool isXCHLHSignalBCrossedOverSignalT; bool isXCHLHSignalBCrossedUnderSignalT; // bool isXCHLHSignalBOverLCLL; bool isXCHLHSignalBUnderLCLL; bool isXCHLHSignalBCrossedOverLCLL; bool isXCHLHSignalBCrossedUnderLCLL; // bool isXCHLHSCMCHHSame; bool isXCHLHSCMCLLSame; // bool isXCHLHSCLCHHSame; bool isXCHLHSCLCLLSame; // bool isXCHLHMCLCHHSame; bool isXCHLHMCLCLLSame; // // XCHMA ... // bool isXCHMASCPeak; bool isXCHMASCVale; bool isXCHMASCFastOverSlow; bool isXCHMASCFastUnderSlow; bool isXCHMASCFastCrossedOverSlow; bool isXCHMASCFastCrossedUnderSlow; // bool isXCHMAMCPeak; bool isXCHMAMCVale; bool isXCHMAMCFastOverSlow; bool isXCHMAMCFastUnderSlow; bool isXCHMAMCFastCrossedOverSlow; bool isXCHMAMCFastCrossedUnderSlow; // bool isXCHMALCPeak; bool isXCHMALCVale; bool isXCHMALCFastOverSlow; bool isXCHMALCFastUnderSlow; bool isXCHMALCFastCrossedOverSlow; bool isXCHMALCFastCrossedUnderSlow; }; // // END Define Enums ... // // // Imports all Indicators Helper here ... input group "XTEST Provider Indicators"; // #include "x-saherelm.xtm.indicator.helper.lib.mq5"; #include "x-saherelm.xtd.oscillator.helper.lib.mq5"; #include "x-saherelm.xrsi.oscillator.helper.lib.mq5"; #include "x-saherelm.xobd.oscillator.helper.lib.mq5"; #include "x-saherelm.xchlh.oscillator.helper.lib.mq5"; #include "x-saherelm.xchma.oscillator.helper.lib.mq5"; // int xTESTMaxLengthOfInputs = 0; int xTESTCalculatedBars = 0; // // Here we Define some Global Market Variables to Analyse MArket Conditions // using them at each time ... X_TEST_MARKET_CONDITIONS conditions = {}; // // Init Indicators ... bool XTESTInitIndicators() { // bool result = false; // // Check and Calculate Max Length in Inputs ... // // // XTM ... xTESTMaxLengthOfInputs = MathMax( xTMMaPeriod, xTESTNumberOfItemsPerTick); // // XTD ... xTESTMaxLengthOfInputs = MathMax( xTDLength, xTESTMaxLengthOfInputs); // // XRSI ... xTESTMaxLengthOfInputs = MathMax( xRSILength, xTESTMaxLengthOfInputs); // // XOBD ... xTESTMaxLengthOfInputs = MathMax( xOBDLength, xTESTMaxLengthOfInputs); // // XCHLH ... xTESTMaxLengthOfInputs = MathMax( xCHLHLcLength, xTESTMaxLengthOfInputs); xTESTMaxLengthOfInputs = MathMax( xCHLHMcLength, xTESTMaxLengthOfInputs); xTESTMaxLengthOfInputs = MathMax( xCHLHScLength, xTESTMaxLengthOfInputs); // // XCHMA ... xTESTMaxLengthOfInputs = MathMax( xCHMAScFastLength, xTESTMaxLengthOfInputs); xTESTMaxLengthOfInputs = MathMax( xCHMAScSlowLength, xTESTMaxLengthOfInputs); xTESTMaxLengthOfInputs = MathMax( xCHMAMcFastLength, xTESTMaxLengthOfInputs); xTESTMaxLengthOfInputs = MathMax( xCHMAMcSlowLength, xTESTMaxLengthOfInputs); xTESTMaxLengthOfInputs = MathMax( xCHMALcFastLength, xTESTMaxLengthOfInputs); xTESTMaxLengthOfInputs = MathMax( xCHMALcSlowLength, xTESTMaxLengthOfInputs); // // Initialize Indicator/Oscillator Handlers ... ResetLastError(); // // XTM Init ... result = XTMInitHandlers(); if (!result) { return result; } // // XTD Init ... result = XTDInitHandlers(); if (!result) { return result; } // // XRSI Init ... result = XRSIInitHandlers(); if (!result) { return result; } // // XOBD Init ... result = XOBDInitHandlers(); if (!result) { return result; } // // XCLH Init ... result = XCHLHInitHandlers(); if (!result) { return result; } // // XCHMA Init ... result = XCHMAInitHandlers(); if (!result) { return result; } // result = true; // return result; } // // Release Indicators ... void XTESTReleaseIndicators() { // // Release Handlers ... XTMReleaseHandlers(); XTDReleaseHandlers(); XRSIReleaseHandlers(); XOBDReleaseHandlers(); XCHMAReleaseHandlers(); XCHLHReleaseHandlers(); } // // Handle Reading Buffers ... void XTESTHandleReadingBuffers() { // // Reading Calculated Bars for a Simple Handler ... xTESTCalculatedBars = BarsCalculated(xTMHandler); // // Read Indicators Buffers ... XTMReadBuffers(xTESTNumberOfItemsPerTick); XTDReadBuffers(xTESTNumberOfItemsPerTick); XRSIReadBuffers(xTESTNumberOfItemsPerTick); XOBDReadBuffers(xTESTNumberOfItemsPerTick); XCHMAReadBuffers(xTESTNumberOfItemsPerTick); XCHLHReadBuffers(xTESTNumberOfItemsPerTick); // XTESTReadConditions(); } // // // START Combination Functions ... // // // // Can Open Long Trade ... // this is a Function will Check all market Conditions and get all // Strategy requirement Verifications for Long Signals ... bool XTESTCanOpenLongTrade( double &providedSignals // Recieve Which Number of Providers has Conditions here, used for Volume Increasing ) { // bool result = false; // bool hasSignal = XTESTHasLongSignal(providedSignals); // result = // hasSignal // ; // // TODO: Remove this On Production ... if (result) { // string message = XTESTGetConditionsString("\n"); // XTESTClearConditions(); // if (StringFind(message, "true") >= 0) { LogMessage(message); } } // return result; } // // Can Close Long Trade ... // this is a Function will Check all market Conditions and get all // Strategy requirement Verifications for Long Signals ... bool XTESTCanCloseLongTrade() { // bool result = false; // // TODO: Check Market Conditions for Close Long Trades ... // result = isXCHMASCFastCrossedUnderMax; // return result; } // // Can Open Short Trade ... // this is a Function will Check all market Conditions and get all // Strategy requirement Verifications for Short Signals ... bool XTESTCanOpenShortTrade( double &providedSignals // Recieve Which Number of Providers has Conditions here, used for Volume Increasing ) { // bool result = false; // bool hasSignal = XTESTHasShortSignal(providedSignals); // result = // hasSignal // ; // // TODO: Remove this On Production ... if (result) { // string message = XTESTGetConditionsString("\n"); // XTESTClearConditions(); // if (StringFind(message, "true") >= 0) { LogMessage(message); } } // return result; } // // Can Close Short Trade ... // this is a Function will Check all market Conditions and get all // Strategy requirement Verifications for Short Signals ... bool XTESTCanCloseShortTrade() { // bool result = false; // // TODO: Check Market Conditions for Close Short Trades ... // result = XTESTHasShortCloseConditions(xTESTNumberOfItemsPerTick); // return result; } // // // END Combination Functions ... // // // // // START Combination Signaling ... // // // // TODO: Works i Had To Do: // // - [] Test All Strategies in All Available Brokers; // - [] Find a Good Age for Closing Long Time Trades; // - [] Find a Good Value for Closing Max DrawDown Equity Trades; // - [] For All Strategies, Find Desired Long/Short Exit Points; // - [] Find a Combination Point for Close All Trades; // - [x] Try to Increase Trade Volume on Giving Multiple Signals at Same Time; // - [] Prepare Signal and Event Alerts and Test Them for Production Environment; // - [] Add SUpport for Daily and Hourly Alerts and also Make Report of Account State in Start Of Each Day; // - [] Test All Methods for Find other Assets to Trade On them; // - [] Do R&D about Multi Asset Trading in MT5; // - [] Test Other Indicators/Oscillators or Exists Examples to Check and Found Market Conditions; // // // Read All Globally Required Conditions ... void XTESTReadConditions() { // XTESTClearConditions(); // // XTM ... conditions.isXTMPeak = XTMIsPeak(); conditions.isXTMVale = XTMIsVale(); // // XTD ... conditions.isXTDSignalPeak = XTDIsSignalPeak(); conditions.isXTDSignalVale = XTDIsSignalVale(); conditions.isXTDSignalOverBear = XTDIsSignalOverBear(1); conditions.isXTDSignalUnderBear = XTDIsSignalUnderBear(1); conditions.isXTDSignalCrossedOverBear = XTDIsSignalCrossedOverBear(1); conditions.isXTDSignalCrossedUnderBear = XTDIsSignalCrossedUnderBear(1); // // XRSI ... conditions.isXRSIPeak = XRSIIsPeak(); conditions.isXRSIVale = XRSIIsVale(); conditions.isXRSICrossedOverLongExit = XRSIIsCrossedOverLongExit(1); conditions.isXRSICrossedOverLongEntry = XRSIIsCrossedOverLongEntry(1); conditions.isXRSICrossedUnderShortExit = XRSIIsCrossedUnderShortExit(1); conditions.isXRSICrossedUnderShortEntry = XRSIIsCrossedUnderShortEntry(1); // // XOBD ... conditions.isXOBDPeak = XOBDIsPeak(); conditions.isXOBDVale = XOBDIsVale(); conditions.isXOBDSignalOverSwingHigh = XOBDIsSignalOverSwingHigh(1); conditions.isXOBDSignalUnderSwingHigh = XOBDIsSignalUnderSwingHigh(1); conditions.isXOBDSignalCrossedOverSwingHigh = XOBDIsSignalCrossedOverSwingHigh(1); conditions.isXOBDSignalCrossedUnderSwingHigh = XOBDIsSignalCrossedUnderSwingHigh(1); // // XCHLH ... // conditions.isXCHLHSignalBOverSignalT = XCHLHIsSignalBOverSignalT(1); conditions.isXCHLHSignalBUnderSignalT = XCHLHIsSignalBUnderSignalT(1); conditions.isXCHLHSignalBCrossedOverSignalT = XCHLHIsSignalBCrossedOverSignalT(1); conditions.isXCHLHSignalBCrossedUnderSignalT = XCHLHIsSignalBCrossedUnderSignalT(1); // conditions.isXCHLHSignalBOverLCLL = XCHLHIsSignalBOverLCLL(1); conditions.isXCHLHSignalBUnderLCLL = XCHLHIsSignalBUnderLCLL(1); conditions.isXCHLHSignalBCrossedOverLCLL = XCHLHIsSignalBCrossedOverLCLL(1); conditions.isXCHLHSignalBCrossedUnderLCLL = XCHLHIsSignalBCrossedUnderLCLL(1); // conditions.isXCHLHSCMCHHSame = XCHLHIsMCSCHasSameHH(1); conditions.isXCHLHSCMCLLSame = XCHLHIsMCSCHasSameLL(1); // conditions.isXCHLHSCLCHHSame = XCHLHIsLCSCHasSameHH(1); conditions.isXCHLHSCLCLLSame = XCHLHIsLCSCHasSameLL(1); // conditions.isXCHLHMCLCHHSame = XCHLHIsLCMCHasSameHH(1); conditions.isXCHLHMCLCLLSame = XCHLHIsLCMCHasSameLL(1); // // XCHMA ... // conditions.isXCHMASCPeak = XCHMAIsSCPeak(); conditions.isXCHMASCVale = XCHMAIsSCVale(); conditions.isXCHMASCFastOverSlow = XCHMAIsSCFastOverSlow(1); conditions.isXCHMASCFastUnderSlow = XCHMAIsSCFastUnderSlow(1); conditions.isXCHMASCFastCrossedOverSlow = XCHMAIsSCFastCrossedOverSlow(1); conditions.isXCHMASCFastCrossedUnderSlow = XCHMAIsSCFastCrossedUnderSlow(1); // conditions.isXCHMAMCPeak = XCHMAIsMCPeak(); conditions.isXCHMAMCVale = XCHMAIsMCVale(); conditions.isXCHMAMCFastOverSlow = XCHMAIsMCFastOverSlow(1); conditions.isXCHMAMCFastUnderSlow = XCHMAIsMCFastUnderSlow(1); conditions.isXCHMAMCFastCrossedOverSlow = XCHMAIsMCFastCrossedOverSlow(1); conditions.isXCHMAMCFastCrossedUnderSlow = XCHMAIsMCFastCrossedUnderSlow(1); // conditions.isXCHMALCPeak = XCHMAIsLCPeak(); conditions.isXCHMALCVale = XCHMAIsLCVale(); conditions.isXCHMALCFastOverSlow = XCHMAIsLCFastOverSlow(1); conditions.isXCHMALCFastUnderSlow = XCHMAIsLCFastUnderSlow(1); conditions.isXCHMALCFastCrossedOverSlow = XCHMAIsLCFastCrossedOverSlow(1); conditions.isXCHMALCFastCrossedUnderSlow = XCHMAIsLCFastCrossedUnderSlow(1); } // // Cleanup Conditions ... void XTESTClearConditions() { // X_TEST_MARKET_CONDITIONS mConditions = {}; // conditions = mConditions; } // // Converts Market Conditions to Specific String Representation ... string XTESTGetConditionsString( string separator = ",", // Specify Separator bool ignoreFalses = true // Ignore False Conditions ) { // string result = ""; // // XTM ... result += "| XTM |" + separator; // if ( !ignoreFalses || (ignoreFalses && conditions.isXTMPeak)) { result += "isXTMPeak: " + (string)conditions.isXTMPeak + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXTMVale)) { result += "isXTMVale: " + (string)conditions.isXTMVale + separator; } // // Separator ... result += separator; // // XTD ... result += "| XTD |" + separator; // if ( !ignoreFalses || (ignoreFalses && conditions.isXTDSignalPeak)) { result += "isXTDSignalPeak: " + (string)conditions.isXTDSignalPeak + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXTDSignalVale)) { result += "isXTDSignalVale: " + (string)conditions.isXTDSignalVale + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXTDSignalOverBear)) { result += "isXTDSignalOverBear: " + (string)conditions.isXTDSignalOverBear + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXTDSignalUnderBear)) { result += "isXTDSignalUnderBear: " + (string)conditions.isXTDSignalUnderBear + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXTDSignalCrossedOverBear)) { result += "isXTDSignalCrossedOverBear: " + (string)conditions.isXTDSignalCrossedOverBear + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXTDSignalCrossedUnderBear)) { result += "isXTDSignalCrossedUnderBear: " + (string)conditions.isXTDSignalCrossedUnderBear + separator; } // // Separator ... result += separator; // // XRSI ... result += "| XRSI |" + separator; // if ( !ignoreFalses || (ignoreFalses && conditions.isXRSIPeak)) { result += "isXRSIPeak: " + (string)conditions.isXRSIPeak + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXRSIVale)) { result += "isXRSIVale: " + (string)conditions.isXRSIVale + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXRSICrossedOverLongExit)) { result += "isXRSICrossedOverLongExit: " + (string)conditions.isXRSICrossedOverLongExit + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXRSICrossedOverLongEntry)) { result += "isXRSICrossedOverLongEntry: " + (string)conditions.isXRSICrossedOverLongEntry + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXRSICrossedUnderShortExit)) { result += "isXRSICrossedUnderShortExit: " + (string)conditions.isXRSICrossedUnderShortExit + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXRSICrossedUnderShortEntry)) { result += "isXRSICrossedUnderShortEntry: " + (string)conditions.isXRSICrossedUnderShortEntry + separator; } // // Separator ... result += separator; // // XOBD ... result += "| XOBD |" + separator; // if ( !ignoreFalses || (ignoreFalses && conditions.isXOBDPeak)) { result += "isXOBDPeak: " + (string)conditions.isXOBDPeak + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXOBDVale)) { result += "isXOBDVale: " + (string)conditions.isXOBDVale + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXOBDSignalOverSwingHigh)) { result += "isXOBDSignalOverSwingHigh: " + (string)conditions.isXOBDSignalOverSwingHigh + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXOBDSignalUnderSwingHigh)) { result += "isXOBDSignalUnderSwingHigh: " + (string)conditions.isXOBDSignalUnderSwingHigh + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXOBDSignalCrossedOverSwingHigh)) { result += "isXOBDSignalCrossedOverSwingHigh: " + (string)conditions.isXOBDSignalCrossedOverSwingHigh + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXOBDSignalCrossedUnderSwingHigh)) { result += "isXOBDSignalCrossedUnderSwingHigh: " + (string)conditions.isXOBDSignalCrossedUnderSwingHigh + separator; } // // Separator ... result += separator; // // XCHLH ... result += "| XCHLH |" + separator; // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSignalBOverSignalT)) { result += "isXCHLHSignalBOverSignalT: " + (string)conditions.isXCHLHSignalBOverSignalT + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSignalBUnderSignalT)) { result += "isXCHLHSignalBUnderSignalT: " + (string)conditions.isXCHLHSignalBUnderSignalT + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSignalBCrossedOverSignalT)) { result += "isXCHLHSignalBCrossedOverSignalT: " + (string)conditions.isXCHLHSignalBCrossedOverSignalT + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSignalBCrossedUnderSignalT)) { result += "isXCHLHSignalBCrossedUnderSignalT: " + (string)conditions.isXCHLHSignalBCrossedUnderSignalT + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSignalBOverLCLL)) { result += "isXCHLHSignalBOverLCLL: " + (string)conditions.isXCHLHSignalBOverLCLL + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSignalBUnderLCLL)) { result += "isXCHLHSignalBUnderLCLL: " + (string)conditions.isXCHLHSignalBUnderLCLL + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSignalBCrossedOverLCLL)) { result += "isXCHLHSignalBCrossedOverLCLL: " + (string)conditions.isXCHLHSignalBCrossedOverLCLL + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSignalBCrossedUnderLCLL)) { result += "isXCHLHSignalBCrossedUnderLCLL: " + (string)conditions.isXCHLHSignalBCrossedUnderLCLL + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSCMCHHSame)) { result += "isXCHLHSCMCHHSame: " + (string)conditions.isXCHLHSCMCHHSame + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSCMCLLSame)) { result += "isXCHLHSCMCLLSame: " + (string)conditions.isXCHLHSCMCLLSame + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSCLCHHSame)) { result += "isXCHLHSCLCHHSame: " + (string)conditions.isXCHLHSCLCHHSame + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHSCLCLLSame)) { result += "isXCHLHSCLCLLSame: " + (string)conditions.isXCHLHSCLCLLSame + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHMCLCHHSame)) { result += "isXCHLHMCLCHHSame: " + (string)conditions.isXCHLHMCLCHHSame + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHLHMCLCLLSame)) { result += "isXCHLHMCLCLLSame: " + (string)conditions.isXCHLHMCLCLLSame + separator; } // // Separator ... result += separator; // // XCHMA ... result += "| XCHMA |" + separator; // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMASCPeak)) { result += "isXCHMASCPeak: " + (string)conditions.isXCHMASCPeak + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMASCVale)) { result += "isXCHMASCVale: " + (string)conditions.isXCHMASCVale + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMASCFastOverSlow)) { result += "isXCHMASCFastOverSlow: " + (string)conditions.isXCHMASCFastOverSlow + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMASCFastUnderSlow)) { result += "isXCHMASCFastUnderSlow: " + (string)conditions.isXCHMASCFastUnderSlow + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMASCFastCrossedOverSlow)) { result += "isXCHMASCFastCrossedOverSlow: " + (string)conditions.isXCHMASCFastCrossedOverSlow + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMASCFastCrossedUnderSlow)) { result += "isXCHMASCFastCrossedUnderSlow: " + (string)conditions.isXCHMASCFastCrossedUnderSlow + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMAMCPeak)) { result += "isXCHMAMCPeak: " + (string)conditions.isXCHMAMCPeak + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMAMCVale)) { result += "isXCHMAMCVale: " + (string)conditions.isXCHMAMCVale + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMAMCFastOverSlow)) { result += "isXCHMAMCFastOverSlow: " + (string)conditions.isXCHMAMCFastOverSlow + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMAMCFastUnderSlow)) { result += "isXCHMAMCFastUnderSlow: " + (string)conditions.isXCHMAMCFastUnderSlow + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMAMCFastCrossedOverSlow)) { result += "isXCHMAMCFastCrossedOverSlow: " + (string)conditions.isXCHMAMCFastCrossedOverSlow + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMAMCFastCrossedUnderSlow)) { result += "isXCHMAMCFastCrossedUnderSlow: " + (string)conditions.isXCHMAMCFastCrossedUnderSlow + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMALCPeak)) { result += "isXCHMALCPeak: " + (string)conditions.isXCHMALCPeak + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMALCVale)) { result += "isXCHMALCVale: " + (string)conditions.isXCHMALCVale + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMALCFastOverSlow)) { result += "isXCHMALCFastOverSlow: " + (string)conditions.isXCHMALCFastOverSlow + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMALCFastUnderSlow)) { result += "isXCHMALCFastUnderSlow: " + (string)conditions.isXCHMALCFastUnderSlow + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMALCFastCrossedOverSlow)) { result += "isXCHMALCFastCrossedOverSlow: " + (string)conditions.isXCHMALCFastCrossedOverSlow + separator; } // if ( !ignoreFalses || (ignoreFalses && conditions.isXCHMALCFastCrossedUnderSlow)) { result += "isXCHMALCFastCrossedUnderSlow: " + (string)conditions.isXCHMALCFastCrossedUnderSlow + separator; } // // Separator ... result += separator; // return result; } // // Check Market Conditions by Combination of Power of All tools for LONGs ... bool XTESTHasLongSignal( double &providedSignals // Recieve Which Number of Providers has Conditions here, used for Volume Increasing ) { // bool result = false; ENUM_X_SIGNAL_METHODS methods[]; // // START Custom Mechanism ... // // // Required Data ... double entry = GetEntry(X_SIGNAL_LONG); double nearHH = GetHighestHigh(3, 1); double nearLL = GetLowestLow(3, 1); XOHCL candle1 = GetCandle(1); // bool isSharpChanged = IsSharpChanged( 5, 1, xTMMaBuffer); // bool isCandleSharpChanged = IsSharpChanged( 5, 1, PRICE_CLOSE); // // XRSI ... bool isXRSIOverLongExit = xRSIBuffer[1] > xRSILongExitValue; // // XTD ... // bool isXTDSignalIncreasing = // xTDSignalBuffer[1] > xTDSignalBuffer[2] && // xTDSignalBuffer[1] > xTDSignalBuffer[3]; // // XCHLH ... bool isDecreasingMCHH = IsDecreasing( 12, 1, xCHLHMcHHBuffer); // // XCHMA ... // double xCHMAMin1 = XCHMAGetMin(1); double xCHMAMin2 = XCHMAGetMin(2); // double xCHMAMax1 = XCHMAGetMax(1); double xCHMAMax2 = XCHMAGetMax(2); // // Calculate Non SC Max ... double xCHMANonSCMax1 = MathMax(xCHMAMcFastBuffer[1], xCHMAMcSlowBuffer[1]); xCHMANonSCMax1 = MathMax(xCHMANonSCMax1, xCHMALcFastBuffer[1]); xCHMANonSCMax1 = MathMax(xCHMANonSCMax1, xCHMALcSlowBuffer[1]); // // Calculate Non SC Min ... double xCHMANonSCMin1 = MathMin(xCHMAMcFastBuffer[1], xCHMAMcSlowBuffer[1]); xCHMANonSCMin1 = MathMin(xCHMANonSCMin1, xCHMALcFastBuffer[1]); xCHMANonSCMin1 = MathMin(xCHMANonSCMin1, xCHMALcSlowBuffer[1]); // double xCHMASCMin1 = MathMin(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); double xCHMASCMin2 = MathMin(xCHMAScFastBuffer[2], xCHMAScSlowBuffer[2]); // double xCHMASCMax1 = MathMax(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); double xCHMASCMax2 = MathMax(xCHMAScFastBuffer[2], xCHMAScSlowBuffer[2]); // double xCHMAMCTrend1 = MathAbs(xCHMAMcFastBuffer[1] - xCHMAMcSlowBuffer[1]); double xCHMAMCTrend5 = MathAbs(xCHMAMcFastBuffer[5] - xCHMAMcSlowBuffer[5]); double xCHMAMCTrend10 = MathAbs(xCHMAMcFastBuffer[10] - xCHMAMcSlowBuffer[10]); // double xCHMALCTrend1 = MathAbs(xCHMALcFastBuffer[1] - xCHMALcSlowBuffer[1]); double xCHMALCTrend5 = MathAbs(xCHMALcFastBuffer[5] - xCHMALcSlowBuffer[5]); double xCHMALCTrend10 = MathAbs(xCHMALcFastBuffer[10] - xCHMALcSlowBuffer[10]); // bool isXCHMASCCrossedOverMin = // xCHMASCMin2 <= xCHMAMin2 && xCHMASCMin1 > xCHMAMin1 // ; // bool isXCHMASCFastCrossedOverMax = xCHMASCMax2 < xCHMAMax2 && xCHMASCMax1 >= xCHMAMax1; // bool isXCHMASCFastCrossedUnderMin = xCHMASCMin2 > xCHMAMin2 && xCHMASCMin1 <= xCHMAMin1; // bool isXCHMASCFastCrossedUnderMax = xCHMASCMax2 >= xCHMAMax2 && xCHMASCMax1 < xCHMAMax1; // // Condition 1 ... // this Method waits for XCHMA Short Cycle's Fast to Going down // of all Cycles Minimum Value, then Check when its Crossed Over // min value and then start to Open Long Trades based On Conditions, // and Recieved Verifications from other Indicator/Oscillator(s) ... bool customMethodCond1 = // isXCHMASCCrossedOverMin // && // entry < nearHH // && // candle1.high != nearHH // && // !isCandleSharpChanged // && // !( // ( // conditions.isXCHMASCFastUnderSlow || conditions.isXCHMASCFastCrossedUnderSlow // ) // && // ( // conditions.isXCHMAMCFastUnderSlow || conditions.isXCHMAMCFastCrossedUnderSlow // ) // && // ( // conditions.isXCHMALCFastUnderSlow || conditions.isXCHMALCFastCrossedUnderSlow // ) // ) // && // ( // conditions.isXCHMAMCFastOverSlow // ? // xCHMAMCTrend1 >= xCHMAMCTrend5 && xCHMAMCTrend5 >= xCHMAMCTrend10 // : // xCHMAMCTrend1 < xCHMAMCTrend5 && xCHMAMCTrend5 < xCHMAMCTrend10 // ) // && // !( // ( // conditions.isXCHMAMCFastUnderSlow || conditions.isXCHMAMCFastCrossedUnderSlow // ) // && // ( // conditions.isXCHMALCFastUnderSlow || conditions.isXCHMALCFastCrossedUnderSlow // ) // ) // && // ( // conditions.isXCHMAMCFastUnderSlow && xTDSignalBuffer[1] < xTDSignalBuffer[2] // ? // xCHMAMcFastBuffer[1] > xCHMANonSCMin1 // && // !( // xCHLHSignalTBuffer[1] > xCHLHScHHBuffer[1] && xCHLHSignalBBuffer[1] < xCHLHLcLLBuffer[1] // ) // : // true // ) // && // !( // conditions.isXCHMASCVale && conditions.isXCHMASCFastUnderSlow // && // ( // ( // conditions.isXCHLHMCLCHHSame // && // ( // conditions.isXCHLHMCLCLLSame || conditions.isXCHLHSCMCLLSame // ) // ) // ) // ) // && // !( // ( // xRSIBuffer[1] > xRSILongExitValue || conditions.isXRSICrossedOverLongExit // ) // && // conditions.isXCHLHSCMCHHSame && conditions.isXCHLHSCMCLLSame && // conditions.isXCHMAMCFastUnderSlow // ) // && // !( // ( // conditions.isXCHLHSignalBOverLCLL || conditions.isXCHLHSignalBCrossedOverLCLL // ) // && conditions.isXCHLHMCLCLLSame && // conditions.isXCHMAMCFastUnderSlow // ) // && // !( // conditions.isXTDSignalOverBear && // conditions.isXOBDSignalUnderSwingHigh && // conditions.isXCHLHSignalBUnderSignalT && conditions.isXCHLHSignalBOverLCLL && conditions.isXCHLHMCLCLLSame && // conditions.isXCHMAMCFastUnderSlow // ) // && // !( // conditions.isXTDSignalOverBear && // conditions.isXOBDSignalUnderSwingHigh && // conditions.isXCHLHSignalBUnderSignalT && conditions.isXCHLHSignalBUnderLCLL && conditions.isXCHLHMCLCLLSame && // conditions.isXCHMASCFastOverSlow && conditions.isXCHMAMCFastUnderSlow && conditions.isXCHMALCFastOverSlow // ) // && // !( // conditions.isXTDSignalOverBear && // conditions.isXOBDSignalUnderSwingHigh && // conditions.isXCHLHSignalBOverSignalT && conditions.isXCHLHSignalBOverLCLL && conditions.isXCHLHMCLCHHSame && // conditions.isXCHMASCFastOverSlow && conditions.isXCHMAMCFastOverSlow && conditions.isXCHMALCFastUnderSlow // ) // ; // // Filling Methods ... if (customMethodCond1) { // ArrayResize( methods, ArraySize(methods) + 1); // methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_1; } // // Condition 2 ... // this Method waits for XCHMA Medium Cycles Fast Line Crossed Over Slow, // then start to Open Long Trades based On Conditions, and Recieved Verifications from // other Indicator/Oscillator(s) ... bool customMethodCond2 = // // MCFast Based ... ( // conditions.isXCHMAMCFastCrossedOverSlow && // ( // conditions.isXCHMASCFastOverSlow // && // conditions.isXCHMALCFastOverSlow // ) // ) // && // !( // ( // conditions.isXOBDSignalUnderSwingHigh || conditions.isXOBDSignalCrossedUnderSwingHigh // ) // && // conditions.isXCHLHSignalBOverSignalT && conditions.isXCHLHSignalBOverLCLL && conditions.isXCHLHSCMCHHSame // ) // && // !( // conditions.isXTDSignalCrossedOverBear && // conditions.isXOBDSignalUnderSwingHigh && // conditions.isXCHLHSignalBUnderSignalT && conditions.isXCHLHSignalBOverLCLL && conditions.isXCHLHMCLCLLSame // ) // && // !( // xCHLHScHHBuffer[1] > xCHLHSignalTBuffer[1] && xCHLHScLLBuffer[1] > xCHLHSignalTBuffer[1] && xCHLHSignalBBuffer[1] < xCHLHSignalTBuffer[1] && xCHLHSignalBBuffer[1] < xCHLHMcLLBuffer[1] // ) // && // !( // conditions.isXTDSignalOverBear && // conditions.isXOBDSignalUnderSwingHigh && // conditions.isXCHLHSignalBCrossedOverSignalT && conditions.isXCHLHSignalBOverLCLL && conditions.isXCHLHSCMCHHSame && conditions.isXCHLHMCLCLLSame // ) // && // !( // conditions.isXTDSignalUnderBear && // conditions.isXOBDSignalUnderSwingHigh && // conditions.isXCHLHSignalBUnderSignalT && conditions.isXCHLHSignalBOverLCLL && conditions.isXCHLHMCLCHHSame && conditions.isXCHLHMCLCLLSame // ) // && // !( // conditions.isXTDSignalOverBear && // conditions.isXRSICrossedOverLongExit && // conditions.isXOBDSignalUnderSwingHigh && // conditions.isXCHLHSignalBOverSignalT && conditions.isXCHLHSignalBOverLCLL // ) // && // !( // conditions.isXTDSignalCrossedUnderBear && // conditions.isXOBDSignalUnderSwingHigh && // conditions.isXCHLHSignalBOverSignalT && conditions.isXCHLHSignalBOverLCLL // ) // // && // entry < nearHH // && // nearHH != candle1.high // && // !isXRSIOverLongExit // ; // // Filling Methods ... if (customMethodCond2) { // ArrayResize( methods, ArraySize(methods) + 1); // methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_2; } // // Condition 3 ... // this Method waits for XCHMA Short Cycle's Fast to Crossed Over all Cycles max value // and then start to Open Long Trades based On Conditions, // and Recieved Verifications from other Indicator/Oscillator(s) ... bool customMethodCond3 = // isXCHMASCFastCrossedOverMax // && // conditions.isXCHMALCFastOverSlow // && // !( // xCHLHScLLBuffer[1] > xCHLHMcLLBuffer[1] && xCHLHMcLLBuffer[1] > xCHLHSignalBBuffer[1] && xCHLHSignalBBuffer[1] > xCHLHSignalTBuffer[1] && xCHLHSignalTBuffer[1] > xCHLHLcLLBuffer[1] // ) // && // !( conditions.isXCHLHSignalBUnderSignalT && conditions.isXCHLHSignalBOverLCLL && ( // conditions.isXCHLHSCMCHHSame || conditions.isXCHLHMCLCLLSame // ) // ) // && // !( // conditions.isXCHLHSignalBOverSignalT && conditions.isXCHLHSignalBOverLCLL && // ( // conditions.isXCHLHSCMCHHSame || conditions.isXCHLHMCLCLLSame || conditions.isXCHLHMCLCHHSame || conditions.isXCHLHSCMCLLSame // ) // ) // && // !isSharpChanged // && // !isCandleSharpChanged // && // entry < nearHH // && // candle1.close > xTMMaBuffer[1]; // ; // // Filling Methods ... if (customMethodCond3) { // ArrayResize( methods, ArraySize(methods) + 1); // methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_3; } // // Combine Custom Methods together ... bool isCustomMethodHasSignal = // customMethodCond1 // || // customMethodCond2 // || // customMethodCond3 // ; // // END Custom Mechanism ... // // result = // // isXTMHasSignal // isXTDHasSignal // isXCHMAHasSignal // // isXTMMethodHasSignal // // || // // isXTDMethodHasSignal // // || // // // isXOBDMethodHasSignal // // // || // // // isXCHMAMethodHasSignal // // // || // // // isXCHLHMethodHasSignal // // // || // // // isXRSIMethodHasSignal // // || isCustomMethodHasSignal // ; // if (result) { // // Set Number of Occured Conditions for Increasing Volume ... providedSignals = ArraySize(methods); } // return result; } // // Check Market Conditions by Combination of Power of All tools for SHORTs ... bool XTESTHasShortSignal( double &providedSignals // Recieve Which Number of Providers has Conditions here, used for Volume Increasing ) { // bool result = false; ENUM_X_SIGNAL_METHODS methods[]; // // START Custom Mechanism ... // // // Required Data ... double entry = GetEntry(X_SIGNAL_SHORT); double nearHH = GetHighestHigh(3, 1); double nearLL = GetLowestLow(3, 1); XOHCL candle1 = GetCandle(1); // bool isSharpChanged = IsSharpChanged( 5, 1, xTMMaBuffer); // bool isCandleSharpChanged = IsSharpChanged( 5, 1, PRICE_CLOSE); // // XRSI ... bool isXRSIOverLongExit = xRSIBuffer[1] > xRSILongExitValue; // // XCHLH ... bool isIncreasingMCHH = IsIncreasing( 12, 1, xCHLHMcHHBuffer); // double xCHLHLCRange1 = xCHLHLcHHBuffer[1] - xCHLHLcLLBuffer[1]; double xCHLHMCRange1 = xCHLHMcHHBuffer[1] - xCHLHMcLLBuffer[1]; double xCHLHSCRange1 = xCHLHScHHBuffer[1] - xCHLHScLLBuffer[1]; // double xCHLHNonLCMax1 = MathMax(xCHLHScHHBuffer[1], xCHLHMcHHBuffer[1]); double xCHLHNonLCMin1 = MathMin(xCHLHScLLBuffer[1], xCHLHMcLLBuffer[1]); double xCHLHNonLCRange1 = xCHLHNonLCMax1 - xCHLHNonLCMin1; // // // bool isIncreasingMCLL = IsIncreasing( // 12, // 1, // xCHLHMcLLBuffer); // // // bool isDecreasingSCHH = IsDecreasing( // 12, // 1, // xCHLHScHHBuffer); // // // bool isDecreasingSCLL = IsDecreasing( // 12, // 1, // xCHLHScLLBuffer); // // XCHMA ... // double xCHMAMin1 = XCHMAGetMin(1); double xCHMAMin2 = XCHMAGetMin(2); // double xCHMAMax1 = XCHMAGetMax(1); double xCHMAMax2 = XCHMAGetMax(2); // // Calculate Non SC Max ... double xCHMANonSCMax1 = MathMax(xCHMAMcFastBuffer[1], xCHMAMcSlowBuffer[1]); xCHMANonSCMax1 = MathMax(xCHMANonSCMax1, xCHMALcFastBuffer[1]); xCHMANonSCMax1 = MathMax(xCHMANonSCMax1, xCHMALcSlowBuffer[1]); // // Calculate Non SC Min ... double xCHMANonSCMin1 = MathMin(xCHMAMcFastBuffer[1], xCHMAMcSlowBuffer[1]); xCHMANonSCMin1 = MathMin(xCHMANonSCMin1, xCHMALcFastBuffer[1]); xCHMANonSCMin1 = MathMin(xCHMANonSCMin1, xCHMALcSlowBuffer[1]); // // Calculate Non LC Max ... double xCHMANonLCMax1 = MathMax(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); xCHMANonLCMax1 = MathMax(xCHMANonLCMax1, xCHMAMcFastBuffer[1]); xCHMANonLCMax1 = MathMax(xCHMANonLCMax1, xCHMAMcSlowBuffer[1]); // // Calculate Non LC Min ... double xCHMANonLCMin1 = MathMin(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); xCHMANonLCMin1 = MathMin(xCHMANonLCMin1, xCHMAMcFastBuffer[1]); xCHMANonLCMin1 = MathMin(xCHMANonLCMin1, xCHMAMcSlowBuffer[1]); // // Check LC On Top Of Others ... double xCHMALCMin1 = MathMin(xCHMALcFastBuffer[1], xCHMALcSlowBuffer[1]); // double xCHMASCMin1 = MathMin(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); double xCHMASCMin2 = MathMin(xCHMAScFastBuffer[2], xCHMAScSlowBuffer[2]); // double xCHMASCMax1 = MathMax(xCHMAScFastBuffer[1], xCHMAScSlowBuffer[1]); double xCHMASCMax2 = MathMax(xCHMAScFastBuffer[2], xCHMAScSlowBuffer[2]); // double xCHMAMCTrend1 = MathAbs(xCHMAMcFastBuffer[1] - xCHMAMcSlowBuffer[1]); double xCHMAMCTrend5 = MathAbs(xCHMAMcFastBuffer[5] - xCHMAMcSlowBuffer[5]); double xCHMAMCTrend10 = MathAbs(xCHMAMcFastBuffer[10] - xCHMAMcSlowBuffer[10]); // double xCHMALCTrend1 = MathAbs(xCHMALcFastBuffer[1] - xCHMALcSlowBuffer[1]); double xCHMALCTrend5 = MathAbs(xCHMALcFastBuffer[5] - xCHMALcSlowBuffer[5]); double xCHMALCTrend10 = MathAbs(xCHMALcFastBuffer[10] - xCHMALcSlowBuffer[10]); // bool isXCHMASCCrossedOverMin = // xCHMASCMin2 <= xCHMAMin2 && xCHMASCMin1 > xCHMAMin1 // ; // bool isXCHMASCFastCrossedOverMax = xCHMASCMax2 < xCHMAMax2 && xCHMASCMax1 >= xCHMAMax1; // bool isXCHMASCFastCrossedUnderMin = xCHMASCMin2 > xCHMAMin2 && xCHMASCMin1 <= xCHMAMin1; // bool isXCHMASCFastCrossedUnderMax = xCHMASCMax2 >= xCHMAMax2 && xCHMASCMax1 < xCHMAMax1; // // Condition 1 ... // this Method waits for XCHMA Short Cycle's Fast to Going up // of all Cycles Maximum Value, then Check when its Crossed Under // max value and then start to Open Short Trades based On Conditions, // and Recieved Verifications from other Indicator/Oscillator(s) ... bool customMethodCond1 = // isXCHMASCFastCrossedUnderMax // && // entry > nearLL // && // !isSharpChanged // && // !isCandleSharpChanged // && // candle1.low != nearLL // && // !conditions.isXCHLHMCLCLLSame // && // ( // xCHLHNonLCRange1 > (xCHLHLCRange1 / 2) // ? // true // : // xCHLHMcHHBuffer[1] > (xCHLHLcHHBuffer[1] - (xCHLHLCRange1 / 2)) && MathAbs(xCHLHMcLLBuffer[1] - xCHLHLcLLBuffer[1]) > (MathAbs(xCHLHMcHHBuffer[1] - xCHLHLcHHBuffer[1]) / 2) // ) // && // !( // xCHLHMcLLBuffer[1] > (xCHLHLcHHBuffer[1] - (xCHLHLCRange1 / 2)) && xCHLHSignalTBuffer[1] < xCHLHSignalBBuffer[1] && MathAbs(xCHLHScLLBuffer[1] - xCHLHMcLLBuffer[1]) > MathAbs(xCHLHScHHBuffer[1] - xCHLHMcHHBuffer[1]) // ) // && // !( // xTDSignalBuffer[1] > xTDSignalBuffer[2] && xTDSignalBuffer[2] > xTDSignalBuffer[3] && xTDSignalBuffer[1] > xTDSignalBuffer[3] // ) // && // !( // ( // conditions.isXCHMASCFastOverSlow || conditions.isXCHMASCFastCrossedOverSlow // ) // && // ( // conditions.isXCHMAMCFastOverSlow || conditions.isXCHMAMCFastCrossedOverSlow // ) // && // ( // conditions.isXCHMALCFastOverSlow || conditions.isXCHMALCFastCrossedOverSlow // ) // ) // && // !( // ( // conditions.isXCHMAMCFastOverSlow || conditions.isXCHMAMCFastCrossedOverSlow // ) // && // ( // conditions.isXCHMALCFastOverSlow || conditions.isXCHMALCFastCrossedOverSlow // ) // ) // && // ( // conditions.isXCHMAMCFastOverSlow // ? // xCHMAMCTrend1 < xCHMAMCTrend5 // && // ( // xCHMAMCTrend1 < xCHMAMCTrend10 || xCHMAMCTrend5 < xCHMAMCTrend10 // ) // : // true // ) // && // ( // conditions.isXCHMALCFastOverSlow // ? // xCHMALCTrend1 <= xCHMALCTrend5 // && // ( // xCHMALCTrend1 <= xCHMALCTrend10 || xCHMALCTrend5 <= xCHMALCTrend10 // ) // : // true // ) // && // !( // conditions.isXCHMASCVale || conditions.isXCHMAMCVale || conditions.isXCHMASCPeak || conditions.isXCHMAMCPeak // ) // && // ( conditions.isXCHMASCFastOverSlow || conditions.isXCHMAMCFastOverSlow // ? // xOBDSwingHighBuffer[1] < xOBDSwingLowBuffer[1] // : // true) // ; // // Filling Methods ... if (customMethodCond1) { // ArrayResize( methods, ArraySize(methods) + 1); // methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_1; } // // Condition 2 ... // this Method waits for XCHMA Medium Cycle Fast Line Crossed Under Slow, // then start to Open Short Trades based On Conditions, and Recieved Verifications from // other Indicator/Oscillator(s) ... bool customMethodCond2 = // conditions.isXCHMAMCFastCrossedUnderSlow // && // entry > nearLL // && // candle1.low != nearLL // && // xCHMALCMin1 < xCHMANonLCMax1 // && // conditions.isXTDSignalUnderBear // && // ( // conditions.isXCHLHMCLCHHSame // ? // xOBDSwingHighBuffer[1] < xOBDSwingLowBuffer[1] // : // true // ) // && // !( conditions.isXCHLHSCMCLLSame || conditions.isXCHLHSCLCLLSame // ) // && // !( // xCHLHMcHHBuffer[1] < xCHLHLcHHBuffer[1] && // xCHLHScHHBuffer[1] < xCHLHMcHHBuffer[1] && xCHLHScLLBuffer[1] > xCHLHMcLLBuffer[1] && // xCHLHMcLLBuffer[1] > xCHLHSignalBBuffer[1] && xCHLHMcLLBuffer[1] > xCHLHSignalTBuffer[1] && // xCHLHSignalBBuffer[1] > xCHLHLcLLBuffer[1] && xCHLHSignalTBuffer[1] > xCHLHLcLLBuffer[1] && // MathAbs(xCHLHScLLBuffer[1] - xCHLHMcLLBuffer[1]) < MathAbs(xCHLHScHHBuffer[1] - xCHLHMcHHBuffer[1]) // ) // ; // // Filling Methods ... if (customMethodCond2) { // ArrayResize( methods, ArraySize(methods) + 1); // methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_2; } // // Condition 3 ... // this Method waits for XCHMA Short Cycle's Fast to Crossed Under all Cycles min value // and then start to Open Short Trades based On Conditions, // and Recieved Verifications from other Indicator/Oscillator(s) ... bool customMethodCond3 = // isXCHMASCFastCrossedUnderMin // && // xCHMAScSlowBuffer[1] < xCHMANonSCMin1 // && // ( // conditions.isXCHMASCFastCrossedUnderSlow || conditions.isXCHMASCFastUnderSlow // ) // && // ( // ( // conditions.isXCHMAMCFastCrossedUnderSlow || conditions.isXCHMAMCFastUnderSlow // ) // && // ( // conditions.isXCHMALCFastCrossedUnderSlow || conditions.isXCHMALCFastUnderSlow // ) // ) // && // ( // ( // conditions.isXTDSignalCrossedUnderBear || conditions.isXTDSignalUnderBear // ) // && // xTDBullishBuffer[1] < xTDBearishBuffer[1] // ) // && // !( // xCHLHMCRange1 < (xCHLHLCRange1 / 2) // && // xCHLHMcHHBuffer[1] < (xCHLHLcHHBuffer[1] - (xCHLHLCRange1 / 2)) // ) // && // !( // conditions.isXCHMAMCFastUnderSlow // && // ( // xCHMAMcFastBuffer[1] > xCHMAMcFastBuffer[5] && xCHMAMcFastBuffer[1] > xCHMAMcFastBuffer[10] // ) // && // ( // xCHMAMCTrend1 < xCHMAMCTrend5 && xCHMAMCTrend1 < xCHMAMCTrend10 // ) // ) // ; // // Filling Methods ... if (customMethodCond3) { // ArrayResize( methods, ArraySize(methods) + 1); // methods[ArraySize(methods) - 1] = X_SIGNAL_METHOD_3; } // // Combine Custom Methods together ... bool isCustomMethodHasSignal = // customMethodCond1 // || // customMethodCond2 // || // customMethodCond3 // ; // // END Custom Mechanism ... // // // Fill Result ... result = // isCustomMethodHasSignal // ; // if (result) { // // Set Number of Occured Conditions for Increasing Volume ... providedSignals = ArraySize(methods); } // return result; } // // // END Combination Signaling ... // //