From b0199f5b4fe5e27273f4775e66cd10e49b4bb5f3 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Wed, 7 Feb 2024 14:45:46 +0330 Subject: [PATCH] Cleanup Repo and Backup contents ... --- BKP/Projects.7z | Bin 206198 -> 0 bytes BKP/Temp/XEmptyPreparedProjet.zip | Bin 184021 -> 0 bytes ...-saherelm.xau5.provider.indicators.lib.mq5 | 9556 ----------- BKP/Temp/xau5.indicators.provider.txt | 8161 ---------- .../Classes/x-saherelm.class.lib.mq5 | 10316 ------------ BKP/XAU5-0.43/Classes/x-saherelm.nn.lib.mq5 | 258 - .../Classes/x-saherelm.provider.lib.mq5 | 4430 ----- BKP/XAU5-0.43/Experts/x-saherelm.xeu5.ea.mq5 | 347 - .../x-saherelm.xama.indicator.helper.lib.mq5 | 607 - ...x-saherelm.xchlh.oscillator.helper.lib.mq5 | 1032 -- ...x-saherelm.xchma.oscillator.helper.lib.mq5 | 2229 --- .../x-saherelm.xfi.oscillator.helper.lib.mq5 | 358 - .../x-saherelm.xlh.indicator.helper.lib.mq5 | 668 - .../x-saherelm.xobd.indicator.helper.lib.mq5 | 249 - .../x-saherelm.xrsi.oscillator.helper.lib.mq5 | 433 - .../x-saherelm.xtd.oscillator.helper.lib.mq5 | 931 -- .../x-saherelm.xtm.indicator.helper.lib.mq5 | 598 - .../x-saherelm.xts.oscillator.helper.lib.mq5 | 1179 -- .../Indicators/x-saherelm.xama.indicator.mq5 | 353 - .../x-saherelm.xchlh.oscillator.mq5 | 753 - .../x-saherelm.xchma.oscillator.mq5 | 1153 -- .../Indicators/x-saherelm.xfi.oscillator.mq5 | 317 - .../Indicators/x-saherelm.xlh.indicator.mq5 | 346 - .../Indicators/x-saherelm.xobd.indicator.mq5 | 390 - .../Indicators/x-saherelm.xrsi.oscillator.mq5 | 397 - .../Indicators/x-saherelm.xtd.oscillator.mq5 | 465 - .../Indicators/x-saherelm.xtm.indicator.mq5 | 349 - .../Indicators/x-saherelm.xts.oscillator.mq5 | 558 - .../Libraries/x-saherelm.alert.lib.mq5 | 200 - .../Libraries/x-saherelm.common.lib.mq5 | 4429 ----- .../Libraries/x-saherelm.draw.lib.mq5 | 2345 --- .../Libraries/x-saherelm.http.lib.mq5 | 177 - .../Libraries/x-saherelm.log.lib.mq5 | 261 - .../Libraries/x-saherelm.models.lib.mq5 | 438 - ...-saherelm.xeu5.provider.indicators.lib.mq5 | 13599 ---------------- .../x-saherelm.xeu5.provider.inputs.lib.mq5 | 280 - .../x-saherelm.xeu5.provider.lib.mq5 | 1370 -- 37 files changed, 69532 deletions(-) delete mode 100644 BKP/Projects.7z delete mode 100644 BKP/Temp/XEmptyPreparedProjet.zip delete mode 100644 BKP/Temp/x-saherelm.xau5.provider.indicators.lib.mq5 delete mode 100644 BKP/Temp/xau5.indicators.provider.txt delete mode 100644 BKP/XAU5-0.43/Classes/x-saherelm.class.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Classes/x-saherelm.nn.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Classes/x-saherelm.provider.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Experts/x-saherelm.xeu5.ea.mq5 delete mode 100644 BKP/XAU5-0.43/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Indicators/x-saherelm.xama.indicator.mq5 delete mode 100644 BKP/XAU5-0.43/Indicators/x-saherelm.xchlh.oscillator.mq5 delete mode 100644 BKP/XAU5-0.43/Indicators/x-saherelm.xchma.oscillator.mq5 delete mode 100644 BKP/XAU5-0.43/Indicators/x-saherelm.xfi.oscillator.mq5 delete mode 100644 BKP/XAU5-0.43/Indicators/x-saherelm.xlh.indicator.mq5 delete mode 100644 BKP/XAU5-0.43/Indicators/x-saherelm.xobd.indicator.mq5 delete mode 100644 BKP/XAU5-0.43/Indicators/x-saherelm.xrsi.oscillator.mq5 delete mode 100644 BKP/XAU5-0.43/Indicators/x-saherelm.xtd.oscillator.mq5 delete mode 100644 BKP/XAU5-0.43/Indicators/x-saherelm.xtm.indicator.mq5 delete mode 100644 BKP/XAU5-0.43/Indicators/x-saherelm.xts.oscillator.mq5 delete mode 100644 BKP/XAU5-0.43/Libraries/x-saherelm.alert.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Libraries/x-saherelm.common.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Libraries/x-saherelm.draw.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Libraries/x-saherelm.http.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Libraries/x-saherelm.log.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Libraries/x-saherelm.models.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 delete mode 100644 BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.lib.mq5 diff --git a/BKP/Projects.7z b/BKP/Projects.7z deleted file mode 100644 index fd63b493f87768948412837131d01a4753caa2fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206198 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Ðh$wQ2$5 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

B}(j&J7ih>d9!cz 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 diff --git a/BKP/Temp/XEmptyPreparedProjet.zip b/BKP/Temp/XEmptyPreparedProjet.zip deleted file mode 100644 index 8ba604e3f85f91b8e2e91b4041a44be1a6788f7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184021 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šQmW9*j$k}rn(7bRLRds%^r9#95` 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 aHvaAb1W;N604%_NN5F+k5Adx3!2bX;9s&~p diff --git a/BKP/Temp/x-saherelm.xau5.provider.indicators.lib.mq5 b/BKP/Temp/x-saherelm.xau5.provider.indicators.lib.mq5 deleted file mode 100644 index cd1bb2ad..00000000 --- a/BKP/Temp/x-saherelm.xau5.provider.indicators.lib.mq5 +++ /dev/null @@ -1,9556 +0,0 @@ -/////////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XAU5 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 - -// -// START Define Enums ... -// - -// -enum ENUM_XAU5_SIGNAL_PROVIDERS -{ - // - // XSP Expert Support Mechanism ... - XSP, - // - // XTD ... - XTD, - // - // XTAM ... - XTAM, - // - // XSI ... - XSI, - // - // XSTFI ... - XSTFI, - // - // XOBDLH ... - XOBDLH, - // - // XCHMACC ... - XCHMACC, - // - // XCHMACMN ... - XCHMACMN, - // - // XCHMACMX ... - XCHMACMX, -}; - -// -// Represent Market Conditions ... -struct XAU5MarketConditions -{ - // - // XTM ... - bool isXTMPeak; - bool isXTMVale; - bool isXTMBullish; - bool isXTMBearish; - bool isXTMNeutural; - bool isXTMEndBullish; - bool isXTMEndBearish; - bool isXTMStartBullish; - bool isXTMStartBearish; - bool isXTMEndBullishByNeutural; - bool isXTMEndBearishByNeutural; - bool isXTMStartBullishAfterNeutural; - bool isXTMStartBearishAfterNeutural; - - // - // XAMA ... - bool isXAMAPeak; - bool isXAMAVale; - bool isXAMABullish; - bool isXAMABearish; - bool isXAMANeutural; - bool isXAMAEndBullish; - bool isXAMAEndBearish; - bool isXAMAStartBullish; - bool isXAMAStartBearish; - bool isXAMAEndBullishByNeutural; - bool isXAMAEndBearishByNeutural; - bool isXAMAStartBullishAfterNeutural; - bool isXAMAStartBearishAfterNeutural; - - // - // XLH ... - bool isXLHHHIncreased; - bool isXLHHHDecreased; - bool isXLHLLIncreased; - bool isXLHLLDecreased; - bool isXLHLowAttachedLL; - bool isXLHHighAttachedHH; - bool isXLHHHSameInLength; - bool isXLHLLSameInLength; - bool isXLHPriceOverSignal; - bool isXLHPriceUnderSignal; - bool isXLHPriceInSignalRange; - bool isXLHPriceCrossedOverSignal; - bool isXLHPriceCrossedUnderSignal; - - // - // XTD ... - bool isXTDSignalPeak; - bool isXTDSignalVale; - bool isXTDBullishPeak; - bool isXTDBullishVale; - bool isXTDBearishPeak; - bool isXTDBearishVale; - bool isXTDBullOverBear; - bool isXTDBullUnderBear; - bool isXTDSignalOverBear; - bool isXTDSignalUnderBear; - bool isXTDBullCrossedOverBear; - bool isXTDBullCrossedUnderBear; - bool isXTDSignalCrossedOverBear; - bool isXTDSignalCrossedUnderBear; - - // - // XFI ... - bool isXFIPeak; - bool isXFIVale; - bool isXFICrossedOverZero; - bool isXFIOverZero; - bool isXFICrossedUnderZero; - bool isXFIUnderZero; - - // - // XTS ... - bool isXTSAllSame; - bool isXTSCurrentMin; - bool isXTSCurrentMax; - bool isXTSCurrentOverFarest; - bool isXTSCurrentOverNearest; - bool isXTSCurrentOverMediest; - bool isXTSCurrentUnderFarest; - bool isXTSCurrentUnderNearest; - bool isXTSCurrentUnderMediest; - bool isXTSCurrentCrossedOverFarest; - bool isXTSCurrentCrossedOverNearest; - bool isXTSCurrentCrossedOverMediest; - bool isXTSCurrentCrossedUnderFarest; - bool isXTSCurrentCrossedUnderNearest; - bool isXTSCurrentCrossedUnderMediest; - - // - // XRSI ... - bool isXRSIPeak; - bool isXRSIVale; - bool isXRSICrossedOverLongExit; - bool isXRSICrossedOverLongEntry; - bool isXRSICrossedUnderShortExit; - bool isXRSICrossedUnderShortEntry; - - // - // XOBD ... - bool isXOBDSwingLow; - bool isXOBDSwingHigh; - - // - // XCHLH ... - // - bool isXCHLHSameHHs; - bool isXCHLHSameLLs; - // - bool isXCHLHSCMCHHSame; - bool isXCHLHSCMCLLSame; - // - bool isXCHLHSCLCHHSame; - bool isXCHLHSCLCLLSame; - // - bool isXCHLHMCLCHHSame; - bool isXCHLHMCLCLLSame; - // - bool isXCHLHMCOnTopOfLC; - bool isXCHLHMCInBottomOfLC; - - // - // XCHMA ... - // - bool isXCHMASCOverMax; - bool isXCHMASCOverMin; - bool isXCHMASCUnderMax; - bool isXCHMASCUnderMin; - // - bool isXCHMASCCrossedOverMax; - bool isXCHMASCCrossedUnderMax; - bool isXCHMASCCrossedOverMin; - bool isXCHMASCCrossedUnderMin; - // - bool isXCHMASCPeak; - bool isXCHMASCVale; - bool isXCHMASCTrendsUp; - bool isXCHMASCTrendsDown; - bool isXCHMASCFastOverSlow; - bool isXCHMASCFastUnderSlow; - bool isXCHMASCFastCrossedOverSlow; - bool isXCHMASCFastCrossedUnderSlow; - // - bool isXCHMAMCPeak; - bool isXCHMAMCVale; - bool isXCHMAMCTrendsUp; - bool isXCHMAMCTrendsDown; - bool isXCHMAMCFastOverSlow; - bool isXCHMAMCFastUnderSlow; - bool isXCHMAMCFastCrossedOverSlow; - bool isXCHMAMCFastCrossedUnderSlow; - // - bool isXCHMALCPeak; - bool isXCHMALCVale; - bool isXCHMALCTrendsUp; - bool isXCHMALCTrendsDown; - bool isXCHMALCFastOverSlow; - bool isXCHMALCFastUnderSlow; - bool isXCHMALCFastCrossedOverSlow; - bool isXCHMALCFastCrossedUnderSlow; -}; - -// -// END Define Enums ... -// - -// -// Include Provider Inputs ... -#include "x-saherelm.xau5.provider.inputs.lib.mq5" - -// -// Signallers ... -input group "XAU5 Signallers"; - -// -// XTD ... -input group "XAU5 XTD Signaller"; -input bool xAU5XTDEnableSignaller = true; // Enable Signaller -// input bool xAU5XTDEnableTPSL = false; // Enable TP/SL -input bool xAU5XTDAllowLongSignals = true; // Enable Long Signals -input bool xAU5XTDAllowShortSignals = true; // Enable Short Signals - -// -// XTAM ... -input group "XAU5 XTAM Signaller"; -input bool xAU5XTAMEnableSignaller = true; // Enable Signaller -// input bool xAU5XTAMEnableTPSL = false; // Enable TP/SL -input bool xAU5XTAMAllowLongSignals = true; // Enable Long Signals -input bool xAU5XTAMAllowShortSignals = true; // Enable Short Signals - -// -// XSI ... -input group "XAU5 XSI Signaller"; -input bool xAU5XSIEnableSignaller = true; // Enable Signaller -// input bool xAU5SIXEnableTPSL = false; // Enable TP/SL -input bool xAU5XSIAllowLongSignals = true; // Enable Long Signals -input bool xAU5XSIAllowShortSignals = true; // Enable Short Signals - -// -// XSTFI ... -input group "XAU5 XSTFI Signaller"; -input bool xAU5XSTFIEnableSignaller = true; // Enable Signaller -// input bool xAU5XSTFIEnableTPSL = false; // Enable TP/SL -input bool xAU5XSTFIAllowLongSignals = true; // Enable Long Signals -input bool xAU5XSTFIAllowShortSignals = true; // Enable Short Signals - -// -// XOBDLH ... -input group "XAU5 XOBDLH Signaller"; -input bool xAU5XOBDLHEnableSignaller = true; // Enable Signaller -// input bool xAU5XOBDLHEnableTPSL = false; // Enable TP/SL -input bool xAU5XOBDLHAllowLongSignals = true; // Enable Long Signals -input bool xAU5XOBDLHAllowShortSignals = true; // Enable Short Signals - -// -// XCHMACC ... -input group "XAU5 XCHMACC Signaller"; -input bool xAU5XCHMACCEnableSignaller = true; // Enable Signaller -// input bool xAU5XCHMACCEnableTPSL = false; // Enable TP/SL -input bool xAU5XCHMACCAllowLongSignals = true; // Enable Long Signals -input bool xAU5XCHMACCAllowShortSignals = true; // Enable Short Signals - -// -// XCHMACMX ... -input group "XAU5 XCHMACMX Signaller"; -input bool xAU5XCHMACMXEnableSignaller = true; // Enable Signaller -// input bool xAU5XCHMACMXEnableTPSL = false; // Enable TP/SL -input bool xAU5XCHMACMXAllowLongSignals = true; // Enable Long Signals -input bool xAU5XCHMACMXAllowShortSignals = true; // Enable Short Signals - -// -// XCHMACMN ... -input group "XAU5 XCHMACMN Signaller"; -input bool xAU5XCHMACMNEnableSignaller = true; // Enable Signaller -// input bool xAU5XCHMACMNEnableTPSL = false; // Enable TP/SL -input bool xAU5XCHMACMNAllowLongSignals = true; // Enable Long Signals -input bool xAU5XCHMACMNAllowShortSignals = true; // Enable Short Signals - -// -// Imports all Indicators Helper here ... -// input group "XAU5 Provider Indicators"; - -// -#include "../Helpers/x-saherelm.xtm.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xama.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xlh.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xts.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xobd.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5" - -// -bool xAU5IsTestMode = true; -int xAU5MaxLengthOfInputs = 0; -int xAU5CalculatedBars = 0; - -// -// Signaller Variables ... -// -// XTD ... -bool xAU5MXTDEnableSignaller = xAU5XTDEnableSignaller; -// bool xAU5MXTDEnableTPSL = xAU5XTDEnableTPSL; -bool xAU5MXTDAllowLongSignals = xAU5XTDAllowLongSignals; -bool xAU5MXTDAllowShortSignals = xAU5XTDAllowShortSignals; - -// -// XTAM ... -bool xAU5MXTAMEnableSignaller = xAU5XTAMEnableSignaller; -// bool xAU5MXTAMEnableTPSL = xAU5XTAMEnableTPSL; -bool xAU5MXTAMAllowLongSignals = xAU5XTAMAllowLongSignals; -bool xAU5MXTAMAllowShortSignals = xAU5XTAMAllowShortSignals; - -// -// XSI ... -bool xAU5MXSIEnableSignaller = xAU5XSIEnableSignaller; -// bool xAU5MSIXEnableTPSL = xAU5SIXEnableTPSL; -bool xAU5MXSIAllowLongSignals = xAU5XSIAllowLongSignals; -bool xAU5MXSIAllowShortSignals = xAU5XSIAllowShortSignals; - -// -// XSTFI ... -bool xAU5MXSTFIEnableSignaller = xAU5XSTFIEnableSignaller; -// bool xAU5MXSTFIEnableTPSL = xAU5XSTFIEnableTPSL; -bool xAU5MXSTFIAllowLongSignals = xAU5XSTFIAllowLongSignals; -bool xAU5MXSTFIAllowShortSignals = xAU5XSTFIAllowShortSignals; - -// -// XOBDLH ... -bool xAU5MXOBDLHEnableSignaller = xAU5XOBDLHEnableSignaller; -// bool xAU5MXOBDLHEnableTPSL = xAU5XOBDLHEnableTPSL; -bool xAU5MXOBDLHAllowLongSignals = xAU5XOBDLHAllowLongSignals; -bool xAU5MXOBDLHAllowShortSignals = xAU5XOBDLHAllowShortSignals; - -// -// XCHMACC ... -bool xAU5MXCHMACCEnableSignaller = xAU5XCHMACCEnableSignaller; -// bool xAU5MXCHMACCEnableTPSL = xAU5XCHMACCEnableTPSL; -bool xAU5MXCHMACCAllowLongSignals = xAU5XCHMACCAllowLongSignals; -bool xAU5MXCHMACCAllowShortSignals = xAU5XCHMACCAllowShortSignals; - -// -// XCHMAMX ... -bool xAU5MXCHMACMXEnableSignaller = xAU5XCHMACMXEnableSignaller; -// bool xAU5MXCHMACMXEnableTPSL = xAU5XCHMACMXEnableTPSL; -bool xAU5MXCHMACMXAllowLongSignals = xAU5XCHMACMXAllowLongSignals; -bool xAU5MXCHMACMXAllowShortSignals = xAU5XCHMACMXAllowShortSignals; - -// -// XCHMAMN ... -bool xAU5MXCHMACMNEnableSignaller = xAU5XCHMACMNEnableSignaller; -// bool xAU5MXCHMACMNEnableTPSL = xAU5XCHMACMNEnableTPSL; -bool xAU5MXCHMACMNAllowLongSignals = xAU5XCHMACMNAllowLongSignals; -bool xAU5MXCHMACMNAllowShortSignals = xAU5XCHMACMNAllowShortSignals; - -// -// Funded Next Resolve Guards ... -bool isXAU5OnFundedNext = true; - -// -// Here we Define some Global Market Variables to Analyse MArket Conditions -// using them at each time ... -XAU5MarketConditions xAU5Conditions = {}; - -// -// Validate Indicators Inputs ... -bool XAU5ValidateIndicatorsInputs() -{ - // - bool result = false; - - // - // XTM ... - result = XTMValidateInputs(); - if (!result) - { - return result; - } - - // - // XAMA ... - result = XAMAValidateInputs(); - if (!result) - { - return result; - } - - // - // XTD ... - result = XTDValidateInputs(); - if (!result) - { - return result; - } - - // - // XFI ... - result = XFIValidateInputs(); - if (!result) - { - return result; - } - - // - // XTS ... - result = XTSValidateInputs(); - if (!result) - { - return result; - } - - // - // XOBD ... - result = XOBDValidateInputs(); - if (!result) - { - return result; - } - - // - // XLH ... - result = XLHValidateInputs(); - if (!result) - { - return result; - } - - // - // XRSI ... - result = XRSIValidateInputs(); - if (!result) - { - return result; - } - - // - // XCHLH ... - result = XCHLHValidateInputs(); - if (!result) - { - return result; - } - - // - // XCHMA ... - result = XCHMAValidateInputs(); - if (!result) - { - return result; - } - - // - result = true; - - // - return result; -} - -// -// Init Indicators ... -bool XAU5InitIndicators() -{ - // - bool result = false; - - // - // Make it Enable when we need to Log Market Conditions ... - // xAU5IsTestMode = false; // IsRunningOnTestMode(); - - // - // Check and Calculate Max Length in Inputs ... - // - - // - // XTM ... - xAU5MaxLengthOfInputs = MathMax( - xTMMaPeriod, - xAU5NumberOfItemsPerTick); - - // - // XAMA ... - xAU5MaxLengthOfInputs = MathMax( - xAMALength, - xAU5NumberOfItemsPerTick); - xAU5MaxLengthOfInputs = MathMax( - xAMAFastEMA, - xAU5NumberOfItemsPerTick); - xAU5MaxLengthOfInputs = MathMax( - xAMASlowEMA, - xAU5NumberOfItemsPerTick); - - // - // XLH ... - xAU5MaxLengthOfInputs = MathMax( - xLHLength, - xAU5NumberOfItemsPerTick); - - // - // XTD ... - xAU5MaxLengthOfInputs = MathMax( - xTDLength, - xAU5MaxLengthOfInputs); - - // - // XFI ... - xAU5MaxLengthOfInputs = MathMax( - xFILength, - xAU5MaxLengthOfInputs); - - // - // XRSI ... - xAU5MaxLengthOfInputs = MathMax( - xRSILength, - xAU5MaxLengthOfInputs); - - // - // XOBD ... - xAU5MaxLengthOfInputs = MathMax( - xOBDLength, - xAU5MaxLengthOfInputs); - - // - // XCHLH ... - xAU5MaxLengthOfInputs = MathMax( - xCHLHLcLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHLHMcLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHLHScLength, - xAU5MaxLengthOfInputs); - - // - // XCHMA ... - xAU5MaxLengthOfInputs = MathMax( - xCHMAScFastLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHMAScSlowLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHMAMcFastLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHMAMcSlowLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHMALcFastLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHMALcSlowLength, - xAU5MaxLengthOfInputs); - - // - // Validate Indicators Inputs before Initialization ... - result = XAU5ValidateIndicatorsInputs(); - if (!result) - { - return result; - } - - // - // Validate Signallers ... - - // - // XTD ... - bool isXTDEnable = - xAU5XTDEnableSignaller && - (xAU5XTDAllowLongSignals || - xAU5XTDAllowShortSignals); - - // - // XTAM ... - bool isXTAMEnable = - xAU5XTAMEnableSignaller && - (xAU5XTAMAllowLongSignals || - xAU5XTAMAllowShortSignals); - - // - // XSI ... - bool isXSIEnable = - xAU5XSIEnableSignaller && - (xAU5XSIAllowLongSignals || - xAU5XSIAllowShortSignals); - - // - // XSTFI ... - bool isXSTFIEnable = - xAU5XSTFIEnableSignaller && - (xAU5XSTFIAllowLongSignals || - xAU5XSTFIAllowShortSignals); - - // - // XOBDLH ... - bool isXOBDLHEnable = - xAU5XOBDLHEnableSignaller && - (xAU5XOBDLHAllowLongSignals || - xAU5XOBDLHAllowShortSignals); - - // - // XCHMACC ... - bool isXCHMACCEnable = - xAU5XCHMACCEnableSignaller && - (xAU5XCHMACCAllowLongSignals || - xAU5XCHMACCAllowShortSignals); - - // - // XCHMACMX ... - bool isXCHMACMXEnable = - xAU5XCHMACMXEnableSignaller && - (xAU5XCHMACMXAllowLongSignals || - xAU5XCHMACMXAllowShortSignals); - - // - // XCHMACMN ... - bool isXCHMACMNEnable = - xAU5XCHMACMNEnableSignaller && - (xAU5XCHMACMNAllowLongSignals || - xAU5XCHMACMNAllowShortSignals); - - // - bool hasSignaller = - // - isXTDEnable || - isXTAMEnable || - isXSIEnable || - isXSTFIEnable || - isXOBDLHEnable || - isXCHMACCEnable || - isXCHMACMXEnable || - isXCHMACMNEnable - // - ; - result = hasSignaller; - if (!result) - { - // - LogMessage("XAU5 doesn't enable any Signaller ..."); - - // - return result; - } - - // - // Initialize Indicator/Oscillator Handlers ... - ResetLastError(); - - // - // XTM Init ... - result = XTMInitHandlers(); - if (!result) - { - return result; - } - - // - // XAMA Init ... - result = XAMAInitHandlers(); - if (!result) - { - return result; - } - - // - // XLH Init ... - result = XLHInitHandlers(); - if (!result) - { - return result; - } - - // - // XTD Init ... - result = XTDInitHandlers(); - if (!result) - { - return result; - } - - // - // XFI Init ... - result = XFIInitHandlers(); - if (!result) - { - return result; - } - - // - // XTS Init ... - result = XTSInitHandlers(); - 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 XAU5ReleaseIndicators() -{ - // - // Release Handlers ... - XTMReleaseHandlers(); - XAMAReleaseHandlers(); - XLHReleaseHandlers(); - XTDReleaseHandlers(); - XFIReleaseHandlers(); - XTSReleaseHandlers(); - XRSIReleaseHandlers(); - XOBDReleaseHandlers(); - XCHMAReleaseHandlers(); - XCHLHReleaseHandlers(); -} - -// -// Handle Reading Buffers ... -void XAU5HandleReadingBuffers() -{ - // - // Reading Calculated Bars for a Simple Handler ... - xAU5CalculatedBars = BarsCalculated(xTMHandler); - - // - // Read Indicators Buffers ... - XTMReadBuffers(xAU5NumberOfItemsPerTick); - XAMAReadBuffers(xAU5NumberOfItemsPerTick); - XLHReadBuffers(xAU5NumberOfItemsPerTick); - XTDReadBuffers(xAU5NumberOfItemsPerTick); - XFIReadBuffers(xAU5NumberOfItemsPerTick); - XTSReadBuffers(xAU5NumberOfItemsPerTick); - XRSIReadBuffers(xAU5NumberOfItemsPerTick); - XOBDReadBuffers(xAU5NumberOfItemsPerTick); - XCHMAReadBuffers(xAU5NumberOfItemsPerTick); - XCHLHReadBuffers(xAU5NumberOfItemsPerTick); - - // - XAU5ReadConditions(); -} - -// -// -// 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 XAU5CanOpenLongTrade( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - info.tp = 0; - info.sl = 0; - ArrayResize( - info.signallers, - 0); - - // - bool hasSignal = XAU5HasLongSignal(info); - - // - result = - // - hasSignal - // - ; - - // - if (result) - { - XAU5ClearConditions(); - } - - // - 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 XAU5CanCloseLongTrade() -{ - // - bool result = false; - - // - 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 XAU5CanOpenShortTrade( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - info.tp = 0; - info.sl = 0; - ArrayResize( - info.signallers, - 0); - - // - bool hasSignal = XAU5HasShortSignal(info); - - // - result = - // - hasSignal - // - ; - - // - if (result) - { - XAU5ClearConditions(); - } - - // - 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 XAU5CanCloseShortTrade() -{ - // - bool result = false; - - // - return result; -} - -// -// -// END Combination Functions ... -// -// - -// -// -// START Combination Signaling ... -// -// - -// -// Read All Globally Required Conditions ... -void XAU5ReadConditions() -{ - // - XAU5ClearConditions(); - - // - xAU5Conditions = XAU5GenerateMarketConditions(1); -} - -// -// Cleanup Conditions ... -void XAU5ClearConditions() -{ - // - XAU5MarketConditions mConditions = {}; - - // - xAU5Conditions = mConditions; -} - -// -// Generate Merket Conditions for Specified Bar Index ... -XAU5MarketConditions XAU5GenerateMarketConditions( - int bar_index = 1 // Specified Bar Index ... -) -{ - // - XAU5MarketConditions mConditions = {}; - - // - // XTM ... - mConditions.isXTMPeak = XTMIsPeak(bar_index); - mConditions.isXTMVale = XTMIsVale(bar_index); - mConditions.isXTMBullish = XTMIsBullish(bar_index); - mConditions.isXTMBearish = XTMIsBearish(bar_index); - mConditions.isXTMNeutural = XTMIsNeutural(bar_index); - mConditions.isXTMEndBullish = XTMIsEndBullish(bar_index); - mConditions.isXTMEndBearish = XTMIsEndBearish(bar_index); - mConditions.isXTMStartBullish = XTMIsStartBullish(bar_index); - mConditions.isXTMStartBearish = XTMIsStartBearish(bar_index); - mConditions.isXTMEndBullishByNeutural = XTMIsEndBullishByNeutural(bar_index); - mConditions.isXTMEndBearishByNeutural = XTMIsEndBearishByNeutural(bar_index); - mConditions.isXTMStartBullishAfterNeutural = XTMIsStartBullishAfterNeutural(bar_index); - mConditions.isXTMStartBearishAfterNeutural = XTMIsStartBearishAfterNeutural(bar_index); - - // - // XAMA ... - mConditions.isXAMAPeak = XAMAIsPeak(bar_index); - mConditions.isXAMAVale = XAMAIsVale(bar_index); - mConditions.isXAMABullish = XAMAIsBullish(bar_index); - mConditions.isXAMABearish = XAMAIsBearish(bar_index); - mConditions.isXAMANeutural = XAMAIsNeutural(bar_index); - mConditions.isXAMAEndBullish = XAMAIsEndBullish(bar_index); - mConditions.isXAMAEndBearish = XAMAIsEndBearish(bar_index); - mConditions.isXAMAStartBullish = XAMAIsStartBullish(bar_index); - mConditions.isXAMAStartBearish = XAMAIsStartBearish(bar_index); - mConditions.isXAMAEndBullishByNeutural = XAMAIsEndBullishByNeutural(bar_index); - mConditions.isXAMAEndBearishByNeutural = XAMAIsEndBearishByNeutural(bar_index); - mConditions.isXAMAStartBullishAfterNeutural = XAMAIsStartBullishAfterNeutural(bar_index); - mConditions.isXAMAStartBearishAfterNeutural = XAMAIsStartBearishAfterNeutural(bar_index); - - // - // XLH ... - mConditions.isXLHHHIncreased = XLHIsHHIncreased(bar_index); - mConditions.isXLHHHDecreased = XLHIsHHDecreased(bar_index); - mConditions.isXLHLLIncreased = XLHIsLLIncreased(bar_index); - mConditions.isXLHLLDecreased = XLHIsLLDecreased(bar_index); - mConditions.isXLHLowAttachedLL = XLHIsLowAttachedLL(bar_index); - mConditions.isXLHHighAttachedHH = XLHIsHighAttachedHH(bar_index); - mConditions.isXLHHHSameInLength = XLHIsHHSameInLength(bar_index); - mConditions.isXLHLLSameInLength = XLHIsLLSameInLength(bar_index); - mConditions.isXLHPriceOverSignal = XLHIsPriceOverSignal(bar_index); - mConditions.isXLHPriceUnderSignal = XLHIsPriceUnderSignal(bar_index); - mConditions.isXLHPriceInSignalRange = XLHIsPriceInSignalRange(bar_index); - mConditions.isXLHPriceCrossedOverSignal = XLHIsPriceCrossedOverSignal(bar_index); - mConditions.isXLHPriceCrossedUnderSignal = XLHIsPriceCrossedUnderSignal(bar_index); - - // - // XTD ... - mConditions.isXTDSignalPeak = XTDIsSignalPeak(bar_index); - mConditions.isXTDSignalVale = XTDIsSignalVale(bar_index); - mConditions.isXTDBullishPeak = XTDIsBullishPeak(bar_index); - mConditions.isXTDBullishVale = XTDIsBullishVale(bar_index); - mConditions.isXTDBearishPeak = XTDIsBearishPeak(bar_index); - mConditions.isXTDBearishVale = XTDIsBearishVale(bar_index); - mConditions.isXTDBullOverBear = XTDIsBullOverBear(bar_index); - mConditions.isXTDBullUnderBear = XTDIsBullUnderBear(bar_index); - mConditions.isXTDSignalOverBear = XTDIsSignalOverBear(bar_index); - mConditions.isXTDSignalUnderBear = XTDIsSignalUnderBear(bar_index); - mConditions.isXTDBullCrossedOverBear = XTDIsBullCrossedOverBear(bar_index); - mConditions.isXTDBullCrossedUnderBear = XTDIsBullCrossedUnderBear(bar_index); - mConditions.isXTDSignalCrossedOverBear = XTDIsSignalCrossedOverBear(bar_index); - mConditions.isXTDSignalCrossedUnderBear = XTDIsSignalCrossedUnderBear(bar_index); - - // - // XFI ... - mConditions.isXFIPeak = XFIIsPeak(bar_index); - mConditions.isXFIVale = XFIIsVale(bar_index); - mConditions.isXFIOverZero = XFIIsOverZero(bar_index); - mConditions.isXFIUnderZero = XFIIsUnderZero(bar_index); - mConditions.isXFICrossedOverZero = XFIIsCrossedOverZero(bar_index); - mConditions.isXFICrossedUnderZero = XFIIsCrossedUnderZero(bar_index); - - // - // XTS ... - mConditions.isXTSAllSame = XTSIsAllSame(bar_index); - mConditions.isXTSCurrentMin = XTSIsCurrentMin(bar_index); - mConditions.isXTSCurrentMax = XTSIsCurrentMax(bar_index); - mConditions.isXTSCurrentOverFarest = XTSIsCurrentOverFarest(bar_index); - mConditions.isXTSCurrentOverNearest = XTSIsCurrentOverNearest(bar_index); - mConditions.isXTSCurrentOverMediest = XTSIsCurrentOverMediest(bar_index); - mConditions.isXTSCurrentUnderFarest = XTSIsCurrentUnderFarest(bar_index); - mConditions.isXTSCurrentUnderNearest = XTSIsCurrentUnderNearest(bar_index); - mConditions.isXTSCurrentUnderMediest = XTSIsCurrentUnderMediest(bar_index); - mConditions.isXTSCurrentCrossedOverFarest = XTSIsCurrentCrossedOverFarest(bar_index); - mConditions.isXTSCurrentCrossedOverNearest = XTSIsCurrentCrossedOverNearest(bar_index); - mConditions.isXTSCurrentCrossedOverMediest = XTSIsCurrentCrossedOverMediest(bar_index); - mConditions.isXTSCurrentCrossedUnderFarest = XTSIsCurrentCrossedUnderFarest(bar_index); - mConditions.isXTSCurrentCrossedUnderNearest = XTSIsCurrentCrossedUnderNearest(bar_index); - mConditions.isXTSCurrentCrossedUnderMediest = XTSIsCurrentCrossedUnderMediest(bar_index); - - // - // XRSI ... - mConditions.isXRSIPeak = XRSIIsPeak(bar_index); - mConditions.isXRSIVale = XRSIIsVale(bar_index); - mConditions.isXRSICrossedOverLongExit = XRSIIsCrossedOverLongExit(bar_index); - mConditions.isXRSICrossedOverLongEntry = XRSIIsCrossedOverLongEntry(bar_index); - mConditions.isXRSICrossedUnderShortExit = XRSIIsCrossedUnderShortExit(bar_index); - mConditions.isXRSICrossedUnderShortEntry = XRSIIsCrossedUnderShortEntry(bar_index); - - // - // XOBD ... - mConditions.isXOBDSwingLow = XOBDIsSwingLow(bar_index); - mConditions.isXOBDSwingHigh = XOBDIsSwingHigh(bar_index); - - // - // XCHLH ... - // - mConditions.isXCHLHSameHHs = XCHLHIsSameHHs(bar_index); - mConditions.isXCHLHSameLLs = XCHLHIsSameLLs(bar_index); - // - mConditions.isXCHLHSCMCHHSame = XCHLHIsMCSCHasSameHH(bar_index); - mConditions.isXCHLHSCMCLLSame = XCHLHIsMCSCHasSameLL(bar_index); - // - mConditions.isXCHLHSCLCHHSame = XCHLHIsLCSCHasSameHH(bar_index); - mConditions.isXCHLHSCLCLLSame = XCHLHIsLCSCHasSameLL(bar_index); - // - mConditions.isXCHLHMCLCHHSame = XCHLHIsLCMCHasSameHH(bar_index); - mConditions.isXCHLHMCLCLLSame = XCHLHIsLCMCHasSameLL(bar_index); - // - mConditions.isXCHLHMCOnTopOfLC = XCHLHIsMCOnTopOfLC(bar_index); - mConditions.isXCHLHMCInBottomOfLC = XCHLHIsMCInBottomOfLC(bar_index); - - // - // XCHMA ... - // - mConditions.isXCHMASCOverMax = XCHMAIsSCOverMax(bar_index); - mConditions.isXCHMASCOverMin = XCHMAIsSCOverMin(bar_index); - mConditions.isXCHMASCUnderMax = XCHMAIsSCUnderMax(bar_index); - mConditions.isXCHMASCUnderMin = XCHMAIsSCUnderMin(bar_index); - // - mConditions.isXCHMASCCrossedOverMax = XCHMAIsSCCrossedOverMax(bar_index); - mConditions.isXCHMASCCrossedUnderMax = XCHMAIsSCCrossedUnderMax(bar_index); - mConditions.isXCHMASCCrossedOverMin = XCHMAIsSCCrossedOverMin(bar_index); - mConditions.isXCHMASCCrossedUnderMin = XCHMAIsSCCrossedUnderMin(bar_index); - // - mConditions.isXCHMASCPeak = XCHMAIsSCPeak(bar_index); - mConditions.isXCHMASCVale = XCHMAIsSCVale(bar_index); - mConditions.isXCHMASCTrendsUp = XCHMAIsSCTrendsUp(bar_index); - mConditions.isXCHMASCTrendsDown = XCHMAIsSCTrendsDown(bar_index); - mConditions.isXCHMASCFastOverSlow = XCHMAIsSCFastOverSlow(bar_index); - mConditions.isXCHMASCFastUnderSlow = XCHMAIsSCFastUnderSlow(bar_index); - mConditions.isXCHMASCFastCrossedOverSlow = XCHMAIsSCFastCrossedOverSlow(bar_index); - mConditions.isXCHMASCFastCrossedUnderSlow = XCHMAIsSCFastCrossedUnderSlow(bar_index); - // - mConditions.isXCHMAMCPeak = XCHMAIsMCPeak(bar_index); - mConditions.isXCHMAMCVale = XCHMAIsMCVale(bar_index); - mConditions.isXCHMAMCTrendsUp = XCHMAIsMCTrendsUp(bar_index); - mConditions.isXCHMAMCTrendsDown = XCHMAIsMCTrendsDown(bar_index); - mConditions.isXCHMAMCFastOverSlow = XCHMAIsMCFastOverSlow(bar_index); - mConditions.isXCHMAMCFastUnderSlow = XCHMAIsMCFastUnderSlow(bar_index); - mConditions.isXCHMAMCFastCrossedOverSlow = XCHMAIsMCFastCrossedOverSlow(bar_index); - mConditions.isXCHMAMCFastCrossedUnderSlow = XCHMAIsMCFastCrossedUnderSlow(bar_index); - // - mConditions.isXCHMALCPeak = XCHMAIsLCPeak(bar_index); - mConditions.isXCHMALCVale = XCHMAIsLCVale(bar_index); - mConditions.isXCHMALCTrendsUp = XCHMAIsLCTrendsUp(bar_index); - mConditions.isXCHMALCTrendsDown = XCHMAIsLCTrendsDown(bar_index); - mConditions.isXCHMALCFastOverSlow = XCHMAIsLCFastOverSlow(bar_index); - mConditions.isXCHMALCFastUnderSlow = XCHMAIsLCFastUnderSlow(bar_index); - mConditions.isXCHMALCFastCrossedOverSlow = XCHMAIsLCFastCrossedOverSlow(bar_index); - mConditions.isXCHMALCFastCrossedUnderSlow = XCHMAIsLCFastCrossedUnderSlow(bar_index); - - // - return mConditions; -} - -// -// Check Market Conditions by Combination of Power of All tools for LONGs ... -bool XAU5HasLongSignal( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - // XTD ... - bool isXTDHasSignal = XAU5XTDHasLongSignal(); - if (isXTDHasSignal) - { - // - Add( - EnumToString(XTD), - info.signallers); - } - - // - // XTAM ... - bool isXTAMHasSignal = XAU5XTAMHasLongSignal(); - if (isXTAMHasSignal) - { - // - Add( - EnumToString(XTAM), - info.signallers); - } - - // - // XSI ... - bool isXSIHasSignal = XAU5XSIHasLongSignal(); - if (isXSIHasSignal) - { - // - Add( - EnumToString(XSI), - info.signallers); - } - - // - // XSTFI ... - bool isXSTFIHasSignal = XAU5XSTFIHasLongSignal(); - if (isXSTFIHasSignal) - { - // - Add( - EnumToString(XSTFI), - info.signallers); - } - - // - // XOBD XLH ... - bool isXOBDLHHasSignal = XAU5XOBDLHHasLongSignal(); - if (isXOBDLHHasSignal) - { - // - Add( - EnumToString(XOBDLH), - info.signallers); - } - - // - // XCHMA Cycles Cross ... - bool isXCHMACCHasSignal = XAU5XCHMACCHasLongSignal(); - if (isXCHMACCHasSignal) - { - // - Add( - EnumToString(XCHMACC), - info.signallers); - } - - // - // XCHMA Cycles Min ... - bool isXCHMACMNHasSignal = XAU5XCHMACMNHasLongSignal(); - if (isXCHMACMNHasSignal) - { - // - Add( - EnumToString(XCHMACMN), - info.signallers); - } - - // - // XCHMA Cycles Max - bool isXCHMACMXHasSignal = XAU5XCHMACMXHasLongSignal(); - if (isXCHMACMXHasSignal) - { - // - Add( - EnumToString(XCHMACMX), - info.signallers); - } - - // - result = - // - isXTDHasSignal - // - || - // - isXTAMHasSignal - // - || - // - isXSIHasSignal - // - || - // - isXSTFIHasSignal - // - || - // - isXOBDLHHasSignal - // - || - // - isXCHMACCHasSignal - // - || - // - isXCHMACMNHasSignal - // - || - // - isXCHMACMXHasSignal - // - ; - - // - if (result) - { - // - // Only Log Signals Time Market Conditions if is in Testing Mode ... - if (xAU5IsTestMode) - { - // - string message = XAU5GetConditionsString(xAU5Conditions, "\n"); - - // - LogMessage( - "Long Signal Provided by: \n" + - info.signallers[ArraySize(info.signallers) - 1] + "\n" + - "Pusher: " + (string)ArraySize(info.signallers) + "\n" + - "Market Conditions: " + message); - } - } - - // - return result; -} - -// -// Check Market Conditions by Combination of Power of All tools for SHORTs ... -bool XAU5HasShortSignal( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - // XTD ... - bool isXTDHasSignal = XAU5XTDHasShortSignal(); - if (isXTDHasSignal) - { - // - Add( - EnumToString(XTD), - info.signallers); - } - - // - // XTAM ... - bool isXTAMHasSignal = XAU5XTAMHasShortSignal(); - if (isXTAMHasSignal) - { - // - Add( - EnumToString(XTAM), - info.signallers); - } - - // - // XSI ... - bool isXSIHasSignal = XAU5XSIHasShortSignal(); - if (isXSIHasSignal) - { - // - Add( - EnumToString(XSI), - info.signallers); - } - - // - // XSTFI ... - bool isXSTFIHasSignal = XAU5XSTFIHasShortSignal(); - if (isXSTFIHasSignal) - { - // - Add( - EnumToString(XSTFI), - info.signallers); - } - - // - // XOBD XLH ... - bool isXOBDLHHasSignal = XAU5XOBDLHHasShortSignal(); - if (isXOBDLHHasSignal) - { - // - Add( - EnumToString(XOBDLH), - info.signallers); - } - - // - // XCHMA Cycles Cross ... - bool isXCHMACCHasSignal = XAU5XCHMACCHasShortSignal(); - if (isXCHMACCHasSignal) - { - // - Add( - EnumToString(XCHMACC), - info.signallers); - } - - // - // XCHMA Cycles Min ... - bool isXCHMACMNHasSignal = XAU5XCHMACMNHasShortSignal(); - if (isXCHMACMNHasSignal) - { - // - Add( - EnumToString(XCHMACMN), - info.signallers); - } - - // - // XCHMA Cycles Max - bool isXCHMACMXHasSignal = XAU5XCHMACMXHasShortSignal(); - if (isXCHMACMXHasSignal) - { - // - Add( - EnumToString(XCHMACMX), - info.signallers); - } - - // - result = - // - isXTDHasSignal - // - || - // - isXTAMHasSignal - // - || - // - isXSIHasSignal - // - || - // - isXSTFIHasSignal - // - || - // - isXOBDLHHasSignal - // - || - // - isXCHMACCHasSignal - // - || - // - isXCHMACMNHasSignal - // - || - // - isXCHMACMXHasSignal - // - ; - - // - if (result) - { - // - // Only Log Signals Time Market Conditions if is in Testing Mode ... - if (xAU5IsTestMode) - { - // - string message = XAU5GetConditionsString(xAU5Conditions, "\n"); - - // - LogMessage( - "Short Signal Provided by: \n" + - info.signallers[ArraySize(info.signallers) - 1] + "\n" + - "Pusher: " + (string)ArraySize(info.signallers) + "\n" + - "Market Conditions: " + message); - } - } - - // - return result; -} - -// -// -// END Combination Signaling ... -// -// - -// -// START Signal Providers ... -// - -// -// Disbale All Signallers Longs ... -void XAU5DisableLongSignallers() -{ - // - // XTD ... - if (xAU5MXTDEnableSignaller) - { - xAU5MXTDAllowLongSignals = false; - } - - // - // XTAM ... - if (xAU5MXTAMEnableSignaller) - { - xAU5MXTAMAllowLongSignals = false; - } - - // - // XSI ... - if (xAU5MXSIEnableSignaller) - { - xAU5MXSIAllowLongSignals = false; - } - - // - // XSTFI ... - if (xAU5MXSTFIEnableSignaller) - { - xAU5MXSTFIAllowLongSignals = false; - } - - // - // XOBDLH ... - if (xAU5MXOBDLHEnableSignaller) - { - xAU5MXOBDLHAllowLongSignals = false; - } - - // - // XCHMACC ... - if (xAU5MXCHMACCEnableSignaller) - { - xAU5MXCHMACCAllowLongSignals = false; - } - - // - // XCHMAMX ... - if (xAU5MXCHMACMXEnableSignaller) - { - xAU5MXCHMACMXAllowLongSignals = false; - } - - // - // XCHMAMN ... - if (xAU5MXCHMACMNEnableSignaller) - { - xAU5MXCHMACMNAllowLongSignals = false; - } -} - -// -// Enable All Signallers Longs ... -// Only if they are Configured as Enable at Settings ... -void XAU5EnableLongSignallers() -{ - // - // XTD ... - if (xAU5MXTDEnableSignaller) - { - xAU5MXTDAllowLongSignals = - xAU5XTDAllowLongSignals - ? true - : xAU5MXTDAllowLongSignals; - } - - // - // XTAM ... - if (xAU5MXTAMEnableSignaller) - { - xAU5MXTAMAllowLongSignals = - xAU5XTAMAllowLongSignals - ? true - : xAU5MXTAMAllowLongSignals; - } - - // - // XSI ... - if (xAU5MXSIEnableSignaller) - { - xAU5MXSIAllowLongSignals = - xAU5XSIAllowLongSignals - ? true - : xAU5MXSIAllowLongSignals; - } - - // - // XSTFI ... - if (xAU5MXSTFIEnableSignaller) - { - xAU5MXSTFIAllowLongSignals = - xAU5XSTFIAllowLongSignals - ? true - : xAU5MXSTFIAllowLongSignals; - } - - // - // XOBDLH ... - if (xAU5MXOBDLHEnableSignaller) - { - xAU5MXOBDLHAllowLongSignals = - xAU5XOBDLHAllowLongSignals - ? true - : xAU5MXOBDLHAllowLongSignals; - } - - // - // XCHMACC ... - if (xAU5MXCHMACCEnableSignaller) - { - xAU5MXCHMACCAllowLongSignals = - xAU5XCHMACCAllowLongSignals - ? true - : xAU5MXCHMACCAllowLongSignals; - } - - // - // XCHMAMX ... - if (xAU5MXCHMACMXEnableSignaller) - { - xAU5MXCHMACMXAllowLongSignals = - xAU5XCHMACMXAllowLongSignals - ? true - : xAU5MXCHMACMXAllowLongSignals; - } - - // - // XCHMAMN ... - if (xAU5MXCHMACMNEnableSignaller) - { - xAU5MXCHMACMNAllowLongSignals = - xAU5XCHMACMNAllowLongSignals - ? true - : xAU5MXCHMACMNAllowLongSignals; - } -} - -// -// Disable All Signallers Shorts ... -void XAU5DisableShortSignallers() -{ - // - // XTD ... - if (xAU5MXTDEnableSignaller) - { - xAU5MXTDAllowShortSignals = false; - } - - // - // XTAM ... - if (xAU5MXTAMEnableSignaller) - { - xAU5MXTAMAllowShortSignals = false; - } - - // - // XSI ... - if (xAU5MXSIEnableSignaller) - { - xAU5MXSIAllowShortSignals = false; - } - - // - // XSTFI ... - if (xAU5MXSTFIEnableSignaller) - { - xAU5MXSTFIAllowShortSignals = false; - } - - // - // XOBDLH ... - if (xAU5MXOBDLHEnableSignaller) - { - xAU5MXOBDLHAllowShortSignals = false; - } - - // - // XCHMACC ... - if (xAU5MXCHMACCEnableSignaller) - { - xAU5MXCHMACCAllowShortSignals = false; - } - - // - // XCHMAMX ... - if (xAU5MXCHMACMXEnableSignaller) - { - xAU5MXCHMACMXAllowShortSignals = false; - } - - // - // XCHMAMN ... - if (xAU5MXCHMACMNEnableSignaller) - { - xAU5MXCHMACMNAllowShortSignals = false; - } -} - -// -// Enable All Signallers Shorts ... -// Only if they are Configured as Enable at Settings ... -void XAU5EnableShortSignallers() -{ - // - // XTD ... - if (xAU5MXTDEnableSignaller) - { - xAU5MXTDAllowShortSignals = - xAU5XTDAllowShortSignals - ? true - : xAU5MXTDAllowShortSignals; - } - - // - // XTAM ... - if (xAU5MXTAMEnableSignaller) - { - xAU5MXTAMAllowShortSignals = - xAU5XTAMAllowShortSignals - ? true - : xAU5MXTAMAllowShortSignals; - } - - // - // XSI ... - if (xAU5MXSIEnableSignaller) - { - xAU5MXSIAllowShortSignals = - xAU5XSIAllowShortSignals - ? true - : xAU5MXSIAllowShortSignals; - } - - // - // XSTFI ... - if (xAU5MXSTFIEnableSignaller) - { - xAU5MXSTFIAllowShortSignals = - xAU5XSTFIAllowShortSignals - ? true - : xAU5MXSTFIAllowShortSignals; - } - - // - // XOBDLH ... - if (xAU5MXOBDLHEnableSignaller) - { - xAU5MXOBDLHAllowShortSignals = - xAU5XOBDLHAllowShortSignals - ? true - : xAU5MXOBDLHAllowShortSignals; - } - - // - // XCHMACC ... - if (xAU5MXCHMACCEnableSignaller) - { - xAU5MXCHMACCAllowShortSignals = - xAU5XCHMACCAllowShortSignals - ? true - : xAU5MXCHMACCAllowShortSignals; - } - - // - // XCHMAMX ... - if (xAU5MXCHMACMXEnableSignaller) - { - xAU5MXCHMACMXAllowShortSignals = - xAU5XCHMACMXAllowShortSignals - ? true - : xAU5MXCHMACMXAllowShortSignals; - } - - // - // XCHMAMN ... - if (xAU5MXCHMACMNEnableSignaller) - { - xAU5MXCHMACMNAllowShortSignals = - xAU5XCHMACMNAllowShortSignals - ? true - : xAU5MXCHMACMNAllowShortSignals; - } -} - -// -// Check Market Conditions is Ready for Long Signals or not ... -bool XAU5ReadyForLong( - bool checkXCHMAMin = true, // Force Check XCHMA Min State - bool checkXCHMAMax = true, // Force Check XCHMA Max State - bool checkXCHMACycles = true, // Force Check XCHMA Cycles State - bool checkXCHMAPeaks = true, // Force Check XCHMA Peaks State - bool checkXCHMATrendPowers = true, // Force Check XCHMA Trend Powers - bool checkXOBD = true, // Force Check XOBD State - bool checkXTS = true // Force Check XTS State -) -{ - // - bool result = true; - - // - if (checkXCHMAMin) - { - // - result = - // - // XCHMA MIN ... - !( - // - (xAU5Conditions.isXCHMASCOverMin || - xAU5Conditions.isXCHMASCCrossedOverMin) && - (xAU5Conditions.isXCHMASCUnderMin || - xAU5Conditions.isXCHMASCCrossedUnderMin) - // - ); - } - - // - if (checkXCHMAMax && result) - { - // - result = - // - // XCHMA MAX ... - !( - // - (xAU5Conditions.isXCHMASCOverMax || - xAU5Conditions.isXCHMASCCrossedOverMax) && - (xAU5Conditions.isXCHMASCUnderMax || - xAU5Conditions.isXCHMASCCrossedUnderMax) - // - ) - // - ; - } - - // - if (checkXCHMACycles && result) - { - // - result = - // - // Check XCHMA Trend Bullish ... - ( - // - // All Cycles Bullish ... - ( - // - // SC ... - (xAU5Conditions.isXCHMASCFastOverSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow) - // - && - // - // MC ... - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow) - // - && - // - // LC ... - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow) - // - ) - // - || - // - // Two Cycle Fully Bullish ... - ( - // - // SC and MC ... - ( - // - // SC ... - (xAU5Conditions.isXCHMASCFastOverSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow) - // - && - // - // MC ... - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow) - // - ) - // - || - // - // SC and LC ... - ( - // - // SC ... - (xAU5Conditions.isXCHMASCFastOverSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow) - // - && - // - // LC ... - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow) - // - ) - // - || - // - // MC and LC ... - ( - // - // MC ... - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow) - // - && - // - // LC ... - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow) - // - ) - // - ) - // - ) - // - ; - } - - // - if (checkXCHMAPeaks && result) - { - // - result = - // - // XCHMA Check Peaks ... - !( - // - // All Cycles Peak ... - (xAU5Conditions.isXCHMASCPeak && - xAU5Conditions.isXCHMAMCPeak && - xAU5Conditions.isXCHMALCPeak) - // - || - // - ( - // - // SC MC ... - (xAU5Conditions.isXCHMASCPeak && - xAU5Conditions.isXCHMAMCPeak) - // - || - // - // SC LC ... - (xAU5Conditions.isXCHMASCPeak && - xAU5Conditions.isXCHMALCPeak) - // - || - // - // MC LC ... - (xAU5Conditions.isXCHMAMCPeak && - xAU5Conditions.isXCHMALCPeak) - // - ) - // - ) - // - ; - } - - // - if (checkXCHMATrendPowers && result) - { - // - result = - // - // XCHMA Check Trends Power ... - !( - // - // All Trends Down ... - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - || - // - // Twisted pairs ... - ( - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMAMCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - ; - } - - // - if (checkXOBD && result) - { - // - result = - // - // XOBD Check Swings ... - !xAU5Conditions.isXOBDSwingLow - // - ; - } - - // - if (checkXTS && result) - { - result = - // - // XTS Check ... - !( - // - xAU5Conditions.isXTSCurrentMin && - // - ( - // - // All Under ... - ( - (xAU5Conditions.isXTSCurrentUnderNearest || - xAU5Conditions.isXTSCurrentCrossedUnderNearest) && - (xAU5Conditions.isXTSCurrentUnderMediest || - xAU5Conditions.isXTSCurrentCrossedUnderMediest) && - (xAU5Conditions.isXTSCurrentUnderFarest || - xAU5Conditions.isXTSCurrentCrossedUnderFarest)) - // - || - // - // Pairs ... - ( - // - ((xAU5Conditions.isXTSCurrentUnderNearest || - xAU5Conditions.isXTSCurrentCrossedUnderNearest) && - (xAU5Conditions.isXTSCurrentUnderMediest || - xAU5Conditions.isXTSCurrentCrossedUnderMediest)) - // - || - // - ((xAU5Conditions.isXTSCurrentUnderNearest || - xAU5Conditions.isXTSCurrentCrossedUnderNearest) && - (xAU5Conditions.isXTSCurrentUnderFarest || - xAU5Conditions.isXTSCurrentCrossedUnderFarest)) - // - || - // - ((xAU5Conditions.isXTSCurrentUnderMediest || - xAU5Conditions.isXTSCurrentCrossedUnderMediest) && - (xAU5Conditions.isXTSCurrentUnderFarest || - xAU5Conditions.isXTSCurrentCrossedUnderFarest)) - // - ) - // - ) - // - ) - // - ; - } - - // - return result; -} - -// -// Check Market Conditions is Ready for Short Signals or not ... -bool XAU5ReadyForShort( - bool checkXCHMAMin = true, // Force Check XCHMA Min State - bool checkXCHMAMax = true, // Force Check XCHMA Max State - bool checkXCHMACycles = true, // Force Check XCHMA Cycles State - bool checkXCHMAVales = true, // Force Check XCHMA Vales State - bool checkXCHMATrendPowers = true, // Force Check XCHMA Trend Powers - bool checkXOBD = true, // Force Check XOBD State - bool checkXTS = true // Force Check XTS State -) -{ - // - bool result = true; - - // - if (checkXCHMAMin) - { - // - result = - // - // XCHMA MIN ... - !( - // - (xAU5Conditions.isXCHMASCOverMin || - xAU5Conditions.isXCHMASCCrossedOverMin) && - (xAU5Conditions.isXCHMASCUnderMin || - xAU5Conditions.isXCHMASCCrossedUnderMin) - // - ); - } - - // - if (checkXCHMAMax && result) - { - // - result = - // - // XCHMA MAX ... - !( - // - (xAU5Conditions.isXCHMASCOverMax || - xAU5Conditions.isXCHMASCCrossedOverMax) && - (xAU5Conditions.isXCHMASCUnderMax || - xAU5Conditions.isXCHMASCCrossedUnderMax) - // - ) - // - ; - } - - // - if (checkXCHMACycles && result) - { - // - result = - // - // Check XCHMA Trend Bullish ... - ( - // - // All Cycles Bullish ... - ( - // - // SC ... - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow) - // - && - // - // MC ... - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow) - // - && - // - // LC ... - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow) - // - ) - // - || - // - // Two Cycle Fully Bullish ... - ( - // - // SC and MC ... - ( - // - // SC ... - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow) - // - && - // - // MC ... - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow) - // - ) - // - || - // - // SC and LC ... - ( - // - // SC ... - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow) - // - && - // - // LC ... - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow) - // - ) - // - || - // - // MC and LC ... - ( - // - // MC ... - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow) - // - && - // - // LC ... - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow) - // - ) - // - ) - // - ) - // - ; - } - - // - if (checkXCHMAVales && result) - { - // - result = - // - // XCHMA Check Vales ... - !( - // - // All Cycles Vale ... - (xAU5Conditions.isXCHMASCVale && - xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMALCVale) - // - || - // - ( - // - // SC MC ... - (xAU5Conditions.isXCHMASCVale && - xAU5Conditions.isXCHMAMCVale) - // - || - // - // SC LC ... - (xAU5Conditions.isXCHMASCVale && - xAU5Conditions.isXCHMALCVale) - // - || - // - // MC LC ... - (xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMALCVale) - // - ) - // - ) - // - ; - } - - // - if (checkXCHMATrendPowers && result) - { - // - result = - // - // XCHMA Check Trends Power ... - !( - // - // All Trends Down ... - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - || - // - // Twisted pairs ... - ( - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMAMCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - ; - } - - // - if (checkXOBD && result) - { - // - result = - // - // XOBD Check Swings ... - !xAU5Conditions.isXOBDSwingHigh - // - ; - } - - // - if (checkXTS && result) - { - // - result = - // - // XTS Check ... - !( - // - xAU5Conditions.isXTSCurrentMax && - // - ( - // - // All Over ... - ( - (xAU5Conditions.isXTSCurrentOverNearest || - xAU5Conditions.isXTSCurrentCrossedOverNearest) && - (xAU5Conditions.isXTSCurrentOverMediest || - xAU5Conditions.isXTSCurrentCrossedOverMediest) && - (xAU5Conditions.isXTSCurrentOverFarest || - xAU5Conditions.isXTSCurrentCrossedOverFarest)) - // - || - // - // Pairs ... - ( - // - ((xAU5Conditions.isXTSCurrentOverNearest || - xAU5Conditions.isXTSCurrentCrossedOverNearest) && - (xAU5Conditions.isXTSCurrentOverMediest || - xAU5Conditions.isXTSCurrentCrossedOverMediest)) - // - || - // - ((xAU5Conditions.isXTSCurrentOverNearest || - xAU5Conditions.isXTSCurrentCrossedOverNearest) && - (xAU5Conditions.isXTSCurrentOverFarest || - xAU5Conditions.isXTSCurrentCrossedOverFarest)) - // - || - // - ((xAU5Conditions.isXTSCurrentOverMediest || - xAU5Conditions.isXTSCurrentCrossedOverMediest) && - (xAU5Conditions.isXTSCurrentOverFarest || - xAU5Conditions.isXTSCurrentCrossedOverFarest)) - // - ) - // - ) - // - ) - // - ; - } - - // - return result; -} - -// -// XTD Long Signal Checking ... -bool XAU5XTDHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXTDEnableSignaller || - !xAU5MXTDAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - xAU5Conditions.isXTDSignalCrossedOverBear - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - XAU5ReadyForLong() - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMAMCTrendsUp && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow)) - // - || - // - (xAU5Conditions.isXTMBullish && - xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMALCVale && - xAU5Conditions.isXAMANeutural && - xAU5Conditions.isXLHHHDecreased && - xAU5Conditions.isXCHLHMCLCLLSame) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMALCPeak && - ( - // - (xAU5Conditions.isXTMNeutural && - xAU5Conditions.isXAMAEndBullish) - // - || - // - (xAU5Conditions.isXTSCurrentMax && - (xAU5Conditions.isXCHMALCTrendsUp || - xAU5Conditions.isXCHMALCTrendsDown) && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXTMNeutural && - xAU5Conditions.isXAMABullish && - xAU5Conditions.isXTDBearishVale) - // - || - // - (xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMALCVale && - xAU5Conditions.isXTDBearishVale && - xAU5Conditions.isXLHLLIncreased) - // - || - // - (xAU5Conditions.isXCHMAMCVale && - (xAU5Conditions.isXCHMAMCTrendsUp && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow))) - // - ) - // - ) - // - || - // - (xAU5Conditions.isXCHMALCVale && - ( - // - (xAU5Conditions.isXTMBullish && - xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXTDBearishVale && - xAU5Conditions.isXAMAStartBullish) - // - || - // - (xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMAMCTrendsUp && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - (xAU5Conditions.isXAMAVale && - xAU5Conditions.isXTMNeutural && - xAU5Conditions.isXTDBearishVale && - xAU5Conditions.isXAMAStartBearish) - // - || - // - (xAU5Conditions.isXCHLHMCLCLLSame && - (xAU5Conditions.isXCHMAMCVale && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow))) - // - || - // - (xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMALCVale && - xAU5Conditions.isXAMANeutural && - xAU5Conditions.isXAMAEndBearish && - xAU5Conditions.isXTDBearishVale && - xAU5Conditions.isXLHLLIncreased) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - ((xAU5Conditions.isXCHMAMCVale || - xAU5Conditions.isXLHLLDecreased) && - (xAU5Conditions.isXCHMAMCTrendsUp && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow))) - // - || - // - (xAU5Conditions.isXTSCurrentMax && - xAU5Conditions.isXLHLLIncreased && - (xAU5Conditions.isXCHMALCVale && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow))) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - ( - // - (xAU5Conditions.isXCHMAMCTrendsUp && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow)) && - ( - // - (xAU5Conditions.isXTMBullish && - xAU5Conditions.isXAMANeutural && - xAU5Conditions.isXCHLHMCLCHHSame && - (xAU5Conditions.isXTDSignalOverBear || - xAU5Conditions.isXTDSignalCrossedOverBear)) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMALCVale && - (xAU5Conditions.isXCHMAMCPeak - // - || - // - (xAU5Conditions.isXTMBullish && - xAU5Conditions.isXAMABullish && - xAU5Conditions.isXTDBearishVale) - // - ) - // - ) - // - || - // - (xAU5Conditions.isXCHMAMCVale && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow)) - // - || - // - (xAU5Conditions.isXCHMAMCPeak && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXTSCurrentMax && - xAU5Conditions.isXLHLLIncreased && - xAU5Conditions.isXTMStartBullish && - xAU5Conditions.isXAMAStartBullish && - (xAU5Conditions.isXTDSignalOverBear || - xAU5Conditions.isXTDSignalCrossedOverBear)) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCTrendsDown || - xAU5Conditions.isXCHMALCTrendsUp) && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((xAU5Conditions.isXTSCurrentMax && - xAU5Conditions.isXTDSignalCrossedOverBear) && - ( - // - (xAU5Conditions.isXTMStartBullish && - xAU5Conditions.isXAMAStartBullish && - xAU5Conditions.isXFICrossedOverZero) - // - || - // - (xAU5Conditions.isXCHLHSameHHs && - xAU5Conditions.isXLHHighAttachedHH) - // - ) - // - ) - // - || - // - (xAU5Conditions.isXCHMALCVale && - (xAU5Conditions.isXCHMALCTrendsDown && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow))) - // - || - // - (xAU5Conditions.isXLHLLDecreased && - xAU5Conditions.isXCHLHSCMCHHSame && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (xAU5Conditions.isXCHLHSCMCHHSame && - xAU5Conditions.isXCHLHMCLCLLSame && - xAU5Conditions.isXLHHighAttachedHH && - (xAU5Conditions.isXCHMAMCPeak && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow))) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMAMCPeak && - xAU5Conditions.isXCHMAMCTrendsUp && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - xAU5Conditions.isXCHMALCTrendsUp && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXTSAllSame && - xAU5Conditions.isXCHLHSameHHs && - xAU5Conditions.isXLHHighAttachedHH && - xAU5Conditions.isXRSICrossedOverLongExit) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - xAU5Conditions.isXCHLHSCMCHHSame && - xAU5Conditions.isXCHLHSCMCLLSame) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXLHHighAttachedHH && - ( - // - (xAU5Conditions.isXCHLHSCMCHHSame && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (xAU5Conditions.isXTSAllSame && - xAU5Conditions.isXCHLHSameHHs && - xAU5Conditions.isXRSICrossedOverLongExit) - // - ) - // - ) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - xAU5Conditions.isXCHMALCTrendsUp && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXCHMAMCPeak && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XTD Short Signal Checking ... -bool XAU5XTDHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXTDEnableSignaller || - !xAU5MXTDAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XTAM Long Signal Checking ... -bool XAU5XTAMHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXTAMEnableSignaller || - !xAU5MXTAMAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - (xAMAMaBuffer[1] > xTMMaBuffer[1] && - xAMAMaBuffer[2] > xTMMaBuffer[2]) - // - && - // - !(xAMAMaBuffer[2] > xTMMaBuffer[2] && - xAMAMaBuffer[3] > xTMMaBuffer[3]) - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - XAU5ReadyForLong()) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXTDBearishVale && - xAU5Conditions.isXLHLLIncreased) - // - || - // - (xAU5Conditions.isXCHMAMCTrendsUp && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow)) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMALCPeak && - xAU5Conditions.isXTMNeutural && - xAU5Conditions.isXAMANeutural && - xAU5Conditions.isXTSCurrentUnderMediest) - // - || - // - (xAU5Conditions.isXCHMAMCVale && - (xAU5Conditions.isXCHMAMCTrendsUp && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow))) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMALCVale && - xAU5Conditions.isXTMNeutural && - xAU5Conditions.isXTMEndBearish && - xAU5Conditions.isXAMANeutural && - xAU5Conditions.isXAMAEndBearish && - xAU5Conditions.isXTDBullOverBear && - xAU5Conditions.isXTDSignalUnderBear && - xAU5Conditions.isXCHLHMCLCLLSame && - xAU5Conditions.isXRSICrossedUnderShortExit) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXTMBullish && - xAU5Conditions.isXAMABullish && - xAU5Conditions.isXCHLHSameHHs && - xAU5Conditions.isXTSCurrentMax && - xAU5Conditions.isXTDBearishVale && - xAU5Conditions.isXLHHighAttachedHH) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XTAM Short Signal Checking ... -bool XAU5XTAMHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXTAMEnableSignaller || - !xAU5MXTAMAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XSI Long Signal Checking ... -bool XAU5XSIHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXSIEnableSignaller || - !xAU5MXSIAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - xAU5Conditions.isXRSICrossedOverLongEntry && - xRSIBuffer[3] < xRSILongEntryValue - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - XAU5ReadyForLong( - true, // XCHMA Min - true, // XCHMA Max - true, // XCHMA Cycles - true, // XCHMA Peaks - false, // XCHMA Trend Powers - true, // XOBD - true // XTS - ) - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXTMVale && - xAU5Conditions.isXTMBearish && - xAU5Conditions.isXAMABullish && - xAU5Conditions.isXTSCurrentMax && - xAU5Conditions.isXLHLLDecreased && - xAU5Conditions.isXCHLHSCMCLLSame && - xAU5Conditions.isXCHLHMCLCHHSame) - // - || - // - (xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCVale && - xAU5Conditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXTSCurrentUnderFarest && - xAU5Conditions.isXTSCurrentUnderMediest) - // - || - // - (xAU5Conditions.isXTMVale && - xAU5Conditions.isXAMAVale) - // - || - // - (xAU5Conditions.isXCHMASCVale && - xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMALCPeak) - // - || - // - (xAU5Conditions.isXTMVale && - xAU5Conditions.isXCHMASCVale && - xAU5Conditions.isXAMANeutural && - xAU5Conditions.isXTSCurrentMax && - xAU5Conditions.isXAMAEndBearish && - xAU5Conditions.isXCHLHSCMCLLSame && - xAU5Conditions.isXCHLHMCLCHHSame) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXTMVale && - xAU5Conditions.isXAMAVale && - xAU5Conditions.isXTDSignalVale && - xAU5Conditions.isXTDBullishVale) - // - || - // - (xAU5Conditions.isXCHMASCVale && - xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXTSCurrentMax && - xAU5Conditions.isXTMStartBullish && - xAU5Conditions.isXAMAStartBullish && - xAU5Conditions.isXCHLHSCMCHHSame && - xAU5Conditions.isXCHLHSCMCLLSame && - xAU5Conditions.isXLHHighAttachedHH && - xAU5Conditions.isXFICrossedOverZero && - (xAU5Conditions.isXCHMALCPeak && - xAU5Conditions.isXCHMALCTrendsDown && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow))) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XSI Short Signal Checking ... -bool XAU5XSIHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXSIEnableSignaller || - !xAU5MXSIAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XSTFI Long Signal Checking ... -bool XAU5XSTFIHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXSTFIEnableSignaller || - !xAU5MXSTFIAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - XTSGetMinValue(1) == xTSFarestBuffer[1] && - (xAU5Conditions.isXTSCurrentOverFarest || - xAU5Conditions.isXTSCurrentCrossedOverFarest) && - (xTSCurrentBuffer[1] < xTSNearestBuffer[1] || - xTSCurrentBuffer[1] < xTSMediestBuffer[1]) && - !(xAU5Conditions.isXTSCurrentUnderNearest || - xAU5Conditions.isXTSCurrentCrossedUnderNearest) - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - XAU5ReadyForLong() - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXTMStartBearish && - xAU5Conditions.isXAMAStartBearish && - (xAU5Conditions.isXCHMASCVale && - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow))) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXTMStartBearish && - xAU5Conditions.isXAMAStartBearish && - xAU5Conditions.isXTDBullOverBear && - xAU5Conditions.isXTDSignalCrossedUnderBear && - xAU5Conditions.isXLHHHIncreased && - xAU5Conditions.isXLHHHSameInLength && - xAU5Conditions.isXCHLHSCMCHHSame && - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow)) - // - || - // - (xAU5Conditions.isXLHHHIncreased && - (xAU5Conditions.isXCHMALCPeak && - xAU5Conditions.isXCHMALCTrendsUp && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow))) - // - || - // - (xAU5Conditions.isXAMANeutural && - xAU5Conditions.isXAMAEndBearish && - xAU5Conditions.isXTMStartBullish && - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow)) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - ((xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXTMNeutural && - xAU5Conditions.isXAMANeutural && - xAU5Conditions.isXFICrossedUnderZero) - // - || - // - (xAU5Conditions.isXLHHHDecreased && - xAU5Conditions.isXLHLLDecreased && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXCHLHSameHHs && - xAU5Conditions.isXTDSignalVale && - xAU5Conditions.isXTDBullishVale && - xAU5Conditions.isXLHHHIncreased) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXTMBullish && - xAU5Conditions.isXAMABullish && - xAU5Conditions.isXLHHHDecreased && - xAU5Conditions.isXTSCurrentUnderMediest) - // - || - // - (xAU5Conditions.isXCHMAMCPeak && - xAU5Conditions.isXCHMAMCTrendsUp && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCTrendsUp && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow))) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMAMCPeak && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXCHMALCVale && - xAU5Conditions.isXCHLHSCMCHHSame && - xAU5Conditions.isXLHHighAttachedHH) - // - || - // - (xAU5Conditions.isXOBDSwingHigh && - xAU5Conditions.isXTMEndBullish && - xAU5Conditions.isXAMABullish && - xAU5Conditions.isXTDBullOverBear && - xAU5Conditions.isXTDSignalOverBear && - xAU5Conditions.isXCHLHSCMCHHSame && - xAU5Conditions.isXCHLHMCLCLLSame && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXLHHHIncreased && - xAU5Conditions.isXCHLHSCMCHHSame && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (xAU5Conditions.isXCHMAMCPeak && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XSTFI Short Signal Checking ... -bool XAU5XSTFIHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXSTFIEnableSignaller || - !xAU5MXSTFIAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XOBDLH Long Signal Checking ... -bool XAU5XOBDLHHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXOBDLHEnableSignaller || - !xAU5MXOBDLHAllowLongSignals) - { - return result; - } - - // - XAU5MarketConditions xAU5Conditions2 = XAU5GenerateMarketConditions(2); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - xAU5Conditions2.isXOBDSwingLow && - xAU5Conditions2.isXLHLowAttachedLL && - xLHLLBuffer[1] >= xLHLLBuffer[2] - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - XAU5ReadyForLong( - true, // XCHMA Min - true, // XCHMA Max - false, // XCHMA Cycles - false, // XCHMA Peaks - false, // XCHMA Trend Powers - false, // XOBD - false // XTS - ) - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXTMVale && - xAU5Conditions.isXAMAVale && - xAU5Conditions.isXCHMASCVale && - xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHLHSCMCLLSame) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow) && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXTMVale && - xAU5Conditions.isXTMBearish && - xAU5Conditions.isXAMAVale && - xAU5Conditions.isXAMABearish && - xAU5Conditions.isXLHHHDecreased) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - xAU5Conditions.isXCHMALCTrendsDown && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXTMVale && - xAU5Conditions.isXAMAVale && - xAU5Conditions.isXCHLHSameLLs && - xAU5Conditions.isXTDSignalVale && - xAU5Conditions.isXTDBullishVale) - // - || - // - ((xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow) && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow) && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (xAU5Conditions.isXTMVale && - xAU5Conditions.isXAMAVale && - xAU5Conditions.isXTMBearish && - xAU5Conditions.isXAMABearish && - xAU5Conditions.isXCHMASCVale && - xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMALCVale && - xAU5Conditions.isXFIUnderZero && - xAU5Conditions.isXCHLHSameLLs && - xAU5Conditions.isXTDBullUnderBear && - xAU5Conditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XOBDLH Short Signal Checking ... -bool XAU5XOBDLHHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXOBDLHEnableSignaller || - !xAU5MXOBDLHAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACC Long Signal Checking ... -bool XAU5XCHMACCHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACCEnableSignaller || - !xAU5MXCHMACCAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - xCHMAScFastBuffer[1] > xCHMAScSlowBuffer[1] && - xCHMAMcFastBuffer[1] > xCHMAMcSlowBuffer[1] && - xCHMALcFastBuffer[1] > xCHMALcSlowBuffer[1] && - // - xCHMAScFastBuffer[2] > xCHMAScSlowBuffer[2] && - xCHMAMcFastBuffer[2] > xCHMAMcSlowBuffer[2] && - xCHMALcFastBuffer[2] > xCHMALcSlowBuffer[2] && - // - !( - // - xCHMAScFastBuffer[3] > xCHMAScSlowBuffer[3] && - xCHMAMcFastBuffer[3] > xCHMAMcSlowBuffer[3] && - xCHMALcFastBuffer[3] > xCHMALcSlowBuffer[3] - // - ) - // - && - // - xAU5Conditions.isXCHMASCOverMax && - !xAU5Conditions.isXCHMASCUnderMax - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - XAU5ReadyForLong() - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCTrendsUp || - xAU5Conditions.isXCHMALCTrendsDown) && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXTSAllSame && - xAU5Conditions.isXTSCurrentMin && - xAU5Conditions.isXTSCurrentMax) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - xAU5Conditions.isXCHMALCTrendsUp && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXLHLLIncreased && - xAU5Conditions.isXCHLHMCLCHHSame && - (xAU5Conditions.isXCHMASCTrendsDown && - (xAU5Conditions.isXCHMASCFastOverSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow))) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACC Short Signal Checking ... -bool XAU5XCHMACCHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACCEnableSignaller || - !xAU5MXCHMACCAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACMN Long Signal Checking ... -bool XAU5XCHMACMNHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACMNEnableSignaller || - !xAU5MXCHMACMNAllowLongSignals) - { - return result; - } - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); - double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - xAU5Conditions.isXCHMASCCrossedOverMin && - xCHMAScFastBuffer[2] < xCHMANonSCMin2 && - xCHMAScSlowBuffer[2] < xCHMANonSCMin2 - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - XAU5ReadyForLong( - true, // XCHMA Min - true, // XCHMA Max - false, // XCHMA Cycles - false, // XCHMA Peaks - false, // XCHMA Trend Powers - true, // XOBD - true // XTS - ) - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXLHLLIncreased && - xAU5Conditions.isXAMAStartBullish && - xAU5Conditions.isXTDSignalUnderBear && - xAU5Conditions.isXTDBullCrossedOverBear && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (xAU5Conditions.isXCHMALCVale && - xAU5Conditions.isXAMANeutural && - xAU5Conditions.isXTMStartBullish) - // - || - // - ((xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow) && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow) && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXTMBullish && - xAU5Conditions.isXAMABullish && - xAU5Conditions.isXTDSignalVale && - xAU5Conditions.isXTDBullishVale && - xAU5Conditions.isXTDBullOverBear && - xAU5Conditions.isXTDSignalOverBear) - // - || - // - (xAU5Conditions.isXCHMASCPeak && - (xAU5Conditions.isXCHMASCFastOverSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXCHMALCVale && - xAU5Conditions.isXTSCurrentMax && - xAU5Conditions.isXTMStartBullish && - xAU5Conditions.isXFICrossedOverZero) - // - || - // - ((xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow) && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHLHSCMCHHSame && - xAU5Conditions.isXTDBullUnderBear && - xAU5Conditions.isXLHHighAttachedHH && - xAU5Conditions.isXTDSignalUnderBear) - // - || - // - ((xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow) && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow) && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - ((xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow) && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (xAU5Conditions.isXCHMALCVale && - xAU5Conditions.isXCHMALCTrendsUp && - (xAU5Conditions.isXCHMALCFastUnderSlow || - xAU5Conditions.isXCHMALCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACMN Short Signal Checking ... -bool XAU5XCHMACMNHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACMNEnableSignaller || - !xAU5MXCHMACMNAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACMX Long Signal Checking ... -bool XAU5XCHMACMXHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACMXEnableSignaller || - !xAU5MXCHMACMXAllowLongSignals) - { - return result; - } - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - xAU5Conditions.isXCHMASCCrossedOverMax && - xCHMAScFastBuffer[2] < xCHMANonSCMax2 && - xCHMAScSlowBuffer[2] < xCHMANonSCMax2 && - MathAbs(xCHMANonSCMax2 - xCHMAScFastBuffer[2]) > MathAbs(xCHMAScFastBuffer[2] - xCHMAScSlowBuffer[2]) && - MathAbs(xCHMANonSCMax2 - xCHMAScSlowBuffer[2]) > MathAbs(xCHMAScFastBuffer[2] - xCHMAScSlowBuffer[2]) - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - XAU5ReadyForLong( - true, // XCHMA Min - true, // XCHMA Max - false, // XCHMA Cycles - false, // XCHMA Peaks - false, // XCHMA Trend Powers - true, // XOBD - true // XTS - ) - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXTMNeutural && - xAU5Conditions.isXTSCurrentMin && - xAU5Conditions.isXAMAEndBearish && - xAU5Conditions.isXCHLHMCLCHHSame) - // - || - // - (xAU5Conditions.isXCHMAMCPeak && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXTMNeutural && - xAU5Conditions.isXAMANeutural && - xAU5Conditions.isXTDBearishVale && - xAU5Conditions.isXCHLHMCLCHHSame) - // - || - // - ((xAU5Conditions.isXCHMAMCPeak && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) || - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow))) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACMX Short Signal Checking ... -bool XAU5XCHMACMXHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACMXEnableSignaller || - !xAU5MXCHMACMXAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// END Signal Providers ... -// - -// -// START Utilities ... -// - -// -// Converts Market Conditions to Specific String Representation ... -string XAU5GetConditionsString( - XAU5MarketConditions &condition, // Specify Conditiond - string separator = ",", // Specify Separator - bool ignoreFalses = true // Ignore False Conditions -) -{ - // - XAU5MarketConditions mConditions = {}; - - // - mConditions = condition; - - // - string result = "\n"; - - // - // XOBD ... - result += - "| XOBD |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXOBDSwingLow)) - { - result += "isXOBDSwingLow: " + (string)mConditions.isXOBDSwingLow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXOBDSwingHigh)) - { - result += "isXOBDSwingHigh: " + (string)mConditions.isXOBDSwingHigh + separator; - } - - // - // Separator ... - result += separator; - - // - // XTM ... - result += - "| XTM |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMPeak)) - { - result += "isXTMPeak: " + (string)mConditions.isXTMPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMVale)) - { - result += "isXTMVale: " + (string)mConditions.isXTMVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBullish)) - { - result += "isXTMStartBullish: " + (string)mConditions.isXTMStartBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBullishAfterNeutural)) - { - result += "isXTMStartBullishAfterNeutural: " + (string)mConditions.isXTMStartBullishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMBullish)) - { - result += "isXTMBullish: " + (string)mConditions.isXTMBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBullish)) - { - result += "isXTMEndBullish: " + (string)mConditions.isXTMEndBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBullishByNeutural)) - { - result += "isXTMEndBullishByNeutural: " + (string)mConditions.isXTMEndBullishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBearish)) - { - result += "isXTMStartBearish: " + (string)mConditions.isXTMStartBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBearishAfterNeutural)) - { - result += "isXTMStartBearishAfterNeutural: " + (string)mConditions.isXTMStartBearishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMBearish)) - { - result += "isXTMBearish: " + (string)mConditions.isXTMBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBearish)) - { - result += "isXTMEndBearish: " + (string)mConditions.isXTMEndBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBearishByNeutural)) - { - result += "isXTMEndBearishByNeutural: " + (string)mConditions.isXTMEndBearishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMNeutural)) - { - result += "isXTMNeutural: " + (string)mConditions.isXTMNeutural + separator; - } - - // - // Separator ... - result += separator; - - // - // XAMA ... - result += - "| XAMA |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAPeak)) - { - result += "isXAMAPeak: " + (string)mConditions.isXAMAPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAVale)) - { - result += "isXAMAVale: " + (string)mConditions.isXAMAVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBullish)) - { - result += "isXAMAStartBullish: " + (string)mConditions.isXAMAStartBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBullishAfterNeutural)) - { - result += "isXAMAStartBullishAfterNeutural: " + (string)mConditions.isXAMAStartBullishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMABullish)) - { - result += "isXAMABullish: " + (string)mConditions.isXAMABullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBullish)) - { - result += "isXAMAEndBullish: " + (string)mConditions.isXAMAEndBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBullishByNeutural)) - { - result += "isXAMAEndBullishByNeutural: " + (string)mConditions.isXAMAEndBullishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBearish)) - { - result += "isXAMAStartBearish: " + (string)mConditions.isXAMAStartBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBearishAfterNeutural)) - { - result += "isXAMAStartBearishAfterNeutural: " + (string)mConditions.isXAMAStartBearishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMABearish)) - { - result += "isXAMABearish: " + (string)mConditions.isXAMABearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBearish)) - { - result += "isXAMAEndBearish: " + (string)mConditions.isXAMAEndBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBearishByNeutural)) - { - result += "isXAMAEndBearishByNeutural: " + (string)mConditions.isXAMAEndBearishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMANeutural)) - { - result += "isXAMANeutural: " + (string)mConditions.isXAMANeutural + separator; - } - - // - // Separator ... - result += separator; - - // - // XTD ... - result += - "| XTD |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalPeak)) - { - result += "isXTDSignalPeak: " + (string)mConditions.isXTDSignalPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalVale)) - { - result += "isXTDSignalVale: " + (string)mConditions.isXTDSignalVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullishPeak)) - { - result += "isXTDBullishPeak: " + (string)mConditions.isXTDBullishPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullishVale)) - { - result += "isXTDBullishVale: " + (string)mConditions.isXTDBullishVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBearishPeak)) - { - result += "isXTDBearishPeak: " + (string)mConditions.isXTDBearishPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBearishVale)) - { - result += "isXTDBearishVale: " + (string)mConditions.isXTDBearishVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullOverBear)) - { - result += "isXTDBullOverBear: " + (string)mConditions.isXTDBullOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullUnderBear)) - { - result += "isXTDBullUnderBear: " + (string)mConditions.isXTDBullUnderBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalOverBear)) - { - result += "isXTDSignalOverBear: " + (string)mConditions.isXTDSignalOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalUnderBear)) - { - result += "isXTDSignalUnderBear: " + (string)mConditions.isXTDSignalUnderBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullCrossedOverBear)) - { - result += "isXTDBullCrossedOverBear: " + (string)mConditions.isXTDBullCrossedOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullCrossedUnderBear)) - { - result += "isXTDBullCrossedUnderBear: " + (string)mConditions.isXTDBullCrossedUnderBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalCrossedOverBear)) - { - result += "isXTDSignalCrossedOverBear: " + (string)mConditions.isXTDSignalCrossedOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalCrossedUnderBear)) - { - result += "isXTDSignalCrossedUnderBear: " + (string)mConditions.isXTDSignalCrossedUnderBear + separator; - } - - // - // Separator ... - result += separator; - - // - // XFI ... - result += - "| XFI |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIPeak)) - { - result += "isXFIPeak: " + (string)mConditions.isXFIPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIVale)) - { - result += "isXFIVale: " + (string)mConditions.isXFIVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIOverZero)) - { - result += "isXFIOverZero: " + (string)mConditions.isXFIOverZero + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIUnderZero)) - { - result += "isXFIUnderZero: " + (string)mConditions.isXFIUnderZero + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFICrossedOverZero)) - { - result += "isXFICrossedOverZero: " + (string)mConditions.isXFICrossedOverZero + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFICrossedUnderZero)) - { - result += "isXFICrossedUnderZero: " + (string)mConditions.isXFICrossedUnderZero + separator; - } - - // - // Separator ... - result += separator; - - // - // XTS ... - result += - "| XTS |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSAllSame)) - { - result += "isXTSAllSame: " + (string)mConditions.isXTSAllSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentMin)) - { - result += "isXTSCurrentMin: " + (string)mConditions.isXTSCurrentMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentMax)) - { - result += "isXTSCurrentMax: " + (string)mConditions.isXTSCurrentMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentOverFarest)) - { - result += "isXTSCurrentOverFarest: " + (string)mConditions.isXTSCurrentOverFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentOverNearest)) - { - result += "isXTSCurrentOverNearest: " + (string)mConditions.isXTSCurrentOverNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentOverMediest)) - { - result += "isXTSCurrentOverMediest: " + (string)mConditions.isXTSCurrentOverMediest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentUnderFarest)) - { - result += "isXTSCurrentUnderFarest: " + (string)mConditions.isXTSCurrentUnderFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentUnderNearest)) - { - result += "isXTSCurrentUnderNearest: " + (string)mConditions.isXTSCurrentUnderNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentUnderMediest)) - { - result += "isXTSCurrentUnderMediest: " + (string)mConditions.isXTSCurrentUnderMediest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedOverFarest)) - { - result += "isXTSCurrentCrossedOverFarest: " + (string)mConditions.isXTSCurrentCrossedOverFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedOverNearest)) - { - result += "isXTSCurrentCrossedOverNearest: " + (string)mConditions.isXTSCurrentCrossedOverNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedOverMediest)) - { - result += "isXTSCurrentCrossedOverMediest: " + (string)mConditions.isXTSCurrentCrossedOverMediest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedUnderFarest)) - { - result += "isXTSCurrentCrossedUnderFarest: " + (string)mConditions.isXTSCurrentCrossedUnderFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedUnderNearest)) - { - result += "isXTSCurrentCrossedUnderNearest: " + (string)mConditions.isXTSCurrentCrossedUnderNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedUnderMediest)) - { - result += "isXTSCurrentCrossedUnderMediest: " + (string)mConditions.isXTSCurrentCrossedUnderMediest + separator; - } - - // - // Separator ... - result += separator; - - // - // XLH ... - result += - "| XLH |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHHIncreased)) - { - result += "isXLHHHIncreased: " + (string)mConditions.isXLHHHIncreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHHDecreased)) - { - result += "isXLHHHDecreased: " + (string)mConditions.isXLHHHDecreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLLIncreased)) - { - result += "isXLHLLIncreased: " + (string)mConditions.isXLHLLIncreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLLDecreased)) - { - result += "isXLHLLDecreased: " + (string)mConditions.isXLHLLDecreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHighAttachedHH)) - { - result += "isXLHHighAttachedHH: " + (string)mConditions.isXLHHighAttachedHH + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLowAttachedLL)) - { - result += "isXLHLowAttachedLL: " + (string)mConditions.isXLHLowAttachedLL + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHHSameInLength)) - { - result += "isXLHHHSameInLength: " + (string)mConditions.isXLHHHSameInLength + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLLSameInLength)) - { - result += "isXLHLLSameInLength: " + (string)mConditions.isXLHLLSameInLength + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceCrossedOverSignal)) - { - result += "isXLHPriceCrossedOverSignal: " + (string)mConditions.isXLHPriceCrossedOverSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceOverSignal)) - { - result += "isXLHPriceOverSignal: " + (string)mConditions.isXLHPriceOverSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceCrossedUnderSignal)) - { - result += "isXLHPriceCrossedUnderSignal: " + (string)mConditions.isXLHPriceCrossedUnderSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceUnderSignal)) - { - result += "isXLHPriceUnderSignal: " + (string)mConditions.isXLHPriceUnderSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceInSignalRange)) - { - result += "isXLHPriceInSignalRange: " + (string)mConditions.isXLHPriceInSignalRange + separator; - } - - // - // Separator ... - result += separator; - - // - // XRSI ... - result += - "| XRSI |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSIPeak)) - { - result += "isXRSIPeak: " + (string)mConditions.isXRSIPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSIVale)) - { - result += "isXRSIVale: " + (string)mConditions.isXRSIVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedOverLongExit)) - { - result += "isXRSICrossedOverLongExit: " + (string)mConditions.isXRSICrossedOverLongExit + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedOverLongEntry)) - { - result += "isXRSICrossedOverLongEntry: " + (string)mConditions.isXRSICrossedOverLongEntry + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedUnderShortExit)) - { - result += "isXRSICrossedUnderShortExit: " + (string)mConditions.isXRSICrossedUnderShortExit + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedUnderShortEntry)) - { - result += "isXRSICrossedUnderShortEntry: " + (string)mConditions.isXRSICrossedUnderShortEntry + separator; - } - - // - // Separator ... - result += separator; - - // - // XCHLH ... - result += - "| XCHLH |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSameHHs)) - { - result += "isXCHLHSameHHs: " + (string)mConditions.isXCHLHSameHHs + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSameLLs)) - { - result += "isXCHLHSameLLs: " + (string)mConditions.isXCHLHSameLLs + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCMCHHSame)) - { - result += "isXCHLHSCMCHHSame: " + (string)mConditions.isXCHLHSCMCHHSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCMCLLSame)) - { - result += "isXCHLHSCMCLLSame: " + (string)mConditions.isXCHLHSCMCLLSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCLCHHSame)) - { - result += "isXCHLHSCLCHHSame: " + (string)mConditions.isXCHLHSCLCHHSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCLCLLSame)) - { - result += "isXCHLHSCLCLLSame: " + (string)mConditions.isXCHLHSCLCLLSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCLCHHSame)) - { - result += "isXCHLHMCLCHHSame: " + (string)mConditions.isXCHLHMCLCHHSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCLCLLSame)) - { - result += "isXCHLHMCLCLLSame: " + (string)mConditions.isXCHLHMCLCLLSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCOnTopOfLC)) - { - result += "isXCHLHMCOnTopOfLC: " + (string)mConditions.isXCHLHMCOnTopOfLC + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCInBottomOfLC)) - { - result += "isXCHLHMCInBottomOfLC: " + (string)mConditions.isXCHLHMCInBottomOfLC + separator; - } - - // - // Separator ... - result += separator; - - // - // XCHMA ... - result += - "| XCHMA |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCOverMax)) - { - result += "isXCHMASCOverMax: " + (string)mConditions.isXCHMASCOverMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCOverMin)) - { - result += "isXCHMASCOverMin: " + (string)mConditions.isXCHMASCOverMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCUnderMax)) - { - result += "isXCHMASCUnderMax: " + (string)mConditions.isXCHMASCUnderMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCUnderMin)) - { - result += "isXCHMASCUnderMin: " + (string)mConditions.isXCHMASCUnderMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedOverMax)) - { - result += "isXCHMASCCrossedOverMax: " + (string)mConditions.isXCHMASCCrossedOverMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedUnderMax)) - { - result += "isXCHMASCCrossedUnderMax: " + (string)mConditions.isXCHMASCCrossedUnderMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedOverMin)) - { - result += "isXCHMASCCrossedOverMin: " + (string)mConditions.isXCHMASCCrossedOverMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedUnderMin)) - { - result += "isXCHMASCCrossedUnderMin: " + (string)mConditions.isXCHMASCCrossedUnderMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCPeak)) - { - result += "isXCHMASCPeak: " + (string)mConditions.isXCHMASCPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCVale)) - { - result += "isXCHMASCVale: " + (string)mConditions.isXCHMASCVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCTrendsUp)) - { - result += "isXCHMASCTrendsUp: " + (string)mConditions.isXCHMASCTrendsUp + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCTrendsDown)) - { - result += "isXCHMASCTrendsDown: " + (string)mConditions.isXCHMASCTrendsDown + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastOverSlow)) - { - result += "isXCHMASCFastOverSlow: " + (string)mConditions.isXCHMASCFastOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastUnderSlow)) - { - result += "isXCHMASCFastUnderSlow: " + (string)mConditions.isXCHMASCFastUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastCrossedOverSlow)) - { - result += "isXCHMASCFastCrossedOverSlow: " + (string)mConditions.isXCHMASCFastCrossedOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastCrossedUnderSlow)) - { - result += "isXCHMASCFastCrossedUnderSlow: " + (string)mConditions.isXCHMASCFastCrossedUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCPeak)) - { - result += "isXCHMAMCPeak: " + (string)mConditions.isXCHMAMCPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCVale)) - { - result += "isXCHMAMCVale: " + (string)mConditions.isXCHMAMCVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCTrendsUp)) - { - result += "isXCHMAMCTrendsUp: " + (string)mConditions.isXCHMAMCTrendsUp + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCTrendsDown)) - { - result += "isXCHMAMCTrendsDown: " + (string)mConditions.isXCHMAMCTrendsDown + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastOverSlow)) - { - result += "isXCHMAMCFastOverSlow: " + (string)mConditions.isXCHMAMCFastOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastUnderSlow)) - { - result += "isXCHMAMCFastUnderSlow: " + (string)mConditions.isXCHMAMCFastUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastCrossedOverSlow)) - { - result += "isXCHMAMCFastCrossedOverSlow: " + (string)mConditions.isXCHMAMCFastCrossedOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastCrossedUnderSlow)) - { - result += "isXCHMAMCFastCrossedUnderSlow: " + (string)mConditions.isXCHMAMCFastCrossedUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCPeak)) - { - result += "isXCHMALCPeak: " + (string)mConditions.isXCHMALCPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCVale)) - { - result += "isXCHMALCVale: " + (string)mConditions.isXCHMALCVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCTrendsUp)) - { - result += "isXCHMALCTrendsUp: " + (string)mConditions.isXCHMALCTrendsUp + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCTrendsDown)) - { - result += "isXCHMALCTrendsDown: " + (string)mConditions.isXCHMALCTrendsDown + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastOverSlow)) - { - result += "isXCHMALCFastOverSlow: " + (string)mConditions.isXCHMALCFastOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastUnderSlow)) - { - result += "isXCHMALCFastUnderSlow: " + (string)mConditions.isXCHMALCFastUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastCrossedOverSlow)) - { - result += "isXCHMALCFastCrossedOverSlow: " + (string)mConditions.isXCHMALCFastCrossedOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastCrossedUnderSlow)) - { - result += "isXCHMALCFastCrossedUnderSlow: " + (string)mConditions.isXCHMALCFastCrossedUnderSlow + separator; - } - - // - // Separator ... - result += separator; - - // - return result; -} - -void Add( - ENUM_XAU5_SIGNAL_PROVIDERS item, - ENUM_XAU5_SIGNAL_PROVIDERS &items[]) -{ - // - ArrayResize( - items, - ArraySize(items) + 1); - - // - items[ArraySize(items) - 1] = item; -} -// -// START Utilities ... -// \ No newline at end of file diff --git a/BKP/Temp/xau5.indicators.provider.txt b/BKP/Temp/xau5.indicators.provider.txt deleted file mode 100644 index 634f3e0c..00000000 --- a/BKP/Temp/xau5.indicators.provider.txt +++ /dev/null @@ -1,8161 +0,0 @@ -/////////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XAU5 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 - -// -// START Define Enums ... -// - -// -enum ENUM_XAU5_SIGNAL_PROVIDERS -{ - // - // XSP Expert Support Mechanism ... - XSP, - // - // XTD ... - XTD, - // - // XTAM ... - XTAM, - // - // XSI ... - XSI, - // - // XSTFI ... - XSTFI, - // - // XOBDLH ... - XOBDLH, - // - // XCHMACC ... - XCHMACC, - // - // XCHMACMN ... - XCHMACMN, - // - // XCHMACMX ... - XCHMACMX, -}; - -// -// Represent Market Conditions ... -struct XAU5MarketConditions -{ - // - // XTM ... - bool isXTMPeak; - bool isXTMVale; - bool isXTMBullish; - bool isXTMBearish; - bool isXTMNeutural; - bool isXTMEndBullish; - bool isXTMEndBearish; - bool isXTMStartBullish; - bool isXTMStartBearish; - bool isXTMEndBullishByNeutural; - bool isXTMEndBearishByNeutural; - bool isXTMStartBullishAfterNeutural; - bool isXTMStartBearishAfterNeutural; - - // - // XAMA ... - bool isXAMAPeak; - bool isXAMAVale; - bool isXAMABullish; - bool isXAMABearish; - bool isXAMANeutural; - bool isXAMAEndBullish; - bool isXAMAEndBearish; - bool isXAMAStartBullish; - bool isXAMAStartBearish; - bool isXAMAEndBullishByNeutural; - bool isXAMAEndBearishByNeutural; - bool isXAMAStartBullishAfterNeutural; - bool isXAMAStartBearishAfterNeutural; - - // - // XLH ... - bool isXLHHHIncreased; - bool isXLHHHDecreased; - bool isXLHLLIncreased; - bool isXLHLLDecreased; - bool isXLHLowAttachedLL; - bool isXLHHighAttachedHH; - bool isXLHHHSameInLength; - bool isXLHLLSameInLength; - bool isXLHPriceOverSignal; - bool isXLHPriceUnderSignal; - bool isXLHPriceInSignalRange; - bool isXLHPriceCrossedOverSignal; - bool isXLHPriceCrossedUnderSignal; - - // - // XTD ... - bool isXTDSignalPeak; - bool isXTDSignalVale; - bool isXTDBullishPeak; - bool isXTDBullishVale; - bool isXTDBearishPeak; - bool isXTDBearishVale; - bool isXTDBullOverBear; - bool isXTDBullUnderBear; - bool isXTDSignalOverBear; - bool isXTDSignalUnderBear; - bool isXTDBullCrossedOverBear; - bool isXTDBullCrossedUnderBear; - bool isXTDSignalCrossedOverBear; - bool isXTDSignalCrossedUnderBear; - - // - // XFI ... - bool isXFIPeak; - bool isXFIVale; - bool isXFICrossedOverZero; - bool isXFIOverZero; - bool isXFICrossedUnderZero; - bool isXFIUnderZero; - - // - // XTS ... - bool isXTSAllSame; - bool isXTSCurrentMin; - bool isXTSCurrentMax; - bool isXTSCurrentOverFarest; - bool isXTSCurrentOverNearest; - bool isXTSCurrentOverMediest; - bool isXTSCurrentUnderFarest; - bool isXTSCurrentUnderNearest; - bool isXTSCurrentUnderMediest; - bool isXTSCurrentCrossedOverFarest; - bool isXTSCurrentCrossedOverNearest; - bool isXTSCurrentCrossedOverMediest; - bool isXTSCurrentCrossedUnderFarest; - bool isXTSCurrentCrossedUnderNearest; - bool isXTSCurrentCrossedUnderMediest; - - // - // XRSI ... - bool isXRSIPeak; - bool isXRSIVale; - bool isXRSICrossedOverLongExit; - bool isXRSICrossedOverLongEntry; - bool isXRSICrossedUnderShortExit; - bool isXRSICrossedUnderShortEntry; - - // - // XOBD ... - bool isXOBDSwingLow; - bool isXOBDSwingHigh; - - // - // XCHLH ... - // - bool isXCHLHSameHHs; - bool isXCHLHSameLLs; - // - bool isXCHLHSCMCHHSame; - bool isXCHLHSCMCLLSame; - // - bool isXCHLHSCLCHHSame; - bool isXCHLHSCLCLLSame; - // - bool isXCHLHMCLCHHSame; - bool isXCHLHMCLCLLSame; - // - bool isXCHLHMCOnTopOfLC; - bool isXCHLHMCInBottomOfLC; - - // - // XCHMA ... - // - bool isXCHMASCOverMax; - bool isXCHMASCOverMin; - bool isXCHMASCUnderMax; - bool isXCHMASCUnderMin; - // - bool isXCHMASCCrossedOverMax; - bool isXCHMASCCrossedUnderMax; - bool isXCHMASCCrossedOverMin; - bool isXCHMASCCrossedUnderMin; - // - bool isXCHMASCPeak; - bool isXCHMASCVale; - bool isXCHMASCTrendsUp; - bool isXCHMASCTrendsDown; - bool isXCHMASCFastOverSlow; - bool isXCHMASCFastUnderSlow; - bool isXCHMASCFastCrossedOverSlow; - bool isXCHMASCFastCrossedUnderSlow; - // - bool isXCHMAMCPeak; - bool isXCHMAMCVale; - bool isXCHMAMCTrendsUp; - bool isXCHMAMCTrendsDown; - bool isXCHMAMCFastOverSlow; - bool isXCHMAMCFastUnderSlow; - bool isXCHMAMCFastCrossedOverSlow; - bool isXCHMAMCFastCrossedUnderSlow; - // - bool isXCHMALCPeak; - bool isXCHMALCVale; - bool isXCHMALCTrendsUp; - bool isXCHMALCTrendsDown; - bool isXCHMALCFastOverSlow; - bool isXCHMALCFastUnderSlow; - bool isXCHMALCFastCrossedOverSlow; - bool isXCHMALCFastCrossedUnderSlow; -}; - -// -// END Define Enums ... -// - -// -// Include Provider Inputs ... -#include "x-saherelm.xau5.provider.inputs.lib.mq5" - -// -// Signallers ... -input group "XAU5 Signallers"; - -// -// XTD ... -input group "XAU5 XTD Signaller"; -input bool xAU5XTDEnableSignaller = true; // Enable Signaller -// input bool xAU5XTDEnableTPSL = false; // Enable TP/SL -input bool xAU5XTDAllowLongSignals = true; // Enable Long Signals -input bool xAU5XTDAllowShortSignals = true; // Enable Short Signals - -// -// XTAM ... -input group "XAU5 XTAM Signaller"; -input bool xAU5XTAMEnableSignaller = true; // Enable Signaller -// input bool xAU5XTAMEnableTPSL = false; // Enable TP/SL -input bool xAU5XTAMAllowLongSignals = true; // Enable Long Signals -input bool xAU5XTAMAllowShortSignals = true; // Enable Short Signals - -// -// XSI ... -input group "XAU5 XSI Signaller"; -input bool xAU5XSIEnableSignaller = true; // Enable Signaller -// input bool xAU5SIXEnableTPSL = false; // Enable TP/SL -input bool xAU5XSIAllowLongSignals = true; // Enable Long Signals -input bool xAU5XSIAllowShortSignals = true; // Enable Short Signals - -// -// XSTFI ... -input group "XAU5 XSTFI Signaller"; -input bool xAU5XSTFIEnableSignaller = true; // Enable Signaller -// input bool xAU5XSTFIEnableTPSL = false; // Enable TP/SL -input bool xAU5XSTFIAllowLongSignals = true; // Enable Long Signals -input bool xAU5XSTFIAllowShortSignals = true; // Enable Short Signals - -// -// XOBDLH ... -input group "XAU5 XOBDLH Signaller"; -input bool xAU5XOBDLHEnableSignaller = true; // Enable Signaller -// input bool xAU5XOBDLHEnableTPSL = false; // Enable TP/SL -input bool xAU5XOBDLHAllowLongSignals = true; // Enable Long Signals -input bool xAU5XOBDLHAllowShortSignals = true; // Enable Short Signals - -// -// XCHMACC ... -input group "XAU5 XCHMACC Signaller"; -input bool xAU5XCHMACCEnableSignaller = true; // Enable Signaller -// input bool xAU5XCHMACCEnableTPSL = false; // Enable TP/SL -input bool xAU5XCHMACCAllowLongSignals = true; // Enable Long Signals -input bool xAU5XCHMACCAllowShortSignals = true; // Enable Short Signals - -// -// XCHMACMX ... -input group "XAU5 XCHMACMX Signaller"; -input bool xAU5XCHMACMXEnableSignaller = true; // Enable Signaller -// input bool xAU5XCHMACMXEnableTPSL = false; // Enable TP/SL -input bool xAU5XCHMACMXAllowLongSignals = true; // Enable Long Signals -input bool xAU5XCHMACMXAllowShortSignals = true; // Enable Short Signals - -// -// XCHMACMN ... -input group "XAU5 XCHMACMN Signaller"; -input bool xAU5XCHMACMNEnableSignaller = true; // Enable Signaller -// input bool xAU5XCHMACMNEnableTPSL = false; // Enable TP/SL -input bool xAU5XCHMACMNAllowLongSignals = true; // Enable Long Signals -input bool xAU5XCHMACMNAllowShortSignals = true; // Enable Short Signals - -// -// Imports all Indicators Helper here ... -// input group "XAU5 Provider Indicators"; - -// -#include "../Helpers/x-saherelm.xtm.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xama.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xlh.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xts.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xobd.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5" - -// -bool xAU5IsTestMode = true; -int xAU5MaxLengthOfInputs = 0; -int xAU5CalculatedBars = 0; - -// -// Signaller Variables ... -// -// XTD ... -bool xAU5MXTDEnableSignaller = xAU5XTDEnableSignaller; -// bool xAU5MXTDEnableTPSL = xAU5XTDEnableTPSL; -bool xAU5MXTDAllowLongSignals = xAU5XTDAllowLongSignals; -bool xAU5MXTDAllowShortSignals = xAU5XTDAllowShortSignals; - -// -// XTAM ... -bool xAU5MXTAMEnableSignaller = xAU5XTAMEnableSignaller; -// bool xAU5MXTAMEnableTPSL = xAU5XTAMEnableTPSL; -bool xAU5MXTAMAllowLongSignals = xAU5XTAMAllowLongSignals; -bool xAU5MXTAMAllowShortSignals = xAU5XTAMAllowShortSignals; - -// -// XSI ... -bool xAU5MXSIEnableSignaller = xAU5XSIEnableSignaller; -// bool xAU5MSIXEnableTPSL = xAU5SIXEnableTPSL; -bool xAU5MXSIAllowLongSignals = xAU5XSIAllowLongSignals; -bool xAU5MXSIAllowShortSignals = xAU5XSIAllowShortSignals; - -// -// XSTFI ... -bool xAU5MXSTFIEnableSignaller = xAU5XSTFIEnableSignaller; -// bool xAU5MXSTFIEnableTPSL = xAU5XSTFIEnableTPSL; -bool xAU5MXSTFIAllowLongSignals = xAU5XSTFIAllowLongSignals; -bool xAU5MXSTFIAllowShortSignals = xAU5XSTFIAllowShortSignals; - -// -// XOBDLH ... -bool xAU5MXOBDLHEnableSignaller = xAU5XOBDLHEnableSignaller; -// bool xAU5MXOBDLHEnableTPSL = xAU5XOBDLHEnableTPSL; -bool xAU5MXOBDLHAllowLongSignals = xAU5XOBDLHAllowLongSignals; -bool xAU5MXOBDLHAllowShortSignals = xAU5XOBDLHAllowShortSignals; - -// -// XCHMACC ... -bool xAU5MXCHMACCEnableSignaller = xAU5XCHMACCEnableSignaller; -// bool xAU5MXCHMACCEnableTPSL = xAU5XCHMACCEnableTPSL; -bool xAU5MXCHMACCAllowLongSignals = xAU5XCHMACCAllowLongSignals; -bool xAU5MXCHMACCAllowShortSignals = xAU5XCHMACCAllowShortSignals; - -// -// XCHMAMX ... -bool xAU5MXCHMACMXEnableSignaller = xAU5XCHMACMXEnableSignaller; -// bool xAU5MXCHMACMXEnableTPSL = xAU5XCHMACMXEnableTPSL; -bool xAU5MXCHMACMXAllowLongSignals = xAU5XCHMACMXAllowLongSignals; -bool xAU5MXCHMACMXAllowShortSignals = xAU5XCHMACMXAllowShortSignals; - -// -// XCHMAMN ... -bool xAU5MXCHMACMNEnableSignaller = xAU5XCHMACMNEnableSignaller; -// bool xAU5MXCHMACMNEnableTPSL = xAU5XCHMACMNEnableTPSL; -bool xAU5MXCHMACMNAllowLongSignals = xAU5XCHMACMNAllowLongSignals; -bool xAU5MXCHMACMNAllowShortSignals = xAU5XCHMACMNAllowShortSignals; - -// -// Funded Next Resolve Guards ... -bool isXAU5OnFundedNext = true; - -// -// Here we Define some Global Market Variables to Analyse MArket Conditions -// using them at each time ... -XAU5MarketConditions xAU5Conditions = {}; - -// -// Validate Indicators Inputs ... -bool XAU5ValidateIndicatorsInputs() -{ - // - bool result = false; - - // - // XTM ... - result = XTMValidateInputs(); - if (!result) - { - return result; - } - - // - // XAMA ... - result = XAMAValidateInputs(); - if (!result) - { - return result; - } - - // - // XTD ... - result = XTDValidateInputs(); - if (!result) - { - return result; - } - - // - // XFI ... - result = XFIValidateInputs(); - if (!result) - { - return result; - } - - // - // XTS ... - result = XTSValidateInputs(); - if (!result) - { - return result; - } - - // - // XOBD ... - result = XOBDValidateInputs(); - if (!result) - { - return result; - } - - // - // XLH ... - result = XLHValidateInputs(); - if (!result) - { - return result; - } - - // - // XRSI ... - result = XRSIValidateInputs(); - if (!result) - { - return result; - } - - // - // XCHLH ... - result = XCHLHValidateInputs(); - if (!result) - { - return result; - } - - // - // XCHMA ... - result = XCHMAValidateInputs(); - if (!result) - { - return result; - } - - // - result = true; - - // - return result; -} - -// -// Init Indicators ... -bool XAU5InitIndicators() -{ - // - bool result = false; - - // - // Make it Enable when we need to Log Market Conditions ... - // xAU5IsTestMode = false; // IsRunningOnTestMode(); - - // - // Check and Calculate Max Length in Inputs ... - // - - // - // XTM ... - xAU5MaxLengthOfInputs = MathMax( - xTMMaPeriod, - xAU5NumberOfItemsPerTick); - - // - // XAMA ... - xAU5MaxLengthOfInputs = MathMax( - xAMALength, - xAU5NumberOfItemsPerTick); - xAU5MaxLengthOfInputs = MathMax( - xAMAFastEMA, - xAU5NumberOfItemsPerTick); - xAU5MaxLengthOfInputs = MathMax( - xAMASlowEMA, - xAU5NumberOfItemsPerTick); - - // - // XLH ... - xAU5MaxLengthOfInputs = MathMax( - xLHLength, - xAU5NumberOfItemsPerTick); - - // - // XTD ... - xAU5MaxLengthOfInputs = MathMax( - xTDLength, - xAU5MaxLengthOfInputs); - - // - // XFI ... - xAU5MaxLengthOfInputs = MathMax( - xFILength, - xAU5MaxLengthOfInputs); - - // - // XRSI ... - xAU5MaxLengthOfInputs = MathMax( - xRSILength, - xAU5MaxLengthOfInputs); - - // - // XOBD ... - xAU5MaxLengthOfInputs = MathMax( - xOBDLength, - xAU5MaxLengthOfInputs); - - // - // XCHLH ... - xAU5MaxLengthOfInputs = MathMax( - xCHLHLcLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHLHMcLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHLHScLength, - xAU5MaxLengthOfInputs); - - // - // XCHMA ... - xAU5MaxLengthOfInputs = MathMax( - xCHMAScFastLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHMAScSlowLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHMAMcFastLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHMAMcSlowLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHMALcFastLength, - xAU5MaxLengthOfInputs); - xAU5MaxLengthOfInputs = MathMax( - xCHMALcSlowLength, - xAU5MaxLengthOfInputs); - - // - // Validate Indicators Inputs before Initialization ... - result = XAU5ValidateIndicatorsInputs(); - if (!result) - { - return result; - } - - // - // Validate Signallers ... - - // - // XTD ... - bool isXTDEnable = - xAU5XTDEnableSignaller && - (xAU5XTDAllowLongSignals || - xAU5XTDAllowShortSignals); - - // - // XTAM ... - bool isXTAMEnable = - xAU5XTAMEnableSignaller && - (xAU5XTAMAllowLongSignals || - xAU5XTAMAllowShortSignals); - - // - // XSI ... - bool isXSIEnable = - xAU5XSIEnableSignaller && - (xAU5XSIAllowLongSignals || - xAU5XSIAllowShortSignals); - - // - // XSTFI ... - bool isXSTFIEnable = - xAU5XSTFIEnableSignaller && - (xAU5XSTFIAllowLongSignals || - xAU5XSTFIAllowShortSignals); - - // - // XOBDLH ... - bool isXOBDLHEnable = - xAU5XOBDLHEnableSignaller && - (xAU5XOBDLHAllowLongSignals || - xAU5XOBDLHAllowShortSignals); - - // - // XCHMACC ... - bool isXCHMACCEnable = - xAU5XCHMACCEnableSignaller && - (xAU5XCHMACCAllowLongSignals || - xAU5XCHMACCAllowShortSignals); - - // - // XCHMACMX ... - bool isXCHMACMXEnable = - xAU5XCHMACMXEnableSignaller && - (xAU5XCHMACMXAllowLongSignals || - xAU5XCHMACMXAllowShortSignals); - - // - // XCHMACMN ... - bool isXCHMACMNEnable = - xAU5XCHMACMNEnableSignaller && - (xAU5XCHMACMNAllowLongSignals || - xAU5XCHMACMNAllowShortSignals); - - // - bool hasSignaller = - // - isXTDEnable || - isXTAMEnable || - isXSIEnable || - isXSTFIEnable || - isXOBDLHEnable || - isXCHMACCEnable || - isXCHMACMXEnable || - isXCHMACMNEnable - // - ; - result = hasSignaller; - if (!result) - { - // - LogMessage("XAU5 doesn't enable any Signaller ..."); - - // - return result; - } - - // - // Initialize Indicator/Oscillator Handlers ... - ResetLastError(); - - // - // XTM Init ... - result = XTMInitHandlers(); - if (!result) - { - return result; - } - - // - // XAMA Init ... - result = XAMAInitHandlers(); - if (!result) - { - return result; - } - - // - // XLH Init ... - result = XLHInitHandlers(); - if (!result) - { - return result; - } - - // - // XTD Init ... - result = XTDInitHandlers(); - if (!result) - { - return result; - } - - // - // XFI Init ... - result = XFIInitHandlers(); - if (!result) - { - return result; - } - - // - // XTS Init ... - result = XTSInitHandlers(); - 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 XAU5ReleaseIndicators() -{ - // - // Release Handlers ... - XTMReleaseHandlers(); - XAMAReleaseHandlers(); - XLHReleaseHandlers(); - XTDReleaseHandlers(); - XFIReleaseHandlers(); - XTSReleaseHandlers(); - XRSIReleaseHandlers(); - XOBDReleaseHandlers(); - XCHMAReleaseHandlers(); - XCHLHReleaseHandlers(); -} - -// -// Handle Reading Buffers ... -void XAU5HandleReadingBuffers() -{ - // - // Reading Calculated Bars for a Simple Handler ... - xAU5CalculatedBars = BarsCalculated(xTMHandler); - - // - // Read Indicators Buffers ... - XTMReadBuffers(xAU5NumberOfItemsPerTick); - XAMAReadBuffers(xAU5NumberOfItemsPerTick); - XLHReadBuffers(xAU5NumberOfItemsPerTick); - XTDReadBuffers(xAU5NumberOfItemsPerTick); - XFIReadBuffers(xAU5NumberOfItemsPerTick); - XTSReadBuffers(xAU5NumberOfItemsPerTick); - XRSIReadBuffers(xAU5NumberOfItemsPerTick); - XOBDReadBuffers(xAU5NumberOfItemsPerTick); - XCHMAReadBuffers(xAU5NumberOfItemsPerTick); - XCHLHReadBuffers(xAU5NumberOfItemsPerTick); - - // - XAU5ReadConditions(); -} - -// -// -// 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 XAU5CanOpenLongTrade( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - info.tp = 0; - info.sl = 0; - ArrayResize( - info.signallers, - 0); - - // - bool hasSignal = XAU5HasLongSignal(info); - - // - result = - // - hasSignal - // - ; - - // - if (result) - { - XAU5ClearConditions(); - } - - // - 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 XAU5CanCloseLongTrade() -{ - // - bool result = false; - - // - 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 XAU5CanOpenShortTrade( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - info.tp = 0; - info.sl = 0; - ArrayResize( - info.signallers, - 0); - - // - bool hasSignal = XAU5HasShortSignal(info); - - // - result = - // - hasSignal - // - ; - - // - if (result) - { - XAU5ClearConditions(); - } - - // - 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 XAU5CanCloseShortTrade() -{ - // - bool result = false; - - // - return result; -} - -// -// -// END Combination Functions ... -// -// - -// -// -// START Combination Signaling ... -// -// - -// -// Read All Globally Required Conditions ... -void XAU5ReadConditions() -{ - // - XAU5ClearConditions(); - - // - xAU5Conditions = XAU5GenerateMarketConditions(1); -} - -// -// Cleanup Conditions ... -void XAU5ClearConditions() -{ - // - XAU5MarketConditions mConditions = {}; - - // - xAU5Conditions = mConditions; -} - -// -// Generate Merket Conditions for Specified Bar Index ... -XAU5MarketConditions XAU5GenerateMarketConditions( - int bar_index = 1 // Specified Bar Index ... -) -{ - // - XAU5MarketConditions mConditions = {}; - - // - // XTM ... - mConditions.isXTMPeak = XTMIsPeak(bar_index); - mConditions.isXTMVale = XTMIsVale(bar_index); - mConditions.isXTMBullish = XTMIsBullish(bar_index); - mConditions.isXTMBearish = XTMIsBearish(bar_index); - mConditions.isXTMNeutural = XTMIsNeutural(bar_index); - mConditions.isXTMEndBullish = XTMIsEndBullish(bar_index); - mConditions.isXTMEndBearish = XTMIsEndBearish(bar_index); - mConditions.isXTMStartBullish = XTMIsStartBullish(bar_index); - mConditions.isXTMStartBearish = XTMIsStartBearish(bar_index); - mConditions.isXTMEndBullishByNeutural = XTMIsEndBullishByNeutural(bar_index); - mConditions.isXTMEndBearishByNeutural = XTMIsEndBearishByNeutural(bar_index); - mConditions.isXTMStartBullishAfterNeutural = XTMIsStartBullishAfterNeutural(bar_index); - mConditions.isXTMStartBearishAfterNeutural = XTMIsStartBearishAfterNeutural(bar_index); - - // - // XAMA ... - mConditions.isXAMAPeak = XAMAIsPeak(bar_index); - mConditions.isXAMAVale = XAMAIsVale(bar_index); - mConditions.isXAMABullish = XAMAIsBullish(bar_index); - mConditions.isXAMABearish = XAMAIsBearish(bar_index); - mConditions.isXAMANeutural = XAMAIsNeutural(bar_index); - mConditions.isXAMAEndBullish = XAMAIsEndBullish(bar_index); - mConditions.isXAMAEndBearish = XAMAIsEndBearish(bar_index); - mConditions.isXAMAStartBullish = XAMAIsStartBullish(bar_index); - mConditions.isXAMAStartBearish = XAMAIsStartBearish(bar_index); - mConditions.isXAMAEndBullishByNeutural = XAMAIsEndBullishByNeutural(bar_index); - mConditions.isXAMAEndBearishByNeutural = XAMAIsEndBearishByNeutural(bar_index); - mConditions.isXAMAStartBullishAfterNeutural = XAMAIsStartBullishAfterNeutural(bar_index); - mConditions.isXAMAStartBearishAfterNeutural = XAMAIsStartBearishAfterNeutural(bar_index); - - // - // XLH ... - mConditions.isXLHHHIncreased = XLHIsHHIncreased(bar_index); - mConditions.isXLHHHDecreased = XLHIsHHDecreased(bar_index); - mConditions.isXLHLLIncreased = XLHIsLLIncreased(bar_index); - mConditions.isXLHLLDecreased = XLHIsLLDecreased(bar_index); - mConditions.isXLHLowAttachedLL = XLHIsLowAttachedLL(bar_index); - mConditions.isXLHHighAttachedHH = XLHIsHighAttachedHH(bar_index); - mConditions.isXLHHHSameInLength = XLHIsHHSameInLength(bar_index); - mConditions.isXLHLLSameInLength = XLHIsLLSameInLength(bar_index); - mConditions.isXLHPriceOverSignal = XLHIsPriceOverSignal(bar_index); - mConditions.isXLHPriceUnderSignal = XLHIsPriceUnderSignal(bar_index); - mConditions.isXLHPriceInSignalRange = XLHIsPriceInSignalRange(bar_index); - mConditions.isXLHPriceCrossedOverSignal = XLHIsPriceCrossedOverSignal(bar_index); - mConditions.isXLHPriceCrossedUnderSignal = XLHIsPriceCrossedUnderSignal(bar_index); - - // - // XTD ... - mConditions.isXTDSignalPeak = XTDIsSignalPeak(bar_index); - mConditions.isXTDSignalVale = XTDIsSignalVale(bar_index); - mConditions.isXTDBullishPeak = XTDIsBullishPeak(bar_index); - mConditions.isXTDBullishVale = XTDIsBullishVale(bar_index); - mConditions.isXTDBearishPeak = XTDIsBearishPeak(bar_index); - mConditions.isXTDBearishVale = XTDIsBearishVale(bar_index); - mConditions.isXTDBullOverBear = XTDIsBullOverBear(bar_index); - mConditions.isXTDBullUnderBear = XTDIsBullUnderBear(bar_index); - mConditions.isXTDSignalOverBear = XTDIsSignalOverBear(bar_index); - mConditions.isXTDSignalUnderBear = XTDIsSignalUnderBear(bar_index); - mConditions.isXTDBullCrossedOverBear = XTDIsBullCrossedOverBear(bar_index); - mConditions.isXTDBullCrossedUnderBear = XTDIsBullCrossedUnderBear(bar_index); - mConditions.isXTDSignalCrossedOverBear = XTDIsSignalCrossedOverBear(bar_index); - mConditions.isXTDSignalCrossedUnderBear = XTDIsSignalCrossedUnderBear(bar_index); - - // - // XFI ... - mConditions.isXFIPeak = XFIIsPeak(bar_index); - mConditions.isXFIVale = XFIIsVale(bar_index); - mConditions.isXFIOverZero = XFIIsOverZero(bar_index); - mConditions.isXFIUnderZero = XFIIsUnderZero(bar_index); - mConditions.isXFICrossedOverZero = XFIIsCrossedOverZero(bar_index); - mConditions.isXFICrossedUnderZero = XFIIsCrossedUnderZero(bar_index); - - // - // XTS ... - mConditions.isXTSAllSame = XTSIsAllSame(bar_index); - mConditions.isXTSCurrentMin = XTSIsCurrentMin(bar_index); - mConditions.isXTSCurrentMax = XTSIsCurrentMax(bar_index); - mConditions.isXTSCurrentOverFarest = XTSIsCurrentOverFarest(bar_index); - mConditions.isXTSCurrentOverNearest = XTSIsCurrentOverNearest(bar_index); - mConditions.isXTSCurrentOverMediest = XTSIsCurrentOverMediest(bar_index); - mConditions.isXTSCurrentUnderFarest = XTSIsCurrentUnderFarest(bar_index); - mConditions.isXTSCurrentUnderNearest = XTSIsCurrentUnderNearest(bar_index); - mConditions.isXTSCurrentUnderMediest = XTSIsCurrentUnderMediest(bar_index); - mConditions.isXTSCurrentCrossedOverFarest = XTSIsCurrentCrossedOverFarest(bar_index); - mConditions.isXTSCurrentCrossedOverNearest = XTSIsCurrentCrossedOverNearest(bar_index); - mConditions.isXTSCurrentCrossedOverMediest = XTSIsCurrentCrossedOverMediest(bar_index); - mConditions.isXTSCurrentCrossedUnderFarest = XTSIsCurrentCrossedUnderFarest(bar_index); - mConditions.isXTSCurrentCrossedUnderNearest = XTSIsCurrentCrossedUnderNearest(bar_index); - mConditions.isXTSCurrentCrossedUnderMediest = XTSIsCurrentCrossedUnderMediest(bar_index); - - // - // XRSI ... - mConditions.isXRSIPeak = XRSIIsPeak(bar_index); - mConditions.isXRSIVale = XRSIIsVale(bar_index); - mConditions.isXRSICrossedOverLongExit = XRSIIsCrossedOverLongExit(bar_index); - mConditions.isXRSICrossedOverLongEntry = XRSIIsCrossedOverLongEntry(bar_index); - mConditions.isXRSICrossedUnderShortExit = XRSIIsCrossedUnderShortExit(bar_index); - mConditions.isXRSICrossedUnderShortEntry = XRSIIsCrossedUnderShortEntry(bar_index); - - // - // XOBD ... - mConditions.isXOBDSwingLow = XOBDIsSwingLow(bar_index); - mConditions.isXOBDSwingHigh = XOBDIsSwingHigh(bar_index); - - // - // XCHLH ... - // - mConditions.isXCHLHSameHHs = XCHLHIsSameHHs(bar_index); - mConditions.isXCHLHSameLLs = XCHLHIsSameLLs(bar_index); - // - mConditions.isXCHLHSCMCHHSame = XCHLHIsMCSCHasSameHH(bar_index); - mConditions.isXCHLHSCMCLLSame = XCHLHIsMCSCHasSameLL(bar_index); - // - mConditions.isXCHLHSCLCHHSame = XCHLHIsLCSCHasSameHH(bar_index); - mConditions.isXCHLHSCLCLLSame = XCHLHIsLCSCHasSameLL(bar_index); - // - mConditions.isXCHLHMCLCHHSame = XCHLHIsLCMCHasSameHH(bar_index); - mConditions.isXCHLHMCLCLLSame = XCHLHIsLCMCHasSameLL(bar_index); - // - mConditions.isXCHLHMCOnTopOfLC = XCHLHIsMCOnTopOfLC(bar_index); - mConditions.isXCHLHMCInBottomOfLC = XCHLHIsMCInBottomOfLC(bar_index); - - // - // XCHMA ... - // - mConditions.isXCHMASCOverMax = XCHMAIsSCOverMax(bar_index); - mConditions.isXCHMASCOverMin = XCHMAIsSCOverMin(bar_index); - mConditions.isXCHMASCUnderMax = XCHMAIsSCUnderMax(bar_index); - mConditions.isXCHMASCUnderMin = XCHMAIsSCUnderMin(bar_index); - // - mConditions.isXCHMASCCrossedOverMax = XCHMAIsSCCrossedOverMax(bar_index); - mConditions.isXCHMASCCrossedUnderMax = XCHMAIsSCCrossedUnderMax(bar_index); - mConditions.isXCHMASCCrossedOverMin = XCHMAIsSCCrossedOverMin(bar_index); - mConditions.isXCHMASCCrossedUnderMin = XCHMAIsSCCrossedUnderMin(bar_index); - // - mConditions.isXCHMASCPeak = XCHMAIsSCPeak(bar_index); - mConditions.isXCHMASCVale = XCHMAIsSCVale(bar_index); - mConditions.isXCHMASCTrendsUp = XCHMAIsSCTrendsUp(bar_index); - mConditions.isXCHMASCTrendsDown = XCHMAIsSCTrendsDown(bar_index); - mConditions.isXCHMASCFastOverSlow = XCHMAIsSCFastOverSlow(bar_index); - mConditions.isXCHMASCFastUnderSlow = XCHMAIsSCFastUnderSlow(bar_index); - mConditions.isXCHMASCFastCrossedOverSlow = XCHMAIsSCFastCrossedOverSlow(bar_index); - mConditions.isXCHMASCFastCrossedUnderSlow = XCHMAIsSCFastCrossedUnderSlow(bar_index); - // - mConditions.isXCHMAMCPeak = XCHMAIsMCPeak(bar_index); - mConditions.isXCHMAMCVale = XCHMAIsMCVale(bar_index); - mConditions.isXCHMAMCTrendsUp = XCHMAIsMCTrendsUp(bar_index); - mConditions.isXCHMAMCTrendsDown = XCHMAIsMCTrendsDown(bar_index); - mConditions.isXCHMAMCFastOverSlow = XCHMAIsMCFastOverSlow(bar_index); - mConditions.isXCHMAMCFastUnderSlow = XCHMAIsMCFastUnderSlow(bar_index); - mConditions.isXCHMAMCFastCrossedOverSlow = XCHMAIsMCFastCrossedOverSlow(bar_index); - mConditions.isXCHMAMCFastCrossedUnderSlow = XCHMAIsMCFastCrossedUnderSlow(bar_index); - // - mConditions.isXCHMALCPeak = XCHMAIsLCPeak(bar_index); - mConditions.isXCHMALCVale = XCHMAIsLCVale(bar_index); - mConditions.isXCHMALCTrendsUp = XCHMAIsLCTrendsUp(bar_index); - mConditions.isXCHMALCTrendsDown = XCHMAIsLCTrendsDown(bar_index); - mConditions.isXCHMALCFastOverSlow = XCHMAIsLCFastOverSlow(bar_index); - mConditions.isXCHMALCFastUnderSlow = XCHMAIsLCFastUnderSlow(bar_index); - mConditions.isXCHMALCFastCrossedOverSlow = XCHMAIsLCFastCrossedOverSlow(bar_index); - mConditions.isXCHMALCFastCrossedUnderSlow = XCHMAIsLCFastCrossedUnderSlow(bar_index); - - // - return mConditions; -} - -// -// Check Market Conditions by Combination of Power of All tools for LONGs ... -bool XAU5HasLongSignal( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - // XTD ... - bool isXTDHasSignal = XAU5XTDHasLongSignal(); - if (isXTDHasSignal) - { - // - Add( - EnumToString(XTD), - info.signallers); - } - - // - // XTAM ... - bool isXTAMHasSignal = XAU5XTAMHasLongSignal(); - if (isXTAMHasSignal) - { - // - Add( - EnumToString(XTAM), - info.signallers); - } - - // - // XSI ... - bool isXSIHasSignal = XAU5XSIHasLongSignal(); - if (isXSIHasSignal) - { - // - Add( - EnumToString(XSI), - info.signallers); - } - - // - // XSTFI ... - bool isXSTFIHasSignal = XAU5XSTFIHasLongSignal(); - if (isXSTFIHasSignal) - { - // - Add( - EnumToString(XSTFI), - info.signallers); - } - - // - // XOBD XLH ... - bool isXOBDLHHasSignal = XAU5XOBDLHHasLongSignal(); - if (isXOBDLHHasSignal) - { - // - Add( - EnumToString(XOBDLH), - info.signallers); - } - - // - // XCHMA Cycles Cross ... - bool isXCHMACCHasSignal = XAU5XCHMACCHasLongSignal(); - if (isXCHMACCHasSignal) - { - // - Add( - EnumToString(XCHMACC), - info.signallers); - } - - // - // XCHMA Cycles Min ... - bool isXCHMACMNHasSignal = XAU5XCHMACMNHasLongSignal(); - if (isXCHMACMNHasSignal) - { - // - Add( - EnumToString(XCHMACMN), - info.signallers); - } - - // - // XCHMA Cycles Max - bool isXCHMACMXHasSignal = XAU5XCHMACMXHasLongSignal(); - if (isXCHMACMXHasSignal) - { - // - Add( - EnumToString(XCHMACMX), - info.signallers); - } - - // - result = - // - isXTDHasSignal - // - || - // - isXTAMHasSignal - // - || - // - isXSIHasSignal - // - || - // - isXSTFIHasSignal - // - || - // - isXOBDLHHasSignal - // - || - // - isXCHMACCHasSignal - // - || - // - isXCHMACMNHasSignal - // - || - // - isXCHMACMXHasSignal - // - ; - - // - if (result) - { - // - // Only Log Signals Time Market Conditions if is in Testing Mode ... - if (xAU5IsTestMode) - { - // - string message = XAU5GetConditionsString(xAU5Conditions, "\n"); - - // - LogMessage( - "Long Signal Provided by: \n" + - info.signallers[ArraySize(info.signallers) - 1] + "\n" + - "Pusher: " + (string)ArraySize(info.signallers) + "\n" + - "Market Conditions: " + message); - } - } - - // - return result; -} - -// -// Check Market Conditions by Combination of Power of All tools for SHORTs ... -bool XAU5HasShortSignal( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - // XTD ... - bool isXTDHasSignal = XAU5XTDHasShortSignal(); - if (isXTDHasSignal) - { - // - Add( - EnumToString(XTD), - info.signallers); - } - - // - // XTAM ... - bool isXTAMHasSignal = XAU5XTAMHasShortSignal(); - if (isXTAMHasSignal) - { - // - Add( - EnumToString(XTAM), - info.signallers); - } - - // - // XSI ... - bool isXSIHasSignal = XAU5XSIHasShortSignal(); - if (isXSIHasSignal) - { - // - Add( - EnumToString(XSI), - info.signallers); - } - - // - // XSTFI ... - bool isXSTFIHasSignal = XAU5XSTFIHasShortSignal(); - if (isXSTFIHasSignal) - { - // - Add( - EnumToString(XSTFI), - info.signallers); - } - - // - // XOBD XLH ... - bool isXOBDLHHasSignal = XAU5XOBDLHHasShortSignal(); - if (isXOBDLHHasSignal) - { - // - Add( - EnumToString(XOBDLH), - info.signallers); - } - - // - // XCHMA Cycles Cross ... - bool isXCHMACCHasSignal = XAU5XCHMACCHasShortSignal(); - if (isXCHMACCHasSignal) - { - // - Add( - EnumToString(XCHMACC), - info.signallers); - } - - // - // XCHMA Cycles Min ... - bool isXCHMACMNHasSignal = XAU5XCHMACMNHasShortSignal(); - if (isXCHMACMNHasSignal) - { - // - Add( - EnumToString(XCHMACMN), - info.signallers); - } - - // - // XCHMA Cycles Max - bool isXCHMACMXHasSignal = XAU5XCHMACMXHasShortSignal(); - if (isXCHMACMXHasSignal) - { - // - Add( - EnumToString(XCHMACMX), - info.signallers); - } - - // - result = - // - isXTDHasSignal - // - || - // - isXTAMHasSignal - // - || - // - isXSIHasSignal - // - || - // - isXSTFIHasSignal - // - || - // - isXOBDLHHasSignal - // - || - // - isXCHMACCHasSignal - // - || - // - isXCHMACMNHasSignal - // - || - // - isXCHMACMXHasSignal - // - ; - - // - if (result) - { - // - // Only Log Signals Time Market Conditions if is in Testing Mode ... - if (xAU5IsTestMode) - { - // - string message = XAU5GetConditionsString(xAU5Conditions, "\n"); - - // - LogMessage( - "Short Signal Provided by: \n" + - info.signallers[ArraySize(info.signallers) - 1] + "\n" + - "Pusher: " + (string)ArraySize(info.signallers) + "\n" + - "Market Conditions: " + message); - } - } - - // - return result; -} - -// -// -// END Combination Signaling ... -// -// - -// -// START Signal Providers ... -// - -// -// Disbale All Signallers Longs ... -void XAU5DisableLongSignallers() -{ - // - // XTD ... - if (xAU5MXTDEnableSignaller) - { - xAU5MXTDAllowLongSignals = false; - } - - // - // XTAM ... - if (xAU5MXTAMEnableSignaller) - { - xAU5MXTAMAllowLongSignals = false; - } - - // - // XSI ... - if (xAU5MXSIEnableSignaller) - { - xAU5MXSIAllowLongSignals = false; - } - - // - // XSTFI ... - if (xAU5MXSTFIEnableSignaller) - { - xAU5MXSTFIAllowLongSignals = false; - } - - // - // XOBDLH ... - if (xAU5MXOBDLHEnableSignaller) - { - xAU5MXOBDLHAllowLongSignals = false; - } - - // - // XCHMACC ... - if (xAU5MXCHMACCEnableSignaller) - { - xAU5MXCHMACCAllowLongSignals = false; - } - - // - // XCHMAMX ... - if (xAU5MXCHMACMXEnableSignaller) - { - xAU5MXCHMACMXAllowLongSignals = false; - } - - // - // XCHMAMN ... - if (xAU5MXCHMACMNEnableSignaller) - { - xAU5MXCHMACMNAllowLongSignals = false; - } -} - -// -// Enable All Signallers Longs ... -// Only if they are Configured as Enable at Settings ... -void XAU5EnableLongSignallers() -{ - // - // XTD ... - if (xAU5MXTDEnableSignaller) - { - xAU5MXTDAllowLongSignals = - xAU5XTDAllowLongSignals - ? true - : xAU5MXTDAllowLongSignals; - } - - // - // XTAM ... - if (xAU5MXTAMEnableSignaller) - { - xAU5MXTAMAllowLongSignals = - xAU5XTAMAllowLongSignals - ? true - : xAU5MXTAMAllowLongSignals; - } - - // - // XSI ... - if (xAU5MXSIEnableSignaller) - { - xAU5MXSIAllowLongSignals = - xAU5XSIAllowLongSignals - ? true - : xAU5MXSIAllowLongSignals; - } - - // - // XSTFI ... - if (xAU5MXSTFIEnableSignaller) - { - xAU5MXSTFIAllowLongSignals = - xAU5XSTFIAllowLongSignals - ? true - : xAU5MXSTFIAllowLongSignals; - } - - // - // XOBDLH ... - if (xAU5MXOBDLHEnableSignaller) - { - xAU5MXOBDLHAllowLongSignals = - xAU5XOBDLHAllowLongSignals - ? true - : xAU5MXOBDLHAllowLongSignals; - } - - // - // XCHMACC ... - if (xAU5MXCHMACCEnableSignaller) - { - xAU5MXCHMACCAllowLongSignals = - xAU5XCHMACCAllowLongSignals - ? true - : xAU5MXCHMACCAllowLongSignals; - } - - // - // XCHMAMX ... - if (xAU5MXCHMACMXEnableSignaller) - { - xAU5MXCHMACMXAllowLongSignals = - xAU5XCHMACMXAllowLongSignals - ? true - : xAU5MXCHMACMXAllowLongSignals; - } - - // - // XCHMAMN ... - if (xAU5MXCHMACMNEnableSignaller) - { - xAU5MXCHMACMNAllowLongSignals = - xAU5XCHMACMNAllowLongSignals - ? true - : xAU5MXCHMACMNAllowLongSignals; - } -} - -// -// Disable All Signallers Shorts ... -void XEUDisableShortSignallers() -{ - // - // XTD ... - if (xAU5MXTDEnableSignaller) - { - xAU5MXTDAllowShortSignals = false; - } - - // - // XTAM ... - if (xAU5MXTAMEnableSignaller) - { - xAU5MXTAMAllowShortSignals = false; - } - - // - // XSI ... - if (xAU5MXSIEnableSignaller) - { - xAU5MXSIAllowShortSignals = false; - } - - // - // XSTFI ... - if (xAU5MXSTFIEnableSignaller) - { - xAU5MXSTFIAllowShortSignals = false; - } - - // - // XOBDLH ... - if (xAU5MXOBDLHEnableSignaller) - { - xAU5MXOBDLHAllowShortSignals = false; - } - - // - // XCHMACC ... - if (xAU5MXCHMACCEnableSignaller) - { - xAU5MXCHMACCAllowShortSignals = false; - } - - // - // XCHMAMX ... - if (xAU5MXCHMACMXEnableSignaller) - { - xAU5MXCHMACMXAllowShortSignals = false; - } - - // - // XCHMAMN ... - if (xAU5MXCHMACMNEnableSignaller) - { - xAU5MXCHMACMNAllowShortSignals = false; - } -} - -// -// Enable All Signallers Shorts ... -// Only if they are Configured as Enable at Settings ... -void XEUEnableShortSignallers() -{ - // - // XTD ... - if (xAU5MXTDEnableSignaller) - { - xAU5MXTDAllowShortSignals = - xAU5XTDAllowShortSignals - ? true - : xAU5MXTDAllowShortSignals; - } - - // - // XTAM ... - if (xAU5MXTAMEnableSignaller) - { - xAU5MXTAMAllowShortSignals = - xAU5XTAMAllowShortSignals - ? true - : xAU5MXTAMAllowShortSignals; - } - - // - // XSI ... - if (xAU5MXSIEnableSignaller) - { - xAU5MXSIAllowShortSignals = - xAU5XSIAllowShortSignals - ? true - : xAU5MXSIAllowShortSignals; - } - - // - // XSTFI ... - if (xAU5MXSTFIEnableSignaller) - { - xAU5MXSTFIAllowShortSignals = - xAU5XSTFIAllowShortSignals - ? true - : xAU5MXSTFIAllowShortSignals; - } - - // - // XOBDLH ... - if (xAU5MXOBDLHEnableSignaller) - { - xAU5MXOBDLHAllowShortSignals = - xAU5XOBDLHAllowShortSignals - ? true - : xAU5MXOBDLHAllowShortSignals; - } - - // - // XCHMACC ... - if (xAU5MXCHMACCEnableSignaller) - { - xAU5MXCHMACCAllowShortSignals = - xAU5XCHMACCAllowShortSignals - ? true - : xAU5MXCHMACCAllowShortSignals; - } - - // - // XCHMAMX ... - if (xAU5MXCHMACMXEnableSignaller) - { - xAU5MXCHMACMXAllowShortSignals = - xAU5XCHMACMXAllowShortSignals - ? true - : xAU5MXCHMACMXAllowShortSignals; - } - - // - // XCHMAMN ... - if (xAU5MXCHMACMNEnableSignaller) - { - xAU5MXCHMACMNAllowShortSignals = - xAU5XCHMACMNAllowShortSignals - ? true - : xAU5MXCHMACMNAllowShortSignals; - } -} - -// -// XTD Long Signal Checking ... -bool XAU5XTDHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXTDEnableSignaller || - !xAU5MXTDAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XTD Short Signal Checking ... -bool XAU5XTDHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXTDEnableSignaller || - !xAU5MXTDAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XTAM Long Signal Checking ... -bool XAU5XTAMHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXTAMEnableSignaller || - !xAU5MXTAMAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - (xAMAMaBuffer[1] > xTMMaBuffer[1] && - xAMAMaBuffer[2] > xTMMaBuffer[2]) - // - && - // - !(xAMAMaBuffer[2] > xTMMaBuffer[2] && - xAMAMaBuffer[3] > xTMMaBuffer[3]) - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - // Exception Cases for XCHMA Min or Max ... - !( - // - // XCHMA MAX ... - ( - // - (xAU5Conditions.isXCHMASCOverMax || - xAU5Conditions.isXCHMASCCrossedOverMax) && - (xAU5Conditions.isXCHMASCUnderMax || - xAU5Conditions.isXCHMASCCrossedUnderMax) - // - ) - // - || - // - // XCHMA MIN ... - ( - // - (xAU5Conditions.isXCHMASCOverMin || - xAU5Conditions.isXCHMASCCrossedOverMin) && - (xAU5Conditions.isXCHMASCUnderMin || - xAU5Conditions.isXCHMASCCrossedUnderMin) - // - ) - // - ) - // - && - // - // Check XCHMA Trend Bullish ... - ( - // - // All Cycles Bullish ... - ( - // - // SC ... - (xAU5Conditions.isXCHMASCFastOverSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow) - // - && - // - // MC ... - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow) - // - && - // - // LC ... - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow) - // - ) - // - || - // - // Two Cycle Fully Bullish ... - ( - // - // SC and MC ... - ( - // - // SC ... - ( - // !xAU5Conditions.isXCHMASCTrendsDown && - (xAU5Conditions.isXCHMASCFastOverSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow)) - // - && - // - // MC ... - ( - // !xAU5Conditions.isXCHMAMCTrendsDown && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) - // - ) - // - || - // - // SC and LC ... - ( - // - // SC ... - ( - // !xAU5Conditions.isXCHMASCTrendsDown && - (xAU5Conditions.isXCHMASCFastOverSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow)) - // - && - // - // LC ... - ( - // !xAU5Conditions.isXCHMALCTrendsDown && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - || - // - // MC and LC ... - ( - // - // MC ... - ( - // !xAU5Conditions.isXCHMAMCTrendsDown && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) - // - && - // - // LC ... - ( - // !xAU5Conditions.isXCHMALCTrendsDown && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - ) - // - && - // - // XCHMA Check Peaks ... - !( - // - // All Cycles Peak ... - ( - xAU5Conditions.isXCHMASCPeak && - xAU5Conditions.isXCHMAMCPeak && - xAU5Conditions.isXCHMALCPeak) - // - || - // - ( - // - // SC MC ... - (xAU5Conditions.isXCHMASCPeak && - xAU5Conditions.isXCHMAMCPeak) - // - || - // - // SC LC ... - (xAU5Conditions.isXCHMASCPeak && - xAU5Conditions.isXCHMALCPeak) - // - || - // - // MC LC ... - (xAU5Conditions.isXCHMAMCPeak && - xAU5Conditions.isXCHMALCPeak) - // - ) - // - ) - // - && - // - // Check XCHMA Trends Powers ... - !( - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMAMCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - ) - // - && - // - // Check XOBD Swings ... - !xAU5Conditions.isXOBDSwingLow - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXAMABearish && - xAU5Conditions.isXTMEndBearish && - xAU5Conditions.isXTDSignalVale && - xAU5Conditions.isXTDBullishVale) - // - || - // - ( - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMAMCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - ( - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMAMCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - || - // - (xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXAMANeutural && - xAU5Conditions.isXLHHHDecreased && - xAU5Conditions.isXTDBullUnderBear && - xAU5Conditions.isXTDSignalUnderBear) - // - || - ( - // - (xAU5Conditions.isXCHMASCTrendsDown && - xAU5Conditions.isXCHMAMCTrendsDown && - xAU5Conditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMALCPeak && - ( - // - (xAU5Conditions.isXCHMAMCVale && - (( - // - xAU5Conditions.isXCHMASCVale - // - || - // - (xAU5Conditions.isXAMAVale && - (xAU5Conditions.isXTDBearishVale || - xAU5Conditions.isXTMStartBearish)) - // - || - // - ( - // - ((xAU5Conditions.isXCHMASCTrendsUp && - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow)) && - (xAU5Conditions.isXCHMAMCTrendsDown && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) && - (xAU5Conditions.isXCHMALCTrendsDown && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - ))) - // - || - // - (xAU5Conditions.isXTMBearish && - xAU5Conditions.isXAMABearish && - xAU5Conditions.isXTSCurrentMin && - xAU5Conditions.isXLHHHDecreased && - xAU5Conditions.isXFICrossedUnderZero) - // - )) - // - || - // - (xAU5Conditions.isXTSCurrentMin && - (xAU5Conditions.isXTSCurrentUnderFarest || - xAU5Conditions.isXTSCurrentCrossedUnderFarest) && - (xAU5Conditions.isXTSCurrentUnderNearest || - xAU5Conditions.isXTSCurrentCrossedUnderNearest) && - (xAU5Conditions.isXTSCurrentUnderMediest || - xAU5Conditions.isXTSCurrentCrossedUnderMediest)) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXTSCurrentMin && - xAU5Conditions.isXTSCurrentUnderFarest && - xAU5Conditions.isXTSCurrentUnderNearest && - xAU5Conditions.isXTSCurrentUnderMediest) - // - || - // - (xAU5Conditions.isXAMAVale && - xAU5Conditions.isXCHLHSCMCLLSame && - xAU5Conditions.isXLHLowAttachedLL) - // - || - // - ((xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMALCPeak) && - ( - // - (xAU5Conditions.isXCHMASCTrendsUp && - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow)) - // - )) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXTSCurrentMax && - xAU5Conditions.isXTSCurrentOverFarest && - xAU5Conditions.isXTSCurrentOverNearest && - xAU5Conditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XTAM Short Signal Checking ... -bool XAU5XTAMHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXTAMEnableSignaller || - !xAU5MXTAMAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XSI Long Signal Checking ... -bool XAU5XSIHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXSIEnableSignaller || - !xAU5MXSIAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - xAU5Conditions.isXRSICrossedOverLongEntry && - xRSIBuffer[3] < xRSILongEntryValue - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - // Exception Cases for XCHMA Min or Max ... - !( - // - // XCHMA MAX ... - ( - // - (xAU5Conditions.isXCHMASCOverMax || - xAU5Conditions.isXCHMASCCrossedOverMax) && - (xAU5Conditions.isXCHMASCUnderMax || - xAU5Conditions.isXCHMASCCrossedUnderMax) - // - ) - // - || - // - // XCHMA MIN ... - ( - // - (xAU5Conditions.isXCHMASCOverMin || - xAU5Conditions.isXCHMASCCrossedOverMin) && - (xAU5Conditions.isXCHMASCUnderMin || - xAU5Conditions.isXCHMASCCrossedUnderMin) - // - ) - // - ) - // - && - // - // Check XCHMA Trend Bullish ... - ( - // - // All Cycles Bullish ... - ( - // - // SC ... - (xAU5Conditions.isXCHMASCFastOverSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow) - // - && - // - // MC ... - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow) - // - && - // - // LC ... - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow) - // - ) - // - || - // - // Two Cycle Fully Bullish ... - ( - // - // SC and MC ... - ( - // - // SC ... - ( - // !xAU5Conditions.isXCHMASCTrendsDown && - (xAU5Conditions.isXCHMASCFastOverSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow)) - // - && - // - // MC ... - ( - // !xAU5Conditions.isXCHMAMCTrendsDown && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) - // - ) - // - || - // - // SC and LC ... - ( - // - // SC ... - ( - // !xAU5Conditions.isXCHMASCTrendsDown && - (xAU5Conditions.isXCHMASCFastOverSlow || - xAU5Conditions.isXCHMASCFastCrossedOverSlow)) - // - && - // - // LC ... - ( - // !xAU5Conditions.isXCHMALCTrendsDown && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - || - // - // MC and LC ... - ( - // - // MC ... - ( - // !xAU5Conditions.isXCHMAMCTrendsDown && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) - // - && - // - // LC ... - ( - // !xAU5Conditions.isXCHMALCTrendsDown && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - ) - // - && - // - // XCHMA Check Peaks ... - !( - // - // All Cycles Peak ... - ( - xAU5Conditions.isXCHMASCPeak && - xAU5Conditions.isXCHMAMCPeak && - xAU5Conditions.isXCHMALCPeak) - // - || - // - ( - // - // SC MC ... - (xAU5Conditions.isXCHMASCPeak && - xAU5Conditions.isXCHMAMCPeak) - // - || - // - // SC LC ... - (xAU5Conditions.isXCHMASCPeak && - xAU5Conditions.isXCHMALCPeak) - // - || - // - // MC LC ... - (xAU5Conditions.isXCHMAMCPeak && - xAU5Conditions.isXCHMALCPeak) - // - ) - // - ) - // - && - // - // Check XOBD Swings ... - !xAU5Conditions.isXOBDSwingLow - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - (xAU5Conditions.isXCHMALCPeak && - xAU5Conditions.isXTDSignalVale && - xAU5Conditions.isXTDBullishVale) - // - || - // - ((xAU5Conditions.isXCHMASCTrendsUp && - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow)) && - (xAU5Conditions.isXCHMAMCTrendsDown && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow)) && - (xAU5Conditions.isXCHMALCTrendsDown && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow))) - // - || - // - ((xAU5Conditions.isXTMVale || - xAU5Conditions.isXTMBearish) && - xAU5Conditions.isXTSCurrentMax && - xAU5Conditions.isXLHLLDecreased && - xAU5Conditions.isXCHLHSCMCLLSame && - xAU5Conditions.isXCHLHMCLCHHSame) - // - || - // - ((xAU5Conditions.isXCHMAMCVale && - (xAU5Conditions.isXCHMAMCFastUnderSlow || - xAU5Conditions.isXCHMAMCFastCrossedUnderSlow)) && - (xAU5Conditions.isXCHMALCVale && - xAU5Conditions.isXCHMALCTrendsDown && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow))) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - (xAU5Conditions.isXTMVale && - xAU5Conditions.isXAMAVale && - xAU5Conditions.isXTSCurrentMin && - xAU5Conditions.isXCHLHSCMCLLSame && - xAU5Conditions.isXCHLHMCLCHHSame && - xAU5Conditions.isXLHLowAttachedLL) - // - || - // - (xAU5Conditions.isXCHMASCVale && - xAU5Conditions.isXCHMASCTrendsUp && - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow) && - xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (( - // - ( - (xAU5Conditions.isXTMVale || - xAU5Conditions.isXTMBearish) && - (xAU5Conditions.isXAMAVale || - xAU5Conditions.isXAMABearish) && - xAU5Conditions.isXTDSignalVale && - xAU5Conditions.isXTDBullishVale) - // - ) && - (xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow))) - // - || - // - ((xAU5Conditions.isXCHMASCVale && - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow)) && - (xAU5Conditions.isXCHMAMCVale && - (xAU5Conditions.isXCHMAMCFastOverSlow || - xAU5Conditions.isXCHMAMCFastCrossedOverSlow))) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - ( - xAU5Conditions.isXCHMASCVale && - xAU5Conditions.isXCHMASCTrendsUp && - (xAU5Conditions.isXCHMASCFastUnderSlow || - xAU5Conditions.isXCHMASCFastCrossedUnderSlow)) - // - || - // - ( - xAU5Conditions.isXTMVale && - xAU5Conditions.isXAMAVale && - xAU5Conditions.isXTDSignalVale && - xAU5Conditions.isXTDBullishVale && - xAU5Conditions.isXTMStartBearish && - xAU5Conditions.isXAMAStartBearish && - xAU5Conditions.isXLHLowAttachedLL) - // - || - // - (xAU5Conditions.isXTMVale && - xAU5Conditions.isXTMNeutural && - xAU5Conditions.isXTMEndBearish && - xAU5Conditions.isXLHLLDecreased && - xAU5Conditions.isXCHLHSCMCLLSame) - // - || - // - (xAU5Conditions.isXCHMASCVale && - xAU5Conditions.isXCHMAMCVale && - xAU5Conditions.isXCHMALCPeak && - (xAU5Conditions.isXCHMALCFastOverSlow || - xAU5Conditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XSI Short Signal Checking ... -bool XAU5XSIHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXSIEnableSignaller || - !xAU5MXSIAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XSTFI Long Signal Checking ... -bool XAU5XSTFIHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXSTFIEnableSignaller || - !xAU5MXSTFIAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XSTFI Short Signal Checking ... -bool XAU5XSTFIHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXSTFIEnableSignaller || - !xAU5MXSTFIAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XOBDLH Long Signal Checking ... -bool XAU5XOBDLHHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXOBDLHEnableSignaller || - !xAU5MXOBDLHAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XOBDLH Short Signal Checking ... -bool XAU5XOBDLHHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXOBDLHEnableSignaller || - !xAU5MXOBDLHAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACC Long Signal Checking ... -bool XAU5XCHMACCHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACCEnableSignaller || - !xAU5MXCHMACCAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACC Short Signal Checking ... -bool XAU5XCHMACCHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACCEnableSignaller || - !xAU5MXCHMACCAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACMN Long Signal Checking ... -bool XAU5XCHMACMNHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACMNEnableSignaller || - !xAU5MXCHMACMNAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACMN Short Signal Checking ... -bool XAU5XCHMACMNHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACMNEnableSignaller || - !xAU5MXCHMACMNAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACMX Long Signal Checking ... -bool XAU5XCHMACMXHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACMXEnableSignaller || - !xAU5MXCHMACMXAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACMX Short Signal Checking ... -bool XAU5XCHMACMXHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xAU5MXCHMACMXEnableSignaller || - !xAU5MXCHMACMXAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - false - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - false - // - ) - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (xAU5Conditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((xAU5Conditions.isXLHPriceUnderSignal || - xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((xAU5Conditions.isXLHPriceOverSignal || - xAU5Conditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!xAU5Conditions.isXLHPriceOverSignal && - !xAU5Conditions.isXLHPriceUnderSignal && - !xAU5Conditions.isXLHPriceInSignalRange && - !xAU5Conditions.isXLHPriceCrossedOverSignal && - !xAU5Conditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If LL Same In Length ... - ((xAU5Conditions.isXLHLLSameInLength && - !xAU5Conditions.isXLHHHSameInLength) && - // - ( - false) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!xAU5Conditions.isXLHHHSameInLength && - !xAU5Conditions.isXLHLLSameInLength) && - // - ( - false) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// END Signal Providers ... -// - -// -// START Utilities ... -// - -// -// Converts Market Conditions to Specific String Representation ... -string XAU5GetConditionsString( - XAU5MarketConditions &condition, // Specify Conditiond - string separator = ",", // Specify Separator - bool ignoreFalses = true // Ignore False Conditions -) -{ - // - XAU5MarketConditions mConditions = {}; - - // - mConditions = condition; - - // - string result = "\n"; - - // - // XOBD ... - result += - "| XOBD |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXOBDSwingLow)) - { - result += "isXOBDSwingLow: " + (string)mConditions.isXOBDSwingLow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXOBDSwingHigh)) - { - result += "isXOBDSwingHigh: " + (string)mConditions.isXOBDSwingHigh + separator; - } - - // - // Separator ... - result += separator; - - // - // XTM ... - result += - "| XTM |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMPeak)) - { - result += "isXTMPeak: " + (string)mConditions.isXTMPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMVale)) - { - result += "isXTMVale: " + (string)mConditions.isXTMVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBullish)) - { - result += "isXTMStartBullish: " + (string)mConditions.isXTMStartBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBullishAfterNeutural)) - { - result += "isXTMStartBullishAfterNeutural: " + (string)mConditions.isXTMStartBullishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMBullish)) - { - result += "isXTMBullish: " + (string)mConditions.isXTMBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBullish)) - { - result += "isXTMEndBullish: " + (string)mConditions.isXTMEndBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBullishByNeutural)) - { - result += "isXTMEndBullishByNeutural: " + (string)mConditions.isXTMEndBullishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBearish)) - { - result += "isXTMStartBearish: " + (string)mConditions.isXTMStartBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBearishAfterNeutural)) - { - result += "isXTMStartBearishAfterNeutural: " + (string)mConditions.isXTMStartBearishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMBearish)) - { - result += "isXTMBearish: " + (string)mConditions.isXTMBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBearish)) - { - result += "isXTMEndBearish: " + (string)mConditions.isXTMEndBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBearishByNeutural)) - { - result += "isXTMEndBearishByNeutural: " + (string)mConditions.isXTMEndBearishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMNeutural)) - { - result += "isXTMNeutural: " + (string)mConditions.isXTMNeutural + separator; - } - - // - // Separator ... - result += separator; - - // - // XAMA ... - result += - "| XAMA |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAPeak)) - { - result += "isXAMAPeak: " + (string)mConditions.isXAMAPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAVale)) - { - result += "isXAMAVale: " + (string)mConditions.isXAMAVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBullish)) - { - result += "isXAMAStartBullish: " + (string)mConditions.isXAMAStartBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBullishAfterNeutural)) - { - result += "isXAMAStartBullishAfterNeutural: " + (string)mConditions.isXAMAStartBullishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMABullish)) - { - result += "isXAMABullish: " + (string)mConditions.isXAMABullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBullish)) - { - result += "isXAMAEndBullish: " + (string)mConditions.isXAMAEndBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBullishByNeutural)) - { - result += "isXAMAEndBullishByNeutural: " + (string)mConditions.isXAMAEndBullishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBearish)) - { - result += "isXAMAStartBearish: " + (string)mConditions.isXAMAStartBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBearishAfterNeutural)) - { - result += "isXAMAStartBearishAfterNeutural: " + (string)mConditions.isXAMAStartBearishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMABearish)) - { - result += "isXAMABearish: " + (string)mConditions.isXAMABearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBearish)) - { - result += "isXAMAEndBearish: " + (string)mConditions.isXAMAEndBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBearishByNeutural)) - { - result += "isXAMAEndBearishByNeutural: " + (string)mConditions.isXAMAEndBearishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMANeutural)) - { - result += "isXAMANeutural: " + (string)mConditions.isXAMANeutural + separator; - } - - // - // Separator ... - result += separator; - - // - // XTD ... - result += - "| XTD |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalPeak)) - { - result += "isXTDSignalPeak: " + (string)mConditions.isXTDSignalPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalVale)) - { - result += "isXTDSignalVale: " + (string)mConditions.isXTDSignalVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullishPeak)) - { - result += "isXTDBullishPeak: " + (string)mConditions.isXTDBullishPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullishVale)) - { - result += "isXTDBullishVale: " + (string)mConditions.isXTDBullishVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBearishPeak)) - { - result += "isXTDBearishPeak: " + (string)mConditions.isXTDBearishPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBearishVale)) - { - result += "isXTDBearishVale: " + (string)mConditions.isXTDBearishVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullOverBear)) - { - result += "isXTDBullOverBear: " + (string)mConditions.isXTDBullOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullUnderBear)) - { - result += "isXTDBullUnderBear: " + (string)mConditions.isXTDBullUnderBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalOverBear)) - { - result += "isXTDSignalOverBear: " + (string)mConditions.isXTDSignalOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalUnderBear)) - { - result += "isXTDSignalUnderBear: " + (string)mConditions.isXTDSignalUnderBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullCrossedOverBear)) - { - result += "isXTDBullCrossedOverBear: " + (string)mConditions.isXTDBullCrossedOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullCrossedUnderBear)) - { - result += "isXTDBullCrossedUnderBear: " + (string)mConditions.isXTDBullCrossedUnderBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalCrossedOverBear)) - { - result += "isXTDSignalCrossedOverBear: " + (string)mConditions.isXTDSignalCrossedOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalCrossedUnderBear)) - { - result += "isXTDSignalCrossedUnderBear: " + (string)mConditions.isXTDSignalCrossedUnderBear + separator; - } - - // - // Separator ... - result += separator; - - // - // XFI ... - result += - "| XFI |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIPeak)) - { - result += "isXFIPeak: " + (string)mConditions.isXFIPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIVale)) - { - result += "isXFIVale: " + (string)mConditions.isXFIVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIOverZero)) - { - result += "isXFIOverZero: " + (string)mConditions.isXFIOverZero + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIUnderZero)) - { - result += "isXFIUnderZero: " + (string)mConditions.isXFIUnderZero + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFICrossedOverZero)) - { - result += "isXFICrossedOverZero: " + (string)mConditions.isXFICrossedOverZero + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFICrossedUnderZero)) - { - result += "isXFICrossedUnderZero: " + (string)mConditions.isXFICrossedUnderZero + separator; - } - - // - // Separator ... - result += separator; - - // - // XTS ... - result += - "| XTS |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSAllSame)) - { - result += "isXTSAllSame: " + (string)mConditions.isXTSAllSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentMin)) - { - result += "isXTSCurrentMin: " + (string)mConditions.isXTSCurrentMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentMax)) - { - result += "isXTSCurrentMax: " + (string)mConditions.isXTSCurrentMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentOverFarest)) - { - result += "isXTSCurrentOverFarest: " + (string)mConditions.isXTSCurrentOverFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentOverNearest)) - { - result += "isXTSCurrentOverNearest: " + (string)mConditions.isXTSCurrentOverNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentOverMediest)) - { - result += "isXTSCurrentOverMediest: " + (string)mConditions.isXTSCurrentOverMediest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentUnderFarest)) - { - result += "isXTSCurrentUnderFarest: " + (string)mConditions.isXTSCurrentUnderFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentUnderNearest)) - { - result += "isXTSCurrentUnderNearest: " + (string)mConditions.isXTSCurrentUnderNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentUnderMediest)) - { - result += "isXTSCurrentUnderMediest: " + (string)mConditions.isXTSCurrentUnderMediest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedOverFarest)) - { - result += "isXTSCurrentCrossedOverFarest: " + (string)mConditions.isXTSCurrentCrossedOverFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedOverNearest)) - { - result += "isXTSCurrentCrossedOverNearest: " + (string)mConditions.isXTSCurrentCrossedOverNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedOverMediest)) - { - result += "isXTSCurrentCrossedOverMediest: " + (string)mConditions.isXTSCurrentCrossedOverMediest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedUnderFarest)) - { - result += "isXTSCurrentCrossedUnderFarest: " + (string)mConditions.isXTSCurrentCrossedUnderFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedUnderNearest)) - { - result += "isXTSCurrentCrossedUnderNearest: " + (string)mConditions.isXTSCurrentCrossedUnderNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedUnderMediest)) - { - result += "isXTSCurrentCrossedUnderMediest: " + (string)mConditions.isXTSCurrentCrossedUnderMediest + separator; - } - - // - // Separator ... - result += separator; - - // - // XLH ... - result += - "| XLH |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHHIncreased)) - { - result += "isXLHHHIncreased: " + (string)mConditions.isXLHHHIncreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHHDecreased)) - { - result += "isXLHHHDecreased: " + (string)mConditions.isXLHHHDecreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLLIncreased)) - { - result += "isXLHLLIncreased: " + (string)mConditions.isXLHLLIncreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLLDecreased)) - { - result += "isXLHLLDecreased: " + (string)mConditions.isXLHLLDecreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHighAttachedHH)) - { - result += "isXLHHighAttachedHH: " + (string)mConditions.isXLHHighAttachedHH + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLowAttachedLL)) - { - result += "isXLHLowAttachedLL: " + (string)mConditions.isXLHLowAttachedLL + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHHSameInLength)) - { - result += "isXLHHHSameInLength: " + (string)mConditions.isXLHHHSameInLength + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLLSameInLength)) - { - result += "isXLHLLSameInLength: " + (string)mConditions.isXLHLLSameInLength + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceCrossedOverSignal)) - { - result += "isXLHPriceCrossedOverSignal: " + (string)mConditions.isXLHPriceCrossedOverSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceOverSignal)) - { - result += "isXLHPriceOverSignal: " + (string)mConditions.isXLHPriceOverSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceCrossedUnderSignal)) - { - result += "isXLHPriceCrossedUnderSignal: " + (string)mConditions.isXLHPriceCrossedUnderSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceUnderSignal)) - { - result += "isXLHPriceUnderSignal: " + (string)mConditions.isXLHPriceUnderSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceInSignalRange)) - { - result += "isXLHPriceInSignalRange: " + (string)mConditions.isXLHPriceInSignalRange + separator; - } - - // - // Separator ... - result += separator; - - // - // XRSI ... - result += - "| XRSI |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSIPeak)) - { - result += "isXRSIPeak: " + (string)mConditions.isXRSIPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSIVale)) - { - result += "isXRSIVale: " + (string)mConditions.isXRSIVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedOverLongExit)) - { - result += "isXRSICrossedOverLongExit: " + (string)mConditions.isXRSICrossedOverLongExit + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedOverLongEntry)) - { - result += "isXRSICrossedOverLongEntry: " + (string)mConditions.isXRSICrossedOverLongEntry + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedUnderShortExit)) - { - result += "isXRSICrossedUnderShortExit: " + (string)mConditions.isXRSICrossedUnderShortExit + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedUnderShortEntry)) - { - result += "isXRSICrossedUnderShortEntry: " + (string)mConditions.isXRSICrossedUnderShortEntry + separator; - } - - // - // Separator ... - result += separator; - - // - // XCHLH ... - result += - "| XCHLH |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSameHHs)) - { - result += "isXCHLHSameHHs: " + (string)mConditions.isXCHLHSameHHs + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSameLLs)) - { - result += "isXCHLHSameLLs: " + (string)mConditions.isXCHLHSameLLs + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCMCHHSame)) - { - result += "isXCHLHSCMCHHSame: " + (string)mConditions.isXCHLHSCMCHHSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCMCLLSame)) - { - result += "isXCHLHSCMCLLSame: " + (string)mConditions.isXCHLHSCMCLLSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCLCHHSame)) - { - result += "isXCHLHSCLCHHSame: " + (string)mConditions.isXCHLHSCLCHHSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCLCLLSame)) - { - result += "isXCHLHSCLCLLSame: " + (string)mConditions.isXCHLHSCLCLLSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCLCHHSame)) - { - result += "isXCHLHMCLCHHSame: " + (string)mConditions.isXCHLHMCLCHHSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCLCLLSame)) - { - result += "isXCHLHMCLCLLSame: " + (string)mConditions.isXCHLHMCLCLLSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCOnTopOfLC)) - { - result += "isXCHLHMCOnTopOfLC: " + (string)mConditions.isXCHLHMCOnTopOfLC + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCInBottomOfLC)) - { - result += "isXCHLHMCInBottomOfLC: " + (string)mConditions.isXCHLHMCInBottomOfLC + separator; - } - - // - // Separator ... - result += separator; - - // - // XCHMA ... - result += - "| XCHMA |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCOverMax)) - { - result += "isXCHMASCOverMax: " + (string)mConditions.isXCHMASCOverMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCOverMin)) - { - result += "isXCHMASCOverMin: " + (string)mConditions.isXCHMASCOverMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCUnderMax)) - { - result += "isXCHMASCUnderMax: " + (string)mConditions.isXCHMASCUnderMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCUnderMin)) - { - result += "isXCHMASCUnderMin: " + (string)mConditions.isXCHMASCUnderMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedOverMax)) - { - result += "isXCHMASCCrossedOverMax: " + (string)mConditions.isXCHMASCCrossedOverMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedUnderMax)) - { - result += "isXCHMASCCrossedUnderMax: " + (string)mConditions.isXCHMASCCrossedUnderMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedOverMin)) - { - result += "isXCHMASCCrossedOverMin: " + (string)mConditions.isXCHMASCCrossedOverMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedUnderMin)) - { - result += "isXCHMASCCrossedUnderMin: " + (string)mConditions.isXCHMASCCrossedUnderMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCPeak)) - { - result += "isXCHMASCPeak: " + (string)mConditions.isXCHMASCPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCVale)) - { - result += "isXCHMASCVale: " + (string)mConditions.isXCHMASCVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCTrendsUp)) - { - result += "isXCHMASCTrendsUp: " + (string)mConditions.isXCHMASCTrendsUp + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCTrendsDown)) - { - result += "isXCHMASCTrendsDown: " + (string)mConditions.isXCHMASCTrendsDown + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastOverSlow)) - { - result += "isXCHMASCFastOverSlow: " + (string)mConditions.isXCHMASCFastOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastUnderSlow)) - { - result += "isXCHMASCFastUnderSlow: " + (string)mConditions.isXCHMASCFastUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastCrossedOverSlow)) - { - result += "isXCHMASCFastCrossedOverSlow: " + (string)mConditions.isXCHMASCFastCrossedOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastCrossedUnderSlow)) - { - result += "isXCHMASCFastCrossedUnderSlow: " + (string)mConditions.isXCHMASCFastCrossedUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCPeak)) - { - result += "isXCHMAMCPeak: " + (string)mConditions.isXCHMAMCPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCVale)) - { - result += "isXCHMAMCVale: " + (string)mConditions.isXCHMAMCVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCTrendsUp)) - { - result += "isXCHMAMCTrendsUp: " + (string)mConditions.isXCHMAMCTrendsUp + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCTrendsDown)) - { - result += "isXCHMAMCTrendsDown: " + (string)mConditions.isXCHMAMCTrendsDown + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastOverSlow)) - { - result += "isXCHMAMCFastOverSlow: " + (string)mConditions.isXCHMAMCFastOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastUnderSlow)) - { - result += "isXCHMAMCFastUnderSlow: " + (string)mConditions.isXCHMAMCFastUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastCrossedOverSlow)) - { - result += "isXCHMAMCFastCrossedOverSlow: " + (string)mConditions.isXCHMAMCFastCrossedOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastCrossedUnderSlow)) - { - result += "isXCHMAMCFastCrossedUnderSlow: " + (string)mConditions.isXCHMAMCFastCrossedUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCPeak)) - { - result += "isXCHMALCPeak: " + (string)mConditions.isXCHMALCPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCVale)) - { - result += "isXCHMALCVale: " + (string)mConditions.isXCHMALCVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCTrendsUp)) - { - result += "isXCHMALCTrendsUp: " + (string)mConditions.isXCHMALCTrendsUp + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCTrendsDown)) - { - result += "isXCHMALCTrendsDown: " + (string)mConditions.isXCHMALCTrendsDown + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastOverSlow)) - { - result += "isXCHMALCFastOverSlow: " + (string)mConditions.isXCHMALCFastOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastUnderSlow)) - { - result += "isXCHMALCFastUnderSlow: " + (string)mConditions.isXCHMALCFastUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastCrossedOverSlow)) - { - result += "isXCHMALCFastCrossedOverSlow: " + (string)mConditions.isXCHMALCFastCrossedOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastCrossedUnderSlow)) - { - result += "isXCHMALCFastCrossedUnderSlow: " + (string)mConditions.isXCHMALCFastCrossedUnderSlow + separator; - } - - // - // Separator ... - result += separator; - - // - return result; -} - -void Add( - ENUM_XAU5_SIGNAL_PROVIDERS item, - ENUM_XAU5_SIGNAL_PROVIDERS &items[]) -{ - // - ArrayResize( - items, - ArraySize(items) + 1); - - // - items[ArraySize(items) - 1] = item; -} -// -// START Utilities ... -// \ No newline at end of file diff --git a/BKP/XAU5-0.43/Classes/x-saherelm.class.lib.mq5 b/BKP/XAU5-0.43/Classes/x-saherelm.class.lib.mq5 deleted file mode 100644 index 68f48471..00000000 --- a/BKP/XAU5-0.43/Classes/x-saherelm.class.lib.mq5 +++ /dev/null @@ -1,10316 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// -------------------------------------- -// Name: XClass -// Description: provides all classes for use ... -// -// -// 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 -#include -#include -#include -#include -#include -// -#include "../Libraries/x-saherelm.draw.lib.mq5" -#include "../Libraries/x-saherelm.alert.lib.mq5" -#include "../Libraries/x-saherelm.models.lib.mq5" -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Constant Definitions ... -// - -static uchar _md5_PADDING[64] = - { - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -#define _md5_F(x, y, z) (((x) & (y)) | ((~x) & (z))) -#define _md5_G(x, y, z) (((x) & (z)) | ((y) & (~z))) -#define _md5_H(x, y, z) ((x) ^ (y) ^ (z)) -#define _md5_I(x, y, z) ((y) ^ ((x) | (~z))) -#define _md5_ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) - -#define _md5_FF(a, b, c, d, x, s, ac) \ - { \ - (a) += _md5_F((b), (c), (d)) + (x) + (uint)(ac); \ - (a) = _md5_ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } -#define _md5_GG(a, b, c, d, x, s, ac) \ - { \ - (a) += _md5_G((b), (c), (d)) + (x) + (uint)(ac); \ - (a) = _md5_ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } -#define _md5_HH(a, b, c, d, x, s, ac) \ - { \ - (a) += _md5_H((b), (c), (d)) + (x) + (uint)(ac); \ - (a) = _md5_ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } -#define _md5_II(a, b, c, d, x, s, ac) \ - { \ - (a) += _md5_I((b), (c), (d)) + (x) + (uint)(ac); \ - (a) = _md5_ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } - -#define _md5_INIT_STATE_0 0x67452301 -#define _md5_INIT_STATE_1 0xefcdab89 -#define _md5_INIT_STATE_2 0x98badcfe -#define _md5_INIT_STATE_3 0x10325476 - -#define _md5_S11 7 -#define _md5_S12 12 -#define _md5_S13 17 -#define _md5_S14 22 - -#define _md5_S21 5 -#define _md5_S22 9 -#define _md5_S23 14 -#define _md5_S24 20 - -#define _md5_S31 4 -#define _md5_S32 11 -#define _md5_S33 16 -#define _md5_S34 23 - -#define _md5_S41 6 -#define _md5_S42 10 -#define _md5_S43 15 -#define _md5_S44 21 - -// -// END Constant Definitions ... -// - -// -// START Model Definitions ... -// - -// -string X_SIGNAL_TP = "TP"; -string X_SIGNAL_SL = "SL"; -string X_SIGNAL_TYPE = "TY"; -string X_SIGNAL_TICKET = "T"; -string X_SIGNAL_RISKFREE_STEP = "RFS"; -string X_SIGNAL_RISKFREE_RATE = "RFR"; - -// -// Model Signal Handler Result on XCTrade Class ... -struct XTraderHandlerResult -{ - // - // List Of Closed On SL Signals ... - XSignal sl[]; - - // - // List Of Closed On TP Signals ... - XSignal tp[]; - - // - // List Of Risk Free Signals ... - XSignal rf[]; -}; - -// -// Model OnTrade Event Handler Result on XCTrade Class ... -struct XOnTradeHandlerResult -{ - // - bool hasNewDeal; - int newDeals; - - // - bool hasNewOrder; - int newOrders; - - // - bool hasNewPosition; - int newPositions; - - // - bool hasNewHistoryOrder; - int newHistoryOrders; -}; - -// -// Model Guard Action Applied Signals ... -struct XGuardHandlerResult -{ - // - // Critical Guard ... - XSignal criticals[]; - - // - // Max Guard ... - XSignal maxes[]; - - // - // Old ... - XSignal olds[]; - - // - // Determines Stopout Action Cals or not ... - bool isStopOut; -}; - -// -// Define Volume States ... -struct XVolumeInfo -{ - // - // Current Available Static Volume ... - double staticVolume; - - // - // Static Volume Calculation Method ... - string staticVolumeCalculationMethod; - - // - // Current Maximum Appliable Volume ... - double maxAllowedVolume; - - // - // Static Volume Increase Multiplier ... - double volumeIncreaseMultiplier; - - // - // Multiply Volume Based On Balance Growing ... - double balanceGowingToApplyMultiplier; - - // - // Where to Increase MaxAllowed Volume ... - double balanceGrowingToIncreaseMaxAllowedVolume; -}; - -// -// Model a Simple Provider Status ... -struct XSignallerInfo -{ - // - // Provider Name ... - string name; - - // - // Number of Longs ... - int longs; - - // - // Number of Shorts ... - int shorts; -}; - -// -// Model Some of Usefull Signals and Market Data ... -struct XSummaryInfo -{ - // - // Define Max Signal Volume ... - double maxSignalVolume; - - // - // Max DrawDown ... - double maxDrawDown; - - // - // Max DrawUp ... - double maxDrawUp; - - // - // Max Number of Same Time Signals ... - int maxSameTimeSignals; - - // - // Number of Long Trades ... - int longSignals; - - // - // Number of Short Trades ... - int shortSignals; - - // - // Number of TPs Attached ... - int numberOfTPs; - - // - // Number of SLs Attached ... - int numberOfSLs; -}; - -// -// Model Account info ... -struct XAccountInfo -{ - // - // User Account ... - string user; - - // - // Name of Client ... - string name; - - // - // Trade Server Name ... - string server; - - // - // Broker Name ... - string broker; - - // - // Account Trade Mode ... - ENUM_ACCOUNT_TRADE_MODE mode; - - // - // Account Leverage ... - long leverage; - - // - // Currency ... - string currency; - - // - // Deposit ... - double deposit; - - // - // Balance ... - double balance; - - // - // Min Balance for Open Trades ... - double minBalanceForOpenTrades; -}; - -// -// this is a Model Which holds Reports for Specific Time Periods ... -struct XReport -{ - // - datetime start; - - // - datetime end; - - // - XAccountInfo accountInfo; - - // - XVolumeInfo volumeInfo; - - // - XSignallerInfo signallersInfo[]; - - // - XSummaryInfo summaryInfo; -}; - -// -// an Enumeration Object which determines Report Type ... -enum ENUM_XREPORT_TYPES -{ - // - // Main Report ... - XREPORT_MAIN, - // - // Daily Report ... - XREPORT_DAILY, - // - // Weekly Report ... - XREPORT_WEEKLY, - // - // Monthly Report ... - XREPORT_MONTHLY, -}; - -// -// a Signal Protection Structure ... -struct XProtectedSignal -{ - // - ulong ticket; - - // - datetime time[]; - - // - double profit[]; -}; - -// -// Represent Collector State Based on Time ... -struct XCollector -{ - // - // time in checking ... - datetime time; - - // - // Signal Volume ... - double volume; - - // - // Max DrawDown in Check Time ... - double maxDrawDown; - - // - // Max Allowed Volume in Check Time ... - double maxAllowedVolume; - - // - // Minimum required Balance for Opening Trades at Check Time ... - double minBalanceForOpenTrade; -}; - -// -// Cross Signals Methods ... -enum ENUM_X_CROSS_SIGNAL_METHOD -{ - // - // Do Nothing and Ignore them ... - X_CROSS_SIGNAL_DO_NOTHING, - // - // Accept all Cross Signals and Act Usually ... - X_CROSS_SIGNAL_REGULAR, - // - // Accept all Cross Signals and for Directional Act Usually and for Indirectional Ac Important ... - X_CROSS_SIGNAL_DIRECTION_REGULAR_INDIRECTION_IMPORTANT, - // - // Accept all Cross Signals and for Directional Act Important and for Indirectional Ac Usually ... - X_CROSS_SIGNAL_DIRECTION_IMPORTANT_INDIRECTION_REGULAR, - // - // Accept Only Indirectional Signals and Act Usually ... - X_CROSS_SIGNAL_INDIRECTION_REGULAR, - // - // Accept Only Directional Signals and Act Usually ... - X_CROSS_SIGNAL_DIRECTION_REGULAR, - // - // Accept Only Indirectional Signals and Act Important ... - X_CROSS_SIGNAL_INDIRECTION_IMPORTANT, - // - // Accept Only Directional Signals and Act Important ... - X_CROSS_SIGNAL_DIRECTION_IMPORTANT, -}; - -// -// the Action which Guard Handler Can Done when Attacked ... -enum ENUM_X_GUARD_ACTIONS -{ - // - // Do Nothing ... - X_GUARD_DO_NOTHING, - // - // Close All Open Positions ... - X_GUARD_CLOSE_ALL, - // - // Close Max In Drawdown Position ... - X_GUARD_CLOSE_MAX_IN_DD, - // - // Partial Close Max In Drawdown Position by 1% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1, - // - // Partial Close Max In Drawdown Position by 2% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_2, - // - // Partial Close Max In Drawdown Position by 3% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_3, - // - // Partial Close Max In Drawdown Position by 5% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5, - // - // Partial Close Max In Drawdown Position by 10% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10, - // - // Partial Close Max In Drawdown Position by 15% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_15, - // - // Partial Close Max In Drawdown Position by 20% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_20, - // - // Partial Close Max In Drawdown Position by 25% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_25, - // - // Partial Close Max In Drawdown Position by 30% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_30, - // - // Partial Close Max In Drawdown Position by 40% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_40, - // - // Partial Close Max In Drawdown Position by 50% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_50, - // - // Partial Close Max In Drawdown Position by 60% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_60, - // - // Partial Close Max In Drawdown Position by 70% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_70, - // - // Partial Close Max In Drawdown Position by 75% of Volume ... - X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_75, -}; - -// -// Guard Reason ... -enum ENUM_X_GUARD_REASONS -{ - // - // Critical ... - X_GUARDED_CRITICAL, - // - // Max ... - X_GUARDED_MAX, - // - // Old ... - X_GUARDED_OLD -}; - -// -// All Suuported Support Positions Guard ... -enum ENUM_X_GUARD_SUPPORT_METHODS -{ - // - // Ignore Supporting ... - X_SUPPORT_DO_NOTHING, - // - // Full Both Side Support ... - X_SUPPORT_FULL, - // - // Indirectional Supports On Drawing Down ... - X_SUPPORT_IN_DRAWDOWN_INDIRECTIONAL, - // - // Directional Supports On Drawing Up ... - X_SUPPORT_IN_DRAWUP_DIRECTIONAL, -}; - -// -// END Model Definitions ... -// - -// -// START Overrides ... -// - -// -// XBase Class ... -class XCBase -{ - // - // Public ... -public: - // - // Protected ... -protected: - // - void AddItemToBuffer( - double item, // Specified Item - double &buffer[] // Specified Buffer - ) - { - // - int bufferSize = ArraySize(buffer); - - // - ArrayResize( - buffer, - bufferSize + 1); - - // - buffer[bufferSize] = item; - } - void AddItemToBuffer( - datetime item, // Specified Item - datetime &buffer[] // Specified Buffer - ) - { - // - int bufferSize = ArraySize(buffer); - - // - ArrayResize( - buffer, - bufferSize + 1); - - // - buffer[bufferSize] = item; - } - void AddItemToBuffer( - XSignal &item, - XSignal &buffer[]) - { - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; - } - void AddItemToBuffer( - XCollector &item, // Specified Item - XCollector &buffer[] // Specified Buffer - ) - { - // - int bufferSize = ArraySize(buffer); - - // - ArrayResize( - buffer, - bufferSize + 1); - - // - buffer[bufferSize] = item; - } - void AddItemToBuffer( - XSignallerInfo &item, - XSignallerInfo &buffer[]) - { - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; - } - void AddItemToBuffer( - XProtectedSignal &item, // Item ... - XProtectedSignal &buffer[] // Buffer ... - ) - { - // - int bufferSize = ArraySize(buffer); - - // - ArrayResize( - buffer, - bufferSize + 1); - buffer[bufferSize] = item; - } - - // - void CleanBuffer(double &buffer[]) - { - // - ArrayFree(buffer); - ArrayResize(buffer, 0); - } - void CleanBuffer(XDeal &buffer[]) - { - // - ArrayFree(buffer); - ArrayResize(buffer, 0); - } - void CleanBuffer(XOrder &buffer[]) - { - // - ArrayFree(buffer); - ArrayResize(buffer, 0); - } - void CleanBuffer(XSignal &buffer[]) - { - // - ArrayFree(buffer); - ArrayResize(buffer, 0); - } - void CleanBuffer(XCollector &buffer[]) - { - // - ArrayFree(buffer); - ArrayResize(buffer, 0); - } - void CleanBuffer(XSignallerInfo &buffer[]) - { - // - ArrayFree(buffer); - ArrayResize(buffer, 0); - } - void CleanBuffer(XProtectedSignal &buffer[]) - { - // - ArrayFree(buffer); - ArrayResize(buffer, 0); - } - - // - void CopyBuffer( - const XSignallerInfo &source[], // Source Buffer ... - XSignallerInfo &dest[] // Dest Buffer ... - ) - { - // - CleanBuffer(dest); - - // - int sourceCount = ArraySize(source); - if (sourceCount <= 0) - { - return; - } - - // - // Loop ... - for (int i = 0; i < sourceCount; i++) - { - // - XSignallerInfo iInfo = source[i]; - - // - AddItemToBuffer( - iInfo, - dest); - } - } - void CopyBuffer( - XProtectedSignal &source[], // Source Buffer to Copy - XProtectedSignal &dest[] // Fill this buffer using source - ) - { - // - CleanBuffer(dest); - - // - int sourceCount = ArraySize(source); - if (sourceCount <= 0) - { - return; - } - - // - for (int i = 0; i < sourceCount; i++) - { - // - XProtectedSignal iItem = source[i]; - - // - AddItemToBuffer( - iItem, - dest); - } - } - - // - // Private ... -private: -}; - -// -// XCTrade Base Class ... -class XSCTrade : public CTrade -{ -public: - // - // Modify Specific Position, by Specific Comment ... - bool PositionModify( - const string symbol, // Symbol - const double sl, // Stop Loss - const double tp, // Take Profit - const string comment = "" // Comment For Modify - ) - { - // - // check stopped - if (IsStopped(__FUNCTION__)) - { - return (false); - } - - // - // check position existence - if (!SelectPosition(symbol)) - { - return (false); - } - - // - // clean - ClearStructures(); - - // - // setting request - m_request.action = TRADE_ACTION_SLTP; - m_request.symbol = symbol; - m_request.magic = m_magic; - m_request.sl = sl; - m_request.tp = tp; - m_request.position = PositionGetInteger(POSITION_TICKET); - - // - // Specified Comment ... - if (StringLen(comment) > 0) - { - m_request.comment = comment; - } - - // - // action and return the result - return (OrderSend(m_request, m_result)); - } - bool PositionModify( - const ulong ticket, // Position Ticket - const double sl, // Stop Loss - const double tp, // Take Profit - const string comment = "" // Comment For Modify - ) - { - // - // check stopped - if (IsStopped(__FUNCTION__)) - { - return (false); - } - - // - // check position existence - if (!PositionSelectByTicket(ticket)) - { - return (false); - } - - // - // clean - ClearStructures(); - - // - // setting request - m_request.action = TRADE_ACTION_SLTP; - m_request.position = ticket; - m_request.symbol = PositionGetString(POSITION_SYMBOL); - m_request.magic = m_magic; - m_request.sl = sl; - m_request.tp = tp; - - // - // Specified Comment ... - if (StringLen(comment) > 0) - { - m_request.comment = comment; - } - - // - // action and return the result - return (OrderSend(m_request, m_result)); - } - - // - // Close Specific Position, by Specific Comment ... - bool PositionClose( - const string symbol, // Symbol - const ulong deviation, // Deviation - const string comment = "" // Comment For Close - ) - { - // - bool partial_close = false; - int retry_count = 10; - uint retcode = TRADE_RETCODE_REJECT; - - // - // check stopped - if (IsStopped(__FUNCTION__)) - { - return (false); - } - - // - // clean - ClearStructures(); - - // - // check filling - if (!FillingCheck(symbol)) - { - return (false); - } - - // - do - { - // - // check - if (SelectPosition(symbol)) - { - // - if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) - { - // - // prepare request for close BUY position - m_request.type = ORDER_TYPE_SELL; - m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); - } - else - { - // - // prepare request for close SELL position - m_request.type = ORDER_TYPE_BUY; - m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); - } - } - else - { - // - // position not found - m_result.retcode = retcode; - return (false); - } - - // - // setting request - m_request.action = TRADE_ACTION_DEAL; - m_request.symbol = symbol; - m_request.volume = PositionGetDouble(POSITION_VOLUME); - m_request.magic = m_magic; - m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; - m_request.position = PositionGetInteger(POSITION_TICKET); - - // - // Specify Comment ... - m_request.comment = comment; - - // - // check volume - double max_volume = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX); - if (m_request.volume > max_volume) - { - // - m_request.volume = max_volume; - partial_close = true; - } - else - { - partial_close = false; - } - - // - // hedging? just send order - if (IsHedging()) - { - return (OrderSend(m_request, m_result)); - } - - // - // order send - if (!OrderSend(m_request, m_result)) - { - // - if (--retry_count != 0) - { - continue; - } - - // - if (retcode == TRADE_RETCODE_DONE_PARTIAL) - { - m_result.retcode = retcode; - } - - // - return (false); - } - - // - //--- WARNING. If position volume exceeds the maximum volume allowed for deal, - //--- and when the asynchronous trade mode is on, for safety reasons, position is closed not completely, - //--- but partially. It is decreased by the maximum volume allowed for deal. - if (m_async_mode) - { - break; - } - - // - retcode = TRADE_RETCODE_DONE_PARTIAL; - if (partial_close) - { - Sleep(1000); - } - } while (partial_close); - - // - // succeed - return (true); - } - bool PositionClose( - const ulong ticket, // Position Ticket - const ulong deviation, // Deviation - const string comment = "" // Comment For Close - ) - { - // - // check stopped - if (IsStopped(__FUNCTION__)) - { - return (false); - } - - // - // check position existence - if (!PositionSelectByTicket(ticket)) - { - return (false); - } - - // - string symbol = PositionGetString(POSITION_SYMBOL); - - // - // clean - ClearStructures(); - - // - // check filling - if (!FillingCheck(symbol)) - { - return (false); - } - - // - // check - if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) - { - // - // prepare request for close BUY position - m_request.type = ORDER_TYPE_SELL; - m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); - } - else - { - // - // prepare request for close SELL position - m_request.type = ORDER_TYPE_BUY; - m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); - } - - // - // setting request - m_request.action = TRADE_ACTION_DEAL; - m_request.position = ticket; - m_request.symbol = symbol; - m_request.volume = PositionGetDouble(POSITION_VOLUME); - m_request.magic = m_magic; - m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; - - // - // Specify Comment ... - m_request.comment = comment; - - // - // close position - return (OrderSend(m_request, m_result)); - } - - // - // Partial Close Specific Position, by Specific Comment ... - bool PositionClosePartial( - const string symbol, // Symbol - const double volume, // Partial Closing Volume - const ulong deviation, // Deviation - const string comment = "" // Comment For Close - ) - { - // - uint retcode = TRADE_RETCODE_REJECT; - - // - // check stopped - if (IsStopped(__FUNCTION__)) - { - return (false); - } - - // - // for hedging mode only - if (!IsHedging()) - { - return (false); - } - - // - // clean - ClearStructures(); - - // - // check filling - if (!FillingCheck(symbol)) - { - return (false); - } - - // - // check - if (SelectPosition(symbol)) - { - // - if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) - { - // - // prepare request for close BUY position - m_request.type = ORDER_TYPE_SELL; - m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); - } - else - { - // - // prepare request for close SELL position - m_request.type = ORDER_TYPE_BUY; - m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); - } - } - else - { - // - // position not found - m_result.retcode = retcode; - return (false); - } - - // - // check volume - double position_volume = PositionGetDouble(POSITION_VOLUME); - if (position_volume > volume) - { - position_volume = volume; - } - - // - // setting request - m_request.action = TRADE_ACTION_DEAL; - m_request.symbol = symbol; - m_request.volume = position_volume; - m_request.magic = m_magic; - m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; - m_request.position = PositionGetInteger(POSITION_TICKET); - - // - // Specifieng Comment ... - m_request.comment = comment; - - // - // hedging? just send order - return (OrderSend(m_request, m_result)); - } - bool PositionClosePartial( - const ulong ticket, // Position Ticket - const double volume, // Partial Closing Volume - const ulong deviation, // Deviation - const string comment = "" // Comment For Close - ) - { - // - // check stopped - if (IsStopped(__FUNCTION__)) - { - return (false); - } - - // - // for hedging mode only - if (!IsHedging()) - { - return (false); - } - - // - // check position existence - if (!PositionSelectByTicket(ticket)) - { - return (false); - } - - // - string symbol = PositionGetString(POSITION_SYMBOL); - - // - // clean - ClearStructures(); - - // - // check filling - if (!FillingCheck(symbol)) - { - return (false); - } - - // - // check - if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) - { - // - // prepare request for close BUY position - m_request.type = ORDER_TYPE_SELL; - m_request.price = SymbolInfoDouble(symbol, SYMBOL_BID); - } - else - { - // - // prepare request for close SELL position - m_request.type = ORDER_TYPE_BUY; - m_request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); - } - - // - // check volume - double position_volume = PositionGetDouble(POSITION_VOLUME); - if (position_volume > volume) - { - position_volume = volume; - } - - // - // setting request - m_request.action = TRADE_ACTION_DEAL; - m_request.position = ticket; - m_request.symbol = symbol; - m_request.volume = position_volume; - m_request.magic = m_magic; - m_request.deviation = (deviation == ULONG_MAX) ? m_deviation : deviation; - - // - // Specifieng Comment ... - m_request.comment = comment; - - // - // close position - return (OrderSend(m_request, m_result)); - } -}; -// -// END Overrides ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// - -// -// XCMD5 a library for Hashing ... -class XCMD5 : public XCBase -{ - // - // Public Provides ... -public: - // - // Protected Provides ... - - // - // Constructor ... - XCMD5(void) {} - - // - // Deconstructor ... - ~XCMD5(void) {} - - // - // Hash Specified Char Array ... - string Hash( - uchar &source[], // Specify Char Array to Hash - int length = 0 // Specify Length of Char Array which required to hash - ) - { - // - string result = ""; - - // - int sourceCount = ArraySize(source); - - // - // Validate Args ... - if ( - sourceCount <= 0 || - (sourceCount > 0 && length > sourceCount)) - { - return result; - } - - // - // Normalize Args ... - if (length == 0) - { - length = sourceCount; - } - - // - // Init MD5 ... - MD5Init(); - - // - // Update Buffer ... - MD5Update(source, length); - - // - // Calculate Result ... - result = MD5Final(); - - // - return result; - } - - // - // Hash Specified String ... - string Hash( - string source // Specified String - ) - { - // - string result = ""; - - // - // Converts String to Char Array ... - uchar bytes[]; - StringToCharArray( - source, - bytes, - 0, - StringLen(source)); - - // - result = Hash( - bytes, - ArraySize(bytes)); - - // - return result; - } - -protected: - // - // Private Provides ... -private: - // - uint m_lMD5[4]; - uint m_nCount[2]; - uchar m_lpszBuffer[64]; - - // - // Convert Byte to DWord ... - void ByteToDWord(int &out[], uint &in[], uint len) - { - // - uint i = 0; - uint j = 0; - - // - for (; j < len; i++, j += 4) - { - out[i] = (int)in[j] | (int)in[j + 1] << 8 | (int)in[j + 2] << 16 | (int)in[j + 3] << 24; - } - } - - // - // Convert DWord to Byte ... - void DWordToByte(uchar &out[], int &in[], uint len) - { - // - uint i = 0; - uint j = 0; - - // - for (; j < len; i++, j += 4) - { - // - out[j] = (uchar)(in[i] & 0xff); - out[j + 1] = (uchar)((in[i] >> 8) & 0xff); - out[j + 2] = (uchar)((in[i] >> 16) & 0xff); - out[j + 3] = (uchar)((in[i] >> 24) & 0xff); - } - } - - // - // Init MD5 Array ... - void MD5Init() - { - // - ArrayInitialize(m_lpszBuffer, 64); - - // - m_nCount[0] = m_nCount[1] = 0; - m_lMD5[0] = _md5_INIT_STATE_0; - m_lMD5[1] = _md5_INIT_STATE_1; - m_lMD5[2] = _md5_INIT_STATE_2; - m_lMD5[3] = _md5_INIT_STATE_3; - } - - // - // Update MD5 ... - void MD5Update(uchar &inBuf[], uint inLen) - { - // - int i, ii; - int mdi; - - // - uint in[16]; - int i0 = 0; - - // - mdi = (int)((m_nCount[0] >> 3) & 0x3F); - - // - if ((m_nCount[0] + ((uint)inLen << 3)) < m_nCount[0]) - { - m_nCount[1]++; - } - - // - m_nCount[0] += ((uint)inLen << 3); - m_nCount[1] += ((uint)inLen >> 29); - - // - while ((inLen--) > 0) - { - // - m_lpszBuffer[mdi++] = inBuf[i0++]; - if (mdi == 0x40) - { - // - for (i = 0, ii = 0; i < 16; i++, ii += 4) - { - in[i] = (((uint)m_lpszBuffer[ii + 3]) << 24) | (((uint)m_lpszBuffer[ii + 2]) << 16) | (((uint)m_lpszBuffer[ii + 1]) << 8) | ((uint)m_lpszBuffer[ii]); - } - - // - Transform(m_lMD5, in); - - // - mdi = 0; - } - } - } - - // - // Finalize an MD5 Expression ... - string MD5Final() - { - // - uchar bits[8]; - int nIndex; - uint nPadLen; - const int nMD5Size = 16; - uchar lpszMD5[16]; - string temp; - string out = ""; - int i; - - // - DWordToByte(bits, m_nCount, 8); - nIndex = (int)((m_nCount[0] >> 3) & 0x3f); - nPadLen = (nIndex < 56) ? (56 - nIndex) : (120 - nIndex); - MD5Update(_md5_PADDING, nPadLen); - MD5Update(bits, 8); - DWordToByte(lpszMD5, m_lMD5, nMD5Size); - - // - for (i = 0; i < nMD5Size; i++) - { - // - if (lpszMD5[i] == 0) - { - temp = "00"; - } - else if (lpszMD5[i] <= 15) - { - temp = StringFormat("0%x", lpszMD5[i]); - } - else - { - temp = StringFormat("%x", lpszMD5[i]); - } - - // - out += temp; - } - - // - lpszMD5[0] = '\0'; - - // - return (out); - } - - // - // Transform Buffers ... - void Transform(uint &buf[], uint &in[]) - { - // - uint a = buf[0], b = buf[1], c = buf[2], d = buf[3]; - - // - _md5_FF(a, b, c, d, in[0], _md5_S11, 0xD76AA478); - _md5_FF(d, a, b, c, in[1], _md5_S12, 0xE8C7B756); - _md5_FF(c, d, a, b, in[2], _md5_S13, 0x242070DB); - _md5_FF(b, c, d, a, in[3], _md5_S14, 0xC1BDCEEE); - _md5_FF(a, b, c, d, in[4], _md5_S11, 0xF57C0FAF); - _md5_FF(d, a, b, c, in[5], _md5_S12, 0x4787C62A); - _md5_FF(c, d, a, b, in[6], _md5_S13, 0xA8304613); - _md5_FF(b, c, d, a, in[7], _md5_S14, 0xFD469501); - _md5_FF(a, b, c, d, in[8], _md5_S11, 0x698098D8); - _md5_FF(d, a, b, c, in[9], _md5_S12, 0x8B44F7AF); - _md5_FF(c, d, a, b, in[10], _md5_S13, 0xFFFF5BB1); - _md5_FF(b, c, d, a, in[11], _md5_S14, 0x895CD7BE); - _md5_FF(a, b, c, d, in[12], _md5_S11, 0x6B901122); - _md5_FF(d, a, b, c, in[13], _md5_S12, 0xFD987193); - _md5_FF(c, d, a, b, in[14], _md5_S13, 0xA679438E); - _md5_FF(b, c, d, a, in[15], _md5_S14, 0x49B40821); - - // - _md5_GG(a, b, c, d, in[1], _md5_S21, 0xF61E2562); - _md5_GG(d, a, b, c, in[6], _md5_S22, 0xC040B340); - _md5_GG(c, d, a, b, in[11], _md5_S23, 0x265E5A51); - _md5_GG(b, c, d, a, in[0], _md5_S24, 0xE9B6C7AA); - _md5_GG(a, b, c, d, in[5], _md5_S21, 0xD62F105D); - _md5_GG(d, a, b, c, in[10], _md5_S22, 0x02441453); - _md5_GG(c, d, a, b, in[15], _md5_S23, 0xD8A1E681); - _md5_GG(b, c, d, a, in[4], _md5_S24, 0xE7D3FBC8); - _md5_GG(a, b, c, d, in[9], _md5_S21, 0x21E1CDE6); - _md5_GG(d, a, b, c, in[14], _md5_S22, 0xC33707D6); - _md5_GG(c, d, a, b, in[3], _md5_S23, 0xF4D50D87); - _md5_GG(b, c, d, a, in[8], _md5_S24, 0x455A14ED); - _md5_GG(a, b, c, d, in[13], _md5_S21, 0xA9E3E905); - _md5_GG(d, a, b, c, in[2], _md5_S22, 0xFCEFA3F8); - _md5_GG(c, d, a, b, in[7], _md5_S23, 0x676F02D9); - _md5_GG(b, c, d, a, in[12], _md5_S24, 0x8D2A4C8A); - - // - _md5_HH(a, b, c, d, in[5], _md5_S31, 0xFFFA3942); - _md5_HH(d, a, b, c, in[8], _md5_S32, 0x8771F681); - _md5_HH(c, d, a, b, in[11], _md5_S33, 0x6D9D6122); - _md5_HH(b, c, d, a, in[14], _md5_S34, 0xFDE5380C); - _md5_HH(a, b, c, d, in[1], _md5_S31, 0xA4BEEA44); - _md5_HH(d, a, b, c, in[4], _md5_S32, 0x4BDECFA9); - _md5_HH(c, d, a, b, in[7], _md5_S33, 0xF6BB4B60); - _md5_HH(b, c, d, a, in[10], _md5_S34, 0xBEBFBC70); - _md5_HH(a, b, c, d, in[13], _md5_S31, 0x289B7EC6); - _md5_HH(d, a, b, c, in[0], _md5_S32, 0xEAA127FA); - _md5_HH(c, d, a, b, in[3], _md5_S33, 0xD4EF3085); - _md5_HH(b, c, d, a, in[6], _md5_S34, 0x04881D05); - _md5_HH(a, b, c, d, in[9], _md5_S31, 0xD9D4D039); - _md5_HH(d, a, b, c, in[12], _md5_S32, 0xE6DB99E5); - _md5_HH(c, d, a, b, in[15], _md5_S33, 0x1FA27CF8); - _md5_HH(b, c, d, a, in[2], _md5_S34, 0xC4AC5665); - - // - _md5_II(a, b, c, d, in[0], _md5_S41, 0xF4292244); - _md5_II(d, a, b, c, in[7], _md5_S42, 0x432AFF97); - _md5_II(c, d, a, b, in[14], _md5_S43, 0xAB9423A7); - _md5_II(b, c, d, a, in[5], _md5_S44, 0xFC93A039); - _md5_II(a, b, c, d, in[12], _md5_S41, 0x655B59C3); - _md5_II(d, a, b, c, in[3], _md5_S42, 0x8F0CCC92); - _md5_II(c, d, a, b, in[10], _md5_S43, 0xFFEFF47D); - _md5_II(b, c, d, a, in[1], _md5_S44, 0x85845DD1); - _md5_II(a, b, c, d, in[8], _md5_S41, 0x6FA87E4F); - _md5_II(d, a, b, c, in[15], _md5_S42, 0xFE2CE6E0); - _md5_II(c, d, a, b, in[6], _md5_S43, 0xA3014314); - _md5_II(b, c, d, a, in[13], _md5_S44, 0x4E0811A1); - _md5_II(a, b, c, d, in[4], _md5_S41, 0xF7537E82); - _md5_II(d, a, b, c, in[11], _md5_S42, 0xBD3AF235); - _md5_II(c, d, a, b, in[2], _md5_S43, 0x2AD7D2BB); - _md5_II(b, c, d, a, in[9], _md5_S44, 0xEB86D391); - - // - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; - } -}; - -// -// XSaherElm Account Info Class ... -class XCAccountInfo : public XCBase -{ - // - // Public properties ... -public: - // - // Constructro ... - void XCAccountInfo() - { - // - mAccountInfo = new CAccountInfo(); - - // - mInitialBalance = mAccountInfo.Balance(); - } - - // - // Deconstructor ... - void ~XCAccountInfo() - { - // - mInitialBalance = 0; - } - - // - // User Account ... - long GetUserAccount() - { - return mAccountInfo.Login(); - } - - // - // Account Leverage ... - long GetLeverage() - { - return mAccountInfo.Leverage(); - } - - // - // Get Trade Expert State ... - bool CanExpertTrade() - { - return mAccountInfo.TradeExpert(); - } - - // - // User Account Trade Mopde (ENUM_ACCOUNT_TRADE_MODE) ... - // -------------------------- - // ACCOUNT_TRADE_MODE_DEMO - // ACCOUNT_TRADE_MODE_CONTEST - // ACCOUNT_TRADE_MODE_REAL - ENUM_ACCOUNT_TRADE_MODE GetTradeMode() - { - return mAccountInfo.TradeMode(); - } - - // - // Get Account Balance ... - double GetBalance() - { - return mAccountInfo.Balance(); - } - - // - // Get Initial Deposit Balance ... - double GetInitialBalance() - { - return mInitialBalance; - } - - // - // Get the amount of give Credit ... - double GetCredit() - { - return mAccountInfo.Credit(); - } - - // - // Get the amount of current Profit on account ... - double GetProfit() - { - return mAccountInfo.Profit(); - } - - // - // Get the amount of current Equity on account ... - double GetEquity() - { - return mAccountInfo.Equity(); - } - - // - // Get the amount of reserved Margin ... - double GetMargin() - { - return mAccountInfo.Margin(); - } - - // - // Get the amount of free Margin ... - double GetFreeMargin() - { - return mAccountInfo.FreeMargin(); - } - - // - // Get the Level of Margin ... - double GetMarginLevel() - { - return mAccountInfo.MarginLevel(); - } - - // - // Get the Level Of Margin for a Deposit ... - double GetMarginCall() - { - return mAccountInfo.MarginCall(); - } - - // - // Get the Level of Margin for Stop out ... - double GetMarginStopOut() - { - return mAccountInfo.MarginStopOut(); - } - - // - // Get the Client Name ... - string GetName() - { - return mAccountInfo.Name(); - } - - // - // Get the Trade Server Name ... - string GetServerName() - { - return mAccountInfo.Server(); - } - - // - // Get deposit Currency Name ... - string GetCurrency() - { - return mAccountInfo.Currency(); - } - - // - // Get the Company Name that serves an Account ... - string GetCompany() - { - return mAccountInfo.Company(); - } - - // - // Calculate Profits for the current account based on passed parameters ... - double CalculateTradeProfit( - const string symbol, // trading symbol - ENUM_ORDER_TYPE type, // order type - double volume, // volume - double entry, // open price - double exit // close price - ) - { - // - double result = mAccountInfo.OrderProfitCheck( - symbol, - type, - volume, - entry, - exit); - - // - return result; - } - - // - // Calculate amount of margin which required for trade operation ... - double CalculateMarging( - const string symbol, // trading symbol - ENUM_ORDER_TYPE type, // order type - double volume, // volume - double entry // open price - ) - { - // - double result = mAccountInfo.MarginCheck( - symbol, - type, - volume, - entry); - - // - return result; - } - - // - // Calculate amount of free margin left after trade operation ... - double CalculateFreeMarging( - const string symbol, // trading symbol - ENUM_ORDER_TYPE type, // order type - double volume, // volume - double entry // open price - ) - { - // - double result = mAccountInfo.FreeMarginCheck( - symbol, - type, - volume, - entry); - - // - return result; - } - - // - // Calculate the Maximum possible volume of trade operation ... - double CalculateMaxVolume( - const string symbol, // trading symbol - ENUM_ORDER_TYPE type, // order type - double entry, // open price - double percent = 100 // percent of available margin - ) - { - // - double result = mAccountInfo.MaxLotCheck( - symbol, - type, - entry, - percent); - - // - return result; - } - - // - // Protected properties ... -protected: - // - // Private properties ... -private: - // - // Initial Account Balance ... - double mInitialBalance; - - // - // Account Info ... - CAccountInfo mAccountInfo; -}; - -// -// XSaherElm Report Info Class ... -class XCReporter : public XCBase -{ - // - // Public Provided ... -public: - // - // Constructro ... - void XCReporter() - { - // - mAccountInfo = new XCAccountInfo(); - - // - Reset(); - } - - // - // Deconstructor ... - void ~XCReporter() - { - } - - // - // Reset Specific Report ... - void Reset( - ENUM_XREPORT_TYPES type // Specify Report Type - ) - { - CleanReport(type); - } - - // - // Reset All Reports ... - void Reset() - { - // - CleanReport(XREPORT_MAIN); - CleanReport(XREPORT_MONTHLY); - CleanReport(XREPORT_WEEKLY); - CleanReport(XREPORT_DAILY); - } - - // - // Update Volume Info ... - void UpdateReportVolumeInfo( - ENUM_XREPORT_TYPES type, // Specified Report Type - // - double staticVolume, // Current Available Static Volume - string staticVolumeCalculationMethod, // Static Volume Calculation Method - double maxAllowedVolume, // Current Maximum Appliable Volume - double volumeIncreaseMultiplier, // Static Volume Increase Multiplier - double balanceGowingToApplyMultiplier, // Multiply Volume Based On Balance Growing - double balanceGrowingToIncreaseMaxAllowedVolume // Where to Increase MaxAllowed Volume - ) - { - // - // Filling Account Info ... - FillReportAccountInfo(type); - - // - switch (type) - { - // - // Main ... - case XREPORT_MAIN: - // - FillingVolumeInfo( - mMainReport, - staticVolume, - staticVolumeCalculationMethod, - maxAllowedVolume, - volumeIncreaseMultiplier, - balanceGowingToApplyMultiplier, - balanceGrowingToIncreaseMaxAllowedVolume); - break; - - // - // Monthly ... - case XREPORT_MONTHLY: - // - FillingVolumeInfo( - mMonthlyReport, - staticVolume, - staticVolumeCalculationMethod, - maxAllowedVolume, - volumeIncreaseMultiplier, - balanceGowingToApplyMultiplier, - balanceGrowingToIncreaseMaxAllowedVolume); - break; - - // - // Weekly ... - case XREPORT_WEEKLY: - // - FillingVolumeInfo( - mWeeklyReport, - staticVolume, - staticVolumeCalculationMethod, - maxAllowedVolume, - volumeIncreaseMultiplier, - balanceGowingToApplyMultiplier, - balanceGrowingToIncreaseMaxAllowedVolume); - break; - - // - // Daily ... - case XREPORT_DAILY: - // - FillingVolumeInfo( - mDailyReport, - staticVolume, - staticVolumeCalculationMethod, - maxAllowedVolume, - volumeIncreaseMultiplier, - balanceGowingToApplyMultiplier, - balanceGrowingToIncreaseMaxAllowedVolume); - break; - } - } - - // - // Update Volume Info on All Reports ... - void UpdateReportsVolumeInfo( - double staticVolume, // Current Available Static Volume - string staticVolumeCalculationMethod, // Static Volume Calculation Method - double maxAllowedVolume, // Current Maximum Appliable Volume - double volumeIncreaseMultiplier, // Static Volume Increase Multiplier - double balanceGowingToApplyMultiplier, // Multiply Volume Based On Balance Growing - double balanceGrowingToIncreaseMaxAllowedVolume // Where to Increase MaxAllowed Volume - ) - { - // - // Main ... - UpdateReportVolumeInfo( - XREPORT_MAIN, - staticVolume, - staticVolumeCalculationMethod, - maxAllowedVolume, - volumeIncreaseMultiplier, - balanceGowingToApplyMultiplier, - balanceGrowingToIncreaseMaxAllowedVolume); - - // - // Monthly ... - UpdateReportVolumeInfo( - XREPORT_MONTHLY, - staticVolume, - staticVolumeCalculationMethod, - maxAllowedVolume, - volumeIncreaseMultiplier, - balanceGowingToApplyMultiplier, - balanceGrowingToIncreaseMaxAllowedVolume); - - // - // Weekly ... - UpdateReportVolumeInfo( - XREPORT_WEEKLY, - staticVolume, - staticVolumeCalculationMethod, - maxAllowedVolume, - volumeIncreaseMultiplier, - balanceGowingToApplyMultiplier, - balanceGrowingToIncreaseMaxAllowedVolume); - - // - // Daily ... - UpdateReportVolumeInfo( - XREPORT_DAILY, - staticVolume, - staticVolumeCalculationMethod, - maxAllowedVolume, - volumeIncreaseMultiplier, - balanceGowingToApplyMultiplier, - balanceGrowingToIncreaseMaxAllowedVolume); - } - - // - // Add Specific Signal to Report ... - void AddSignalToReport( - ENUM_XREPORT_TYPES type, // Specified Report Type - const XSignal &signal, // Specified Signal - const string &providers[] // Specified Signal Providers - ) - { - // - // - // Filling Account Info ... - FillReportAccountInfo(type); - - // - switch (type) - { - // - // Main ... - case XREPORT_MAIN: - AddSignalToReport( - mMainReport, - signal, - providers); - break; - - // - // Monthly ... - case XREPORT_MONTHLY: - AddSignalToReport( - mMonthlyReport, - signal, - providers); - break; - - // - // Weekly ... - case XREPORT_WEEKLY: - AddSignalToReport( - mWeeklyReport, - signal, - providers); - break; - - // - // Daily ... - case XREPORT_DAILY: - AddSignalToReport( - mDailyReport, - signal, - providers); - break; - } - } - - // - // Add Specific Signal to All Reports ... - void AddSignalToReports( - const XSignal &signal, // Specified Signal - const string &providers[] // Specified Signal Providers - ) - { - // - // Main ... - AddSignalToReport( - XREPORT_MAIN, - signal, - providers); - - // - // Monthly ... - AddSignalToReport( - XREPORT_MONTHLY, - signal, - providers); - - // - // Weekly ... - AddSignalToReport( - XREPORT_WEEKLY, - signal, - providers); - - // - // Daily ... - AddSignalToReport( - XREPORT_DAILY, - signal, - providers); - } - - // - // Report a TP for Specific Report ... - void AddTradeTPInReport( - ENUM_XREPORT_TYPES type // Specified Report Type - ) - { - // - switch (type) - { - // - // Main ... - case XREPORT_MAIN: - AddTradeTPInReport(mMainReport); - break; - - // - // Monthly ... - case XREPORT_MONTHLY: - AddTradeTPInReport(mMonthlyReport); - break; - - // - // Weekly ... - case XREPORT_WEEKLY: - AddTradeTPInReport(mWeeklyReport); - break; - - // - // Daily ... - case XREPORT_DAILY: - AddTradeTPInReport(mDailyReport); - break; - } - } - - // - // Report a TP for All Reports ... - void AddTradeTPInReports() - { - // - // Main ... - AddTradeTPInReport(XREPORT_MAIN); - - // - // Monthly ... - AddTradeTPInReport(XREPORT_MONTHLY); - - // - // Weekly ... - AddTradeTPInReport(XREPORT_WEEKLY); - - // - // Daily ... - AddTradeTPInReport(XREPORT_DAILY); - } - - // - // Report a SL for Specific Report ... - void AddTradeSLInReport( - ENUM_XREPORT_TYPES type // Specified Report Type - ) - { - // - switch (type) - { - // - // Main ... - case XREPORT_MAIN: - AddTradeSLInReport(mMainReport); - break; - - // - // Monthly ... - case XREPORT_MONTHLY: - AddTradeSLInReport(mMonthlyReport); - break; - - // - // Weekly ... - case XREPORT_WEEKLY: - AddTradeSLInReport(mWeeklyReport); - break; - - // - // Daily ... - case XREPORT_DAILY: - AddTradeSLInReport(mDailyReport); - break; - } - } - - // - // Report a SL for All Reports ... - void AddTradeSLInReports() - { - // - // Main ... - AddTradeSLInReport(XREPORT_MAIN); - - // - // Monthly ... - AddTradeSLInReport(XREPORT_MONTHLY); - - // - // Weekly ... - AddTradeSLInReport(XREPORT_WEEKLY); - - // - // Daily ... - AddTradeSLInReport(XREPORT_DAILY); - } - - // - // Update Number of Same Time Trades in Specific Report ... - void UpdateMaxSameTimeTradesInReport( - ENUM_XREPORT_TYPES type, // Specified Report Type - int value // number of same time trades - ) - { - // - switch (type) - { - // - // Main ... - case XREPORT_MAIN: - UpdateMaxSameTimeTradesInReport( - mMainReport, - value); - break; - - // - // Monthly ... - case XREPORT_MONTHLY: - UpdateMaxSameTimeTradesInReport( - mMonthlyReport, - value); - break; - - // - // Weekly ... - case XREPORT_WEEKLY: - UpdateMaxSameTimeTradesInReport( - mWeeklyReport, - value); - break; - - // - // Daily ... - case XREPORT_DAILY: - UpdateMaxSameTimeTradesInReport( - mDailyReport, - value); - break; - } - } - - // - // Update Number of Same Time Trades in All Report ... - void UpdateMaxSameTimeTradesInReports( - int value // number of same time trades - ) - { - // - // Main ... - UpdateMaxSameTimeTradesInReport( - XREPORT_MAIN, - value); - - // - // Monthly ... - UpdateMaxSameTimeTradesInReport( - XREPORT_MONTHLY, - value); - - // - // Weekly ... - UpdateMaxSameTimeTradesInReport( - XREPORT_WEEKLY, - value); - - // - // Daily ... - UpdateMaxSameTimeTradesInReport( - XREPORT_DAILY, - value); - } - - // - // Update Max DrawDown in Specific Report ... - void UpdateMaxDrawDownInReport( - ENUM_XREPORT_TYPES type, // Specified Report Type - double value // draw down value - ) - { - // - switch (type) - { - // - // Main ... - case XREPORT_MAIN: - UpdateMaxDrawDownInReport( - mMainReport, - value); - break; - - // - // Monthly ... - case XREPORT_MONTHLY: - UpdateMaxDrawDownInReport( - mMonthlyReport, - value); - break; - - // - // Weekly ... - case XREPORT_WEEKLY: - UpdateMaxDrawDownInReport( - mWeeklyReport, - value); - break; - - // - // Daily ... - case XREPORT_DAILY: - UpdateMaxDrawDownInReport( - mDailyReport, - value); - break; - } - } - - // - // Update Max DrawDown in All Report ... - void UpdateMaxDrawDownInReports( - double value // draw down value - ) - { - // - // Main ... - UpdateMaxDrawDownInReport( - XREPORT_MAIN, - value); - - // - // Monthly ... - UpdateMaxDrawDownInReport( - XREPORT_MONTHLY, - value); - - // - // Weekly ... - UpdateMaxDrawDownInReport( - XREPORT_WEEKLY, - value); - - // - // Daily ... - UpdateMaxDrawDownInReport( - XREPORT_DAILY, - value); - } - - // - // Update Max DrawUp in Specific Report ... - void UpdateMaxDrawUpInReport( - ENUM_XREPORT_TYPES type, // Specified Report Type - double value // draw up value - ) - { - // - switch (type) - { - // - // Main ... - case XREPORT_MAIN: - UpdateMaxDrawUpInReport( - mMainReport, - value); - break; - - // - // Monthly ... - case XREPORT_MONTHLY: - UpdateMaxDrawUpInReport( - mMonthlyReport, - value); - break; - - // - // Weekly ... - case XREPORT_WEEKLY: - UpdateMaxDrawUpInReport( - mWeeklyReport, - value); - break; - - // - // Daily ... - case XREPORT_DAILY: - UpdateMaxDrawUpInReport( - mDailyReport, - value); - break; - } - } - - // - // Update Max DrawUp in All Report ... - void UpdateMaxDrawUpInReports( - double value // draw up value - ) - { - // - // Main ... - UpdateMaxDrawUpInReport( - XREPORT_MAIN, - value); - - // - // Monthly ... - UpdateMaxDrawUpInReport( - XREPORT_MONTHLY, - value); - - // - // Weekly ... - UpdateMaxDrawUpInReport( - XREPORT_WEEKLY, - value); - - // - // Daily ... - UpdateMaxDrawUpInReport( - XREPORT_DAILY, - value); - } - - // - // Update Min Balance for Open Trades in Specific Report ... - void UpdateMinBalanceForOpenTradesInReport( - ENUM_XREPORT_TYPES type, // Specified Report Type - double value // min balance for open trades - ) - { - // - switch (type) - { - // - // Main ... - case XREPORT_MAIN: - UpdateMinBalanceForOpenTradesInReport( - mMainReport, - value); - break; - - // - // Monthly ... - case XREPORT_MONTHLY: - UpdateMinBalanceForOpenTradesInReport( - mMonthlyReport, - value); - break; - - // - // Weekly ... - case XREPORT_WEEKLY: - UpdateMinBalanceForOpenTradesInReport( - mWeeklyReport, - value); - break; - - // - // Daily ... - case XREPORT_DAILY: - UpdateMinBalanceForOpenTradesInReport( - mDailyReport, - value); - break; - } - } - - // - // Update Min Balance for Open Trades in All Report ... - void UpdateMinBalanceForOpenTradesInReports( - double value // min balance for open trades - ) - { - // - // Main ... - UpdateMinBalanceForOpenTradesInReport( - XREPORT_MAIN, - value); - - // - // Monthly ... - UpdateMinBalanceForOpenTradesInReport( - XREPORT_MONTHLY, - value); - - // - // Weekly ... - UpdateMinBalanceForOpenTradesInReport( - XREPORT_WEEKLY, - value); - - // - // Daily ... - UpdateMinBalanceForOpenTradesInReport( - XREPORT_DAILY, - value); - } - - // - // Gnerate Specific Type Of Report String Representation ... - string GenerateReportString( - ENUM_XREPORT_TYPES type, // Specified Report Type - string separator = "\n" // Separator - ) - { - // - string result = ""; - - // - switch (type) - { - // - // Main ... - case XREPORT_MAIN: - result = GenerateReportString( - mMainReport, - separator); - break; - - // - // Monthly ... - case XREPORT_MONTHLY: - result = GenerateReportString( - mMonthlyReport, - separator); - break; - - // - // Weekly ... - case XREPORT_WEEKLY: - result = GenerateReportString( - mWeeklyReport, - separator); - break; - - // - // Daily ... - case XREPORT_DAILY: - result = GenerateReportString( - mDailyReport, - separator); - break; - } - - // - return result; - } - - // - // Protected Provided ... -protected: - // - // Private Provided ... -private: - // - // Account Info Instance ... - XCAccountInfo mAccountInfo; - - // - // Main Report ... - XReport mMainReport; - - // - // Monthly Report ... - XReport mMonthlyReport; - - // - // Weekly Report ... - XReport mWeeklyReport; - - // - // Daily Report ... - XReport mDailyReport; - - // - // Clean Specific Report ... - void CleanReport( - XReport &report // Specified Report - ) - { - // - datetime time = TimeCurrent(); - - // - // Reset Times ... - report.start = time; - report.end = -1; - - // - // Reset Account Info ... - FillReportAccountInfo(report); - - // - // Reset Summary Info ... - report.summaryInfo.maxDrawUp = 0; - report.summaryInfo.maxDrawDown = 0; - report.summaryInfo.longSignals = 0; - report.summaryInfo.numberOfTPs = 0; - report.summaryInfo.numberOfSLs = 0; - report.summaryInfo.shortSignals = 0; - report.summaryInfo.maxSignalVolume = 0; - report.summaryInfo.maxSameTimeSignals = 0; - - // - // Reset Volume Info ... - report.volumeInfo.staticVolume = 0; - report.volumeInfo.maxAllowedVolume = 0; - report.volumeInfo.volumeIncreaseMultiplier = 0; - report.volumeInfo.balanceGowingToApplyMultiplier = 0; - report.volumeInfo.staticVolumeCalculationMethod = NULL; - report.volumeInfo.balanceGrowingToIncreaseMaxAllowedVolume = 0; - - // - // Reset Signallers Info ... - CleanBuffer(report.signallersInfo); - } - void CleanReport( - ENUM_XREPORT_TYPES type // Specify Report Type - ) - { - // - switch (type) - { - // - // Main ... - case XREPORT_MAIN: - CleanReport(mMainReport); - break; - - // - // Monthly ... - case XREPORT_MONTHLY: - CleanReport(mMonthlyReport); - break; - - // - // Weekly ... - case XREPORT_WEEKLY: - CleanReport(mWeeklyReport); - break; - - // - // Daily ... - case XREPORT_DAILY: - CleanReport(mDailyReport); - break; - } - } - - // - // Update Specific Reports End Time ... - void FillReportEndTime( - XReport &report // Specified Report - ) - { - // - datetime time = TimeCurrent(); - report.end = time; - } - - // - // Filleing Report Account Info ... - void FillReportAccountInfo( - XReport &report // Specified Report - ) - { - // - FillReportEndTime(report); - - // - report.accountInfo.user = (string)mAccountInfo.GetUserAccount(); - report.accountInfo.name = mAccountInfo.GetName(); - report.accountInfo.server = mAccountInfo.GetServerName(); - report.accountInfo.broker = mAccountInfo.GetCompany(); - report.accountInfo.mode = mAccountInfo.GetTradeMode(); - report.accountInfo.leverage = mAccountInfo.GetLeverage(); - report.accountInfo.currency = mAccountInfo.GetCurrency(); - report.accountInfo.deposit = mAccountInfo.GetInitialBalance(); - report.accountInfo.balance = mAccountInfo.GetBalance(); - } - void FillReportAccountInfo( - ENUM_XREPORT_TYPES type // Specify Report Type - ) - { - // - switch (type) - { - // - // Main ... - case XREPORT_MAIN: - FillReportAccountInfo(mMainReport); - break; - - // - // Monthly ... - case XREPORT_MONTHLY: - FillReportAccountInfo(mMonthlyReport); - break; - - // - // Weekly ... - case XREPORT_WEEKLY: - FillReportAccountInfo(mWeeklyReport); - break; - - // - // Daily ... - case XREPORT_DAILY: - FillReportAccountInfo(mDailyReport); - break; - } - } - - // - // Filling Volume Info ... - void FillingVolumeInfo( - XReport &report, // Specified Report - // - double staticVolume, // Current Available Static Volume - string staticVolumeCalculationMethod, // Static Volume Calculation Method - double maxAllowedVolume, // Current Maximum Appliable Volume - double volumeIncreaseMultiplier, // Static Volume Increase Multiplier - double balanceGowingToApplyMultiplier, // Multiply Volume Based On Balance Growing - double balanceGrowingToIncreaseMaxAllowedVolume // Where to Increase MaxAllowed Volume - ) - { - // - FillReportEndTime(report); - - // - report.volumeInfo.staticVolume = staticVolume; - report.volumeInfo.maxAllowedVolume = maxAllowedVolume; - report.volumeInfo.volumeIncreaseMultiplier = volumeIncreaseMultiplier; - report.volumeInfo.staticVolumeCalculationMethod = staticVolumeCalculationMethod; - report.volumeInfo.balanceGowingToApplyMultiplier = balanceGowingToApplyMultiplier; - report.volumeInfo.balanceGrowingToIncreaseMaxAllowedVolume = balanceGrowingToIncreaseMaxAllowedVolume; - } - - // - // Add Signal to Report ... - void AddSignalToReport( - XReport &report, // Specified Report - const XSignal &signal, // Specified Signal - const string &providers[] // Specified Signal Providers - ) - { - // - FillReportEndTime(report); - - // - double volume = signal.volume; - bool isLong = signal.type == X_SIGNAL_LONG; - - // - // Update Longs and Shorts ... - if (isLong) - { - report.summaryInfo.longSignals++; - } - else - { - report.summaryInfo.shortSignals++; - } - - // - // Chack Max Volume ... - if (volume > report.summaryInfo.maxSignalVolume) - { - report.summaryInfo.maxSignalVolume = volume; - } - - // - // Update Signallers Info ... - for (int i = 0; i < ArraySize(providers); i++) - { - // - string iProvider = providers[i]; - - // - AddOrUpdateSignaller( - report, - iProvider, - signal); - } - } - - // - // Add or Update Signaller Info of Specific Report ... - void AddOrUpdateSignaller( - XReport &report, // Specified Report - const string provider, // Signal Provider name - const XSignal &signal // Specified Signal - ) - { - // - int providerIdx = -1; - int signallersInfoCount = 0; - bool isLong = signal.type == X_SIGNAL_LONG; - - // - // Prepare New One Provider ... - XSignallerInfo info = {}; - info.name = provider; - if (isLong) - { - info.longs = 1; - } - else - { - info.shorts = 1; - } - - // - // Find Provider idx if Exists ... - providerIdx = FindProviderInSignallersInfo( - provider, - report.signallersInfo); - - // - // Check IDX ... - if (providerIdx > -1) - { - // - // Update Exists ... - if (isLong) - { - report.signallersInfo[providerIdx].longs++; - } - else - { - report.signallersInfo[providerIdx].shorts++; - } - } - else - { - // - // Add New One ... - AddItemToBuffer( - info, - report.signallersInfo); - } - } - - // - // Add TP in Report ... - void AddTradeTPInReport( - XReport &report // Specified Report - ) - { - // - FillReportEndTime(report); - - // - report.summaryInfo.numberOfTPs++; - } - - // - // Add SL in Report ... - void AddTradeSLInReport( - XReport &report // Specified Report - ) - { - // - FillReportEndTime(report); - - // - report.summaryInfo.numberOfSLs++; - } - - // - // Update Number of Same Time Trades in Report ... - void UpdateMaxSameTimeTradesInReport( - XReport &report, // Specified Report - int value // number of same time trades - ) - { - // - // Validate Args ... - if (value <= report.summaryInfo.maxSameTimeSignals) - { - return; - } - - // - FillReportEndTime(report); - - // - report.summaryInfo.maxSameTimeSignals = value; - } - - // - // Update Number of Same Time Trades in Report ... - void UpdateMaxDrawUpInReport( - XReport &report, // Specified Report - double value // draw up value - ) - { - // - // Validate Args ... - if (value <= report.summaryInfo.maxDrawUp) - { - return; - } - - // - FillReportEndTime(report); - - // - report.summaryInfo.maxDrawUp = value; - } - - // - // Update Number of Same Time Trades in Report ... - void UpdateMaxDrawDownInReport( - XReport &report, // Specified Report - double value // draw down value - ) - { - // - // Validate Args ... - if (value <= report.summaryInfo.maxDrawDown) - { - return; - } - - // - FillReportEndTime(report); - - // - report.summaryInfo.maxDrawDown = value; - } - - // - // Update Min Balance for Open Trades Value in Report ... - void UpdateMinBalanceForOpenTradesInReport( - XReport &report, // Specified Report - double value // min balance for open trades - ) - { - // - // Validate Arg ... - if (value <= 0) - { - return; - } - - // - FillReportEndTime(report); - - // - report.accountInfo.minBalanceForOpenTrades = value; - } - - // - // Generate Specific Report String Representation ... - string GenerateReportString( - XReport &report, // Specified Report - string separator = "\n" // Separator - ) - { - // - string result = ""; - - // - // Start and End Date ... - result += "Start: " + (string)report.start + separator; - result += "End: " + (string)report.end + separator; - - // - // Account Info ... - string accountStr = GenerateAccountInfoReportString(report.accountInfo); - result += "Account: " + separator + accountStr + separator; - - // - // Summary Info ... - string summaryStr = GenerateSummaryInfoReportString(report.summaryInfo); - result += "Summary: " + separator + summaryStr + separator; - - // - // Volume Info ... - string volumeStr = GenerateVolumeInfoReportString(report.volumeInfo); - result += "Volume: " + separator + volumeStr + separator; - - // - // Signallers Info ... - string signallersStr = GenerateSignallersInfoReportString(report.signallersInfo); - result += "Signallers: " + separator + signallersStr + separator; - - // - return result; - } - - // - // Generate Account info String Representation ... - string GenerateAccountInfoReportString( - XAccountInfo &info, // Specified Account Info - string separator = "\n" // Separator - ) - { - // - string result = ""; - - // - // Generate Report ... - result += "user: " + info.user + separator; - result += "name: " + info.name + separator; - result += "server: " + info.server + separator; - result += "broker: " + info.broker + separator; - result += "mode: " + EnumToString(info.mode) + separator; - result += "leverage: " + (string)info.leverage + separator; - result += "currency: " + info.currency + separator; - result += "deposit: " + (string)info.deposit + separator; - result += "balance: " + (string)info.balance + separator; - result += "minBalanceForTrading: " + (string)info.minBalanceForOpenTrades + separator; - - // - return result; - } - - // - // Generate Summary info String Representation ... - string GenerateSummaryInfoReportString( - XSummaryInfo &info, // Specified Summary Info - string separator = "\n" // Separator - ) - { - // - string result = ""; - - // - // Generate Report ... - result += "longSignals: " + (string)info.longSignals + separator; - result += "shortSignals: " + (string)info.shortSignals + separator; - result += "numberOfTps: " + (string)info.numberOfTPs + separator; - result += "numberOfSLs: " + (string)info.numberOfSLs + separator; - result += "maxDrawUp: " + (string)info.maxDrawUp + separator; - result += "maxDrawDown: " + (string)info.maxDrawDown + separator; - result += "maxSignalVolume: " + (string)info.maxSignalVolume + separator; - result += "maxSameTimeSignals: " + (string)info.maxSameTimeSignals + separator; - - // - return result; - } - - // - // Generate Volume info String Representation ... - string GenerateVolumeInfoReportString( - XVolumeInfo &info, // Specified Volume Info - string separator = "\n" // Separator - ) - { - // - string result = ""; - - // - // Generate Report ... - result += "staticVolume: " + (string)info.staticVolume + separator; - result += "staticVolumeCalculationMethod: " + info.staticVolumeCalculationMethod + separator; - result += "maxAllowedVolume: " + (string)info.maxAllowedVolume + separator; - result += "volumeIncreaseMultiplier: " + (string)info.volumeIncreaseMultiplier + separator; - result += "balanceGowingToApplyMultiplier: " + (string)info.balanceGowingToApplyMultiplier + separator; - result += "balanceGrowingToIncreaseMaxAllowedVolume: " + (string)info.balanceGrowingToIncreaseMaxAllowedVolume + separator; - - // - return result; - } - - // - // Generate Signallers info String Representation ... - string GenerateSignallersInfoReportString( - XSignallerInfo &infos[], // Specified Signallers Info - string separator = "\n" // Separator - ) - { - // - string result = ""; - - // - // Validate Signallers Array Size ... - int signallersCount = ArraySize(infos); - if (signallersCount <= 0) - { - // - result += "EMPTY" + separator; - return result; - } - - // - // Generate Report ... - for (int i = 0; i < signallersCount; i++) - { - // - XSignallerInfo iSignaller = infos[i]; - - // - result += "name: " + iSignaller.name + separator; - result += "longs: " + (string)iSignaller.longs + separator; - result += "shorts: " + (string)iSignaller.shorts + separator; - - // - if (i < signallersCount - 1) - { - result += separator; - } - } - // - return result; - } - - // - // Find a Provider Index in SignallersInfo ... - int FindProviderInSignallersInfo( - string provider, // Specified Provider Name ... - XSignallerInfo &infoBuffer[] // Specified XSignallerInfo Buffer ... - ) - { - // - int result = -1; - - // - int bufferSize = ArraySize(infoBuffer); - if (bufferSize <= 0) - { - return result; - } - - // - // Loop through buffer to find provider index ... - for (int i = 0; i < bufferSize; i++) - { - // - XSignallerInfo iInfo = infoBuffer[i]; - - // - if (iInfo.name != provider) - { - continue; - } - - // - result = i; - } - - // - return result; - } -}; - -// -// a Class For Collectiong Info ... -class XCCollector : public XCBase -{ - // - // Public ... -public: - // - // Constructor ... - XCCollector() - { - Reset(); - } - - // - // Deconstructor ... - ~XCCollector() {} - - // - // Reset All Collectors ... - void Reset() - { - Clean(); - } - - // - // Count Data ... - int Count() - { - // - int result = 0; - - // - result = ArraySize(mTimes); - - // - return result; - } - - // - // TODO: Implement Business Logic here ... - - // - // Add Specific item to Collection ... - bool Add( - XCollector &item // Specified Info - ) - { - // - bool result = false; - - // - // Validate Args ... - result = IsValid( - item, - false); - if (!result) - { - return result; - } - - // - // Add Items Values to Buffers ... - // - AddItemToBuffer( - item.time, - mTimes); - - // - AddItemToBuffer( - item.volume, - mVolumes); - - // - AddItemToBuffer( - item.maxDrawDown, - mMaxDrawDowns); - - // - AddItemToBuffer( - item.maxAllowedVolume, - mMaxAllowedVolumes); - - // - AddItemToBuffer( - item.minBalanceForOpenTrade, - mMinBalanceForTradePrices); - - // - return result; - } - - // - // Retrieve Specific Item ... - bool Get( - XCollector &item, // Hold's Result - int index = 0 // Specified Index to Retrieve - ) - { - // - bool result = false; - - // - result = IsValidIndex(index); - if (!result) - { - return result; - } - - // - // Filling Item ... - item.time = mTimes[index]; - item.volume = mVolumes[index]; - item.maxDrawDown = mMaxDrawDowns[index]; - item.maxAllowedVolume = mMaxAllowedVolumes[index]; - item.minBalanceForOpenTrade = mMinBalanceForTradePrices[index]; - - // - return result; - } - XCollector Get( - int index = 0 // Specified Index to Retrieve - ) - { - // - XCollector result = {}; - - // - bool isValidIndex = IsValidIndex(index); - if (!isValidIndex) - { - return result; - } - - // - // Filling Item ... - result.time = mTimes[index]; - result.volume = mVolumes[index]; - result.maxDrawDown = mMaxDrawDowns[index]; - result.maxAllowedVolume = mMaxAllowedVolumes[index]; - result.minBalanceForOpenTrade = mMinBalanceForTradePrices[index]; - - // - return result; - } - bool Get( - XCollector &item, // Hold's Result - datetime time // Specified Index to Retrieve - ) - { - // - bool result = false; - - // - if (time <= 0) - { - return result; - } - - // - int timesCount = ArraySize(mTimes); - result = timesCount > 0; - if (!result) - { - return result; - } - - // - int index = -1; - for (int i = 0; i < timesCount; i++) - { - // - datetime iTime = mTimes[i]; - - // - if (iTime == time) - { - // - index = i; - break; - } - } - - // - result = index >= 0; - if (!result) - { - return result; - } - - // - result = Get( - item, - index); - - // - return result; - } - XCollector Get( - datetime time // Specified Index to Retrieve - ) - { - // - XCollector result = {}; - - // - if (time <= 0) - { - return result; - } - - // - int timesCount = ArraySize(mTimes); - if (timesCount <= 0) - { - return result; - } - - // - int index = -1; - for (int i = 0; i < timesCount; i++) - { - // - datetime iTime = mTimes[i]; - - // - if (iTime == time) - { - // - index = i; - break; - } - } - - // - if (index <= -1) - { - return result; - } - - // - result = Get( - index); - - // - return result; - } - - // - // Retrieve All ... - void GetAll( - XCollector &result[], // Hold's Result - bool reversal = false // Extract Direction - ) - { - // - CleanBuffer(result); - - // - int timesCount = ArraySize(mTimes); - if (timesCount <= 0) - { - return; - } - - // - if (!reversal) - { - // - for (int i = 0; i < timesCount; i++) - { - // - XCollector iCollector = Get(i); - - // - AddItemToBuffer( - iCollector, - result); - } - } - else - { - // - for (int i = timesCount - 1; i >= 0; i--) - { - // - XCollector iCollector = Get(i); - - // - AddItemToBuffer( - iCollector, - result); - } - } - } - - // - // Extract History ... - void Extract( - XCollector &result[], // Hold's Result - int start, // Start Index - int end // End Index - ) - { - // - CleanBuffer(result); - - // - // Validate Args ... - if ( - end < 0 || - start < 0 || - (start == 0 && end == 0) || - MathAbs(start - end == 0)) - { - return; - } - - // - // Validate Start and End Index ... - bool isValidEnd = IsValidIndex(end); - bool isValidStart = IsValidIndex(start); - if (!isValidEnd || !isValidStart) - { - return; - } - - // - bool direction = end > start; - if (direction) - { - // - for (int i = start; i < end - 1; i++) - { - // - XCollector iCollect = Get(i); - - // - AddItemToBuffer( - iCollect, - result); - } - } - else - { - // - for (int i = end - 1; i >= start; i--) - { - // - XCollector iCollect = Get(i); - - // - AddItemToBuffer( - iCollect, - result); - } - } - } - - // - // Validate an Item ... - bool IsValid( - XCollector &item, // Specified Info - bool ignoreTime = true // Ignore Times Checking ... - ) - { - // - bool result = false; - - // - // Check Each Items contains Correct Value ... - // - result = item.volume >= 0; - if (!result) - { - return result; - } - - // - result = item.maxDrawDown >= 0; - if (!result) - { - return result; - } - - // - result = item.maxAllowedVolume >= 0; - if (!result) - { - return result; - } - - // - result = item.minBalanceForOpenTrade >= 0; - if (!result) - { - return result; - } - - // - // Check Time has Proper Value ... - result = item.time > 0; - if (!result) - { - return result; - } - - // - // Check time bigger than last Time ... - int timesCount = ArraySize(mTimes); - if ( - !ignoreTime && - timesCount >= 0) - { - // - // Retrieve Last Added Times ... - datetime lastTime; - result = GetLastItem(lastTime, mTimes); - if (!result) - { - return result; - } - - // - // Compare Last Time by current Time ... - result = item.time > lastTime; - if (!result) - { - return result; - } - } - - // - return result; - } - - // - // Generate Logging String Representation ... - string GenerateString( - XCollector &item, // Specified Info - string separator = "\n" // Separator Character - ) - { - // - string result = ""; - - // - result += "time: " + (string)item.time + separator; - result += "volume: " + (string)item.volume + separator; - result += "maxDrawDown: " + (string)item.maxDrawDown + separator; - result += "maxAllowedVolume: " + (string)item.maxAllowedVolume + separator; - result += "minBalanceForOpenTrade: " + (string)item.minBalanceForOpenTrade + separator; - - // - return result; - } - - // - // Protected ... -protected: - // - // Private ... -private: - // - // Max Draw Up touched till now ... - double mMaxDrawUp; - - // - // Max Draw Down touched till now ... - double mMaxDrawDown; - - // - // Last Time for Checks ... - datetime mTimes[]; - - // - // Volume at the Check Time ... - double mVolumes[]; - - // - // DrawDown for each Check ... - double mMaxDrawDowns[]; - - // - // Max Allowed Volume for each check ... - double mMaxAllowedVolumes[]; - - // - // Min Balance for Open Trades for Each Check ... - double mMinBalanceForTradePrices[]; - - // - // Reset ... - void Clean() - { - // - mMaxDrawUp = 0; - mMaxDrawDown = 0; - - // - CleanBuffer(mTimes); - CleanBuffer(mVolumes); - CleanBuffer(mMaxDrawDowns); - CleanBuffer(mMaxAllowedVolumes); - CleanBuffer(mMinBalanceForTradePrices); - } - - // - // Validate Index ... - bool IsValidIndex( - int index // Specified Index - ) - { - // - bool result = false; - - // - int bufferSize = ArraySize(mTimes); - if (bufferSize <= 0) - { - return result; - } - - // - result = index <= bufferSize - 1; - - // - return result; - } -}; - -// -// a Class for Managing Volumes ... -class XCVolumeManager : public XCBase -{ - // - // Public ... -public: - // - // Constructor ... - XCVolumeManager( - double staticVolumeRate, // Static Volume Calculation Mutiplier - ENUM_STATIC_VOLUME_METHODS volumeMethod = X_STATIC_VOLUME_BASED_ON_DEPOSIT, // How to Calculate Static Volume - double volumeMultiplier = 0, // Volume Multiplier - double volumeMultiplierAppliedRate = 0, // Apply Volume Multiplier when Balance Increased by this rate - double maxAllowedVolume = 0, // Max Allowed Volume - double increaseMaxAllowedVolumeRate = 0 // Increase Max Allowed Volumes when Balance Increased by this rate - ) - { - // - mAccountInfo = new XCAccountInfo(); - - // - ResetForceVolumeMultiplier(); - - // - mVolumeMethod = volumeMethod; - mStaticVoluemRate = staticVolumeRate; - mVolumeMultiplier = volumeMultiplier; - mMaxAllowedVolume = maxAllowedVolume; - mVolumeMultiplierAppliedRate = volumeMultiplierAppliedRate; - mIncreaseMaxAllowedVolumeRate = increaseMaxAllowedVolumeRate; - } - - // - // Deconstructor ... - ~XCVolumeManager(void) {} - - // - // Check Volume Multiplier ... - bool CanUseVolumeMultiplier() - { - // - bool result = false; - - // - result = - mVolumeMultiplier > 0 && - mVolumeMultiplierAppliedRate > 0; - - // - return result; - } - - // - // Check Max Volume ... - bool CanUseMaxVolume() - { - // - bool result = false; - - // - result = - mMaxAllowedVolume > 0; - - // - return result; - } - - // - // Calculate Volume for Position ... - double CalculateVolume( - int numberOfOpenPositions = 0, // Number Of Open Signals - string symbol = NULL // Specify Symbol - ) - { - // - double result = 0; - - // - // Normalize Symbol ... - if (StringLen(symbol) == 0) - { - symbol = _Symbol; - } - - // - // Static Volume ... - result = GetStaticVolume(); - - // - double multiplier = GetVolumeMultiplier(); - result *= multiplier; - - // - // Check Max Allowed Volume Exists ... - double maxAllowedVolume = GetMaxAllowedVolume(); - if (maxAllowedVolume > 0) - { - // - result = - result > maxAllowedVolume - ? maxAllowedVolume - : result; - } - - // - // Check Number of Open Positions ... - if (numberOfOpenPositions >= 0) - { - // - // Decrease Volume ... - result /= (1 + numberOfOpenPositions); - } - - // - // Apply Force Volume Multiplier ... - result *= mForceVolumeMultiplier; - - // - // Retrieve Symbol Volume Info ... - result = NormalizeVolume(result, symbol, 2); - - // - return result; - } - - // - // Calculate Volume Multiplier ... - double GetVolumeMultiplier() - { - // - double result = 1; - - // - double deposit = mAccountInfo.GetInitialBalance(); - double balance = mAccountInfo.GetBalance(); - bool canUseVolumeMultiplier = CanUseVolumeMultiplier(); - if ( - balance < deposit || - !canUseVolumeMultiplier) - { - return result; - } - - // - // Apply Multiplier to Volume ... - double baseGrowBalance = deposit * mVolumeMultiplierAppliedRate; - double balanceGrows = balance - deposit; - if (balanceGrows < baseGrowBalance) - { - return result; - } - - // - double applyMultiplierTimes = balanceGrows / baseGrowBalance; - double roundedApplyMultiplierTimes = MathRound(applyMultiplierTimes); - - // - if (applyMultiplierTimes < roundedApplyMultiplierTimes) - { - applyMultiplierTimes -= (1 - (roundedApplyMultiplierTimes - applyMultiplierTimes)); - } - - // - // Calculate result ... - result = applyMultiplierTimes * mVolumeMultiplier; - - // - return result; - } - - // - // Retrieve Required Balance Grows for Increase Max Allowed Volume ... - double GetIncreaseMaxAllowedVolumeBalance() - { - // - double result = 0; - - // - if ( - mMaxAllowedVolume <= 0 || - mIncreaseMaxAllowedVolumeRate <= 0) - { - return result; - } - - // - result = mAccountInfo.GetInitialBalance() * mIncreaseMaxAllowedVolumeRate; - - // - return result; - } - - // - // Calculate Max Allowed Volume ... - double GetMaxAllowedVolume() - { - // - double result = 0; - - // - // Validate Args ... - result = - mMaxAllowedVolume <= 0 - ? 0 - : mMaxAllowedVolume; - - // - double deposit = mAccountInfo.GetInitialBalance(); - double balance = mAccountInfo.GetBalance(); - bool canUseMaxAllowedVolume = CanUseMaxVolume(); - if ( - balance <= deposit || - !canUseMaxAllowedVolume || - mIncreaseMaxAllowedVolumeRate <= 0) - { - // - return result; - } - - // - // Apply Multiplier to Volume ... - double baseGrowBalance = GetIncreaseMaxAllowedVolumeBalance(); - double balanceGrows = balance - deposit; - if (balanceGrows < baseGrowBalance) - { - return result; - } - - // - double applyMultiplierTimes = balanceGrows / baseGrowBalance; - double roundedApplyMultiplierTimes = MathRound(applyMultiplierTimes); - - // - if (applyMultiplierTimes < roundedApplyMultiplierTimes) - { - applyMultiplierTimes -= (1 - (roundedApplyMultiplierTimes - applyMultiplierTimes)); - } - - // - result *= applyMultiplierTimes; - - // - return result; - } - - // - // Get Static Volume ... - double GetStaticVolume() - { - // - double result = 0; - - // - double deposit = mAccountInfo.GetInitialBalance(); - double balance = mAccountInfo.GetBalance(); - - // - switch (mVolumeMethod) - { - // - case X_STATIC_VOLUME_BASED_ON_DEPOSIT: - result = mStaticVoluemRate * deposit; - break; - - // - case X_STATIC_VOLUME_BASED_ON_BALANCE: - result = mStaticVoluemRate * balance; - break; - } - - // - return result; - } - - // - // Reset Froce Volume Multiplier ... - void ResetForceVolumeMultiplier() - { - mForceVolumeMultiplier = 1; - } - - // - // Retrieve Current Force Volume Multiplier ... - double GetCurrentForceVolumeMultiplier() - { - return mForceVolumeMultiplier; - } - - // - // Retrieve Next Increase Multiplier Price ... - double GetIncreaseMultiplierBalance() - { - return mAccountInfo.GetInitialBalance() * mVolumeMultiplierAppliedRate; - } - - // - // Change Force Volume Multiplier ... - void ChangeForceVolumeMultiplier( - double rate // Change rate - ) - { - // - // Normalize rate ... - if (rate <= 1) - { - rate = 1; - } - - // - mForceVolumeMultiplier = rate; - } - - // - // Increase Force Volume Multiplier ... - void IncreaseForceVolumeMultiplier() - { - mForceVolumeMultiplier += 0.5; - } - - // - // Decrease Force Volume Multiplier ... - void DecreaseForceVolumeMultiplier() - { - // - if (mForceVolumeMultiplier <= 1) - { - return; - } - - // - mForceVolumeMultiplier -= 0.5; - } - - // - // Generate Current State Log String ... - string GenerateStateString( - string separator = "\n" // Log Separator ... - ) - { - // - string result = ""; - - // - // Normallize Separator ... - if (StringLen(separator) == 0) - { - separator = "\n"; - } - - // - result += "ForceVolumeMultiplier: " + (string)mForceVolumeMultiplier + separator; - // - result += "StaticVoluemRate: " + (string)mStaticVoluemRate + separator; - result += "StaticVoluem: " + (string)GetStaticVolume() + separator; - result += "VolumeMethod: " + EnumToString(mVolumeMethod) + separator; - // - result += "VolumeMultiplier: " + (string)mVolumeMultiplier + separator; - result += "VolumeMultiplierAppliedRate: " + (string)mVolumeMultiplierAppliedRate + separator; - // - result += "MaxAllowedVolume: " + (string)mMaxAllowedVolume + separator; - result += "IncreaseMaxAllowedVolumeRate: " + (string)mIncreaseMaxAllowedVolumeRate + separator; - - // - return result; - } - - // - // Protected ... -protected: - // - // Private ... -private: - // - // an Instance of Account Info for reading Balance and Deposit and etc ... - XCAccountInfo mAccountInfo; - - // - // Force Volume Rate Multiplier ... - double mForceVolumeMultiplier; - - // - // Static Volume Calculation Mutiplier ... - double mStaticVoluemRate; - - // - // How to Calculate Static Volume ... - ENUM_STATIC_VOLUME_METHODS mVolumeMethod; - - // - // Volume Multiplier ... - double mVolumeMultiplier; - - // - // Apply Volume Multiplier when Balance Increased by this rate ... - double mVolumeMultiplierAppliedRate; - - // - // Max Allowed Volume - double mMaxAllowedVolume; - - // - // Increase Max Allowed Volumes when Balance Increased by this rate - double mIncreaseMaxAllowedVolumeRate; -}; - -// -// a Class For Managing Signals Additional Data ... -class XCSignalManager : public XCBase -{ - // - // Public ... -public: - // - // Constructor ... - XCSignalManager(void) - { - CleanData(); - } - - // - // Deconstructor ... - ~XCSignalManager(void) {} - - // - void Reset() - { - CleanData(); - } - - // - // Retrieve All Signals ... - void GetAll( - XSignal &result[] // Hold's Result - ) - { - // - CleanBuffer(result); - - // - int signalsCount = ArraySize(mSignals); - if (signalsCount <= 0) - { - return; - } - - // - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = mSignals[i]; - - // - AddItemToBuffer( - iSignal, - result); - } - } - - // - // Count Items ... - int Count() - { - return ArraySize(mSignals); - } - - // - // Retrieve Specific Signal by Ticket ... - XSignal Get( - ulong ticket // Signals Ticket ... - ) - { - // - XSignal result = {}; - - // - // Check Exists ... - bool isExists = IsExists(ticket); - if (!isExists) - { - return result; - } - - // - int signalsCount = ArraySize(mSignals); - if (signalsCount <= 0) - { - return result; - } - - // - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = mSignals[i]; - - // - if (iSignal.ticket == ticket) - { - // - result = iSignal; - break; - } - } - - // - return result; - } - - // - // Check Signal Exists or not ... - bool IsExists( - ulong ticket // Specified Signal Ticket - ) - { - // - bool result = false; - - // - int signalsCount = ArraySize(mSignals); - if (signalsCount <= 0) - { - return result; - } - - // - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = mSignals[i]; - - // - if (iSignal.ticket == ticket) - { - // - result = true; - break; - } - } - - // - return result; - } - bool IsExists( - XSignal &signal // Specified Signal - ) - { - // - bool result = false; - - // - int signalsCount = ArraySize(mSignals); - if (signalsCount <= 0) - { - return result; - } - - // - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = mSignals[i]; - - // - if (iSignal.ticket == signal.ticket) - { - // - result = true; - break; - } - } - - // - return result; - } - - // - // Add Signal ... - bool Add( - XSignal &signal // Specified Signal - ) - { - // - bool result = false; - - // - // Validate Args ... - if (signal.ticket <= 0) - { - return result; - } - - // - // Chekc Signal Exists ... - bool isExists = IsExists(signal); - if (isExists) - { - return result; - } - - // - AddItemToBuffer( - signal, - mSignals); - result = true; - - // - return result; - } - - // - // Update Specific Buffer ... - bool Update( - XSignal &signal // Specified Signal - ) - { - // - bool result = false; - - // - // Validate Args ... - if (signal.ticket <= 0) - { - return result; - } - - // - // Chekc Signal Exists ... - bool isExists = IsExists(signal); - if (!isExists) - { - return result; - } - - // - // Remove Signal ... - Remove(signal); - - // - // Add new One ... - AddItemToBuffer( - signal, - mSignals); - - // - result = true; - - // - return result; - } - - // - // Remove Signal ... - bool Remove( - ulong ticket // Specified Signal Ticket - ) - { - // - bool result = false; - - // - // Check Signal Exists ... - bool isExists = IsExists(ticket); - if (!isExists) - { - return result; - } - - // - int signalsCount = ArraySize(mSignals); - if (signalsCount <= 0) - { - return result; - } - - // - XSignal signals[]; - - // - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = mSignals[i]; - - // - if (iSignal.ticket != ticket) - { - AddItemToBuffer( - iSignal, - signals); - } - } - - // - // Now we have to Clean All Signals and Replace them by signals[] buffer ... - UpdateData(signals); - - // - result = true; - return result; - } - bool Remove( - XSignal &signal // Specified Signal - ) - { - // - bool result = false; - - // - // Check Signal Exists ... - bool isExists = IsExists(signal); - if (!isExists) - { - return result; - } - - // - int signalsCount = ArraySize(mSignals); - if (signalsCount <= 0) - { - return result; - } - - // - XSignal signals[]; - - // - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = mSignals[i]; - - // - if (iSignal.ticket != signal.ticket) - { - AddItemToBuffer( - iSignal, - signals); - } - } - - // - // Now we have to Clean All Signals and Replace them by signals[] buffer ... - UpdateData(signals); - - // - result = true; - return result; - } - - // - // Add Or Update ... - bool AddOrUpdate( - XSignal &signal // Specified Signal - ) - { - // - bool result = false; - - // - // Validate Args ... - if (signal.ticket <= 0) - { - return result; - } - - // - // Chekc Signal Exists ... - bool isExists = IsExists(signal); - if (!isExists) - { - result = Add(signal); - } - else - { - result = Update(signal); - } - - // - return result; - } - - // - // Protected ... -protected: - // - // Private ... -private: - // - // Holds Signals ... - XSignal mSignals[]; - - // - // Clean All Exists Data ... - void CleanData() - { - CleanBuffer(mSignals); - } - - // - // Update Data ... - void UpdateData( - XSignal &source[] // a Buffer which needs to Replace ... - ) - { - // - CleanData(); - - // - int sourceCount = ArraySize(source); - if (sourceCount <= 0) - { - return; - } - - // - for (int i = 0; i < sourceCount; i++) - { - // - XSignal iSignal = source[i]; - - // - AddItemToBuffer( - iSignal, - mSignals); - } - } -}; - -// -// XSaherElm Trade Class ... -class XCTrade : public XCBase -{ - // - // all public features ... -public: - // - // Constructor ... - void XCTrade( - string tag, // Specify a Tag for Trader instance - string symbol, // Specify Trader Symbol - int slippage, // Specify Slippage - ulong magicNumber, // Specify Magic Number - bool useVirtualTPSL, // Use Virtual TP SL - int maxAllowedTrades, // Specify Max Allowed Trades - double minBallanceForOpenTrades, // Specify Minimum Balance for Open Trades - double minAllowedFreeMarginForOpenTrades, // Specify Minimum Free Marging for Open Trades - bool useSignalProtector = true // Specify Use Signal Protector or not - ) - { - // - mTag = tag; - mSymbol = symbol; - mSlippage = slippage; - mMagicNumber = magicNumber; - mUseVirtualTPSL = useVirtualTPSL; - mMaxAllowedTrades = maxAllowedTrades; - mMinBallanceForOpenTrades = minBallanceForOpenTrades; - mMinAllowedFreeMarginForOpenTrades = minAllowedFreeMarginForOpenTrades; - - // - mTrader = new XSCTrade(); - - // - mTrader.SetAsyncMode(false); - mTrader.SetDeviationInPoints(mSlippage); - mTrader.SetExpertMagicNumber(mMagicNumber); - - // - // Setting Log Level ... - mTrader.LogLevel(LOG_LEVEL_ERRORS); - - // - mSignalManager = new XCSignalManager(); - - // - Reset(); - } - - // - // Deconstructor ... - void ~XCTrade() - { - } - - // - // START Configuring Class Functions ... - // - - // - // Reset all Variables ... - void Reset() - { - // - mSignalManager.Reset(); - - // - mDaysForRead = 1; - mScanStarted = false; - - // - // Reset On Trade Counter ... - ResetOnTradeContext(); - - // - // Init On Trade Context ... - InitOnTradeContext(); - } - - // - // END Configuring Class Functions ... - // - - // - // START Count ... - // - - // - // Count Open Positions ... - int Count() - { - // - int result = 0; - - // - int total = PositionsTotal(); - for (int i = 0; i < total; i++) - { - // - if (!mPositionInfo.SelectByIndex(i)) - { - continue; - } - - // - if (mPositionInfo.Magic() != mMagicNumber) - { - continue; - } - - // - if (mPositionInfo.Symbol() != mSymbol) - { - continue; - } - - // - result++; - } - - // - return result; - } - - // - // Count Longs ... - int CountLongs() - { - int result = CountByType(X_SIGNAL_LONG); - return result; - } - - // - // Count Shorts ... - int CountShorts() - { - int result = CountByType(X_SIGNAL_SHORT); - return result; - } - - // - // Count Specific Type Of Positions ... - int CountByType(ENUM_POSITION_TYPE type) - { - // - int result = 0; - - // - int total = PositionsTotal(); - for (int i = 0; i < total; i++) - { - // - if (!mPositionInfo.SelectByIndex(i)) - { - continue; - } - - // - if (mPositionInfo.Symbol() != mSymbol) - { - continue; - } - - // - if (mPositionInfo.PositionType() != type) - { - continue; - } - - // - result++; - } - - // - return result; - } - - // - // Count By Type ... - int CountByType(ENUM_X_SIGNAL_TYPE type) - { - // - // Validate Args ... - ENUM_POSITION_TYPE mType = POSITION_TYPE_BUY; - if (type == X_SIGNAL_LONG) - { - mType = POSITION_TYPE_BUY; - } - else if (type == X_SIGNAL_SHORT) - { - mType = POSITION_TYPE_SELL; - } - - // - int result = CountByType(mType); - return result; - } - - // - // END Count ... - // - - // - // START Retrieve ... - // - - // - // Retrieve Specified Position by it's Ticket ... - XSignal GetSignal( - ulong ticket // Specified Ticket - ) - { - // - XSignal result = {}; - - // - result = PositionToSignal(ticket); - - // - return result; - } - - // - // Get Last Signal ... - XSignal GetLastSignal() - { - // - XSignal result = {}; - - // - XSignal signals[]; - GetSignals(signals); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return result; - } - - // - result = signals[0]; - - // - return result; - } - - // - // Retrieve Last Executed Signal ... - bool GetLastSignal(XSignal &signal) - { - // - bool result = false; - - // - XSignal signals[]; - GetSignals(signals); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return result; - } - - // - signal = signals[0]; - result = true; - - // - return result; - } - - // - // Retrieve All Positions ... - void GetSignals( - XSignal &result[] // Holds Result ... - ) - { - // - CleanBuffer(result); - - // - int totalPositions = PositionsTotal(); - for (int i = 0; i < totalPositions; i++) - { - // - if (!mPositionInfo.SelectByIndex(i)) - { - continue; - } - - // - if (mPositionInfo.Magic() != mMagicNumber) - { - continue; - } - - // - if (mPositionInfo.Symbol() != mSymbol) - { - continue; - } - - // - // Position to Signal ... - XSignal signal = PositionToSignal(i); - Add( - signal, - result); - } - } - - // - // Retrieve Type Specific Signals ... - void GetSignals( - XSignal &result[], // Holds Result ... - ENUM_X_SIGNAL_TYPE type // Specified Sginal Type ... - ) - { - // - CleanBuffer(result); - - // - XSignal signals[]; - GetSignals(signals); - - // - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return; - } - - // - // Loop ... - for (int i = signalsCount - 1; i >= 0; i--) - { - // - XSignal iSignal = signals[i]; - - // - if (type == X_SIGNAL_UNKNOWN) - { - Add( - iSignal, - result); - } - else if (iSignal.type == type) - { - Add( - iSignal, - result); - } - } - } - - // - // Filter Signals By Searching Comments ... - void FilterSignals( - XSignal &result[], // Holds Result ... - const string query, // Search in Comment Qeury ... - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specified Sginal Type ... - ) - { - // - CleanBuffer(result); - - // - XSignal signals[]; - GetSignals( - signals, - type); - int signalsCount = ArraySize(signals); - - // - // Validate Args ... - if ( - StringLen(query) <= 0 || - signalsCount <= 0) - { - return; - } - - // - // Loop ... - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - int queryPos = StringFind( - iSignal.comment, - query); - bool isContains = queryPos > -1; - if (!isContains) - { - continue; - } - - // - Add( - iSignal, - result); - } - } - - // - // Get All Trades Which Candle Passed after Open ... - void GetOldSignals( - XSignal &result[], // Holds Result - int life, // Max Candle Passed after Trades Open - ENUM_TIMEFRAMES period = NULL, // Calculate Candles based on time frame - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions - ) - { - // - CleanBuffer(result); - - // - // Normalize Period ... - if (period == NULL) - { - period = _Period; - } - - // - XSignal signals[]; - GetSignals( - signals, - type); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return; - } - - // - // Current Time Frame Candle Index ... - int currentBarIndex = 0; - - // - // Loop through Positions ... - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - // Retrieve Trade Open Bar Index based on Current Period ... - int tradeOpenBarIndex = iBarShift( - mSymbol, - period, - iSignal.time); - - // - // Calculate Trade Life ... - int diff = MathAbs(currentBarIndex - tradeOpenBarIndex); - - // - bool isPassed = diff >= life; - if (isPassed) - { - // - Add( - iSignal, - result); - } - } - } - - // - // Get In Profit Signals ... - void GetInProfitSignals( - XSignal &result[], // Holds Result - double minProfit = 0, // Minimum Profit To Close Trades - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions - ) - { - // - CleanBuffer(result); - - // - XSignal signals[]; - GetSignals( - signals, - type); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return; - } - - // - // Loop ... - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - bool isPassed = minProfit <= 0 && iSignal.profit > 0 - ? true - : iSignal.profit >= minProfit; - if (isPassed) - { - Add( - iSignal, - result); - } - } - } - - // - // Get In Drawdown Signals ... - void GetInDrawdownSignals( - XSignal &result[], // Holds Result - double maxDrawDown = 0, // Minimum Profit To Close Trades - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions - ) - { - // - CleanBuffer(result); - - // - XSignal signals[]; - GetSignals( - signals, - type); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return; - } - - // - // Loop ... - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - bool isPassed = maxDrawDown <= 0 && iSignal.profit < 0 - ? true - : iSignal.profit >= (-1 * maxDrawDown); - if (isPassed) - { - Add( - iSignal, - result); - } - } - } - - // - // Retrieve Max In Draw Down Trade ... - XSignal GetMaxInDrawdownSignal( - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions - ) - { - // - XSignal result = {}; - - // - XSignal signals[]; - GetInDrawdownSignals( - signals, - 0, - type); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return result; - } - - // - // Loop ... - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - result = - (result.ticket <= 0 && - result.profit == 0) || - result.profit > iSignal.profit - ? iSignal - : result; - } - - // - return result; - } - - // - // Calculate Profits Of all Open Signals ... - double GetSignalsProfit( - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions - ) - { - // - double result = 0; - - // - XSignal signals[]; - GetSignals(signals, type); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return result; - } - - // - // Loop ... - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - result += iSignal.profit; - } - - // - return result; - } - - // - // END Retrieve ... - // - - // - // START Signal Execution Actions ... - // - - // - // Execute a Signal in Market ... - ENUM_EXECUTION_SIGNAL_RESULT ExecuteSignal( - XSignal &signal, // Specified Signal - bool ignoreNumberOfTraes = false, // Ignore Number of Trades - bool checkAccountConditions = true // Check Account Balance, Equity and Free Margin for Signal Execution - ) - { - // - ENUM_EXECUTION_SIGNAL_RESULT result = X_TRADER_UNKNOWN_ERROR; - - // - // Validate Signal ... - bool isValid = IsValidSignal(signal); - if (!isValid) - { - // - result = X_TRADER_INVALID_SIGNAL_ERROR; - return result; - } - - // - // Check Account Equity ... - bool isEquityPassed = !checkAccountConditions - ? true - : IsEquityReadyForTrade(); - if (!isEquityPassed) - { - // - result = X_TRADER_NOT_ENOUGH_EQUITY_ERROR; - return result; - } - - // - // Check Account Balance ... - bool isBalancePassed = !checkAccountConditions - ? true - : IsBalanceReadyForTrade(); - if (!isBalancePassed) - { - // - result = X_TRADER_NOT_ENOUGH_BALANCE_ERROR; - return result; - } - - // - // Check Account FreeMargin ... - bool isFreeMarginPassed = !checkAccountConditions - ? true - : IsFreeMarginReadyForTrade(); - if (!isFreeMarginPassed) - { - // - result = X_TRADER_NOT_ENOUGH_MARIGIN_ERROR; - return result; - } - - // - // Check Number of Open Trades ... - int openTradesCount = Count(); - bool isTradeCountPassed = ignoreNumberOfTraes - ? true - : openTradesCount < mMaxAllowedTrades; - if (!isTradeCountPassed) - { - // - result = X_TRADER_MAX_TRADES_REACHED_ERROR; - return result; - } - - // - bool isExecuted = - signal.type == X_SIGNAL_LONG - ? Buy( - signal.volume, - signal.entry, - mUseVirtualTPSL - ? 0 - : signal.sl, - mUseVirtualTPSL - ? 0 - : signal.tp, - signal.comment) - : signal.type == X_SIGNAL_SHORT - ? Sell( - signal.volume, - signal.entry, - mUseVirtualTPSL - ? 0 - : signal.sl, - mUseVirtualTPSL - ? 0 - : signal.tp, - signal.comment) - : false; - if (isExecuted) - { - // - ulong ticket = PositionGetTicket(PositionsTotal() - 1); - - // - signal.id = ticket; - signal.ticket = ticket; - - // - AddOrUpdateSignalInfo(signal); - - // - result = X_TRADER_SUCCEED_EXECUTION; - } - - // - return result; - } - - // - // This Function, Handling Following Works on Open Positions: - // - Close On SL if Reached ... - // - Close On TP if Reached ... - // - Make Risk Free Trades ... - bool HandleSignals( - XTraderHandlerResult &handlerResult, // Holds Result - bool ignoreRiskFree = false // Ignore Risk Free Trdaes - ) - { - // - bool result = false; - - // - // Cleanup Result ... - CleanBuffer(handlerResult.sl); - CleanBuffer(handlerResult.tp); - CleanBuffer(handlerResult.rf); - - // - // Reading Open Positions ... - XSignal signals[]; - GetSignals(signals); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return result; - } - - // - double deviation = mSlippage * GetPoints(mSymbol); - - // - // Loop ... - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - bool isLong = iSignal.type == X_SIGNAL_LONG; - double entry = GetEntry(iSignal.symbol, iSignal.type); - double exit = GetExit(iSignal.symbol, iSignal.type); - double spread = GetSpread(iSignal.symbol); - double appliedTPPrice = - iSignal.tp > 0 - ? isLong - ? iSignal.tp - deviation - : iSignal.tp + deviation - : 0; - double appliedSLPrice = - iSignal.sl > 0 - ? isLong - ? iSignal.sl + deviation - : iSignal.sl - deviation - : 0; - - // - double usedPrice = exit; - - // - bool isSLTouched = - isLong - ? usedPrice <= appliedSLPrice - : usedPrice >= appliedSLPrice; - - // - bool isTPTouched = - isLong - ? usedPrice >= appliedTPPrice - : usedPrice <= appliedTPPrice; - - // - // Handle SL ... - if ( - // - iSignal.sl > 0 - // - && - // - isSLTouched - // - && - // - mUseVirtualTPSL) - { - // - string comment = GenerateSignalSLComment(iSignal); - - // - bool isClosed = Close( - iSignal.ticket, - comment); - if (isClosed) - { - AddItemToBuffer( - iSignal, - handlerResult.sl); - } - } - - // - // Handle TP ... - if ( - // - iSignal.tp > 0 - // - && - // - isTPTouched - // - && - // - mUseVirtualTPSL) - { - // - string comment = GenerateSignalTPComment(iSignal); - - // - bool isClosed = Close( - iSignal.ticket, - comment); - if (isClosed) - { - AddItemToBuffer( - iSignal, - handlerResult.tp); - } - } - - // - // Handle Risk Free ... - if ( - // - !ignoreRiskFree - // - && - // - iSignal.riskFreeStep > 0 - // - && - // - iSignal.riskFreeRate > 0 - // - ) - { - // - // Make Signals Risk Free Only if Signal In Profit ... - if (iSignal.profit <= 0) - { - continue; - } - - // - // Base Price is ENTRY, then Last Level, in each level SL is Last Level ... - // - // Calculate Risk Free Level/Multiplier ... - double level = 0; - double roundedLevel = 0; - double rStepPrice = PipsToPrice(iSignal.riskFreeStep); - double rBasePrice = - iSignal.sl > 0 && - iSignal.sl > iSignal.entry - ? iSignal.sl - : iSignal.entry; - - // - double exit = GetExit(iSignal.type); - - // - // Check Base Price for Signal reached with Exit Price ... - bool isExitPriceReachedBasePrice = - isLong - ? exit > rBasePrice - : exit < rBasePrice; - if (!isExitPriceReachedBasePrice) - { - continue; - } - - // - // Calculate Risk Free Step Multiplier ... - level = MathAbs(exit - rBasePrice) / rStepPrice; - - // - // Check Level Must Bigger than 1 ... - if (level < 1) - { - continue; - } - - // - // Normalize Level ... - roundedLevel = MathRound(level); - if (level < roundedLevel) - { - level -= (1 - (roundedLevel - level)); - } - else if (level > roundedLevel) - { - level -= (level - roundedLevel); - } - - // - // Generate Comment ... - string comment = GenerateSignalRFComment(iSignal, (int)level); - - // - // Calculate SL ... - double slDistance = spread; - double sl = - isLong - ? exit - slDistance - : exit + slDistance; - - // - // Increase TP One Level if Exists ... - double tp = iSignal.tp; - if (iSignal.tp > 0 && (isLong - ? iSignal.tp < rBasePrice + rStepPrice - : iSignal.tp > rBasePrice - rStepPrice)) - { - // - tp = - isLong - ? iSignal.tp + rStepPrice - : iSignal.tp - rStepPrice; - } - - // - double rVolume = NormalizeVolume((iSignal.volume * iSignal.riskFreeRate), iSignal.symbol); - - // - // Update Signal Volume ... - double volume = iSignal.volume - rVolume; - - // - bool isClosedPartial = - ClosePartial( - iSignal.ticket, - rVolume, - comment); - if (isClosedPartial) - { - // - bool isModified = true; - if (!mUseVirtualTPSL) - { - // - isModified = Modify( - iSignal.ticket, - sl, - tp, - comment); - } - - // - if (isModified) - { - // - // Try to Update Signal ... - XSignal s = mSignalManager.Get(iSignal.ticket); - - // - // Apply Changes on Signal ... - s.sl = sl; - s.tp = tp; - s.volume = volume; - - // - // Update Signal ... - bool isUpdated = false; - bool isRemoved = false; - if (volume == 0) - { - isRemoved = mSignalManager.Remove(s); - } - else if (volume > 0) - { - isUpdated = mSignalManager.AddOrUpdate(s); - } - if ( - isUpdated || - isRemoved) - { - // - AddItemToBuffer( - s, - handlerResult.rf); - } - } - } - else - { - mSignalManager.Remove(iSignal.ticket); - } - } - } - - // - result = - ArraySize(handlerResult.tp) > 0 || - ArraySize(handlerResult.sl) > 0 || - ArraySize(handlerResult.rf) > 0; - - // - return result; - } - - // - // Close All Trades ... - void CloseSignals( - XSignal &result[], // Holds Result - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions - ) - { - // - CleanBuffer(result); - - // - XSignal signals[]; - GetSignals( - signals, - type); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return; - } - - // - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - string comment = GenerateSignalForceCloseComment(iSignal); - - // - bool isClosed = Close( - iSignal.ticket, - comment); - if (isClosed) - { - Add( - iSignal, - result); - } - } - } - - // - // Close Pyramid Signals ... - void CloseInPyramidSignals( - XSignal &result[], // Holds Result - double pyramid = 0, // Close Pyramid Profit - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions - ) - { - // - CleanBuffer(result); - - // - XSignal signals[]; - GetSignals( - signals, - type); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return; - } - - // - double profit = 0; - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - profit += iSignal.profit; - } - - // - // Normalize Pyramid ... - if (pyramid < 0) - { - pyramid = 0; - } - - // - if (profit > pyramid) - { - CloseSignals(result); - } - } - - // - // Close All Trades Which Candle Passed after Open ... - void CloseOldSignals( - XSignal &result[], // Holds Result - int life, // Max Candle Passed after Trades Open - ENUM_TIMEFRAMES period = NULL, // Calculate Candles based on time frame - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions - ) - { - // - CleanBuffer(result); - - // - XSignal signals[]; - GetOldSignals( - signals, - life, - period, - type); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return; - } - - // - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - string comment = GenerateSignalAgeComment(iSignal); - - // - bool isClosed = Close( - iSignal.ticket, - comment); - if (isClosed) - { - Add( - iSignal, - result); - } - } - } - - // - // Close In Profit Signals ... - void CloseInProfitSignals( - XSignal &result[], // Holds Result - double minProfit = 0, // Minimum Profit To Close Trades - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions - ) - { - // - CleanBuffer(result); - - // - XSignal signals[]; - GetInProfitSignals( - signals, - minProfit, - type); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return; - } - - // - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - string comment = GenerateSignalProfitComment(iSignal); - - // - bool isClosed = Close( - iSignal.ticket, - comment); - if (isClosed) - { - Add( - iSignal, - result); - } - } - } - - // - // Close In Drawdown Signals ... - void CloseInDrawdownSignals( - XSignal &result[], // Holds Result - double maxDrawDown = 0, // Minimum Profit To Close Trades - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Specify Type of Positions - ) - { - // - CleanBuffer(result); - - // - XSignal signals[]; - GetInDrawdownSignals( - signals, - maxDrawDown, - type); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return; - } - - // - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - string comment = GenerateSignalProfitComment(iSignal); - - // - bool isClosed = Close( - iSignal.ticket, - comment); - if (isClosed) - { - Add( - iSignal, - result); - } - } - } - - // - // END Signal Execution Actions ... - // - - // - // START Actions ... - // - - // - // Force Open a Buy/Long Position ... - bool Buy( - double volume, // position volume - double price, // execution price - double sl = 0, // stop loss price - double tp = 0, // take profit price - const string comment = "" // comment - ) - { - // - bool result = false; - - // - result = mTrader.Buy( - volume, - mSymbol, - price, - sl, - tp, - comment); - - // - return result; - } - - // - // Send BUY LIMIT order ... - bool BuyLimit( - double volume, // order volume - double price, // order price - double sl = 0.0, // stop loss price - double tp = 0.0, // take profit price - ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime - datetime expiration = 0, // order expiration time - string comment = "" // comment - ) - { - // - bool result = false; - - // - result = mTrader.BuyLimit( - volume, - price, - mSymbol, - sl, - tp, - typeTime, - expiration, - comment); - - // - return result; - } - - // - // Send BUY STOP order ... - bool BuyStop( - double volume, // order volume - double price, // order price - double sl = 0.0, // stop loss price - double tp = 0.0, // take profit price - ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime - datetime expiration = 0, // order expiration time - string comment = "" // comment - ) - { - // - bool result = false; - - // - result = mTrader.BuyStop( - volume, - price, - mSymbol, - sl, - tp, - typeTime, - expiration, - comment); - - // - return result; - } - - // - // Force Open a Sell/Short Position ... - bool Sell( - double volume, // position volume - double price, // execution price - double sl = 0, // stop loss price - double tp = 0, // take profit price - const string comment = "" // comment - ) - { - // - bool result = false; - - // - result = mTrader.Sell( - volume, - mSymbol, - price, - sl, - tp, - comment); - - // - return result; - } - - // - // Send SELL LIMIT order ... - bool SellLimit( - double volume, // order volume - double price, // order price - double sl = 0.0, // stop loss price - double tp = 0.0, // take profit price - ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime - datetime expiration = 0, // order expiration time - string comment = "" // comment - ) - { - // - bool result = false; - - // - result = mTrader.SellLimit( - volume, - price, - mSymbol, - sl, - tp, - typeTime, - expiration, - comment); - - // - return result; - } - - // - // Send SELL STOP order ... - bool SellStop( - double volume, // order volume - double price, // order price - double sl = 0.0, // stop loss price - double tp = 0.0, // take profit price - ENUM_ORDER_TYPE_TIME typeTime = ORDER_TIME_GTC, // order lifetime - datetime expiration = 0, // order expiration time - string comment = "" // comment - ) - { - // - bool result = false; - - // - result = mTrader.SellStop( - volume, - price, - mSymbol, - sl, - tp, - typeTime, - expiration, - comment); - - // - return result; - } - - // - // Modify Position ... - bool Modify( - const ulong ticket, // position ticket - double sl = 0, // stop loss price - double tp = 0, // take profit - const string comment = "" // comment - ) - { - // - bool result = false; - - // - // Validate Args ... - if (tp <= 0 && sl <= 0) - { - result = false; - return result; - } - - // - result = mTrader.PositionModify( - ticket, - sl, - tp, - comment); - if (result) - { - // - if (mSignalManager.IsExists(ticket)) - { - // - XSignal signal = GetSignal(ticket); - - // - mSignalManager.Update(signal); - } - } - - // - return result; - } - - // - // Close Position By Ticket ... - bool Close( - ulong ticket, // Position Ticket - string comment = "" // Close Position By Specific Comment - ) - { - // - bool result = false; - - // - // Try to Select Position ... - if (!mPositionInfo.SelectByTicket(ticket)) - { - return result; - } - - // - // Close Position By Specific Comment ... - result = mTrader.PositionClose( - ticket, - mSlippage, - comment); - if (result) - { - // - if (mSignalManager.IsExists(ticket)) - { - mSignalManager.Remove(ticket); - } - } - - // - return result; - } - - // - // Close Partial By Ticket ... - bool ClosePartial( - ulong ticket, // Position Ticket - double volume, // Volume Size for Partial Closing - string comment = "" // Close Position By Specific Comment - ) - { - // - bool result = false; - - // - if (!mPositionInfo.SelectByTicket(ticket)) - { - return result; - } - - // - result = mTrader.PositionClosePartial( - ticket, - volume, - mSlippage, - comment); - if (result) - { - // - if (mSignalManager.IsExists(ticket)) - { - // - XSignal signal = GetSignal(ticket); - - // - mSignalManager.Update(signal); - } - } - - // - return result; - } - - // - // END Actions ... - // - - // - // START Account Related ... - // - - // - // Retrieve Minimum Balance For Open Trades ... - double GetMinBalanceForOpenTrades() - { - // - double result = mMinBallanceForOpenTrades; - - // - double balance = mAccountInfo.GetBalance(); - double deposit = mAccountInfo.GetInitialBalance(); - if (balance > deposit) - { - // - double rate = mMinBallanceForOpenTrades / deposit; - - // - double ratedBalance = balance * rate; - - // - result = MathMax(mMinBallanceForOpenTrades, ratedBalance); - } - - // - return result; - } - - // - // Check Account Has Minimum Balance For Trade ... - bool IsBalanceReadyForTrade() - { - // - bool result = false; - - // - double minBalance = GetMinBalanceForOpenTrades(); - result = mAccountInfo.GetBalance() >= minBalance; - - // - return result; - } - - // - // Check Free Margin Has Enough For Trade ... - bool IsFreeMarginReadyForTrade() - { - // - bool result = false; - - // - double freeMargin = mAccountInfo.GetFreeMargin(); - - // - result = freeMargin >= mMinAllowedFreeMarginForOpenTrades; - - // - return result; - } - - // - // Check Equity Has Enough For Trade ... - bool IsEquityReadyForTrade() - { - // - bool result = false; - - // - double equity = mAccountInfo.GetEquity(); - - // - result = equity >= mMinAllowedFreeMarginForOpenTrades; - - // - return result; - } - - // - // END Account Related ... - // - - // - // START Signal Related ... - // - - // - // Validate Signal ... - bool IsValidSignal( - XSignal &signal // Specified Signal for Execution - ) - { - // - bool result = false; - - // - // Validate Signal Type ... - result = signal.type != X_SIGNAL_UNKNOWN; - if (!result) - { - return result; - } - - // - // Check Symbol ... - result = StringLen(signal.symbol) == 0 ? true : signal.symbol == mSymbol; - if (!result) - { - return result; - } - - // - // Check magic number ... - result = signal.magicNumber <= 0 ? true : signal.magicNumber == mMagicNumber; - if (!result) - { - return result; - } - - // - // Check Entry ... - result = signal.entry > 0; - if (!result) - { - return result; - } - - // // - // // Check SL ... - // // For Fix RiskFree Issues Ignore this ... - // result = signal.sl == 0 ? true : signal.type == X_SIGNAL_LONG ? signal.sl < signal.entry - // : signal.sl > signal.entry; - // if (!result) - // { - // return result; - // } - - // - // Check TP ... - result = signal.tp == 0 ? true : signal.type == X_SIGNAL_LONG ? signal.tp > signal.entry - : signal.tp < signal.entry; - if (!result) - { - return result; - } - - // - // Check Volume ... - result = signal.volume > 0; - if (!result) - { - return result; - } - - // - // Check Time ... - result = signal.time > 0; - if (!result) - { - return result; - } - - // - return result; - } - - // - // Get Signal InDirection (Reversal) Type ... - ENUM_X_SIGNAL_TYPE GetSignalIndirectionType( - XSignal &signal // Specified Signal - ) - { - // - ENUM_X_SIGNAL_TYPE result = X_SIGNAL_UNKNOWN; - - // - switch (signal.type) - { - // - case X_SIGNAL_LONG: - result = X_SIGNAL_SHORT; - break; - - // - case X_SIGNAL_SHORT: - result = X_SIGNAL_LONG; - break; - } - - // - return result; - } - - // - // Get Signal InDirection (Reversal) Type ... - ENUM_X_SIGNAL_TYPE GetIndirectionSignalType( - ENUM_X_SIGNAL_TYPE type // Specified Type - ) - { - // - ENUM_X_SIGNAL_TYPE result = X_SIGNAL_UNKNOWN; - - // - switch (type) - { - // - case X_SIGNAL_LONG: - result = X_SIGNAL_SHORT; - break; - - // - case X_SIGNAL_SHORT: - result = X_SIGNAL_LONG; - break; - } - - // - return result; - } - - // - // Calculate SignalAge ... - int GetSignalAge( - datetime time // Signal Execution Time - ) - { - // - int result = 0; - - // - // Validate Arg ... - if (time <= 0) - { - return result; - } - - // - int sIndex = iBarShift( - mSymbol, - _Period, - time); - - // - datetime cTime = iTime( - mSymbol, - _Period, - 0); - int cIndex = iBarShift( - mSymbol, - _Period, - cTime); - - // - result = MathAbs(cIndex - sIndex); - - // - return result; - } - int GetSignalAge( - datetime time, // Signal Execution Time - ENUM_TIMEFRAMES period // Specify Time Frame - ) - { - // - int result = 0; - - // - // Validate Arg ... - if (time <= 0) - { - return result; - } - - // - int sIndex = iBarShift( - mSymbol, - period, - time); - - // - datetime cTime = iTime( - mSymbol, - period, - 0); - int cIndex = iBarShift( - mSymbol, - _Period, - cTime); - - // - result = MathAbs(cIndex - sIndex); - - // - return result; - } - int GetSignalAge( - XSignal &signal // Specified Signal - ) - { - // - int result = 0; - - // - // Validate Arg ... - if ( - signal.time <= 0 || - !IsValid(signal, mMagicNumber)) - { - return result; - } - - // - result = GetSignalAge(signal.time); - - // - return result; - } - int GetSignalAge( - XSignal &signal, // Specify Signal - ENUM_TIMEFRAMES period // Specify Time Frame - ) - { - // - int result = 0; - - // - // Validate Arg ... - if ( - signal.time <= 0 || - !IsValid(signal, mMagicNumber)) - { - return result; - } - - // - result = GetSignalAge( - signal.time, - period); - - // - return result; - } - - // - // Prepare a Signall ... - XSignal GenerateSignal( - ENUM_X_SIGNAL_TYPE type, // Signal Type - double tp = 0, // Take Profit - double sl = 0, // Stop Loss - double volume = 0, // Volume - double riskFreeStep = 0, // Risk Free Step Price - double riskFreeRate = 0 // Risk Free Rate - ) - { - // - XSignal result = {}; - - // - // Validate Arg ... - if (type == X_SIGNAL_UNKNOWN) - { - return result; - } - - // - // Check Signal Type ... - bool isLong = type == X_SIGNAL_LONG; - - // - // Retrieve entry Price ... - double entry = GetEntry(mSymbol, type); - double spread = GetSpread(mSymbol); - - // - result.tp = tp; - result.sl = sl; - result.type = type; - result.entry = entry; - result.symbol = mSymbol; - result.magicNumber = mMagicNumber; - result.riskFreeStep = riskFreeStep; - result.riskFreeRate = riskFreeRate; - result.time = iTime(mSymbol, _Period, 0); - result.volume = NormalizeVolume(volume, mSymbol); - - // - // Since we Use signal instance to Generate Comment, this must be at the end ... - result.comment = GenerateSignalComment(result); - - // - return result; - } - - // - // Convert a Signal to String Representation ... - string ToString( - XSignal &signal // Specified Signal - ) - { - // - string result = ""; - - // - if (!IsValid(signal, mMagicNumber) || signal.ticket <= 0) - { - return result; - } - - // - // TICKET ... - // it is very importants since they hold position info ... - result += X_SIGNAL_TICKET + "(" + (string)signal.ticket + ")"; - - // - // TYPE ... - string typeStr = GetSignalType(signal.type); - result += "_" + X_SIGNAL_TYPE + "(" + typeStr + ")"; - - // - // TP ... - result += "_" + X_SIGNAL_TP + "(" + (string)signal.tp + ")"; - - // - // SL ... - result += "_" + X_SIGNAL_SL + "(" + (string)signal.sl + ")"; - - // - // RFS ... - result += "_" + X_SIGNAL_RISKFREE_STEP + "(" + (string)signal.riskFreeStep + ")"; - - // - // RFR ... - result += "_" + X_SIGNAL_RISKFREE_RATE + "(" + (string)signal.riskFreeRate + ")"; - - // - return result; - } - - // - // Generate Comments for Specific Signal ... - string GenerateSignalComment( - ENUM_X_SIGNAL_TYPE type, // Specify Kind Signal Type - double volume, // Signal Volume - bool isCrossSignal = false // Specify Signal Cross - ) - { - // - string result = ""; - - // - string typeStr = GetSignalType(type); - if ( - volume <= 0 || - StringLen(typeStr) == 0) - { - return result; - } - - // - volume = NormalizeVolume(volume, mSymbol); - - // - result = mTag + (!isCrossSignal ? "" : "_Cross_") + "_" + typeStr; - - // - return result; - } - string GenerateSignalComment( - XSignal &signal, // Specified Signal - bool isCrossSignal = false // Specify Signal Cross - ) - { - // - string result = GenerateSignalComment( - signal.type, - signal.volume, - isCrossSignal - // - ); - - // - return result; - } - - // - // Generate Signal RF TP Comment ... - string GenerateSignalRFComment( - XSignal &signal, // Specified Signal - int level // Which Step of RFS - ) - { - // - string result = ""; - - // - // Validate Signal and it's Ticket ... - if (!IsValidSignal(signal) || signal.ticket <= 0) - { - return result; - } - - // - double exit = NormalizePrice(GetExit(signal.symbol, signal.type), signal.symbol); - - // - string prefix = X_SIGNAL_RISKFREE_STEP + "(" + (string)signal.ticket + ")"; - // - result = - // - level > 0 - ? prefix + "_" + (string)level + ": " + (string)exit - : prefix + ": " + (string)exit; - // - ; - - // - return result; - } - - // - // Generate Signal TP Comment ... - string GenerateSignalTPComment( - XSignal &signal // Specified Signal - ) - { - // - string result = ""; - - // - // Validate Signal and it's Ticket ... - if (!IsValidSignal(signal) || signal.ticket <= 0) - { - return result; - } - - // - double exit = NormalizePrice(GetExit(signal.symbol, signal.type), signal.symbol); - - // - result = - // - X_SIGNAL_TP + "(" + (string)signal.ticket + "): " + (string)exit; - // - ; - - // - return result; - } - - // - // Generate Signal SL Comment ... - string GenerateSignalSLComment( - XSignal &signal // Specified Signal - ) - { - // - string result = ""; - - // - // Validate Signal and it's Ticket ... - if (!IsValidSignal(signal) || signal.ticket <= 0) - { - return result; - } - - // - double exit = NormalizePrice(GetExit(signal.symbol, signal.type), signal.symbol); - - // - result = - // - X_SIGNAL_SL + "(" + (string)signal.ticket + "): " + (string)exit; - // - ; - - // - return result; - } - - // - // Generate Signal Profit Comment ... - string GenerateSignalProfitComment( - XSignal &signal // Specified Signal - ) - { - // - string result = ""; - - // - // Validate Signal and it's Ticket ... - if (!IsValidSignal(signal) || signal.ticket <= 0) - { - return result; - } - - // - result = - // - "Profit(" + (string)signal.ticket + "): " + (string)signal.profit; - // - ; - - // - return result; - } - - // - // Generate Signal Force Close Comment ... - string GenerateSignalForceCloseComment( - XSignal &signal // Specified Signal - ) - { - // - string result = ""; - - // - // Validate Signal and it's Ticket ... - if (!IsValidSignal(signal) || signal.ticket <= 0) - { - return result; - } - - // - result = - // - "FC(" + (string)signal.ticket + "): " + (string)signal.profit; - // - ; - - // - return result; - } - - // - // Generate Signal Age Comment ... - string GenerateSignalAgeComment( - XSignal &signal // Specified Signal - ) - { - // - string result = ""; - - // - // Validate Signal and it's Ticket ... - if (!IsValidSignal(signal) || signal.ticket <= 0) - { - return result; - } - - // - int age = GetSignalAge(signal); - - // - result = - // - "(" + (string)signal.ticket + ") A: " + (string)age + ", P:" + (string)signal.profit; - // - ; - - // - return result; - } - - // - // Generate a Signal Object name for Draw Events On Chart ... - string GenerateSignalObjectName( - ulong ticket // Specify Ticket - ) - { - // - string result = ""; - - // - // Validate Arg ... - if (ticket <= 0) - { - return result; - } - - // - // TICKET ... - // it is very importants since they hold position info ... - result += "T(" + (string)ticket + ")"; - - // - return result; - } - string GenerateSignalObjectName( - XSignal &signal // Specified Signal - ) - { - // - string result = ""; - - // - // Validate Arg ... - if (!IsValid(signal, mMagicNumber)) - { - return result; - } - - // - result = GenerateSignalObjectName(signal.ticket); - - // - return result; - } - - // - // Genrate a Signal Event Object Name ... - string GenerateSignalEventObjectName( - ulong ticket // Specify Ticket - ) - { - // - string result = ""; - - // - result = GenerateSignalObjectName(ticket) + "_Event"; - - // - return result; - } - string GenerateSignalEventObjectName( - XSignal &signal // Specified Signal - ) - { - // - string result = ""; - - // - result = GenerateSignalEventObjectName(signal.ticket); - - // - return result; - } - - // - // END Signal Related ... - // - - // - // START Deals ... - // - - // - // Count Deals ... - int DealsCount( - datetime start = -1, // Start Date - datetime end = -1 // End Date - ) - { - // - int result = 0; - - // - XDeal deals[]; - GetDeals( - deals, - start, - end); - result = ArraySize(deals); - - // - return result; - } - - // - // Retrieve All Deals ... - void GetDeals( - XDeal &result[], // Hold's Result - datetime start = -1, // Start Date - datetime end = -1 // End Date - ) - { - // - CleanBuffer(result); - - // - // Select History if Start and End date provided ... - if (start > -1) - { - // - // Normalize End date ... - if (end == -1) - { - end = TimeCurrent(); - } - - // - bool isSelect = HistorySelect(start, end); - if (!isSelect) - { - return; - } - } - - // - int total = HistoryDealsTotal(); - if (total <= 0) - { - return; - } - - // - // Loop ... - for (int i = total - 1; i >= 0; i--) - { - // - // Select by Index ... - bool isSelect = mDealInfo.SelectByIndex(i); - if (!isSelect) - { - continue; - } - - // - // Check Magic ... - ulong magic = mDealInfo.Magic(); - bool isMagicSame = magic == mMagicNumber; - if (!isMagicSame) - { - continue; - } - - // - // Check Symbol ... - string symbol = mDealInfo.Symbol(); - bool isSymbolSame = symbol == mSymbol; - if (!isSymbolSame) - { - continue; - } - - // - XDeal deal = ToXDealByIndex(i); - - // - Add( - deal, - result); - } - } - - // - // Retrieve Last Deal ... - XDeal GetLastDeal() - { - // - XDeal result = {}; - - // - XDeal deals[]; - GetDeals(deals); - int dealsCount = ArraySize(deals); - if (dealsCount <= 0) - { - return result; - } - - // - result = deals[0]; - - // - return result; - } - - // - // END Deals ... - // - - // - // START Orders ... - // - - // - // Count Orders ... - int OrdersCount( - datetime start = -1, // Start Date - datetime end = -1 // End Date - ) - { - // - int result = 0; - - // - XOrder orders[]; - GetOrders( - orders, - start, - end); - result = ArraySize(orders); - - // - return result; - } - - // - // Retrieve Orders ... - void GetOrders( - XOrder &result[], // Hold's Result - datetime start = -1, // Start Date - datetime end = -1 // End Date - ) - { - // - CleanBuffer(result); - - // - // Select History if Start and End date provided ... - if (start > -1) - { - // - // Normalize End date ... - if (end == -1) - { - end = TimeCurrent(); - } - - // - bool isSelect = HistorySelect(start, end); - if (!isSelect) - { - return; - } - } - - // - int total = HistoryOrdersTotal(); - if (total <= 0) - { - return; - } - - // - // Loop ... - for (int i = total - 1; i >= 0; i--) - { - // - // Select by Index ... - bool isSelect = mOrderInfo.SelectByIndex(i); - if (!isSelect) - { - continue; - } - - // - // Check Magic ... - ulong magic = mOrderInfo.Magic(); - bool isMagicSame = magic == mMagicNumber; - if (!isMagicSame) - { - continue; - } - - // - // Check Symbol ... - string symbol = mOrderInfo.Symbol(); - bool isSymbolSame = symbol == mSymbol; - if (!isSymbolSame) - { - continue; - } - - // - XOrder order = ToXOrderByIndex(i); - - // - Add( - order, - result); - } - } - - // - // Retrieve Last Order ... - XOrder GetLastOrder() - { - // - XOrder result = {}; - - // - XOrder orders[]; - GetOrders(orders); - int ordersCount = ArraySize(orders); - if (ordersCount <= 0) - { - return result; - } - - // - result = orders[0]; - - // - return result; - } - - // - // END Orders ... - // - - // - // START OnTrade Handlers ... - // - - // - // Handle OnTrade Event ... - void HandleOnTradeEvent( - XOnTradeHandlerResult &result // Hold's Result - ) - { - // - if (mScanStarted) - { - ProcessOnTradeContext(result); - } - else - { - InitOnTradeContext(); - } - } - - // - // END OnTrade Handlers ... - // - - // - // Retrieve Magic Number ... - ulong GetMagicNumber() - { - return mMagicNumber; - } - - // - // all protected features ... -protected: - // - // all private features ... -private: - // - // Specified Unique Tag ... - string mTag; - - // - // which Symbol ... - string mSymbol; - - // - // using deviation, it must be in Point ... - int mSlippage; - - // - // using magic number ... - ulong mMagicNumber; - - // - // Detect Using Virtual TP or SL ... - bool mUseVirtualTPSL; - - // - // Specify Max Allowed Trades - int mMaxAllowedTrades; - - // - // Minimum Free Marging for Open Trades - double mMinAllowedFreeMarginForOpenTrades; - - // - // Minimum Balance for Open Trades - double mMinBallanceForOpenTrades; - - // - // using CTrade instance ... - XSCTrade mTrader; - - // - // Deals Info ... - CDealInfo mDealInfo; - - // - // Order Info ... - COrderInfo mOrderInfo; - - // - // An Instance Of XCAccount Info for Handling Account Related Actions ... - XCAccountInfo mAccountInfo; - - // - // using PositionInfo instance ... - CPositionInfo mPositionInfo; - - // - // Signal Manager ... - XCSignalManager mSignalManager; - - // - // START OnTrade Handlers ... - // - - // - int mDaysForRead; - - // - // set the limits of the trade history on the global scope ... - - // - // // start date for trade history in cache ... - datetime mStartDate; - - // - // end date for trade history in cache ... - datetime mEndDate; - - // - // global OnTrade counters ... - - // - // number of active orders ... - int mOrdersCount; - - // - // number of open positions ... - int mPositionsCount; - - // - // number of deals in the trade history cache ... - int mDealsCount; - - // - // number of orders in the trade history cache ... - int mHistoryOrdersCount; - - // - // flag of counter relevance ... - bool mScanStarted; - - // - // Check Statrt Date In Trade History ... - void CheckStartDateInTradeHistory() - { - // - // initial interval, if we were to start working right now .. - datetime currStart = TimeCurrent() - (mDaysForRead * PeriodSeconds(PERIOD_D1)); - - // - // make sure that the start limit of the trade history has not gone - // more than 1 day over the intended date ... - if (currStart - mStartDate > PeriodSeconds(PERIOD_D1)) - { - // - // correct the start date of history to be loaded in the cache ... - mStartDate = currStart; - - // - // now reload the trade history for the updated interval ... - HistorySelect(mStartDate, mEndDate); - - // - // correct the deal and order counters in history for further comparison - mHistoryOrdersCount = HistoryOrdersTotal(); - mDealsCount = HistoryDealsTotal(); - } - } - - // - // Process On Trade Context ... - void ProcessOnTradeContext( - XOnTradeHandlerResult &result // Hold's Result - ) - { - // - mEndDate = TimeCurrent(); - - // - ResetLastError(); - - // - // download trading history from the specified interval to the program cache ... - bool selected = HistorySelect(mStartDate, mEndDate); - if (!selected) - { - // - LogMessage("Failed to Load OnTrade Context History ..."); - - // - return; - } - - // - // get the current values ... - int currOrders = OrdersTotal(); - int currPositions = PositionsTotal(); - int currDeals = HistoryDealsTotal(); - int currHistoryOrders = HistoryOrdersTotal(); - - // - // Orders ... - // check if the number of active orders has been changed ... - if (currOrders != mOrdersCount) - { - // - // number of active orders has been changed ... - result.hasNewOrder = true; - result.newOrders = currOrders - mOrdersCount; - - // - // update the value ... - mOrdersCount = currOrders; - } - - // - // Positions ... - // changes in the number of open positions ... - if (currPositions != mPositionsCount) - { - // - // number of open positions has been changed ... - result.hasNewPosition = true; - result.newPositions = currPositions - mPositionsCount; - - // - // update the value ... - mPositionsCount = currPositions; - } - - // - // Deals ... - // changes in the number of deals in the trade history cache ... - if (currDeals != mDealsCount) - { - // - // number of deals in the trade history cache has been changed ... - result.hasNewDeal = true; - result.newDeals = currDeals - mDealsCount; - - // - // update the value ... - mDealsCount = currDeals; - } - - // - // History Orders ... - // changes in the number of history orders in the trade history cache ... - if (currHistoryOrders != mHistoryOrdersCount) - { - // - // number of history orders in the trade history cache has been changed ... - result.hasNewHistoryOrder = true; - result.newHistoryOrders = currHistoryOrders - mHistoryOrdersCount; - - // - // update the value ... - mHistoryOrdersCount = currHistoryOrders; - } - - // - // checking if it is necessary to change the limits of the trade history to be requested in cache ... - CheckStartDateInTradeHistory(); - } - - // - // Reset On Trade Scanner Context ... - void ResetOnTradeContext() - { - // - mEndDate = TimeCurrent(); - mStartDate = mEndDate - (mDaysForRead * PeriodSeconds(PERIOD_D1)); - } - - // - // Initial Context Of Trade Scanner ... - void InitOnTradeContext() - { - // - ResetLastError(); - - // - // load history ... - bool selected = HistorySelect(mStartDate, mEndDate); - if (!selected) - { - // - LogMessage("Failed to Load OnTrade Context History ..."); - - // - return; - } - - // - // get the current value ... - mOrdersCount = OrdersTotal(); - mPositionsCount = PositionsTotal(); - mDealsCount = HistoryDealsTotal(); - mHistoryOrdersCount = HistoryOrdersTotal(); - - // - mScanStarted = true; - } - - // - // END OnTrade Handlers ... - // - - // - // START Signal Private ... - // - - // - // Add Or Update Signal ... - void AddOrUpdateSignalInfo( - XSignal &signal // Specified Signal - ) - { - // - bool isExists = mSignalManager.IsExists(signal); - if (isExists) - { - mSignalManager.Remove(signal.ticket); - } - - // - bool isAddOrUpdated = mSignalManager.AddOrUpdate(signal); - if (isAddOrUpdated) - { - // - color longColor = clrAqua; - color shortColor = clrFuchsia; - - // - DrawSignalShape( - signal, - longColor, - shortColor); - } - } - - // - // Retrieve Signal String From Chart Event ... - XSignal RetrieveSignal( - ulong ticket // Specify Position Ticket - ) - { - // - XSignal result = {}; - - // - if (ticket <= 0) - { - return result; - } - - // - result = mSignalManager.Get(ticket); - - // - return result; - } - void RetrieveSignal( - XSignal &signal // Specified Signal - ) - { - - // - XSignal tSignal = mSignalManager.Get(signal.ticket); - - // - // Fill signal by tSignal Data ... - // since tese properties may change in signal manipulation times ... - signal.tp = tSignal.tp; - signal.sl = tSignal.sl; - signal.riskFreeStep = tSignal.riskFreeStep; - signal.riskFreeRate = tSignal.riskFreeRate; - } - - // - // Convert Position to Signal by Index ... - XSignal PositionToSignal(int index) - { - // - XSignal result = {}; - - // - if (!mPositionInfo.SelectByIndex(index)) - { - return result; - } - - // - ulong ticket = mPositionInfo.Ticket(); - result = PositionToSignal(ticket); - - // - return result; - } - - // - // Position To Signal by Ticket ... - XSignal PositionToSignal(ulong ticket) - { - // - XSignal result = {}; - - // - if (!mPositionInfo.SelectByTicket(ticket)) - { - return result; - } - - // - bool isExists = mSignalManager.IsExists(ticket); - if (isExists) - { - result = RetrieveSignal(ticket); - } - - // - // Ticket ... - result.ticket = mPositionInfo.Ticket(); - - // - // ID ... - result.id = mPositionInfo.Identifier(); - - // - // Symbol ... - result.symbol = mPositionInfo.Symbol(); - - // - // Type ... - ENUM_POSITION_TYPE pType = (ENUM_POSITION_TYPE)mPositionInfo.PositionType(); - ENUM_X_SIGNAL_TYPE type = pType == POSITION_TYPE_BUY ? X_SIGNAL_LONG : X_SIGNAL_SHORT; - result.type = type; - - // - // MagicNumber ... - result.magicNumber = mPositionInfo.Magic(); - - // - // Entry/Open Price ... - result.entry = mPositionInfo.PriceOpen(); - - // - // Take Profit ... - result.tp = result.tp <= 0 && mPositionInfo.TakeProfit() > 0 - ? mPositionInfo.TakeProfit() - : result.tp; - - // - // Stop Loss ... - result.sl = result.sl <= 0 && mPositionInfo.StopLoss() > 0 - ? mPositionInfo.StopLoss() - : result.sl; - - // - // Profit ... - result.profit = mPositionInfo.Profit(); - - // - // Time ... - result.time = mPositionInfo.Time(); - - // - // Volume ... - result.volume = mPositionInfo.Volume(); - - // - // Comment ... - result.comment = mPositionInfo.Comment(); - - // - return result; - } - - // - // Converts a Deal to XDeal by Index ... - XDeal ToXDealByIndex(int index) - { - // - XDeal result = {}; - - // - bool isSelect = mDealInfo.SelectByIndex(index); - if (!isSelect) - { - return result; - } - - // - // Read Deal Ticket ... - ulong ticket = mDealInfo.Ticket(); - result = ToXDealByTicket(ticket); - - // - return result; - } - - // - // Converts a Deal to XDeal by Ticket ... - XDeal ToXDealByTicket(ulong ticket) - { - // - XDeal result = {}; - - // - mDealInfo.Ticket(ticket); - - // - result.time = mDealInfo.Time(); - result.swap = mDealInfo.Swap(); - result.magic = mDealInfo.Magic(); - result.order = mDealInfo.Order(); - result.entry = mDealInfo.Entry(); - result.price = mDealInfo.Price(); - result.ticket = mDealInfo.Ticket(); - result.symbol = mDealInfo.Symbol(); - result.type = mDealInfo.DealType(); - result.profit = mDealInfo.Profit(); - result.volume = mDealInfo.Volume(); - result.comment = mDealInfo.Comment(); - result.positionId = mDealInfo.PositionId(); - result.commission = mDealInfo.Commission(); - result.reason = (ENUM_DEAL_REASON)HistoryDealGetInteger( - ticket, - DEAL_REASON); - - // - return result; - } - - // - // Convert an Order to XOrder by Index ... - XOrder ToXOrderByIndex(int index) - { - // - XOrder result = {}; - - // - bool isSelect = mOrderInfo.SelectByIndex(index); - if (!isSelect) - { - return result; - } - - // - ulong ticket = mOrderInfo.Ticket(); - result = ToXOrderByTicket(ticket); - - // - return result; - } - - // - // Convert an Order to XOrder by Ticket ... - XOrder ToXOrderByTicket(ulong ticket) - { - // - XOrder result = {}; - - // - bool isSelect = mOrderInfo.Select(ticket); - if (!isSelect) - { - return result; - } - - // - result.state = mOrderInfo.State(); - result.magic = mOrderInfo.Magic(); - result.ticket = mOrderInfo.Ticket(); - result.symbol = mOrderInfo.Symbol(); - result.type = mOrderInfo.OrderType(); - result.comment = mOrderInfo.Comment(); - result.stopLoss = mOrderInfo.StopLoss(); - result.typeTime = mOrderInfo.TypeTime(); - result.timeDone = mOrderInfo.TimeDone(); - result.timeSetup = mOrderInfo.TimeSetup(); - result.positionId = mOrderInfo.PositionId(); - result.priceOpen = mOrderInfo.PriceOpen(); - result.takeProfit = mOrderInfo.TakeProfit(); - result.typeFilling = mOrderInfo.TypeFilling(); - result.priceCurrent = mOrderInfo.PriceCurrent(); - result.volumeInitial = mOrderInfo.VolumeInitial(); - result.volumeCurrent = mOrderInfo.VolumeCurrent(); - result.timeExpiration = mOrderInfo.TimeExpiration(); - result.priceStopLimit = mOrderInfo.PriceStopLimit(); - result.reason = (ENUM_ORDER_REASON)HistoryOrderGetInteger( - ticket, - ORDER_REASON); - - // - return result; - } - // - // END Signal Private ... - // -}; - -// -// a Class For Guard Account ... -class XCGuard : public XCBase -{ - // - // Public ... -public: - // - // Constructor ... - XCGuard( - int oldAge, // Age for Old Trades - ENUM_X_GUARD_ACTIONS oldGuardAction, // Guard Action for Too Old State - double criticalFactor, // Critical DrawDown Factor based On Balance - ENUM_X_GUARD_ACTIONS criticalAction, // Guard Action for Critical State - double maxFactor, // Max DrawDown Factor based on Balance - ENUM_X_GUARD_ACTIONS maxAction, // Guard Action for Max State - int GuardStopoutFiredAfterTouches, // Guard Stopout if Max State touched - ENUM_X_GUARD_SUPPORT_METHODS supportMethod // How to Support Signals - ) - { - // - mSupportPrefix = "SPT"; - mDirectional = "SPD"; - mInDirectional = "SPIND"; - - // - mOldAge = oldAge; - mOldGuardAction = oldGuardAction; - - // - mMaxFactor = maxFactor; - mMaxAction = maxAction; - mCriticalFactor = criticalFactor; - mCriticalAction = criticalAction; - mGuardStopoutFiredAfterTouches = GuardStopoutFiredAfterTouches; - - // - mSupportMethod = supportMethod; - - // - mAccountInfo = new XCAccountInfo(); - - // - double deposit = mAccountInfo.GetInitialBalance(); - - // - if ( - maxFactor > 0 && - maxFactor < 1) - { - mMaxValue = maxFactor * deposit; - } - - // - if ( - criticalFactor > 0 && - criticalFactor < 1) - { - mCriticalValue = criticalFactor * deposit; - } - - // - Reset(); - ResetMaxDrawDownTouches(); - } - - // - // Deconstructor ... - ~XCGuard() {} - - // - // Reset List ... - void Reset() - { - // - CleanBuffer(mGuardedSignals); - CleanBuffer(mSupportedSignals); - } - - // - // Reset Consecutive Max DrawDown Touches ... - void ResetMaxDrawDownTouches() - { - mOccuredconsecutiveMaxDraDownTouches = 0; - } - - // - // Calculate and Retrieve Critical DrawDown Value ... - double GetCriticalValue() - { - // - double result = mCriticalValue; - if (mCriticalFactor <= 0) - { - return result; - } - - // - double deposit = mAccountInfo.GetInitialBalance(); - double balance = mAccountInfo.GetBalance(); - - // - if (balance > deposit) - { - // - double balanceBasedCriticalDrawDown = mCriticalFactor * balance; - - // - result = MathMax( - mCriticalValue, - balanceBasedCriticalDrawDown); - } - - // - return result; - } - - // - // Calculate and Retrieve Max Allowed DrawDown Value ... - double GetMaxValue() - { - // - double result = mMaxValue; - if (mMaxValue <= 0) - { - return result; - } - - // - double deposit = mAccountInfo.GetInitialBalance(); - double balance = mAccountInfo.GetBalance(); - - // - if (balance > deposit) - { - // - double balanceBasedMaxAllwedDrawDown = mMaxFactor * balance; - - // - result = MathMax( - mMaxValue, - balanceBasedMaxAllwedDrawDown); - } - - // - return result; - } - - // - // Guard Account Protection ... - bool Guard( - XGuardHandlerResult &guardResult, // Hold's Message - string &message, // Hold's Message - XCTrade &trader, // Specified Trader - ENUM_TIMEFRAMES period = NULL // Specified Time Frame for Detecting Signal Ages - ) - { - // - message = ""; - - // - // Clean Result of Guard ... - CleanBuffer(guardResult.olds); - CleanBuffer(guardResult.maxes); - CleanBuffer(guardResult.criticals); - - // - bool result = false; - - // - // So Important is to Guard DrawDowns ... - result = GuardDrawDown( - guardResult, - message, - trader); - if (result) - { - return result; - } - - // - // Then we have to Guard Old Trades ... - result = GuardOlds( - guardResult, - message, - trader); - - // - return result; - } - - // - // Handle Guard Old Trades ... - bool GuardOlds( - XGuardHandlerResult &guardResult, // Hold's Message - string &message, // Hold's Message - XCTrade &trader, // Specified Trader - ENUM_TIMEFRAMES period = NULL // Specified Time Frame for Detecting Signal Ages - ) - { - // - // Cleanup Message ... - message = ""; - - // - // Clean Result of Guard ... - CleanBuffer(guardResult.olds); - - // - bool result = false; - - // - // Validate Args ... - if ( - mOldAge <= 0 || - mOldGuardAction == X_GUARD_DO_NOTHING) - { - return result; - } - - // - // Normalize Args ... - if (period == NULL) - { - period = _Period; - } - - // - // Retrieve Old Trades ... - XSignal oldSignals[]; - trader.GetOldSignals( - oldSignals, - mOldAge, - period); - int oldSignalsCount = ArraySize(oldSignals); - if (oldSignalsCount <= 0) - { - return result; - } - - // - result = DoGuardAction( - guardResult, - message, - trader, - mOldGuardAction, - X_GUARDED_OLD, // Specify Guard Reason - period // Specified Running Time Frame for Signal Age Calculations - ); - - // - return result; - } - - // - // Hnadle Guard DrawDown ... - bool GuardDrawDown( - XGuardHandlerResult &guardResult, // Hold's Message - string &message, // Hold's Message - XCTrade &trader // Specified Trader - ) - { - // - message = ""; - - // - // Clean Result of Guard ... - CleanBuffer(guardResult.maxes); - CleanBuffer(guardResult.criticals); - - // - bool result = false; - - // - // Check State for Guard ... - bool isCriticalGuardEnabled = mCriticalFactor > 0; - bool isMaxGuardEnabled = mMaxFactor > 0; - bool isGuardEnabled = - isMaxGuardEnabled; - - // - if (!isGuardEnabled) - { - return result; - } - - // - double maxValue = GetMaxValue(); - double criticalValue = GetCriticalValue(); - - // - double profitSums = trader.GetSignalsProfit(); - - // - bool isMaxReached = - profitSums < 0 && - isMaxGuardEnabled && - MathAbs(profitSums) >= maxValue; - bool isCriticalReached = - profitSums < 0 && - isCriticalGuardEnabled && - MathAbs(profitSums) >= criticalValue; - - // - if (!isMaxReached && !isCriticalReached) - { - // - // Reset Consecutive Max DrawDown Touches ... - ResetMaxDrawDownTouches(); - - // - return result; - } - - // - // Check For Critical Guard ... - if (isCriticalReached && !isMaxReached) - { - // - result = DoGuardAction( - guardResult, - message, - trader, - mCriticalAction, - X_GUARDED_CRITICAL); - } - else if (isMaxReached) - { - // - result = DoGuardAction( - guardResult, - message, - trader, - mMaxAction, - X_GUARDED_MAX); - - // - // Handle Guard StopOut Action ... - mOccuredconsecutiveMaxDraDownTouches++; - if ( - mMaxAction != X_GUARD_DO_NOTHING && - mMaxAction != X_GUARD_CLOSE_ALL && - mGuardStopoutFiredAfterTouches > 0 && - mOccuredconsecutiveMaxDraDownTouches >= mGuardStopoutFiredAfterTouches) - { - // - XSignal closed[]; - trader.CloseSignals(closed); - int closedCount = ArraySize(closed); - if (closedCount > 0) - { - // - for (int i = 0; i < closedCount; i++) - { - // - XSignal iSignal = closed[i]; - - // - AddItemToBuffer( - iSignal, - guardResult.maxes); - } - - // - message = "Guard StopOut Action Closed (" + (string)closedCount + ") Signals and Release Account ..."; - - // - guardResult.isStopOut = true; - - // - result = true; - } - } - } - - // - return result; - } - - // - // Do Signal Protections and apply Support ... - bool ProtectSignals( - XSignal &mResult[], // Hold's Result - XCTrade &trader, // Specified Trader - int numberOfItemsCheck = 30 // Number of Items to check - ) - { - // - bool result = false; - - // - CleanBuffer(mResult); - - // - // Check Supports Enabled ... - result = IsSupportEnabled(); - if (!result) - { - return result; - } - - // - // Update Supports ... - XSignal signals[]; - trader.GetSignals(signals); - int signalsCount = ArraySize(signals); - if (signalsCount > 0) - { - // - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - bool isExists = IsSupportExists(iSignal.ticket); - if (isExists) - { - UpdateSupport(iSignal); - } - } - } - - // - // Count Supporteds ... - XProtectedSignal supporteds[]; - GetAllSupports(supporteds); - int supportedCount = ArraySize(supporteds); - result = supportedCount > 0; - if (!result) - { - return result; - } - - // - // Loop through ... - for (int i = 0; i < supportedCount; i++) - { - // - XProtectedSignal iP = supporteds[i]; - - // - bool canDoDirectional = CanDoDirectionalSupport( - trader, - iP.ticket, - numberOfItemsCheck); - bool canDoInDirectional = CanDoInDirectionalSupport( - trader, - iP.ticket, - numberOfItemsCheck); - - // - if ( - !canDoDirectional && - !canDoInDirectional) - { - continue; - } - - // - // Do Directional ... - if (canDoDirectional) - { - // - // Generate Propper Signal ... - XSignal sdSignal = GenerateDirectionalSupportSignal( - iP.ticket, - trader); - - // - ENUM_EXECUTION_SIGNAL_RESULT executionResult = trader.ExecuteSignal( - sdSignal, - true, - false); - bool isExecuted = executionResult == X_TRADER_SUCCEED_EXECUTION; - if (isExecuted) - { - // - XSignal eSignal = trader.GetSignal(sdSignal.ticket); - - // - AddItemToBuffer( - eSignal, - mResult); - } - } - // - // Do Indirectional ... - else if (canDoInDirectional) - { - // - // Generate Propper Signal ... - XSignal sindSignal = GenerateDirectionalSupportSignal( - iP.ticket, - trader); - - // - ENUM_EXECUTION_SIGNAL_RESULT executionResult = trader.ExecuteSignal( - sindSignal, - true, - false); - bool isExecuted = executionResult == X_TRADER_SUCCEED_EXECUTION; - if (isExecuted) - { - // - XSignal eSignal = trader.GetSignal(sindSignal.ticket); - - // - AddItemToBuffer( - eSignal, - mResult); - } - } - } - - // - result = ArraySize(mResult) > 0; - - // - return result; - } - - // - // Validate State ... - bool Validate() - { - // - bool result = false; - - // - result = - mMaxFactor > 0 && - (mCriticalFactor > 0 - ? mCriticalFactor < mMaxFactor - : true); - - // - return result; - } - - // - // START Guarded Signals Functions ... - // - - // - // Add new Protecte Signal ... - bool Add( - XSignal &signal // Specified Signal - ) - { - // - bool result = false; - - // - bool isExists = IsExists(signal.ticket); - if (isExists) - { - return result; - } - - // - XProtectedSignal item; - - // - datetime time = TimeCurrent(); - - // - item.ticket = signal.ticket; - - // - AddItemToBuffer( - time, - item.time); - - // - AddItemToBuffer( - signal.profit, - item.profit); - - // - AddItemToBuffer( - item, - mGuardedSignals); - - // - return result; - } - - // - // Get All ... - void GetAll( - XProtectedSignal &result[] // Hold's Result - ) - { - // - CopyBuffer( - mGuardedSignals, - result); - } - - // - // Get ... - XProtectedSignal Get( - ulong ticket // Specified Signal Ticket - ) - { - // - XProtectedSignal result; - - // - bool isExists = IsExists(ticket); - if (!isExists) - { - return result; - } - - // - int protectedCounts = ArraySize(mGuardedSignals); - if (protectedCounts <= 0) - { - return result; - } - - // - for (int i = 0; i < protectedCounts; i++) - { - // - XProtectedSignal iProtected = mGuardedSignals[i]; - - // - if (iProtected.ticket == ticket) - { - // - result = iProtected; - break; - } - } - - // - return result; - } - - // - // Remove ... - bool Remove( - ulong ticket // Specified Signal Ticket - ) - { - // - bool result = false; - - // - result = IsExists(ticket); - if (!result) - { - return result; - } - - // - int protectedCounts = ArraySize(mGuardedSignals); - result = protectedCounts > 0; - if (!result) - { - return result; - } - - // - XProtectedSignal cleared[]; - for (int i = 0; i < protectedCounts; i++) - { - // - XProtectedSignal iProtected = mGuardedSignals[i]; - - // - if (iProtected.ticket != ticket) - { - AddItemToBuffer( - iProtected, - cleared); - } - } - - // - // Update Source by Cleared ... - CopyBuffer( - cleared, - mGuardedSignals); - - // - result = true; - - // - return result; - } - - // - // Update ... - bool Update( - ulong ticket, // Specified Signal Ticket - datetime time, // Specified Last Checked time - double profit // Specified Signal Profit - // XProtectedSignal &item // Specified which object to Update - ) - { - // - bool result = false; - - // - int protectedCounts = ArraySize(mGuardedSignals); - result = protectedCounts > 0; - if (!result) - { - return result; - } - - // - result = IsExists(ticket); - if (!result) - { - return result; - } - - // - // Retrieve Struct ... - XProtectedSignal item = Get(ticket); - AddItemToBuffer( - time, - item.time); - AddItemToBuffer( - profit, - item.profit); - - // - result = Remove(ticket); - if (!result) - { - return result; - } - - // - AddItemToBuffer( - item, - mGuardedSignals); - result = true; - - // - return result; - } - bool Update( - XProtectedSignal &item // Specified Protected Item - ) - { - // - bool result = false; - - // - datetime time; - result = GetLastItem( - time, - item.time); - if (!result) - { - return result; - } - - // - double profit; - result = GetLastItem( - profit, - item.profit); - if (!result) - { - return result; - } - - // - result = Update( - item.ticket, time, profit); - - // - return result; - } - bool Update( - XSignal &signal // Specified Signal - ) - { - // - bool result = false; - - // - ulong ticket = signal.ticket; - datetime time = TimeCurrent(); - double profit = signal.profit; - - // - result = Update( - ticket, - time, - profit); - - // - return result; - } - - // - // Add Or Update ... - bool AddOrUpdate( - XSignal &signal // Specified Signal - ) - { - // - bool result = false; - - // - bool isExists = IsExists(signal.ticket); - if (!isExists) - { - result = Add(signal); - } - else - { - result = Update(signal); - } - - // - return result; - } - - // - // Check Exists ... - bool IsExists( - ulong ticket // Specified Signal Ticket - ) - { - // - bool result = false; - - // - // Validate Args ... - if (ticket <= 0) - { - return result; - } - - // - int protectedCounts = ArraySize(mGuardedSignals); - if (protectedCounts <= 0) - { - return result; - } - - // - for (int i = 0; i < protectedCounts; i++) - { - // - XProtectedSignal iProtected = mGuardedSignals[i]; - - // - if (iProtected.ticket == ticket) - { - // - result = true; - break; - } - } - - // - return result; - } - - // - // Count Protecteds ... - int Count() - { - // - int result = 0; - - // - result = ArraySize(mGuardedSignals); - - // - return result; - } - - // - // END Guarded Signals Functions ... - // - - // - // START Supported Signals Functions ... - // - - // - // Check can Handle Support Signals or not ... - bool IsSupportEnabled() - { - // - bool result = false; - - // - result = - mSupportMethod != X_SUPPORT_DO_NOTHING; - - // - return result; - } - - // - // Retrieve List Of Supported Signals ... - void GetSupportSignals( - XSignal &result[], // Hold's Result ... - XCTrade &trader // Specified Trader class Instance ... - ) - { - // - CleanBuffer(result); - - // - XSignal signals[]; - trader.GetSignals(signals); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return; - } - - // - for (int i = -0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - bool isSupport = IsSupport(iSignal.comment); - if (isSupport) - { - AddItemToBuffer( - iSignal, - result); - } - } - } - - // - // Retrieve List Of Specific Signals Supported Signals ... - void GetSignalSupports( - XSignal &result[], // Hold's Result ... - XCTrade &trader, // Specified Trader class Instance ... - ulong ticket // Specified Signal Ticket ... - ) - { - // - CleanBuffer(result); - - // - // Validate Args ... - if (ticket <= 0) - { - return; - } - - // - // Check Signal Exists using Trader ... - XSignal parentSignal = trader.GetSignal(ticket); - bool isValid = - parentSignal.ticket > 0 && - parentSignal.ticket == ticket && - StringLen(parentSignal.comment) > 0; - if (!isValid) - { - return; - } - - // - XSignal supportSignals[]; - GetSupportSignals( - supportSignals, - trader); - int supportSignalsCount = ArraySize(supportSignals); - if (supportSignalsCount <= 0) - { - return; - } - - // - for (int i = 0; i < supportSignalsCount; i++) - { - // - XSignal iSignal = supportSignals[i]; - - // - bool isBelongsToParent = IsBelongsToParent( - ticket, - iSignal.comment); - if (isBelongsToParent) - { - AddItemToBuffer( - iSignal, - result); - } - } - } - - // - // Check Specific Support Conditions for Opening Directional Support ... - bool CanDoDirectionalSupport( - XCTrade &trader, // Specified Trader class Instance ... - ulong ticket, // Specified Signal Ticket ... - int numberOfItemsCheck = 30 // Number of Items to check ... - ) - { - // - bool result = false; - - // - // Check Supports Enabled ... - result = IsSupportEnabled(); - if (!result) - { - return result; - } - - // - // Check Support Method Allows Directional ... - result = - mSupportMethod == X_SUPPORT_FULL || - mSupportMethod == X_SUPPORT_IN_DRAWUP_DIRECTIONAL; - if (!result) - { - return result; - } - - // - // Validate Ticket ... - result = ticket > 0; - if (!result) - { - return result; - } - - // - // Check Supports Count ... - int supportedCount = ArraySize(mSupportedSignals); - result = supportedCount > 0; - if (!result) - { - return result; - } - - // - // Check Ticket Exists in Supports ... - result = IsSupportExists(ticket); - if (!result) - { - return result; - } - - // - // Check signal Doesn't have any Support ... - XSignal supports[]; - GetSignalSupports( - supports, - trader, - ticket); - int supportsCount = ArraySize(supports); - result = supportsCount <= 0; - if (!result) - { - return result; - } - - // - // Retrieve Support Model ... - XProtectedSignal sInfo = GetSupport(ticket); - - // - // Validate Model ... - int sTimesCount = ArraySize(sInfo.time); - int sProfitsCount = ArraySize(sInfo.profit); - result = - sInfo.ticket == ticket && - sTimesCount == sProfitsCount && - sTimesCount >= numberOfItemsCheck && - sProfitsCount >= numberOfItemsCheck; - if (!result) - { - return result; - } - - // - // Validate Signal Age ... - XSignal sSignal = trader.GetSignal(ticket); - int sSignalAge = trader.GetSignalAge(sSignal.time); - result = sSignalAge >= numberOfItemsCheck; - if (!result) - { - return result; - } - - // - // Extrat Profits ... - double lastProfits[]; - for (int i = sProfitsCount - 1; i >= (sProfitsCount - numberOfItemsCheck); i++) - { - // - double iProfit = sInfo.profit[i]; - - // - AddItemToBuffer( - iProfit, - lastProfits); - } - - // - string logMsg = ToString(lastProfits); - LogMessage("" + (string)ticket + " lastProfits: \n" + logMsg); - - // - result = false; - - // - // Now implement Business Logics ... - - // - return result; - } - - // - // Check Specific Support Conditions for Opening InDirectional Support ... - bool CanDoInDirectionalSupport( - XCTrade &trader, // Specified Trader class Instance ... - ulong ticket, // Specified Signal Ticket ... - int numberOfItemsCheck = 30 // Number of Items to check ... - ) - { - // - bool result = false; - - // - // Check Supports Enabled ... - result = IsSupportEnabled(); - if (!result) - { - return result; - } - - // - // Check Support Method Allows Directional ... - result = - mSupportMethod == X_SUPPORT_FULL || - mSupportMethod == X_SUPPORT_IN_DRAWDOWN_INDIRECTIONAL; - if (!result) - { - return result; - } - - // - // Validate Ticket ... - result = ticket > 0; - if (!result) - { - return result; - } - - // - // Check Supports Count ... - int supportedCount = ArraySize(mSupportedSignals); - result = supportedCount > 0; - if (!result) - { - return result; - } - - // - // Check Ticket Exists in Supports ... - result = IsSupportExists(ticket); - if (!result) - { - return result; - } - - // - // Check signal Doesn't have any Support ... - XSignal supports[]; - GetSignalSupports( - supports, - trader, - ticket); - int supportsCount = ArraySize(supports); - result = supportsCount <= 0; - if (!result) - { - return result; - } - - // - // Retrieve Support Model ... - XProtectedSignal sInfo = GetSupport(ticket); - - // - // Validate Model ... - int sTimesCount = ArraySize(sInfo.time); - int sProfitsCount = ArraySize(sInfo.profit); - result = - sInfo.ticket == ticket && - sTimesCount == sProfitsCount && - sTimesCount >= numberOfItemsCheck && - sProfitsCount >= numberOfItemsCheck; - if (!result) - { - return result; - } - - // - // Validate Signal Age ... - XSignal sSignal = trader.GetSignal(ticket); - int sSignalAge = trader.GetSignalAge(sSignal.time); - result = sSignalAge >= numberOfItemsCheck; - if (!result) - { - return result; - } - - // - // Extrat Profits ... - double lastProfits[]; - for (int i = sProfitsCount - 1; i >= (sProfitsCount - numberOfItemsCheck); i++) - { - // - double iProfit = sInfo.profit[i]; - - // - AddItemToBuffer( - iProfit, - lastProfits); - } - - // - string logMsg = ToString(lastProfits); - LogMessage("" + (string)ticket + " lastProfits: \n" + logMsg); - - // - result = false; - - // - // Now implement Business Logics ... - - // - return result; - } - - // - // Generate Directional Support Signal for Parent Signal ... - XSignal GenerateDirectionalSupportSignal( - ulong ticket, // Specified Parent Signal Ticket ... - XCTrade &trader // Specified Trader Class ... - ) - { - // - XSignal result = {}; - - // - // Validate Args ... - if (ticket <= 0) - { - return result; - } - - // - XSignal pSignal = trader.GetSignal(ticket); - bool isValidParent = - pSignal.ticket > 0 && - pSignal.ticket == ticket && - StringLen(pSignal.comment) > 0; - if (!isValidParent) - { - return result; - } - - // - ENUM_X_SIGNAL_TYPE type = pSignal.type; - bool isLong = IsLong(type); - - // - double entry = GetEntry( - pSignal.symbol, - type); - double exit = GetExit( - pSignal.symbol, - type); - - // - double reward = PipsToPrice( - pSignal.symbol, - 6); - double risk = PipsToPrice( - pSignal.symbol, - 1); - - // - double tp = - isLong - ? entry + reward - : entry - reward; - - // - double sl = - isLong - ? exit - risk - : exit + risk; - - // - double rfStep = 2; - double rfRate = 0.5; - - // - double volume = NormalizeVolume( - pSignal.volume / 2, - pSignal.symbol, - 2); - - // - // Generate Signal using Trader Class Instance ... - result = trader.GenerateSignal( - // - type, - tp, - sl, - volume, - rfStep, - rfRate - // - ); - - // - return result; - } - - // - // Generate InDirectional Support Signal for Parent Signal ... - XSignal GenerateInDirectionalSupportSignal( - ulong ticket, // Specified Parent Signal Ticket ... - XCTrade &trader // Specified Trader Class ... - ) - { - // - XSignal result = {}; - - // - // Validate Args ... - if (ticket <= 0) - { - return result; - } - - // - XSignal pSignal = trader.GetSignal(ticket); - bool isValidParent = - pSignal.ticket > 0 && - pSignal.ticket == ticket && - StringLen(pSignal.comment) > 0; - if (!isValidParent) - { - return result; - } - - // - ENUM_X_SIGNAL_TYPE type = trader - .GetIndirectionSignalType(pSignal.type); - bool isLong = IsLong(type); - - // - double entry = GetEntry( - pSignal.symbol, - type); - double exit = GetExit( - pSignal.symbol, - type); - - // - double reward = PipsToPrice( - pSignal.symbol, - 6); - double risk = PipsToPrice( - pSignal.symbol, - 1); - - // - double tp = - isLong - ? entry + reward - : entry - reward; - - // - double sl = - isLong - ? exit - risk - : exit + risk; - - // - double rfStep = 2; - double rfRate = 0.5; - - // - double volume = NormalizeVolume( - pSignal.volume / 2, - pSignal.symbol, - 2); - - // - // Generate Signal using Trader Class Instance ... - result = trader.GenerateSignal( - // - type, - tp, - sl, - volume, - rfStep, - rfRate - // - ); - - // - return result; - } - - // - // Generate Specific Signals Support Signal Comment ... - string GenerateSupportSignalComment( - ulong ticket, // Specified Parent Signal Ticket - ENUM_X_SIGNAL_TYPE type, // Specified Support Signal Type - bool isInDirectional = false // Specified Support Signal Direction - ) - { - // - string result = ""; - - // - if (ticket <= 0) - { - return result; - } - - // - string typeString = GetSignalType(type); - string directionStr = GenerateSupportDirection(isInDirectional); - - // - result = - mSupportPrefix + "(" + (string)ticket + ")_" + - X_SIGNAL_TYPE + "(" + typeString + ")_" + - directionStr; - - // - return result; - } - - // - // Get Support Direction String Representation ... - string GenerateSupportDirection( - bool isInDirectional = false // Specified Support Signal Direction - ) - { - // - string result = ""; - - // - result = - isInDirectional - ? mInDirectional - : mDirectional; - - // - return result; - } - - // - // Check an String Is Directional Or not ... - bool IsDirectionalSupport( - string comment // Specified Comment ... - ) - { - // - bool result = false; - - // - result = IsSupport(comment); - if (!result) - { - return result; - } - - // - int sPos = StringFind( - comment, - mDirectional); - result = sPos >= 0; - - // - return result; - } - - // - // Check an String Is In Directional Or not ... - bool IsInDirectionalSupport( - string comment // Specified Comment ... - ) - { - // - bool result = false; - - // - result = IsSupport(comment); - if (!result) - { - return result; - } - - // - int sPos = StringFind( - comment, - mInDirectional); - result = sPos >= 0; - - // - return result; - } - - // - // Check an String Is Support or not ... - bool IsSupport( - string comment // Specified Comment ... - ) - { - // - bool result = false; - - // - int sPos = StringFind( - comment, - mSupportPrefix); - result = sPos >= 0; - - // - return result; - } - - // - // Extract Parent of Support Signal Ticket from a comment ... - ulong ExtractParentTicket( - string comment // Specified Comment ... - ) - { - // - ulong result = 0; - - // - bool isSupport = IsSupport(comment); - if (!isSupport) - { - return result; - } - - // - // TICKET ... - string ticketStr = ExtractString( - comment, - mSupportPrefix + "(", - ")"); - if (StringLen(ticketStr) > 0) - { - result = (ulong)ticketStr; - } - - // - return result; - } - - // - // Check a Comment belongs to Support Signal or not ... - bool IsBelongsToParent( - ulong ticket, // Specified Parent Signal Ticket - string comment // Specified Support Signal Comment - ) - { - // - bool result = false; - - // - // Validate Arg ... - if (ticket <= 0) - { - return result; - } - - // - result = IsSupport(comment); - if (!result) - { - return result; - } - - // - ulong spTicket = ExtractParentTicket(comment); - result = spTicket == ticket; - - // - return result; - } - - // - // Add new Protecte Signal ... - bool AddSupport( - XSignal &signal // Specified Signal - ) - { - // - bool result = false; - - // - bool isExists = IsSupportExists(signal.ticket); - if (isExists) - { - return result; - } - - // - XProtectedSignal item; - - // - datetime time = TimeCurrent(); - - // - item.ticket = signal.ticket; - - // - AddItemToBuffer( - time, - item.time); - - // - AddItemToBuffer( - signal.profit, - item.profit); - - // - AddItemToBuffer( - item, - mSupportedSignals); - - // - return result; - } - - // - // Get All ... - void GetAllSupports( - XProtectedSignal &result[] // Hold's Result - ) - { - // - CopyBuffer( - mSupportedSignals, - result); - } - - // - // Get ... - XProtectedSignal GetSupport( - ulong ticket // Specified Signal Ticket - ) - { - // - XProtectedSignal result; - - // - bool isExists = IsSupportExists(ticket); - if (!isExists) - { - return result; - } - - // - int protectedCounts = ArraySize(mSupportedSignals); - if (protectedCounts <= 0) - { - return result; - } - - // - for (int i = 0; i < protectedCounts; i++) - { - // - XProtectedSignal iProtected = mSupportedSignals[i]; - - // - if (iProtected.ticket == ticket) - { - // - result = iProtected; - break; - } - } - - // - return result; - } - - // - // Remove ... - bool RemoveSupport( - ulong ticket // Specified Signal Ticket - ) - { - // - bool result = false; - - // - result = IsSupportExists(ticket); - if (!result) - { - return result; - } - - // - int protectedCounts = ArraySize(mSupportedSignals); - result = protectedCounts > 0; - if (!result) - { - return result; - } - - // - XProtectedSignal cleared[]; - for (int i = 0; i < protectedCounts; i++) - { - // - XProtectedSignal iProtected = mSupportedSignals[i]; - - // - if (iProtected.ticket != ticket) - { - AddItemToBuffer( - iProtected, - cleared); - } - } - - // - // Update Source by Cleared ... - CopyBuffer( - cleared, - mSupportedSignals); - - // - result = true; - - // - return result; - } - - // - // Update ... - bool UpdateSupport( - ulong ticket, // Specified Signal Ticket - datetime time, // Specified Last Checked time - double profit // Specified Signal Profit - ) - { - // - bool result = false; - - // - int protectedCounts = ArraySize(mSupportedSignals); - result = protectedCounts > 0; - if (!result) - { - return result; - } - - // - result = IsSupportExists(ticket); - if (!result) - { - return result; - } - - // - // Retrieve Struct ... - XProtectedSignal item = GetSupport(ticket); - AddItemToBuffer( - time, - item.time); - AddItemToBuffer( - profit, - item.profit); - - // - result = RemoveSupport(ticket); - if (!result) - { - return result; - } - - // - AddItemToBuffer( - item, - mSupportedSignals); - result = true; - - // - return result; - } - bool UpdateSupport( - XProtectedSignal &item // Specified Protected Item - ) - { - // - bool result = false; - - // - datetime time; - result = GetLastItem( - time, - item.time); - if (!result) - { - return result; - } - - // - double profit; - result = GetLastItem( - profit, - item.profit); - if (!result) - { - return result; - } - - // - result = UpdateSupport( - item.ticket, time, profit); - - // - return result; - } - bool UpdateSupport( - XSignal &signal // Specified Signal - ) - { - // - bool result = false; - - // - ulong ticket = signal.ticket; - datetime time = TimeCurrent(); - double profit = signal.profit; - - // - result = UpdateSupport( - ticket, - time, - profit); - - // - return result; - } - - // - // Add Or Update ... - bool AddOrUpdateSupport( - XSignal &signal // Specified Signal - ) - { - // - bool result = false; - - // - bool isExists = IsSupportExists(signal.ticket); - if (!isExists) - { - result = Add(signal); - } - else - { - result = Update(signal); - } - - // - return result; - } - - // - // Check Exists ... - bool IsSupportExists( - ulong ticket // Specified Signal Ticket - ) - { - // - bool result = false; - - // - // Validate Args ... - if (ticket <= 0) - { - return result; - } - - // - int protectedCounts = ArraySize(mSupportedSignals); - if (protectedCounts <= 0) - { - return result; - } - - // - for (int i = 0; i < protectedCounts; i++) - { - // - XProtectedSignal iProtected = mSupportedSignals[i]; - - // - if (iProtected.ticket == ticket) - { - // - result = true; - break; - } - } - - // - return result; - } - - // - // Count Protecteds ... - int CountSupports() - { - // - int result = 0; - - // - result = ArraySize(mSupportedSignals); - - // - return result; - } - - // - // END Suppoprted Signals Functions ... - // - - // - // START Getter/Setter(s) ... - // - - // - int GetOldAge() - { - return mOldAge; - } - - // - bool SetOldAge(int value) - { - // - bool result = false; - - // - result = - value > 0 && - mOldAge != value; - if (!result) - { - return result; - } - - // - mOldAge = value; - - // - return result; - } - - // - ENUM_X_GUARD_ACTIONS GetOldGuardAction() - { - return mOldGuardAction; - } - - // - bool SetOldGuardAction(ENUM_X_GUARD_ACTIONS value) - { - // - bool result = false; - - // - result = value != mOldGuardAction; - if (!result) - { - return result; - } - - // - mOldGuardAction = value; - - // - return result; - } - - // - double GetCriticalFactor() - { - return mCriticalFactor; - } - - // - bool SetCriticalFactor(bool value) - { - // - bool result = false; - - // - result = - value > 0 && - value < 1 && - mCriticalFactor != value; - if (!result) - { - return result; - } - - // - mCriticalFactor = value; - - // - double deposit = mAccountInfo.GetInitialBalance(); - mCriticalValue = deposit * value; - - // - return result; - } - - // - ENUM_X_GUARD_ACTIONS GetCriticalAction() - { - return mCriticalAction; - } - - // - bool SetCriticalAction(ENUM_X_GUARD_ACTIONS value) - { - // - bool result = false; - - // - result = - value != mCriticalAction; - if (!result) - { - return result; - } - - // - mCriticalAction = value; - - // - return result; - } - - // - double GetMaxFactor() - { - return mMaxFactor; - } - - // - bool SetMaxFactor(bool value) - { - // - bool result = false; - - // - result = - value > 0 && - value < 1 && - mMaxFactor != value; - if (!result) - { - return result; - } - - // - mMaxFactor = value; - - // - double deposit = mAccountInfo.GetInitialBalance(); - mMaxValue = deposit * value; - - // - return result; - } - - // - ENUM_X_GUARD_ACTIONS GetMaxAction() - { - return mMaxAction; - } - - // - bool SetMaxAction(ENUM_X_GUARD_ACTIONS value) - { - // - bool result = false; - - // - result = - value != mMaxAction; - if (!result) - { - return result; - } - - // - mMaxAction = value; - - // - return result; - } - - // - ENUM_X_GUARD_SUPPORT_METHODS GetSupportMethod() - { - return mSupportMethod; - } - - // - bool SetSupportMethod(ENUM_X_GUARD_SUPPORT_METHODS value) - { - // - bool result = false; - - // - result = - value != mSupportMethod; - if (!result) - { - return result; - } - - // - mSupportMethod = value; - - // - return result; - } - - // - // END Getter/Setter(s) ... - // - - // - // Generate Signal Guard Attacked Message ... - string GenerateGuardedSignalComment( - XSignal &signal, // Specified Signal - ENUM_X_GUARD_REASONS reason // Specified Guard Reason - ) - { - // - string result = ""; - - // - string reasonMessage = - ( - // - reason == X_GUARDED_OLD - ? "Because of Old Issue" - : reason == X_GUARDED_CRITICAL - ? "Because Of Crtical Drawdown Isuue" - : reason == X_GUARDED_MAX - ? "Because of Max Drawdown Issue" - : "" - // - ) + - " On Profit: " + (string)signal.profit; - - // - result += "Guard Attacked (" + (string)signal.ticket + "), " + reasonMessage + " ..."; - - // - return result; - } - - // - // Protected ... -protected: - // - // Private ... -private: - // - string mSupportPrefix; - string mDirectional; - string mInDirectional; - - // - XProtectedSignal mGuardedSignals[]; - XProtectedSignal mSupportedSignals[]; - - // - int mOldAge; - ENUM_X_GUARD_ACTIONS mOldGuardAction; - - // - // Critical DrawDown Factor based On Balance ... - double mCriticalFactor; - double mCriticalValue; - - // - // Guard Action for Critical State ... - ENUM_X_GUARD_ACTIONS mCriticalAction; - - // - // Max DrawDown Factor based on Balance ... - double mMaxFactor; - double mMaxValue; - // - // Guard Stopout if Max State touched ... - int mOccuredconsecutiveMaxDraDownTouches; - int mGuardStopoutFiredAfterTouches; - - // - // Guard Action for Max State ... - ENUM_X_GUARD_ACTIONS mMaxAction; - - // - // How to Support Signals ... - ENUM_X_GUARD_SUPPORT_METHODS mSupportMethod; - - // - // Account Info Instance ... - XCAccountInfo mAccountInfo; - - // - // Get Volume Multiplier for Specified Guard Action ... - double GetGuardActionVolumeMultiplier( - ENUM_X_GUARD_ACTIONS action = X_GUARD_DO_NOTHING // Specified Action - ) - { - // - // Partial Close Max In Drawdown Trade ... - double result = 0.0; - if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1) - { - result = 0.01; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_2) - { - result = 0.02; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_3) - { - result = 0.03; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5) - { - result = 0.05; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10) - { - result = 0.10; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_15) - { - result = 0.15; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_20) - { - result = 0.20; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_25) - { - result = 0.25; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_30) - { - result = 0.30; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_40) - { - result = 0.40; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_50) - { - result = 0.50; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_60) - { - result = 0.60; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_70) - { - result = 0.70; - } - else if (action == X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_75) - { - result = 0.75; - } - - // - return result; - } - - // - // Do Specified Guard Action ... - bool DoGuardAction( - XGuardHandlerResult &guardResult, // Hold's Result ... - string &message, // Hold's Message ... - XCTrade &trader, // Specified Trader Class ... - ENUM_X_GUARD_ACTIONS action, // Specified Which Action to Do ... - ENUM_X_GUARD_REASONS reason, // Specified Guard Reason ... - ENUM_TIMEFRAMES period = NULL // Specified Time Frame for Detecting Signal Ages ... - ) - { - // - bool result = false; - - // - message = ""; - - // - string reasonString = - reason == X_GUARDED_OLD - ? "Because of Age Issue" - : "Because of DD " + ( - // - reason == X_GUARDED_CRITICAL ? "Critical" : "Max" - // - ) + - " Issue"; - - // - // Validate Args ... - if (action == X_GUARD_DO_NOTHING) - { - // - message = "Max Allowed Drawdown Reached, but nothing Happens ..."; - - // - return result; - } - - // - // Normalize Period ... - if (period == NULL) - { - period = _Period; - } - - // - // Close All Signals ... - XSignal closed[]; - XSignal maxInDDSignal; - - // - // Handle Perform Guard Action ... - switch (action) - { - // - // Close All ... - case X_GUARD_CLOSE_ALL: - { - // - trader.CloseSignals(closed); - int closedCount = ArraySize(closed); - result = closedCount > 0; - if (!result) - { - break; - } - - // - message = "Closed (" + (string)closedCount + ") Trades by Guard, " + reasonString + " ..."; - } - break; - - // - case X_GUARD_CLOSE_MAX_IN_DD: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_2: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_3: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_15: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_20: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_25: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_30: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_40: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_50: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_60: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_70: - case X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_75: - { - // - // Retrieve Max In Drawdown Trade ... - maxInDDSignal = trader.GetMaxInDrawdownSignal(); - bool isValid = IsValid(maxInDDSignal, trader.GetMagicNumber()) && maxInDDSignal.ticket > 0; - if (!isValid) - { - break; - } - - // - // Close Max In Drawdown Trade ... - if (action == X_GUARD_CLOSE_MAX_IN_DD) - { - // - string comment = "Signal (" + (string)maxInDDSignal.ticket + ") Closed by Guard ..."; - result = trader.Close( - maxInDDSignal.ticket, - comment); - if (result) - { - message = comment; - } - - // - break; - } - - // - int signalAge = 0; - bool canGuard = true; - bool isGuardedBefore = false; - - // - // Do Some Additional Verifications if Guard for Olds Trades ... - if (reason == X_GUARDED_OLD) - { - // - // Retrieve Signal Age ... - signalAge = trader.GetSignalAge( - maxInDDSignal, - period); - - // - // Check Guarded Before Or Not ... - isGuardedBefore = IsExists(maxInDDSignal.ticket); - if (isGuardedBefore) - { - // - // Now We Have to Check Signal Age growse required times to apply Guard Action again ... - // First Calculate Guard Grow Step ... - int ageGrowStep = mOldAge / 10; - - // - XProtectedSignal guardItem = Get(maxInDDSignal.ticket); - datetime lastGuardTime = 0; - if (GetLastItem(lastGuardTime, guardItem.time)) - { - // - int lastGuardIndex = iBarShift( - maxInDDSignal.symbol, - period, - lastGuardTime); - - // - canGuard = - MathAbs(lastGuardIndex) >= ageGrowStep; - } - } - else - { - // - // Check Signal age ... - canGuard = signalAge >= mOldAge; - } - } - - // - // Prevent Moving Forward ... - if (!canGuard) - { - // - result = false; - break; - } - - // - // Partial Close Max In Drawdown Trade ... - double volumeRate = GetGuardActionVolumeMultiplier(action); - - // - double volume = NormalizeVolume( - maxInDDSignal.volume * volumeRate, - maxInDDSignal.symbol); - - // - string commentPrefix = "Signal (" + (string)maxInDDSignal.ticket + ") Partial Closed (" + (string)volumeRate + ") by Guard"; - string comment = commentPrefix + " ..."; - - // - result = trader.ClosePartial( - maxInDDSignal.ticket, - volume, - comment); - if (result) - { - // - reasonString = - reasonString + - (reason == X_GUARDED_OLD - ? " (" + (string)signalAge + ")" - : " (" + (string)maxInDDSignal.profit + ")"); - - // - // Update Guarded Signals ... - if (isGuardedBefore) - { - // - XSignal tSignal = trader.GetSignal(maxInDDSignal.ticket); - - // - if (tSignal.ticket > 0 && tSignal.volume > 0) - { - // - // Update In Guardeds ... - Update(tSignal); - } - else - { - // - // Remove From Guardeds ... - Remove(tSignal.ticket); - } - } - else if (reason == X_GUARDED_OLD) - { - // - // Added to Guardeds ... - Add(maxInDDSignal); - } - - // - message = commentPrefix + reasonString + " ..."; - } - } - break; - - // - // Nothing ... - // Default ... - default: - message = "Max Allowed Drawdown Reached ..."; - break; - } - - // - result = StringLen(message) > 0; - if (!result) - { - return result; - } - - // - if (result) - { - // - if (reason == X_GUARDED_OLD) - { - // - int closedCount = ArraySize(closed); - if (closedCount > 0) - { - // - for (int i = 0; i < closedCount; i++) - { - AddItemToBuffer( - closed[i], - guardResult.olds); - } - } - - // - if (maxInDDSignal.ticket > 0) - { - AddItemToBuffer( - maxInDDSignal, - guardResult.olds); - } - } - else if (reason == X_GUARDED_CRITICAL) - { - // - int closedCount = ArraySize(closed); - if (closedCount > 0) - { - // - for (int i = 0; i < closedCount; i++) - { - AddItemToBuffer( - closed[i], - guardResult.criticals); - } - } - - // - if (maxInDDSignal.ticket > 0) - { - AddItemToBuffer( - maxInDDSignal, - guardResult.criticals); - } - } - else if (reason == X_GUARDED_MAX) - { - // - int closedCount = ArraySize(closed); - if (closedCount > 0) - { - // - for (int i = 0; i < closedCount; i++) - { - AddItemToBuffer( - closed[i], - guardResult.maxes); - } - } - - // - if (maxInDDSignal.ticket > 0) - { - AddItemToBuffer( - maxInDDSignal, - guardResult.maxes); - } - } - } - - // - return result; - } -}; - -// -// END Global Definitions: Variables, Properties and etc ... -// diff --git a/BKP/XAU5-0.43/Classes/x-saherelm.nn.lib.mq5 b/BKP/XAU5-0.43/Classes/x-saherelm.nn.lib.mq5 deleted file mode 100644 index 8fa40f53..00000000 --- a/BKP/XAU5-0.43/Classes/x-saherelm.nn.lib.mq5 +++ /dev/null @@ -1,258 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 NN Class Library -// ---------------------------------------- -// Name: XNNClass -// Description: provides all classes for implementing -// Neural Network ... -// -// -// 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 - -// -// START Global Definitions: Variables, Properties and etc ... -// -class XCNNBase -{ - // - // Public Definitions ... -public: - // - // Constructor ... - void XCNNBase( - int nodes = 10, // Number of Input Nodes - double starterWeight = 0.5, // start weight for each input - double coEfficient = 0.1, // COEfficient Multiplier - double upperRange = 1, // Upper Normal Range Value - double lowerRange = -1, // Lower Normal Range Value - double learningRates = 0.1 // Back Propagation Learning Rate - ) { - // - mNodes = nodes; - mUpperRange = upperRange; - mLowerRange = lowerRange; - mCoEfficient = coEfficient; - mLearningRates = learningRates; - mStarterWeight = starterWeight; - - // - ReConstructWeights(); - } - - // - // Deconstructor ... - void ~XCNNBase() {} - - // - // Protected Definitions ... - void NormalizeInputs(double &inputs[], double &result[]) - { - // - ArrayFree(result); - ArrayResize(result, 1); - - // - // Validate inputs ... - if (ArraySize(inputs) != mNodes) - { - return; - } - - // - // Prepare Result ... - ArrayResize(result, mNodes); - - // - // Calculating min and max range value ... - double minRangeValue = inputs[ArrayMinimum(inputs)]; - double maxRangeValue = inputs[ArrayMaximum(inputs)]; - - // - // Loop through Inputs nd Normalize them ... - for (int i = 0; i < mNodes; i++) - { - // - double normalValue = (((inputs[i] - minRangeValue) * (mUpperRange - mLowerRange)) / (maxRangeValue - minRangeValue)) + mLowerRange; - result[i] = normalValue; - } - } - - // - // Hyperbolic Tangent Activation Function ... - double TanHActivationFunction(double weightedInputs) - { - // - double result = (exp(weightedInputs) - exp(-weightedInputs)) / (exp(weightedInputs) + exp(-weightedInputs)); - return result; - } - - // - // Calculate Weighted Inputs ... - double CalculateWeightedInputs( - double &inputs[], - bool applyCOEfficient = true) - { - // - double result = 0; - - // - // Validate Inputs ... - if (ArraySize(inputs) != mNodes) - { - // - result = -1; - return result; - } - - // - for (int i = 0; i < mNodes; i++) - { - result += inputs[i] * mWeights[i]; - } - - // - // Multiply if required ... - if (applyCOEfficient) - { - result *= mCoEfficient; - } - - // - return result; - } - - // - // Calculate Hidden Layers ... - virtual double CalculateHiddenLayer(double &inputs[]) - { - // - // this is Default Activation Function which used ... - // you can override this by writing your own ... - double totalWeightedInputs = CalculateWeightedInputs(inputs); - double result = TanHActivationFunction(totalWeightedInputs); - - // - return result; - } - - // - // Calculate Output Layers ... - double CalculateOutputLayer(double &inputs[]) - { - // - double result = -1; - - // - // Validate Inputs ... - if (ArraySize(inputs) != mNodes) { - return result; - } - - // - double normalizedInputs[]; - NormalizeInputs(inputs, normalizedInputs); - if (ArraySize(normalizedInputs) != mNodes) { - return result; - } - - // - double hiddenLayerResult = CalculateHiddenLayer(normalizedInputs); - - // - result = 1 * hiddenLayerResult; - - // - return result; - } - - // - // Basck Propaggation Learning ... - void BackPropagation( - double &inputs[], - double &outputs, - double targetOutput - ) { - // - // Validate Inputs ... - if (ArraySize(inputs) != mNodes) { - return; - } - - // - double normalizedInputs[]; - NormalizeInputs(inputs, normalizedInputs); - if (ArraySize(normalizedInputs) != mNodes) { - return; - } - - // - double error = targetOutput - outputs; - double derivative = 1 - MathPow(outputs, 2); - - // - for (int i = 0; i < mNodes; i++) { - // - double gradient = error * derivative * inputs[i]; - mWeights[i] = mLearningRates * gradient; - } - } - -protected: - // - // Private Definitions ... -private: - // - // Number of Input Nodes ... - int mNodes; - - // - // Specify Upper range of Normal Values ... - double mUpperRange; - - // - // Specify Lower range of Normal Values ... - double mLowerRange; - - // - // Starter Weight for each input node ... - double mStarterWeight; - - // - // double Input Node Weights ... - double mWeights[]; - - // - // CoEfficient is a multiplyer for weighted inputs ... - double mCoEfficient; - - // - // Back Propagation Learning Rates ... - double mLearningRates; - - // - // ReConstruct Weights ... - void ReConstructWeights() { - // - ArrayFree(mWeights); - ArrayResize(mWeights, mNodes); - - // - for (int i = 0; i< mNodes; i++) { - mWeights[i] = mStarterWeight; - } - } -} -// -// END Global Definitions: Variables, Properties and etc ... -// diff --git a/BKP/XAU5-0.43/Classes/x-saherelm.provider.lib.mq5 b/BKP/XAU5-0.43/Classes/x-saherelm.provider.lib.mq5 deleted file mode 100644 index 1dbdcd3f..00000000 --- a/BKP/XAU5-0.43/Classes/x-saherelm.provider.lib.mq5 +++ /dev/null @@ -1,4430 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Class Library -// -------------------------------------- -// Name: XProvider -// Description: provides all indicators based provider classes for use ... -// -// -// 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 - -// -// START Define Enums ... -// - -// -enum ENUM_X_SIGNAL_PROVIDERS -{ - // - // XSP Expert Support Mechanism ... - XSP, - // - // XTD ... - XTD, - // - // XTAM ... - XTAM, - // - // XSI ... - XSI, - // - // XTSFI ... - XTSFI, - // - // XOBDLH ... - XOBDLH, - // - // XCHMACC ... - XCHMACC, - // - // XCHMACMN ... - XCHMAMN, - // - // XCHMACMX ... - XCHMAMX, -}; - -// -// Represent Market Conditions ... -struct XMarketConditions -{ - // - // XTM ... - bool isXTMPeak; - bool isXTMVale; - bool isXTMBullish; - bool isXTMBearish; - bool isXTMNeutural; - bool isXTMEndBullish; - bool isXTMEndBearish; - bool isXTMStartBullish; - bool isXTMStartBearish; - bool isXTMEndBullishByNeutural; - bool isXTMEndBearishByNeutural; - bool isXTMStartBullishAfterNeutural; - bool isXTMStartBearishAfterNeutural; - - // - // XAMA ... - bool isXAMAPeak; - bool isXAMAVale; - bool isXAMABullish; - bool isXAMABearish; - bool isXAMANeutural; - bool isXAMAEndBullish; - bool isXAMAEndBearish; - bool isXAMAStartBullish; - bool isXAMAStartBearish; - bool isXAMAEndBullishByNeutural; - bool isXAMAEndBearishByNeutural; - bool isXAMAStartBullishAfterNeutural; - bool isXAMAStartBearishAfterNeutural; - - // - // XLH ... - bool isXLHHHIncreased; - bool isXLHHHDecreased; - bool isXLHLLIncreased; - bool isXLHLLDecreased; - bool isXLHLowAttachedLL; - bool isXLHHighAttachedHH; - bool isXLHHHSameInLength; - bool isXLHLLSameInLength; - bool isXLHPriceOverSignal; - bool isXLHPriceUnderSignal; - bool isXLHPriceInSignalRange; - bool isXLHPriceCrossedOverSignal; - bool isXLHPriceCrossedUnderSignal; - - // - // XTD ... - bool isXTDSignalPeak; - bool isXTDSignalVale; - bool isXTDBullishPeak; - bool isXTDBullishVale; - bool isXTDBearishPeak; - bool isXTDBearishVale; - bool isXTDBullOverBear; - bool isXTDBullUnderBear; - bool isXTDSignalOverBear; - bool isXTDSignalUnderBear; - bool isXTDBullCrossedOverBear; - bool isXTDBullCrossedUnderBear; - bool isXTDSignalCrossedOverBear; - bool isXTDSignalCrossedUnderBear; - - // - // XFI ... - bool isXFIPeak; - bool isXFIVale; - bool isXFICrossedOverZero; - bool isXFIOverZero; - bool isXFICrossedUnderZero; - bool isXFIUnderZero; - - // - // XTS ... - bool isXTSAllSame; - bool isXTSCurrentMin; - bool isXTSCurrentMax; - bool isXTSCurrentOverFarest; - bool isXTSCurrentOverNearest; - bool isXTSCurrentOverMediest; - bool isXTSCurrentUnderFarest; - bool isXTSCurrentUnderNearest; - bool isXTSCurrentUnderMediest; - bool isXTSCurrentCrossedOverFarest; - bool isXTSCurrentCrossedOverNearest; - bool isXTSCurrentCrossedOverMediest; - bool isXTSCurrentCrossedUnderFarest; - bool isXTSCurrentCrossedUnderNearest; - bool isXTSCurrentCrossedUnderMediest; - - // - // XRSI ... - bool isXRSIPeak; - bool isXRSIVale; - bool isXRSICrossedOverLongExit; - bool isXRSICrossedOverLongEntry; - bool isXRSICrossedUnderShortExit; - bool isXRSICrossedUnderShortEntry; - - // - // XOBD ... - bool isXOBDSwingLow; - bool isXOBDSwingHigh; - - // - // XCHLH ... - // - bool isXCHLHSameHHs; - bool isXCHLHSameLLs; - // - bool isXCHLHSCMCHHSame; - bool isXCHLHSCMCLLSame; - // - bool isXCHLHSCLCHHSame; - bool isXCHLHSCLCLLSame; - // - bool isXCHLHMCLCHHSame; - bool isXCHLHMCLCLLSame; - // - bool isXCHLHMCOnTopOfLC; - bool isXCHLHMCInBottomOfLC; - - // - // XCHMA ... - // - bool isXCHMASCOverMax; - bool isXCHMASCOverMin; - bool isXCHMASCUnderMax; - bool isXCHMASCUnderMin; - // - bool isXCHMASCCrossedOverMax; - bool isXCHMASCCrossedUnderMax; - bool isXCHMASCCrossedOverMin; - bool isXCHMASCCrossedUnderMin; - // - bool isXCHMASCPeak; - bool isXCHMASCVale; - bool isXCHMASCTrendsUp; - bool isXCHMASCTrendsDown; - bool isXCHMASCFastOverSlow; - bool isXCHMASCFastUnderSlow; - bool isXCHMASCFastCrossedOverSlow; - bool isXCHMASCFastCrossedUnderSlow; - // - bool isXCHMAMCPeak; - bool isXCHMAMCVale; - bool isXCHMAMCTrendsUp; - bool isXCHMAMCTrendsDown; - bool isXCHMAMCFastOverSlow; - bool isXCHMAMCFastUnderSlow; - bool isXCHMAMCFastCrossedOverSlow; - bool isXCHMAMCFastCrossedUnderSlow; - // - bool isXCHMALCPeak; - bool isXCHMALCVale; - bool isXCHMALCTrendsUp; - bool isXCHMALCTrendsDown; - bool isXCHMALCFastOverSlow; - bool isXCHMALCFastUnderSlow; - bool isXCHMALCFastCrossedOverSlow; - bool isXCHMALCFastCrossedUnderSlow; -}; - -// -// END Define Enums ... -// - -// -// START Includes Requirements ... -// - -// -// Includes Classes ... -#include "x-saherelm.class.lib.mq5" - -// -// Includes all Indicator's Helpers ... -#include "../Helpers/x-saherelm.xlh.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xtm.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xama.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xobd.indicator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xts.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5" -#include "../Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5" - -// -// END Includes Requirements ... -// - -// -class XCProvider : public XCBase -{ - // - // Public ... -public: - // - // Constructor ... - XCProvider( - // - // Common Requirements ... - string xSymbol, // Which Symbol is Used - ENUM_TIMEFRAMES xPeriod, // Which Period is Used - // - // Signallers Requirements ... - // - // XTD ... - bool xTDEnableSignaller, // Enable Signaller - bool xTDAllowLongSignals, // Allow Long Signals - bool xTDAllowShortSignals, // Allow Short Signals - // - // XTAM ... - bool xTAMEnableSignaller, // Enable Signaller - bool xTAMAllowLongSignals, // Allow Long Signals - bool xTAMAllowShortSignals, // Allow Short Signals - // - // XSI ... - bool xSIEnableSignaller, // Enable Signaller - bool xSIAllowLongSignals, // Allow Long Signals - bool xSIAllowShortSignals, // Allow Short Signals - // - // XTSFI ... - bool xTSFIEnableSignaller, // Enable Signaller - bool xTSFIAllowLongSignals, // Allow Long Signals - bool xTSFIAllowShortSignals, // Allow Short Signals - // - // XOBDLH ... - bool xOBDLHEnableSignaller, // Enable Signaller - bool xOBDLHAllowLongSignals, // Allow Long Signals - bool xOBDLHAllowShortSignals, // Allow Short Signals - // - // XCHMACC ... - bool xCHMACCEnableSignaller, // Enable Signaller - bool xCHMACCAllowLongSignals, // Allow Long Signals - bool xCHMACCAllowShortSignals, // Allow Short Signals - // - // XCHMAMX ... - bool xCHMACMXEnableSignaller, // Enable Signaller - bool xCHMACMXAllowLongSignals, // Allow Long Signals - bool xCHMACMXAllowShortSignals, // Allow Short Signals - // - // XCHMAMN ... - bool xCHMACMNEnableSignaller, // Enable Signaller - bool xCHMACMNAllowLongSignals, // Allow Long Signals - bool xCHMACMNAllowShortSignals // Allow Short Signals - // - ) - { - // - // XTD ... - mXTDEnableSignaller = xTDEnableSignaller; - mXTDAllowLongSignals = xTDAllowLongSignals; - mXTDAllowShortSignals = xTDAllowShortSignals; - - // - // XTAM ... - mXTAMEnableSignaller = xTAMEnableSignaller; - mXTAMAllowLongSignals = xTAMAllowLongSignals; - mXTAMAllowShortSignals = xTAMAllowShortSignals; - - // - // XSI ... - mXSIEnableSignaller = xSIEnableSignaller; - mXSIAllowLongSignals = xSIAllowLongSignals; - mXSIAllowShortSignals = xSIAllowShortSignals; - - // - // XTSFI ... - mXTSFIEnableSignaller = xTSFIEnableSignaller; - mXTSFIAllowLongSignals = xTSFIAllowLongSignals; - mXTSFIAllowShortSignals = xTSFIAllowShortSignals; - - // - // XOBDLH ... - mXOBDLHEnableSignaller = xOBDLHEnableSignaller; - mXOBDLHAllowLongSignals = xOBDLHAllowLongSignals; - mXOBDLHAllowShortSignals = xOBDLHAllowShortSignals; - - // - // XCHMACC ... - mXCHMACCEnableSignaller = xCHMACCEnableSignaller; - mXCHMACCAllowLongSignals = xCHMACCAllowLongSignals; - mXCHMACCAllowShortSignals = xCHMACCAllowShortSignals; - - // - // XCHMAMX ... - mXCHMAMXEnableSignaller = xCHMACMXEnableSignaller; - mXCHMAMXAllowLongSignals = xCHMACMXAllowLongSignals; - mXCHMAMXAllowShortSignals = xCHMACMXAllowShortSignals; - - // - // XCHMAMN ... - mXCHMAMNEnableSignaller = xCHMACMNEnableSignaller; - mXCHMAMNAllowLongSignals = xCHMACMNAllowLongSignals; - mXCHMAMNAllowShortSignals = xCHMACMNAllowShortSignals; - } - - // - // Deconstructor ... - ~XCProvider() {} - - // - // START Common Functions ... - // - - // - // Read All Globally Required Conditions ... - void ReadConditions() - { - // - ClearConditions(); - - // - mXConditions = GenerateMarketConditions(1); - } - - // - // Cleanup Conditions ... - void ClearConditions() - { - // - XMarketConditions mConditions = {}; - - // - mXConditions = mConditions; - } - - // - // Generate Merket Conditions for Specified Bar Index ... - XMarketConditions GenerateMarketConditions( - int bar_index = 1 // Specified Bar Index ... - ) - { - // - XMarketConditions mConditions = {}; - - // - // XTM ... - mConditions.isXTMPeak = XTMIsPeak(bar_index); - mConditions.isXTMVale = XTMIsVale(bar_index); - mConditions.isXTMBullish = XTMIsBullish(bar_index); - mConditions.isXTMBearish = XTMIsBearish(bar_index); - mConditions.isXTMNeutural = XTMIsNeutural(bar_index); - mConditions.isXTMEndBullish = XTMIsEndBullish(bar_index); - mConditions.isXTMEndBearish = XTMIsEndBearish(bar_index); - mConditions.isXTMStartBullish = XTMIsStartBullish(bar_index); - mConditions.isXTMStartBearish = XTMIsStartBearish(bar_index); - mConditions.isXTMEndBullishByNeutural = XTMIsEndBullishByNeutural(bar_index); - mConditions.isXTMEndBearishByNeutural = XTMIsEndBearishByNeutural(bar_index); - mConditions.isXTMStartBullishAfterNeutural = XTMIsStartBullishAfterNeutural(bar_index); - mConditions.isXTMStartBearishAfterNeutural = XTMIsStartBearishAfterNeutural(bar_index); - - // - // XAMA ... - mConditions.isXAMAPeak = XAMAIsPeak(bar_index); - mConditions.isXAMAVale = XAMAIsVale(bar_index); - mConditions.isXAMABullish = XAMAIsBullish(bar_index); - mConditions.isXAMABearish = XAMAIsBearish(bar_index); - mConditions.isXAMANeutural = XAMAIsNeutural(bar_index); - mConditions.isXAMAEndBullish = XAMAIsEndBullish(bar_index); - mConditions.isXAMAEndBearish = XAMAIsEndBearish(bar_index); - mConditions.isXAMAStartBullish = XAMAIsStartBullish(bar_index); - mConditions.isXAMAStartBearish = XAMAIsStartBearish(bar_index); - mConditions.isXAMAEndBullishByNeutural = XAMAIsEndBullishByNeutural(bar_index); - mConditions.isXAMAEndBearishByNeutural = XAMAIsEndBearishByNeutural(bar_index); - mConditions.isXAMAStartBullishAfterNeutural = XAMAIsStartBullishAfterNeutural(bar_index); - mConditions.isXAMAStartBearishAfterNeutural = XAMAIsStartBearishAfterNeutural(bar_index); - - // - // XLH ... - mConditions.isXLHHHIncreased = XLHIsHHIncreased(bar_index); - mConditions.isXLHHHDecreased = XLHIsHHDecreased(bar_index); - mConditions.isXLHLLIncreased = XLHIsLLIncreased(bar_index); - mConditions.isXLHLLDecreased = XLHIsLLDecreased(bar_index); - mConditions.isXLHLowAttachedLL = XLHIsLowAttachedLL(bar_index); - mConditions.isXLHHighAttachedHH = XLHIsHighAttachedHH(bar_index); - mConditions.isXLHHHSameInLength = XLHIsHHSameInLength(bar_index); - mConditions.isXLHLLSameInLength = XLHIsLLSameInLength(bar_index); - mConditions.isXLHPriceOverSignal = XLHIsPriceOverSignal(bar_index); - mConditions.isXLHPriceUnderSignal = XLHIsPriceUnderSignal(bar_index); - mConditions.isXLHPriceInSignalRange = XLHIsPriceInSignalRange(bar_index); - mConditions.isXLHPriceCrossedOverSignal = XLHIsPriceCrossedOverSignal(bar_index); - mConditions.isXLHPriceCrossedUnderSignal = XLHIsPriceCrossedUnderSignal(bar_index); - - // - // XTD ... - mConditions.isXTDSignalPeak = XTDIsSignalPeak(bar_index); - mConditions.isXTDSignalVale = XTDIsSignalVale(bar_index); - mConditions.isXTDBullishPeak = XTDIsBullishPeak(bar_index); - mConditions.isXTDBullishVale = XTDIsBullishVale(bar_index); - mConditions.isXTDBearishPeak = XTDIsBearishPeak(bar_index); - mConditions.isXTDBearishVale = XTDIsBearishVale(bar_index); - mConditions.isXTDBullOverBear = XTDIsBullOverBear(bar_index); - mConditions.isXTDBullUnderBear = XTDIsBullUnderBear(bar_index); - mConditions.isXTDSignalOverBear = XTDIsSignalOverBear(bar_index); - mConditions.isXTDSignalUnderBear = XTDIsSignalUnderBear(bar_index); - mConditions.isXTDBullCrossedOverBear = XTDIsBullCrossedOverBear(bar_index); - mConditions.isXTDBullCrossedUnderBear = XTDIsBullCrossedUnderBear(bar_index); - mConditions.isXTDSignalCrossedOverBear = XTDIsSignalCrossedOverBear(bar_index); - mConditions.isXTDSignalCrossedUnderBear = XTDIsSignalCrossedUnderBear(bar_index); - - // - // XFI ... - mConditions.isXFIPeak = XFIIsPeak(bar_index); - mConditions.isXFIVale = XFIIsVale(bar_index); - mConditions.isXFIOverZero = XFIIsOverZero(bar_index); - mConditions.isXFIUnderZero = XFIIsUnderZero(bar_index); - mConditions.isXFICrossedOverZero = XFIIsCrossedOverZero(bar_index); - mConditions.isXFICrossedUnderZero = XFIIsCrossedUnderZero(bar_index); - - // - // XTS ... - mConditions.isXTSAllSame = XTSIsAllSame(bar_index); - mConditions.isXTSCurrentMin = XTSIsCurrentMin(bar_index); - mConditions.isXTSCurrentMax = XTSIsCurrentMax(bar_index); - mConditions.isXTSCurrentOverFarest = XTSIsCurrentOverFarest(bar_index); - mConditions.isXTSCurrentOverNearest = XTSIsCurrentOverNearest(bar_index); - mConditions.isXTSCurrentOverMediest = XTSIsCurrentOverMediest(bar_index); - mConditions.isXTSCurrentUnderFarest = XTSIsCurrentUnderFarest(bar_index); - mConditions.isXTSCurrentUnderNearest = XTSIsCurrentUnderNearest(bar_index); - mConditions.isXTSCurrentUnderMediest = XTSIsCurrentUnderMediest(bar_index); - mConditions.isXTSCurrentCrossedOverFarest = XTSIsCurrentCrossedOverFarest(bar_index); - mConditions.isXTSCurrentCrossedOverNearest = XTSIsCurrentCrossedOverNearest(bar_index); - mConditions.isXTSCurrentCrossedOverMediest = XTSIsCurrentCrossedOverMediest(bar_index); - mConditions.isXTSCurrentCrossedUnderFarest = XTSIsCurrentCrossedUnderFarest(bar_index); - mConditions.isXTSCurrentCrossedUnderNearest = XTSIsCurrentCrossedUnderNearest(bar_index); - mConditions.isXTSCurrentCrossedUnderMediest = XTSIsCurrentCrossedUnderMediest(bar_index); - - // - // XRSI ... - mConditions.isXRSIPeak = XRSIIsPeak(bar_index); - mConditions.isXRSIVale = XRSIIsVale(bar_index); - mConditions.isXRSICrossedOverLongExit = XRSIIsCrossedOverLongExit(bar_index); - mConditions.isXRSICrossedOverLongEntry = XRSIIsCrossedOverLongEntry(bar_index); - mConditions.isXRSICrossedUnderShortExit = XRSIIsCrossedUnderShortExit(bar_index); - mConditions.isXRSICrossedUnderShortEntry = XRSIIsCrossedUnderShortEntry(bar_index); - - // - // XOBD ... - mConditions.isXOBDSwingLow = XOBDIsSwingLow(bar_index); - mConditions.isXOBDSwingHigh = XOBDIsSwingHigh(bar_index); - - // - // XCHLH ... - // - mConditions.isXCHLHSameHHs = XCHLHIsSameHHs(bar_index); - mConditions.isXCHLHSameLLs = XCHLHIsSameLLs(bar_index); - // - mConditions.isXCHLHSCMCHHSame = XCHLHIsMCSCHasSameHH(bar_index); - mConditions.isXCHLHSCMCLLSame = XCHLHIsMCSCHasSameLL(bar_index); - // - mConditions.isXCHLHSCLCHHSame = XCHLHIsLCSCHasSameHH(bar_index); - mConditions.isXCHLHSCLCLLSame = XCHLHIsLCSCHasSameLL(bar_index); - // - mConditions.isXCHLHMCLCHHSame = XCHLHIsLCMCHasSameHH(bar_index); - mConditions.isXCHLHMCLCLLSame = XCHLHIsLCMCHasSameLL(bar_index); - // - mConditions.isXCHLHMCOnTopOfLC = XCHLHIsMCOnTopOfLC(bar_index); - mConditions.isXCHLHMCInBottomOfLC = XCHLHIsMCInBottomOfLC(bar_index); - - // - // XCHMA ... - // - mConditions.isXCHMASCOverMax = XCHMAIsSCOverMax(bar_index); - mConditions.isXCHMASCOverMin = XCHMAIsSCOverMin(bar_index); - mConditions.isXCHMASCUnderMax = XCHMAIsSCUnderMax(bar_index); - mConditions.isXCHMASCUnderMin = XCHMAIsSCUnderMin(bar_index); - // - mConditions.isXCHMASCCrossedOverMax = XCHMAIsSCCrossedOverMax(bar_index); - mConditions.isXCHMASCCrossedUnderMax = XCHMAIsSCCrossedUnderMax(bar_index); - mConditions.isXCHMASCCrossedOverMin = XCHMAIsSCCrossedOverMin(bar_index); - mConditions.isXCHMASCCrossedUnderMin = XCHMAIsSCCrossedUnderMin(bar_index); - // - mConditions.isXCHMASCPeak = XCHMAIsSCPeak(bar_index); - mConditions.isXCHMASCVale = XCHMAIsSCVale(bar_index); - mConditions.isXCHMASCTrendsUp = XCHMAIsSCTrendsUp(bar_index); - mConditions.isXCHMASCTrendsDown = XCHMAIsSCTrendsDown(bar_index); - mConditions.isXCHMASCFastOverSlow = XCHMAIsSCFastOverSlow(bar_index); - mConditions.isXCHMASCFastUnderSlow = XCHMAIsSCFastUnderSlow(bar_index); - mConditions.isXCHMASCFastCrossedOverSlow = XCHMAIsSCFastCrossedOverSlow(bar_index); - mConditions.isXCHMASCFastCrossedUnderSlow = XCHMAIsSCFastCrossedUnderSlow(bar_index); - // - mConditions.isXCHMAMCPeak = XCHMAIsMCPeak(bar_index); - mConditions.isXCHMAMCVale = XCHMAIsMCVale(bar_index); - mConditions.isXCHMAMCTrendsUp = XCHMAIsMCTrendsUp(bar_index); - mConditions.isXCHMAMCTrendsDown = XCHMAIsMCTrendsDown(bar_index); - mConditions.isXCHMAMCFastOverSlow = XCHMAIsMCFastOverSlow(bar_index); - mConditions.isXCHMAMCFastUnderSlow = XCHMAIsMCFastUnderSlow(bar_index); - mConditions.isXCHMAMCFastCrossedOverSlow = XCHMAIsMCFastCrossedOverSlow(bar_index); - mConditions.isXCHMAMCFastCrossedUnderSlow = XCHMAIsMCFastCrossedUnderSlow(bar_index); - // - mConditions.isXCHMALCPeak = XCHMAIsLCPeak(bar_index); - mConditions.isXCHMALCVale = XCHMAIsLCVale(bar_index); - mConditions.isXCHMALCTrendsUp = XCHMAIsLCTrendsUp(bar_index); - mConditions.isXCHMALCTrendsDown = XCHMAIsLCTrendsDown(bar_index); - mConditions.isXCHMALCFastOverSlow = XCHMAIsLCFastOverSlow(bar_index); - mConditions.isXCHMALCFastUnderSlow = XCHMAIsLCFastUnderSlow(bar_index); - mConditions.isXCHMALCFastCrossedOverSlow = XCHMAIsLCFastCrossedOverSlow(bar_index); - mConditions.isXCHMALCFastCrossedUnderSlow = XCHMAIsLCFastCrossedUnderSlow(bar_index); - - // - return mConditions; - } - - // - // Access Last Readed Market Conditions ... - XMarketConditions GetLastMarketCondition() - { - // - XMarketConditions result = {}; - - // - result = mXConditions; - - // - return result; - } - - // - // Check Market Conditions is Ready for Long Signals or not ... - bool IsReadyForLong( - bool checkXCHMAMin = true, // Force Check XCHMA Min State - bool checkXCHMAMax = true, // Force Check XCHMA Max State - bool checkXCHMACycles = true, // Force Check XCHMA Cycles State - bool checkXCHMAPeaks = true, // Force Check XCHMA Peaks State - bool checkXCHMATrendPowers = true, // Force Check XCHMA Trend Powers - bool checkXOBD = true, // Force Check XOBD State - bool checkXTS = true // Force Check XTS State - ) - { - // - bool result = true; - - // - if (checkXCHMAMin) - { - // - result = - // - // XCHMA MIN ... - !( - // - (mXConditions.isXCHMASCOverMin || - mXConditions.isXCHMASCCrossedOverMin) && - (mXConditions.isXCHMASCUnderMin || - mXConditions.isXCHMASCCrossedUnderMin) - // - ); - } - - // - if (checkXCHMAMax && result) - { - // - result = - // - // XCHMA MAX ... - !( - // - (mXConditions.isXCHMASCOverMax || - mXConditions.isXCHMASCCrossedOverMax) && - (mXConditions.isXCHMASCUnderMax || - mXConditions.isXCHMASCCrossedUnderMax) - // - ) - // - ; - } - - // - if (checkXCHMACycles && result) - { - // - result = - // - // Check XCHMA Trend Bullish ... - ( - // - // All Cycles Bullish ... - ( - // - // SC ... - (mXConditions.isXCHMASCFastOverSlow || - mXConditions.isXCHMASCFastCrossedOverSlow) - // - && - // - // MC ... - (mXConditions.isXCHMAMCFastOverSlow || - mXConditions.isXCHMAMCFastCrossedOverSlow) - // - && - // - // LC ... - (mXConditions.isXCHMALCFastOverSlow || - mXConditions.isXCHMALCFastCrossedOverSlow) - // - ) - // - || - // - // Two Cycle Fully Bullish ... - ( - // - // SC and MC ... - ( - // - // SC ... - (mXConditions.isXCHMASCFastOverSlow || - mXConditions.isXCHMASCFastCrossedOverSlow) - // - && - // - // MC ... - (mXConditions.isXCHMAMCFastOverSlow || - mXConditions.isXCHMAMCFastCrossedOverSlow) - // - ) - // - || - // - // SC and LC ... - ( - // - // SC ... - (mXConditions.isXCHMASCFastOverSlow || - mXConditions.isXCHMASCFastCrossedOverSlow) - // - && - // - // LC ... - (mXConditions.isXCHMALCFastOverSlow || - mXConditions.isXCHMALCFastCrossedOverSlow) - // - ) - // - || - // - // MC and LC ... - ( - // - // MC ... - (mXConditions.isXCHMAMCFastOverSlow || - mXConditions.isXCHMAMCFastCrossedOverSlow) - // - && - // - // LC ... - (mXConditions.isXCHMALCFastOverSlow || - mXConditions.isXCHMALCFastCrossedOverSlow) - // - ) - // - ) - // - ) - // - ; - } - - // - if (checkXCHMAPeaks && result) - { - // - result = - // - // XCHMA Check Peaks ... - !( - // - // All Cycles Peak ... - (mXConditions.isXCHMASCPeak && - mXConditions.isXCHMAMCPeak && - mXConditions.isXCHMALCPeak) - // - || - // - ( - // - // SC MC ... - (mXConditions.isXCHMASCPeak && - mXConditions.isXCHMAMCPeak) - // - || - // - // SC LC ... - (mXConditions.isXCHMASCPeak && - mXConditions.isXCHMALCPeak) - // - || - // - // MC LC ... - (mXConditions.isXCHMAMCPeak && - mXConditions.isXCHMALCPeak) - // - ) - // - ) - // - ; - } - - // - if (checkXCHMATrendPowers && result) - { - // - result = - // - // XCHMA Check Trends Power ... - !( - // - // All Trends Down ... - (mXConditions.isXCHMASCTrendsDown && - mXConditions.isXCHMAMCTrendsDown && - mXConditions.isXCHMALCTrendsDown) - // - || - // - // Twisted pairs ... - ( - // - (mXConditions.isXCHMASCTrendsDown && - mXConditions.isXCHMAMCTrendsDown) - // - || - // - (mXConditions.isXCHMASCTrendsDown && - mXConditions.isXCHMALCTrendsDown) - // - || - // - (mXConditions.isXCHMAMCTrendsDown && - mXConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - ; - } - - // - if (checkXOBD && result) - { - // - result = - // - // XOBD Check Swings ... - !mXConditions.isXOBDSwingLow - // - ; - } - - // - if (checkXTS && result) - { - result = - // - // XTS Check ... - !( - // - mXConditions.isXTSCurrentMin && - // - ( - // - // All Under ... - ( - (mXConditions.isXTSCurrentUnderNearest || - mXConditions.isXTSCurrentCrossedUnderNearest) && - (mXConditions.isXTSCurrentUnderMediest || - mXConditions.isXTSCurrentCrossedUnderMediest) && - (mXConditions.isXTSCurrentUnderFarest || - mXConditions.isXTSCurrentCrossedUnderFarest)) - // - || - // - // Pairs ... - ( - // - ((mXConditions.isXTSCurrentUnderNearest || - mXConditions.isXTSCurrentCrossedUnderNearest) && - (mXConditions.isXTSCurrentUnderMediest || - mXConditions.isXTSCurrentCrossedUnderMediest)) - // - || - // - ((mXConditions.isXTSCurrentUnderNearest || - mXConditions.isXTSCurrentCrossedUnderNearest) && - (mXConditions.isXTSCurrentUnderFarest || - mXConditions.isXTSCurrentCrossedUnderFarest)) - // - || - // - ((mXConditions.isXTSCurrentUnderMediest || - mXConditions.isXTSCurrentCrossedUnderMediest) && - (mXConditions.isXTSCurrentUnderFarest || - mXConditions.isXTSCurrentCrossedUnderFarest)) - // - ) - // - ) - // - ) - // - ; - } - - // - return result; - } - - // - // Check Market Conditions is Ready for Short Signals or not ... - bool IsReadyForShort( - bool checkXCHMAMin = true, // Force Check XCHMA Min State - bool checkXCHMAMax = true, // Force Check XCHMA Max State - bool checkXCHMACycles = true, // Force Check XCHMA Cycles State - bool checkXCHMAVales = true, // Force Check XCHMA Vales State - bool checkXCHMATrendPowers = true, // Force Check XCHMA Trend Powers - bool checkXOBD = true, // Force Check XOBD State - bool checkXTS = true // Force Check XTS State - ) - { - // - bool result = true; - - // - if (checkXCHMAMin) - { - // - result = - // - // XCHMA MIN ... - !( - // - (mXConditions.isXCHMASCOverMin || - mXConditions.isXCHMASCCrossedOverMin) && - (mXConditions.isXCHMASCUnderMin || - mXConditions.isXCHMASCCrossedUnderMin) - // - ); - } - - // - if (checkXCHMAMax && result) - { - // - result = - // - // XCHMA MAX ... - !( - // - (mXConditions.isXCHMASCOverMax || - mXConditions.isXCHMASCCrossedOverMax) && - (mXConditions.isXCHMASCUnderMax || - mXConditions.isXCHMASCCrossedUnderMax) - // - ) - // - ; - } - - // - if (checkXCHMACycles && result) - { - // - result = - // - // Check XCHMA Trend Bullish ... - ( - // - // All Cycles Bullish ... - ( - // - // SC ... - (mXConditions.isXCHMASCFastUnderSlow || - mXConditions.isXCHMASCFastCrossedUnderSlow) - // - && - // - // MC ... - (mXConditions.isXCHMAMCFastUnderSlow || - mXConditions.isXCHMAMCFastCrossedUnderSlow) - // - && - // - // LC ... - (mXConditions.isXCHMALCFastUnderSlow || - mXConditions.isXCHMALCFastCrossedUnderSlow) - // - ) - // - || - // - // Two Cycle Fully Bullish ... - ( - // - // SC and MC ... - ( - // - // SC ... - (mXConditions.isXCHMASCFastUnderSlow || - mXConditions.isXCHMASCFastCrossedOverSlow) - // - && - // - // MC ... - (mXConditions.isXCHMAMCFastUnderSlow || - mXConditions.isXCHMAMCFastCrossedOverSlow) - // - ) - // - || - // - // SC and LC ... - ( - // - // SC ... - (mXConditions.isXCHMASCFastUnderSlow || - mXConditions.isXCHMASCFastCrossedUnderSlow) - // - && - // - // LC ... - (mXConditions.isXCHMALCFastUnderSlow || - mXConditions.isXCHMALCFastCrossedUnderSlow) - // - ) - // - || - // - // MC and LC ... - ( - // - // MC ... - (mXConditions.isXCHMAMCFastUnderSlow || - mXConditions.isXCHMAMCFastCrossedOverSlow) - // - && - // - // LC ... - (mXConditions.isXCHMALCFastUnderSlow || - mXConditions.isXCHMALCFastCrossedOverSlow) - // - ) - // - ) - // - ) - // - ; - } - - // - if (checkXCHMAVales && result) - { - // - result = - // - // XCHMA Check Vales ... - !( - // - // All Cycles Vale ... - (mXConditions.isXCHMASCVale && - mXConditions.isXCHMAMCVale && - mXConditions.isXCHMALCVale) - // - || - // - ( - // - // SC MC ... - (mXConditions.isXCHMASCVale && - mXConditions.isXCHMAMCVale) - // - || - // - // SC LC ... - (mXConditions.isXCHMASCVale && - mXConditions.isXCHMALCVale) - // - || - // - // MC LC ... - (mXConditions.isXCHMAMCVale && - mXConditions.isXCHMALCVale) - // - ) - // - ) - // - ; - } - - // - if (checkXCHMATrendPowers && result) - { - // - result = - // - // XCHMA Check Trends Power ... - !( - // - // All Trends Down ... - (mXConditions.isXCHMASCTrendsDown && - mXConditions.isXCHMAMCTrendsDown && - mXConditions.isXCHMALCTrendsDown) - // - || - // - // Twisted pairs ... - ( - // - (mXConditions.isXCHMASCTrendsDown && - mXConditions.isXCHMAMCTrendsDown) - // - || - // - (mXConditions.isXCHMASCTrendsDown && - mXConditions.isXCHMALCTrendsDown) - // - || - // - (mXConditions.isXCHMAMCTrendsDown && - mXConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - ; - } - - // - if (checkXOBD && result) - { - // - result = - // - // XOBD Check Swings ... - !mXConditions.isXOBDSwingHigh - // - ; - } - - // - if (checkXTS && result) - { - // - result = - // - // XTS Check ... - !( - // - mXConditions.isXTSCurrentMax && - // - ( - // - // All Over ... - ( - (mXConditions.isXTSCurrentOverNearest || - mXConditions.isXTSCurrentCrossedOverNearest) && - (mXConditions.isXTSCurrentOverMediest || - mXConditions.isXTSCurrentCrossedOverMediest) && - (mXConditions.isXTSCurrentOverFarest || - mXConditions.isXTSCurrentCrossedOverFarest)) - // - || - // - // Pairs ... - ( - // - ((mXConditions.isXTSCurrentOverNearest || - mXConditions.isXTSCurrentCrossedOverNearest) && - (mXConditions.isXTSCurrentOverMediest || - mXConditions.isXTSCurrentCrossedOverMediest)) - // - || - // - ((mXConditions.isXTSCurrentOverNearest || - mXConditions.isXTSCurrentCrossedOverNearest) && - (mXConditions.isXTSCurrentOverFarest || - mXConditions.isXTSCurrentCrossedOverFarest)) - // - || - // - ((mXConditions.isXTSCurrentOverMediest || - mXConditions.isXTSCurrentCrossedOverMediest) && - (mXConditions.isXTSCurrentOverFarest || - mXConditions.isXTSCurrentCrossedOverFarest)) - // - ) - // - ) - // - ) - // - ; - } - - // - return result; - } - - // - // Converts Market Conditions to Specific String Representation ... - string GenerateConditionsString( - XMarketConditions &condition, // Specify Conditiond - string separator = "\n", // Specify Separator - bool ignoreFalses = true // Ignore False Conditions - ) - { - // - XMarketConditions mConditions = {}; - - // - mConditions = condition; - - // - string result = "\n"; - - // - // XOBD ... - result += - "| XOBD |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXOBDSwingLow)) - { - result += "isXOBDSwingLow: " + (string)mConditions.isXOBDSwingLow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXOBDSwingHigh)) - { - result += "isXOBDSwingHigh: " + (string)mConditions.isXOBDSwingHigh + separator; - } - - // - // Separator ... - result += separator; - - // - // XTM ... - result += - "| XTM |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMPeak)) - { - result += "isXTMPeak: " + (string)mConditions.isXTMPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMVale)) - { - result += "isXTMVale: " + (string)mConditions.isXTMVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBullish)) - { - result += "isXTMStartBullish: " + (string)mConditions.isXTMStartBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBullishAfterNeutural)) - { - result += "isXTMStartBullishAfterNeutural: " + (string)mConditions.isXTMStartBullishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMBullish)) - { - result += "isXTMBullish: " + (string)mConditions.isXTMBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBullish)) - { - result += "isXTMEndBullish: " + (string)mConditions.isXTMEndBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBullishByNeutural)) - { - result += "isXTMEndBullishByNeutural: " + (string)mConditions.isXTMEndBullishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBearish)) - { - result += "isXTMStartBearish: " + (string)mConditions.isXTMStartBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMStartBearishAfterNeutural)) - { - result += "isXTMStartBearishAfterNeutural: " + (string)mConditions.isXTMStartBearishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMBearish)) - { - result += "isXTMBearish: " + (string)mConditions.isXTMBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBearish)) - { - result += "isXTMEndBearish: " + (string)mConditions.isXTMEndBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMEndBearishByNeutural)) - { - result += "isXTMEndBearishByNeutural: " + (string)mConditions.isXTMEndBearishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTMNeutural)) - { - result += "isXTMNeutural: " + (string)mConditions.isXTMNeutural + separator; - } - - // - // Separator ... - result += separator; - - // - // XAMA ... - result += - "| XAMA |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAPeak)) - { - result += "isXAMAPeak: " + (string)mConditions.isXAMAPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAVale)) - { - result += "isXAMAVale: " + (string)mConditions.isXAMAVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBullish)) - { - result += "isXAMAStartBullish: " + (string)mConditions.isXAMAStartBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBullishAfterNeutural)) - { - result += "isXAMAStartBullishAfterNeutural: " + (string)mConditions.isXAMAStartBullishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMABullish)) - { - result += "isXAMABullish: " + (string)mConditions.isXAMABullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBullish)) - { - result += "isXAMAEndBullish: " + (string)mConditions.isXAMAEndBullish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBullishByNeutural)) - { - result += "isXAMAEndBullishByNeutural: " + (string)mConditions.isXAMAEndBullishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBearish)) - { - result += "isXAMAStartBearish: " + (string)mConditions.isXAMAStartBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAStartBearishAfterNeutural)) - { - result += "isXAMAStartBearishAfterNeutural: " + (string)mConditions.isXAMAStartBearishAfterNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMABearish)) - { - result += "isXAMABearish: " + (string)mConditions.isXAMABearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBearish)) - { - result += "isXAMAEndBearish: " + (string)mConditions.isXAMAEndBearish + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMAEndBearishByNeutural)) - { - result += "isXAMAEndBearishByNeutural: " + (string)mConditions.isXAMAEndBearishByNeutural + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXAMANeutural)) - { - result += "isXAMANeutural: " + (string)mConditions.isXAMANeutural + separator; - } - - // - // Separator ... - result += separator; - - // - // XTD ... - result += - "| XTD |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalPeak)) - { - result += "isXTDSignalPeak: " + (string)mConditions.isXTDSignalPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalVale)) - { - result += "isXTDSignalVale: " + (string)mConditions.isXTDSignalVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullishPeak)) - { - result += "isXTDBullishPeak: " + (string)mConditions.isXTDBullishPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullishVale)) - { - result += "isXTDBullishVale: " + (string)mConditions.isXTDBullishVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBearishPeak)) - { - result += "isXTDBearishPeak: " + (string)mConditions.isXTDBearishPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBearishVale)) - { - result += "isXTDBearishVale: " + (string)mConditions.isXTDBearishVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullOverBear)) - { - result += "isXTDBullOverBear: " + (string)mConditions.isXTDBullOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullUnderBear)) - { - result += "isXTDBullUnderBear: " + (string)mConditions.isXTDBullUnderBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalOverBear)) - { - result += "isXTDSignalOverBear: " + (string)mConditions.isXTDSignalOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalUnderBear)) - { - result += "isXTDSignalUnderBear: " + (string)mConditions.isXTDSignalUnderBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullCrossedOverBear)) - { - result += "isXTDBullCrossedOverBear: " + (string)mConditions.isXTDBullCrossedOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDBullCrossedUnderBear)) - { - result += "isXTDBullCrossedUnderBear: " + (string)mConditions.isXTDBullCrossedUnderBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalCrossedOverBear)) - { - result += "isXTDSignalCrossedOverBear: " + (string)mConditions.isXTDSignalCrossedOverBear + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTDSignalCrossedUnderBear)) - { - result += "isXTDSignalCrossedUnderBear: " + (string)mConditions.isXTDSignalCrossedUnderBear + separator; - } - - // - // Separator ... - result += separator; - - // - // XFI ... - result += - "| XFI |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIPeak)) - { - result += "isXFIPeak: " + (string)mConditions.isXFIPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIVale)) - { - result += "isXFIVale: " + (string)mConditions.isXFIVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIOverZero)) - { - result += "isXFIOverZero: " + (string)mConditions.isXFIOverZero + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFIUnderZero)) - { - result += "isXFIUnderZero: " + (string)mConditions.isXFIUnderZero + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFICrossedOverZero)) - { - result += "isXFICrossedOverZero: " + (string)mConditions.isXFICrossedOverZero + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXFICrossedUnderZero)) - { - result += "isXFICrossedUnderZero: " + (string)mConditions.isXFICrossedUnderZero + separator; - } - - // - // Separator ... - result += separator; - - // - // XTS ... - result += - "| XTS |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSAllSame)) - { - result += "isXTSAllSame: " + (string)mConditions.isXTSAllSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentMin)) - { - result += "isXTSCurrentMin: " + (string)mConditions.isXTSCurrentMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentMax)) - { - result += "isXTSCurrentMax: " + (string)mConditions.isXTSCurrentMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentOverFarest)) - { - result += "isXTSCurrentOverFarest: " + (string)mConditions.isXTSCurrentOverFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentOverNearest)) - { - result += "isXTSCurrentOverNearest: " + (string)mConditions.isXTSCurrentOverNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentOverMediest)) - { - result += "isXTSCurrentOverMediest: " + (string)mConditions.isXTSCurrentOverMediest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentUnderFarest)) - { - result += "isXTSCurrentUnderFarest: " + (string)mConditions.isXTSCurrentUnderFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentUnderNearest)) - { - result += "isXTSCurrentUnderNearest: " + (string)mConditions.isXTSCurrentUnderNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentUnderMediest)) - { - result += "isXTSCurrentUnderMediest: " + (string)mConditions.isXTSCurrentUnderMediest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedOverFarest)) - { - result += "isXTSCurrentCrossedOverFarest: " + (string)mConditions.isXTSCurrentCrossedOverFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedOverNearest)) - { - result += "isXTSCurrentCrossedOverNearest: " + (string)mConditions.isXTSCurrentCrossedOverNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedOverMediest)) - { - result += "isXTSCurrentCrossedOverMediest: " + (string)mConditions.isXTSCurrentCrossedOverMediest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedUnderFarest)) - { - result += "isXTSCurrentCrossedUnderFarest: " + (string)mConditions.isXTSCurrentCrossedUnderFarest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedUnderNearest)) - { - result += "isXTSCurrentCrossedUnderNearest: " + (string)mConditions.isXTSCurrentCrossedUnderNearest + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXTSCurrentCrossedUnderMediest)) - { - result += "isXTSCurrentCrossedUnderMediest: " + (string)mConditions.isXTSCurrentCrossedUnderMediest + separator; - } - - // - // Separator ... - result += separator; - - // - // XLH ... - result += - "| XLH |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHHIncreased)) - { - result += "isXLHHHIncreased: " + (string)mConditions.isXLHHHIncreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHHDecreased)) - { - result += "isXLHHHDecreased: " + (string)mConditions.isXLHHHDecreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLLIncreased)) - { - result += "isXLHLLIncreased: " + (string)mConditions.isXLHLLIncreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLLDecreased)) - { - result += "isXLHLLDecreased: " + (string)mConditions.isXLHLLDecreased + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHighAttachedHH)) - { - result += "isXLHHighAttachedHH: " + (string)mConditions.isXLHHighAttachedHH + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLowAttachedLL)) - { - result += "isXLHLowAttachedLL: " + (string)mConditions.isXLHLowAttachedLL + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHHHSameInLength)) - { - result += "isXLHHHSameInLength: " + (string)mConditions.isXLHHHSameInLength + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHLLSameInLength)) - { - result += "isXLHLLSameInLength: " + (string)mConditions.isXLHLLSameInLength + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceCrossedOverSignal)) - { - result += "isXLHPriceCrossedOverSignal: " + (string)mConditions.isXLHPriceCrossedOverSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceOverSignal)) - { - result += "isXLHPriceOverSignal: " + (string)mConditions.isXLHPriceOverSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceCrossedUnderSignal)) - { - result += "isXLHPriceCrossedUnderSignal: " + (string)mConditions.isXLHPriceCrossedUnderSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceUnderSignal)) - { - result += "isXLHPriceUnderSignal: " + (string)mConditions.isXLHPriceUnderSignal + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXLHPriceInSignalRange)) - { - result += "isXLHPriceInSignalRange: " + (string)mConditions.isXLHPriceInSignalRange + separator; - } - - // - // Separator ... - result += separator; - - // - // XRSI ... - result += - "| XRSI |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSIPeak)) - { - result += "isXRSIPeak: " + (string)mConditions.isXRSIPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSIVale)) - { - result += "isXRSIVale: " + (string)mConditions.isXRSIVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedOverLongExit)) - { - result += "isXRSICrossedOverLongExit: " + (string)mConditions.isXRSICrossedOverLongExit + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedOverLongEntry)) - { - result += "isXRSICrossedOverLongEntry: " + (string)mConditions.isXRSICrossedOverLongEntry + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedUnderShortExit)) - { - result += "isXRSICrossedUnderShortExit: " + (string)mConditions.isXRSICrossedUnderShortExit + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXRSICrossedUnderShortEntry)) - { - result += "isXRSICrossedUnderShortEntry: " + (string)mConditions.isXRSICrossedUnderShortEntry + separator; - } - - // - // Separator ... - result += separator; - - // - // XCHLH ... - result += - "| XCHLH |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSameHHs)) - { - result += "isXCHLHSameHHs: " + (string)mConditions.isXCHLHSameHHs + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSameLLs)) - { - result += "isXCHLHSameLLs: " + (string)mConditions.isXCHLHSameLLs + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCMCHHSame)) - { - result += "isXCHLHSCMCHHSame: " + (string)mConditions.isXCHLHSCMCHHSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCMCLLSame)) - { - result += "isXCHLHSCMCLLSame: " + (string)mConditions.isXCHLHSCMCLLSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCLCHHSame)) - { - result += "isXCHLHSCLCHHSame: " + (string)mConditions.isXCHLHSCLCHHSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHSCLCLLSame)) - { - result += "isXCHLHSCLCLLSame: " + (string)mConditions.isXCHLHSCLCLLSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCLCHHSame)) - { - result += "isXCHLHMCLCHHSame: " + (string)mConditions.isXCHLHMCLCHHSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCLCLLSame)) - { - result += "isXCHLHMCLCLLSame: " + (string)mConditions.isXCHLHMCLCLLSame + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCOnTopOfLC)) - { - result += "isXCHLHMCOnTopOfLC: " + (string)mConditions.isXCHLHMCOnTopOfLC + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHLHMCInBottomOfLC)) - { - result += "isXCHLHMCInBottomOfLC: " + (string)mConditions.isXCHLHMCInBottomOfLC + separator; - } - - // - // Separator ... - result += separator; - - // - // XCHMA ... - result += - "| XCHMA |" + separator; - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCOverMax)) - { - result += "isXCHMASCOverMax: " + (string)mConditions.isXCHMASCOverMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCOverMin)) - { - result += "isXCHMASCOverMin: " + (string)mConditions.isXCHMASCOverMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCUnderMax)) - { - result += "isXCHMASCUnderMax: " + (string)mConditions.isXCHMASCUnderMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCUnderMin)) - { - result += "isXCHMASCUnderMin: " + (string)mConditions.isXCHMASCUnderMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedOverMax)) - { - result += "isXCHMASCCrossedOverMax: " + (string)mConditions.isXCHMASCCrossedOverMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedUnderMax)) - { - result += "isXCHMASCCrossedUnderMax: " + (string)mConditions.isXCHMASCCrossedUnderMax + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedOverMin)) - { - result += "isXCHMASCCrossedOverMin: " + (string)mConditions.isXCHMASCCrossedOverMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCCrossedUnderMin)) - { - result += "isXCHMASCCrossedUnderMin: " + (string)mConditions.isXCHMASCCrossedUnderMin + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCPeak)) - { - result += "isXCHMASCPeak: " + (string)mConditions.isXCHMASCPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCVale)) - { - result += "isXCHMASCVale: " + (string)mConditions.isXCHMASCVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCTrendsUp)) - { - result += "isXCHMASCTrendsUp: " + (string)mConditions.isXCHMASCTrendsUp + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCTrendsDown)) - { - result += "isXCHMASCTrendsDown: " + (string)mConditions.isXCHMASCTrendsDown + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastOverSlow)) - { - result += "isXCHMASCFastOverSlow: " + (string)mConditions.isXCHMASCFastOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastUnderSlow)) - { - result += "isXCHMASCFastUnderSlow: " + (string)mConditions.isXCHMASCFastUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastCrossedOverSlow)) - { - result += "isXCHMASCFastCrossedOverSlow: " + (string)mConditions.isXCHMASCFastCrossedOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMASCFastCrossedUnderSlow)) - { - result += "isXCHMASCFastCrossedUnderSlow: " + (string)mConditions.isXCHMASCFastCrossedUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCPeak)) - { - result += "isXCHMAMCPeak: " + (string)mConditions.isXCHMAMCPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCVale)) - { - result += "isXCHMAMCVale: " + (string)mConditions.isXCHMAMCVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCTrendsUp)) - { - result += "isXCHMAMCTrendsUp: " + (string)mConditions.isXCHMAMCTrendsUp + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCTrendsDown)) - { - result += "isXCHMAMCTrendsDown: " + (string)mConditions.isXCHMAMCTrendsDown + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastOverSlow)) - { - result += "isXCHMAMCFastOverSlow: " + (string)mConditions.isXCHMAMCFastOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastUnderSlow)) - { - result += "isXCHMAMCFastUnderSlow: " + (string)mConditions.isXCHMAMCFastUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastCrossedOverSlow)) - { - result += "isXCHMAMCFastCrossedOverSlow: " + (string)mConditions.isXCHMAMCFastCrossedOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMAMCFastCrossedUnderSlow)) - { - result += "isXCHMAMCFastCrossedUnderSlow: " + (string)mConditions.isXCHMAMCFastCrossedUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCPeak)) - { - result += "isXCHMALCPeak: " + (string)mConditions.isXCHMALCPeak + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCVale)) - { - result += "isXCHMALCVale: " + (string)mConditions.isXCHMALCVale + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCTrendsUp)) - { - result += "isXCHMALCTrendsUp: " + (string)mConditions.isXCHMALCTrendsUp + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCTrendsDown)) - { - result += "isXCHMALCTrendsDown: " + (string)mConditions.isXCHMALCTrendsDown + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastOverSlow)) - { - result += "isXCHMALCFastOverSlow: " + (string)mConditions.isXCHMALCFastOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastUnderSlow)) - { - result += "isXCHMALCFastUnderSlow: " + (string)mConditions.isXCHMALCFastUnderSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastCrossedOverSlow)) - { - result += "isXCHMALCFastCrossedOverSlow: " + (string)mConditions.isXCHMALCFastCrossedOverSlow + separator; - } - - // - if ( - !ignoreFalses || - (ignoreFalses && mConditions.isXCHMALCFastCrossedUnderSlow)) - { - result += "isXCHMALCFastCrossedUnderSlow: " + (string)mConditions.isXCHMALCFastCrossedUnderSlow + separator; - } - - // - // Separator ... - result += separator; - - // - return result; - } - - // - // END Common Functions ... - // - - // - // START Actions Based On Signallers ... - // - - // - // START XTD Signaller ... - // - - // - // Enable Signaller ... - bool EnableSXTDignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (mXTDEnableSignaller) - { - return result; - } - - // - result = true; - mXTDEnableSignaller = true; - - // - return result; - } - - // - // Disable Signaller ... - bool DisbaleXTDSignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (!mXTDEnableSignaller) - { - return result; - } - - // - result = true; - mXTDEnableSignaller = false; - - // - return result; - } - - // - // Allow Sginaller to Issue Long Signals ... - bool EnableXTDLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTDEnableSignaller || - mXTDAllowLongSignals) - { - return result; - } - - // - result = true; - mXTDAllowLongSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Long Signals ... - bool DisbaleXTDLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTDEnableSignaller || - !mXTDAllowLongSignals) - { - return result; - } - - // - result = true; - mXTDAllowLongSignals = false; - - // - return result; - } - - // - // Allow Signaller to Issue Short Sginals ... - bool EnableXTDShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTDEnableSignaller || - mXTDAllowShortSignals) - { - return result; - } - - // - result = true; - mXTDAllowShortSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Short Signals ... - bool DisableXTDShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTDEnableSignaller || - !mXTDAllowShortSignals) - { - return result; - } - - // - result = true; - mXTDAllowShortSignals = false; - - // - return result; - } - - // - // Check Market Base Conditions for Long Signals ... - bool XTDHasLongConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTDEnableSignaller || - !mXTDAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - mXConditions.isXTDSignalCrossedOverBear - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForLong() - // - ) - // - ; - - // - return result; - } - - // - // Check Market Base Conditions for Short Signals ... - bool XTDHasShortConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTDEnableSignaller || - !mXTDAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - mXConditions.isXTDSignalCrossedUnderBear - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForShort() - // - ) - // - ; - - // - return result; - } - - // - // END XTD Signaller ... - // - - // - // START XTAM Signaller ... - // - - // - // Enable Signaller ... - bool EnableSXTAMignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (mXTAMEnableSignaller) - { - return result; - } - - // - result = true; - mXTAMEnableSignaller = true; - - // - return result; - } - - // - // Disable Signaller ... - bool DisbaleXTAMSignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (!mXTAMEnableSignaller) - { - return result; - } - - // - result = true; - mXTAMEnableSignaller = false; - - // - return result; - } - - // - // Allow Sginaller to Issue Long Signals ... - bool EnableXTAMLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTAMEnableSignaller || - mXTAMAllowLongSignals) - { - return result; - } - - // - result = true; - mXTAMAllowLongSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Long Signals ... - bool DisbaleXTAMLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTAMEnableSignaller || - !mXTAMAllowLongSignals) - { - return result; - } - - // - result = true; - mXTAMAllowLongSignals = false; - - // - return result; - } - - // - // Allow Signaller to Issue Short Sginals ... - bool EnableXTAMShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTAMEnableSignaller || - mXTAMAllowShortSignals) - { - return result; - } - - // - result = true; - mXTAMAllowShortSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Short Signals ... - bool DisableXTAMShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTAMEnableSignaller || - !mXTAMAllowShortSignals) - { - return result; - } - - // - result = true; - mXTAMAllowShortSignals = false; - - // - return result; - } - - // - // Check Market Base Conditions for Long Signals ... - bool XTAMHasLongConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTAMEnableSignaller || - !mXTAMAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - (xAMAMaBuffer[1] > xTMMaBuffer[1] && - xAMAMaBuffer[2] > xTMMaBuffer[2]) - // - && - // - !(xAMAMaBuffer[2] > xTMMaBuffer[2] && - xAMAMaBuffer[3] > xTMMaBuffer[3]) - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForLong() - // - ) - // - ; - - // - return result; - } - - // - // Check Market Base Conditions for Short Signals ... - bool XTAMHasShortConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTAMEnableSignaller || - !mXTAMAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - (xAMAMaBuffer[1] < xTMMaBuffer[1] && - xAMAMaBuffer[2] < xTMMaBuffer[2]) - // - && - // - !(xAMAMaBuffer[2] < xTMMaBuffer[2] && - xAMAMaBuffer[3] < xTMMaBuffer[3]) - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForShort() - // - ) - // - ; - - // - return result; - } - - // - // END XTAM Signaller ... - // - - // - // START XSI Signaller ... - // - - // - // Enable Signaller ... - bool EnableSXSIignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (mXSIEnableSignaller) - { - return result; - } - - // - result = true; - mXSIEnableSignaller = true; - - // - return result; - } - - // - // Disable Signaller ... - bool DisbaleXSISignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (!mXSIEnableSignaller) - { - return result; - } - - // - result = true; - mXSIEnableSignaller = false; - - // - return result; - } - - // - // Allow Sginaller to Issue Long Signals ... - bool EnableXSILongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXSIEnableSignaller || - mXSIAllowLongSignals) - { - return result; - } - - // - result = true; - mXSIAllowLongSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Long Signals ... - bool DisbaleXSILongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXSIEnableSignaller || - !mXSIAllowLongSignals) - { - return result; - } - - // - result = true; - mXSIAllowLongSignals = false; - - // - return result; - } - - // - // Allow Signaller to Issue Short Sginals ... - bool EnableXSIShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXSIEnableSignaller || - mXSIAllowShortSignals) - { - return result; - } - - // - result = true; - mXSIAllowShortSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Short Signals ... - bool DisableXSIShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXSIEnableSignaller || - !mXSIAllowShortSignals) - { - return result; - } - - // - result = true; - mXSIAllowShortSignals = false; - - // - return result; - } - - // - // Check Market Base Conditions for Long Signals ... - bool XSIHasLongConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXSIEnableSignaller || - !mXSIAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - mXConditions.isXRSICrossedOverLongEntry && - xRSIBuffer[3] < xRSILongEntryValue - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForLong( - true, // XCHMA Min - true, // XCHMA Max - true, // XCHMA Cycles - true, // XCHMA Peaks - false, // XCHMA Trend Powers - true, // XOBD - true // XTS - ) - // - ) - // - ; - - // - return result; - } - - // - // Check Market Base Conditions for Short Signals ... - bool XSIHasShortConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXSIEnableSignaller || - !mXSIAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - mXConditions.isXRSICrossedUnderShortEntry && - xRSIBuffer[3] > xRSIShortEntryValue - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForShort( - true, // XCHMA Min - true, // XCHMA Max - true, // XCHMA Cycles - true, // XCHMA Peaks - false, // XCHMA Trend Powers - true, // XOBD - true // XTS - ) - // - ) - // - ; - - // - return result; - } - - // - // END XSI Signaller ... - // - - // - // START XTSFI Signaller ... - // - - // - // Enable Signaller ... - bool EnableSXTSFIignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (mXTSFIEnableSignaller) - { - return result; - } - - // - result = true; - mXTSFIEnableSignaller = true; - - // - return result; - } - - // - // Disable Signaller ... - bool DisbaleXTSFISignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (!mXTSFIEnableSignaller) - { - return result; - } - - // - result = true; - mXTSFIEnableSignaller = false; - - // - return result; - } - - // - // Allow Sginaller to Issue Long Signals ... - bool EnableXTSFILongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTSFIEnableSignaller || - mXTSFIAllowLongSignals) - { - return result; - } - - // - result = true; - mXTSFIAllowLongSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Long Signals ... - bool DisbaleXTSFILongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTSFIEnableSignaller || - !mXTSFIAllowLongSignals) - { - return result; - } - - // - result = true; - mXTSFIAllowLongSignals = false; - - // - return result; - } - - // - // Allow Signaller to Issue Short Sginals ... - bool EnableXTSFIShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTSFIEnableSignaller || - mXTSFIAllowShortSignals) - { - return result; - } - - // - result = true; - mXTSFIAllowShortSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Short Signals ... - bool DisableXTSFIShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTSFIEnableSignaller || - !mXTSFIAllowShortSignals) - { - return result; - } - - // - result = true; - mXTSFIAllowShortSignals = false; - - // - return result; - } - - // - // Check Market Base Conditions for Long Signals ... - bool XTSFIHasLongConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTSFIEnableSignaller || - !mXTSFIAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - XTSGetMinValue(1) == xTSFarestBuffer[1] && - (mXConditions.isXTSCurrentOverFarest || - mXConditions.isXTSCurrentCrossedOverFarest) && - (xTSCurrentBuffer[1] < xTSNearestBuffer[1] || - xTSCurrentBuffer[1] < xTSMediestBuffer[1]) && - !(mXConditions.isXTSCurrentUnderNearest || - mXConditions.isXTSCurrentCrossedUnderNearest) - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForLong() - // - ) - // - ; - - // - return result; - } - - // - // Check Market Base Conditions for Short Signals ... - bool XTSFIHasShortConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXTSFIEnableSignaller || - !mXTSFIAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - XTSGetMaxValue(1) == xTSFarestBuffer[1] && - (mXConditions.isXTSCurrentUnderFarest || - mXConditions.isXTSCurrentCrossedUnderFarest) && - (xTSCurrentBuffer[1] > xTSNearestBuffer[1] || - xTSCurrentBuffer[1] > xTSMediestBuffer[1]) && - !(mXConditions.isXTSCurrentOverNearest || - mXConditions.isXTSCurrentCrossedOverNearest) - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForShort() - // - ) - // - ; - - // - return result; - } - - // - // END XTSFI Signaller ... - // - - // - // START XOBDLH Signaller ... - // - - // - // Enable Signaller ... - bool EnableSXOBDLHignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (mXOBDLHEnableSignaller) - { - return result; - } - - // - result = true; - mXOBDLHEnableSignaller = true; - - // - return result; - } - - // - // Disable Signaller ... - bool DisbaleXOBDLHSignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (!mXOBDLHEnableSignaller) - { - return result; - } - - // - result = true; - mXOBDLHEnableSignaller = false; - - // - return result; - } - - // - // Allow Sginaller to Issue Long Signals ... - bool EnableXOBDLHLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXOBDLHEnableSignaller || - mXOBDLHAllowLongSignals) - { - return result; - } - - // - result = true; - mXOBDLHAllowLongSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Long Signals ... - bool DisbaleXOBDLHLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXOBDLHEnableSignaller || - !mXOBDLHAllowLongSignals) - { - return result; - } - - // - result = true; - mXOBDLHAllowLongSignals = false; - - // - return result; - } - - // - // Allow Signaller to Issue Short Sginals ... - bool EnableXOBDLHShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXOBDLHEnableSignaller || - mXOBDLHAllowShortSignals) - { - return result; - } - - // - result = true; - mXOBDLHAllowShortSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Short Signals ... - bool DisableXOBDLHShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXOBDLHEnableSignaller || - !mXOBDLHAllowShortSignals) - { - return result; - } - - // - result = true; - mXOBDLHAllowShortSignals = false; - - // - return result; - } - - // - // Check Market Base Conditions for Long Signals ... - bool XOBDLHHasLongConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXOBDLHEnableSignaller || - !mXOBDLHAllowLongSignals) - { - return result; - } - - // - XMarketConditions xConditions2 = GenerateMarketConditions(2); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - xConditions2.isXOBDSwingLow && - xConditions2.isXLHLowAttachedLL && - xLHLLBuffer[1] >= xLHLLBuffer[2] - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForLong( - true, // XCHMA Min - true, // XCHMA Max - false, // XCHMA Cycles - false, // XCHMA Peaks - false, // XCHMA Trend Powers - false, // XOBD - false // XTS - ) - // - ) - // - ; - - // - return result; - } - - // - // Check Market Base Conditions for Short Signals ... - bool XOBDLHHasShortConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXOBDLHEnableSignaller || - !mXOBDLHAllowShortSignals) - { - return result; - } - - // - XMarketConditions xConditions2 = GenerateMarketConditions(2); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - xConditions2.isXOBDSwingHigh && - xConditions2.isXLHHighAttachedHH && - xLHHHBuffer[1] <= xLHHHBuffer[2] - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForShort( - true, // XCHMA Min - true, // XCHMA Max - false, // XCHMA Cycles - false, // XCHMA Peaks - false, // XCHMA Trend Powers - false, // XOBD - false // XTS - ) - // - ) - // - ; - - // - return result; - } - - // - // END XOBDLH Signaller ... - // - - // - // START XCHMACC Signaller ... - // - - // - // Enable Signaller ... - bool EnableSXCHMACCignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (mXCHMACCEnableSignaller) - { - return result; - } - - // - result = true; - mXCHMACCEnableSignaller = true; - - // - return result; - } - - // - // Disable Signaller ... - bool DisbaleXCHMACCSignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (!mXCHMACCEnableSignaller) - { - return result; - } - - // - result = true; - mXCHMACCEnableSignaller = false; - - // - return result; - } - - // - // Allow Sginaller to Issue Long Signals ... - bool EnableXCHMACCLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMACCEnableSignaller || - mXCHMACCAllowLongSignals) - { - return result; - } - - // - result = true; - mXCHMACCAllowLongSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Long Signals ... - bool DisbaleXCHMACCLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMACCEnableSignaller || - !mXCHMACCAllowLongSignals) - { - return result; - } - - // - result = true; - mXCHMACCAllowLongSignals = false; - - // - return result; - } - - // - // Allow Signaller to Issue Short Sginals ... - bool EnableXCHMACCShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMACCEnableSignaller || - mXCHMACCAllowShortSignals) - { - return result; - } - - // - result = true; - mXCHMACCAllowShortSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Short Signals ... - bool DisableXCHMACCShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMACCEnableSignaller || - !mXCHMACCAllowShortSignals) - { - return result; - } - - // - result = true; - mXCHMACCAllowShortSignals = false; - - // - return result; - } - - // - // Check Market Base Conditions for Long Signals ... - bool XCHMACCHasLongConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMACCEnableSignaller || - !mXCHMACCAllowLongSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - xCHMAScFastBuffer[1] > xCHMAScSlowBuffer[1] && - xCHMAMcFastBuffer[1] > xCHMAMcSlowBuffer[1] && - xCHMALcFastBuffer[1] > xCHMALcSlowBuffer[1] && - // - xCHMAScFastBuffer[2] > xCHMAScSlowBuffer[2] && - xCHMAMcFastBuffer[2] > xCHMAMcSlowBuffer[2] && - xCHMALcFastBuffer[2] > xCHMALcSlowBuffer[2] && - // - !( - // - xCHMAScFastBuffer[3] > xCHMAScSlowBuffer[3] && - xCHMAMcFastBuffer[3] > xCHMAMcSlowBuffer[3] && - xCHMALcFastBuffer[3] > xCHMALcSlowBuffer[3] - // - ) - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForLong() - // - ) - // - ; - - // - return result; - } - - // - // Check Market Base Conditions for Short Signals ... - bool XCHMACCHasShortConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMACCEnableSignaller || - !mXCHMACCAllowShortSignals) - { - return result; - } - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - xCHMAScFastBuffer[1] < xCHMAScSlowBuffer[1] && - xCHMAMcFastBuffer[1] < xCHMAMcSlowBuffer[1] && - xCHMALcFastBuffer[1] < xCHMALcSlowBuffer[1] && - // - xCHMAScFastBuffer[2] < xCHMAScSlowBuffer[2] && - xCHMAMcFastBuffer[2] < xCHMAMcSlowBuffer[2] && - xCHMALcFastBuffer[2] < xCHMALcSlowBuffer[2] && - // - !( - // - xCHMAScFastBuffer[3] < xCHMAScSlowBuffer[3] && - xCHMAMcFastBuffer[3] < xCHMAMcSlowBuffer[3] && - xCHMALcFastBuffer[3] < xCHMALcSlowBuffer[3] - // - ) - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForShort() - // - ) - // - ; - - // - return result; - } - - // - // END XCHMACC Signaller ... - // - - // - // START XCHMAMX Signaller ... - // - - // - // Enable Signaller ... - bool EnableSXCHMAMXignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (mXCHMAMXEnableSignaller) - { - return result; - } - - // - result = true; - mXCHMAMXEnableSignaller = true; - - // - return result; - } - - // - // Disable Signaller ... - bool DisbaleXCHMAMXSignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (!mXCHMAMXEnableSignaller) - { - return result; - } - - // - result = true; - mXCHMAMXEnableSignaller = false; - - // - return result; - } - - // - // Allow Sginaller to Issue Long Signals ... - bool EnableXCHMAMXLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMXEnableSignaller || - mXCHMAMXAllowLongSignals) - { - return result; - } - - // - result = true; - mXCHMAMXAllowLongSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Long Signals ... - bool DisbaleXCHMAMXLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMXEnableSignaller || - !mXCHMAMXAllowLongSignals) - { - return result; - } - - // - result = true; - mXCHMAMXAllowLongSignals = false; - - // - return result; - } - - // - // Allow Signaller to Issue Short Sginals ... - bool EnableXCHMAMXShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMXEnableSignaller || - mXCHMAMXAllowShortSignals) - { - return result; - } - - // - result = true; - mXCHMAMXAllowShortSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Short Signals ... - bool DisableXCHMAMXShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMXEnableSignaller || - !mXCHMAMXAllowShortSignals) - { - return result; - } - - // - result = true; - mXCHMAMXAllowShortSignals = false; - - // - return result; - } - - // - // Check Market Base Conditions for Long Signals ... - bool XCHMAMXHasLongConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMXEnableSignaller || - !mXCHMAMXAllowLongSignals) - { - return result; - } - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - mXConditions.isXCHMASCCrossedOverMax && - xCHMAScFastBuffer[2] < xCHMANonSCMax2 && - xCHMAScSlowBuffer[2] < xCHMANonSCMax2 && - MathAbs(xCHMANonSCMax2 - xCHMAScFastBuffer[2]) > MathAbs(xCHMAScFastBuffer[2] - xCHMAScSlowBuffer[2]) && - MathAbs(xCHMANonSCMax2 - xCHMAScSlowBuffer[2]) > MathAbs(xCHMAScFastBuffer[2] - xCHMAScSlowBuffer[2]) - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForLong( - true, // XCHMA Min - true, // XCHMA Max - false, // XCHMA Cycles - false, // XCHMA Peaks - false, // XCHMA Trend Powers - true, // XOBD - true // XTS - ) - // - ) - // - ; - - // - return result; - } - - // - // Check Market Base Conditions for Short Signals ... - bool XCHMAMXHasShortConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMXEnableSignaller || - !mXCHMAMXAllowShortSignals) - { - return result; - } - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - mXConditions.isXCHMASCCrossedUnderMax && - xCHMAScFastBuffer[2] > xCHMANonSCMax2 && - xCHMAScSlowBuffer[2] > xCHMANonSCMax2 - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForShort( - true, // XCHMA Min - true, // XCHMA Max - false, // XCHMA Cycles - false, // XCHMA Peaks - false, // XCHMA Trend Powers - true, // XOBD - true // XTS - ) - // - ) - // - ; - // - return result; - } - - // - // END XCHMAMX Signaller ... - // - - // - // START XCHMAMN Signaller ... - // - - // - // Enable Signaller ... - bool EnableSXCHMAMNignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (mXCHMAMNEnableSignaller) - { - return result; - } - - // - result = true; - mXCHMAMNEnableSignaller = true; - - // - return result; - } - - // - // Disable Signaller ... - bool DisbaleXCHMAMNSignaller() - { - // - bool result = false; - - // - // Validate Args ... - if (!mXCHMAMNEnableSignaller) - { - return result; - } - - // - result = true; - mXCHMAMNEnableSignaller = false; - - // - return result; - } - - // - // Allow Sginaller to Issue Long Signals ... - bool EnableXCHMAMNLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMNEnableSignaller || - mXCHMAMNAllowLongSignals) - { - return result; - } - - // - result = true; - mXCHMAMNAllowLongSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Long Signals ... - bool DisbaleXCHMAMNLongs() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMNEnableSignaller || - !mXCHMAMNAllowLongSignals) - { - return result; - } - - // - result = true; - mXCHMAMNAllowLongSignals = false; - - // - return result; - } - - // - // Allow Signaller to Issue Short Sginals ... - bool EnableXCHMAMNShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMNEnableSignaller || - mXCHMAMNAllowShortSignals) - { - return result; - } - - // - result = true; - mXCHMAMNAllowShortSignals = true; - - // - return result; - } - - // - // Disallow Signaller to Issue Short Signals ... - bool DisableXCHMAMNShorts() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMNEnableSignaller || - !mXCHMAMNAllowShortSignals) - { - return result; - } - - // - result = true; - mXCHMAMNAllowShortSignals = false; - - // - return result; - } - - // - // Check Market Base Conditions for Long Signals ... - bool XCHMAMNHasLongConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMNEnableSignaller || - !mXCHMAMNAllowLongSignals) - { - return result; - } - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - mXConditions.isXCHMASCCrossedOverMin && - xCHMAScFastBuffer[2] < xCHMANonSCMin2 && - xCHMAScSlowBuffer[2] < xCHMANonSCMin2 - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForLong( - true, // XCHMA Min - true, // XCHMA Max - false, // XCHMA Cycles - false, // XCHMA Peaks - false, // XCHMA Trend Powers - true, // XOBD - true // XTS - ) - // - ) - // - ; - - // - return result; - } - - // - // Check Market Base Conditions for Short Signals ... - bool XCHMAMNHasShortConditions() - { - // - bool result = false; - - // - // Validate Args ... - if ( - !mXCHMAMNEnableSignaller || - !mXCHMAMNAllowShortSignals) - { - return result; - } - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - // each Strategy must has a Base Conditions, which they are usually common combinations - // of Market Properties that must be happens to lookup for signals ... - ( - // - mXConditions.isXCHMASCCrossedUnderMin && - xCHMAScFastBuffer[2] > xCHMANonSCMin2 && - xCHMAScSlowBuffer[2] > xCHMANonSCMin2 - // - ) - // - && - // - // Next Step is combine sorts of Conditions which make our choice - // so Exact in Market ... - ( - // - IsReadyForLong( - true, // XCHMA Min - true, // XCHMA Max - false, // XCHMA Cycles - false, // XCHMA Peaks - false, // XCHMA Trend Powers - true, // XOBD - true // XTS - ) - // - ) - // - ; - // - return result; - } - - // - // END XCHMAMN Signaller ... - // - - // - // END Actions Based On Signallers ... - // - - // - // Protected ... -protected: - // - // Private ... -private: - // - // XTD ... - bool mXTDEnableSignaller; - bool mXTDAllowLongSignals; - bool mXTDAllowShortSignals; - - // - // XTAM ... - bool mXTAMEnableSignaller; - bool mXTAMAllowLongSignals; - bool mXTAMAllowShortSignals; - - // - // XSI ... - bool mXSIEnableSignaller; - bool mXSIAllowLongSignals; - bool mXSIAllowShortSignals; - - // - // XTSFI ... - bool mXTSFIEnableSignaller; - bool mXTSFIAllowLongSignals; - bool mXTSFIAllowShortSignals; - - // - // XOBDLH ... - bool mXOBDLHEnableSignaller; - bool mXOBDLHAllowLongSignals; - bool mXOBDLHAllowShortSignals; - - // - // XCHMACC ... - bool mXCHMACCEnableSignaller; - bool mXCHMACCAllowLongSignals; - bool mXCHMACCAllowShortSignals; - - // - // XCHMAMX ... - bool mXCHMAMXEnableSignaller; - bool mXCHMAMXAllowLongSignals; - bool mXCHMAMXAllowShortSignals; - - // - // XCHMAMN ... - bool mXCHMAMNEnableSignaller; - bool mXCHMAMNAllowLongSignals; - bool mXCHMAMNAllowShortSignals; - - // - // Here we Define some Global Market Variables to Analyse MArket Conditions - // using them at each time ... - XMarketConditions mXConditions; -}; \ No newline at end of file diff --git a/BKP/XAU5-0.43/Experts/x-saherelm.xeu5.ea.mq5 b/BKP/XAU5-0.43/Experts/x-saherelm.xeu5.ea.mq5 deleted file mode 100644 index 58c5bdac..00000000 --- a/BKP/XAU5-0.43/Experts/x-saherelm.xeu5.ea.mq5 +++ /dev/null @@ -1,347 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Expert Advisor -// ---------------------------------------- -// Name: XAUUSD -// Description: this is an expert controller -// advisors which provides a mechanism for use them ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XEU5 EA" -#property strict - -// -// START Inputs ... -// - -input group "Commons"; - -// -// END Inputs ... -// - -// -// START Including Providers ... -// - -// -// Logger Library ... -#include "../Libraries/x-saherelm.log.lib.mq5" - -// -// Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Alert Library ... -#include "../Libraries/x-saherelm.alert.lib.mq5" - -// -// Draw Library ... -#include "../Libraries/x-saherelm.draw.lib.mq5" - -// -// XEU5 Signal Provider ... -#include "../Providers/x-saherelm.xeu5.provider.lib.mq5" - -// -// END Including Providers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// -bool isXEU5NewHour; -bool isXEU5NewDay; -bool isXEU5NewWeek; -bool isXEU5NewMonth; -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Event Handlers ... -// - -// -// Initialization ... -int OnInit() -{ - // - logTag = "XEU5EA"; - drawPrefix = logTag; - alertPrefix = logTag; - - // - // Apply default Chart Style for EA ... - ApplyChartStyle(); - - // - // Reset Timings ... - ResetTiming(); - - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Initialize XEU5 Provider ... - if (!XEU5InitSignalProviderLibrary()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function - // REASON_REMOVE 1 Program removed from a chart - // REASON_RECOMPILE 2 Program recompiled - // REASON_CHARTCHANGE 3 A symbol or a chart period is changed - // REASON_CHARTCLOSE 4 Chart closed - // REASON_PARAMETERS 5 Inputs changed by a user - // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings - // REASON_TEMPLATE 7 Another chart template applied - // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value - // REASON_CLOSE 9 Terminal closed - - // - // Here we can handle De Initialization Reasons ... - - // - // De Initialize XEU5 Provider ... - XEU5DeinitSignalProviderLibrary(reason); - - // - // De Init XDraw Library ... - // OnDeinitDrawLibrary(); -} - -// -// On Tick Handler ... -void OnTick() -{ - // - // Handle Monthly Alert ... - bool isFirstMonth = xMonth == -1; - isXEU5NewMonth = IsNewMonth(); - bool canMonthlyAlert = - isXEU5NewMonth && - xEU5EnableAlerts && - xEU5EnableMonthlyAlerts; - bool canMonthlyReport = - !isFirstMonth && - canMonthlyAlert && - xEU5EnableMonthlyReports; - if (canMonthlyAlert) - { - // - string message = "New Month ..."; - - // - // Prepare Monthly Report ... - if (canMonthlyReport) - { - // - string report = xEU5Reporter.GenerateReportString(XREPORT_MONTHLY); - - // - message = "Last Month Report:\n" + report; - } - - // - // Reset Report ... - xEU5Reporter.Reset(XREPORT_MONTHLY); - - // - SendAlert(message); - } - - // - // Handle Weekly Alert ... - bool isFirstWeek = xDayOfWeek == -1; - isXEU5NewWeek = IsNewWeek(); - bool canWeeklyAlert = - isXEU5NewWeek && - xEU5EnableAlerts && - xEU5EnableWeeklyAlerts; - bool canWeeklyReport = - !isFirstWeek && - canWeeklyAlert && - xEU5EnableWeeklyReports; - if (canWeeklyAlert) - { - // - string message = "New Week ..."; - - // - // Prepare Weekly Report ... - if (canWeeklyReport) - { - // - string report = xEU5Reporter.GenerateReportString(XREPORT_WEEKLY); - - // - message = "Last Week Report:\n" + report; - } - - // - // Reset Report ... - xEU5Reporter.Reset(XREPORT_WEEKLY); - - // - SendAlert(message); - } - - // - // Handle Daily Alert ... - bool isFirstDay = xDay == -1; - isXEU5NewDay = IsNewDay(); - bool canDailyAlert = - isXEU5NewDay && - xEU5EnableAlerts && - xEU5EnableDailyAlerts; - bool canDailyReport = - !isFirstDay && - canDailyAlert && - xEU5EnableDailyReports; - if (canDailyAlert) - { - // - string message = "New Day ..."; - - // - // Prepare Daily Report ... - if (canDailyReport) - { - // - string report = xEU5Reporter.GenerateReportString(XREPORT_DAILY); - - // - message = "Last Week Report:\n" + report; - } - - // - // Reset Report ... - xEU5Reporter.Reset(XREPORT_DAILY); - - // - SendAlert(message); - } - - // - // Handle Hourly Alert ... - bool isFirstHour = xHour == -1; - isXEU5NewHour = IsNewHour(); - bool canHourlyAlert = - isXEU5NewHour && - xEU5EnableAlerts && - xEU5EnableHourlyAlerts; - if (canHourlyAlert) - { - // - string message = "New Hour ..."; - - // - SendAlert(message); - } - - - // - // Prevent Going Forward if user Disable it ... - if (xEU5EnableProvider) - { - // - // Handle Processing on XEU5 Signal Provider ... - XEU5SignalProviderDoControlState(); - } - - // - if (!IsNewCandle()) - { - return; - } - - // - // Prevent Going Forward if user Disable it ... - if (xEU5EnableProvider) - { - // - // Handle Processing on XEU5 Signal Provider ... - XEU5SignalProviderHandleTick(); - } -} - -// -// Handle Trade Events ... -void OnTrade() -{ - - // - // Prevent Going Forward if user Disable it ... - if (xEU5EnableProvider) - { - // - // Handle Processing Trades on XEU5 Signal Provider ... - XEU5SignalProviderHandleTrade(); - } -} - -// -// END Event Handlers ... -// - -// -// START Functions ... -// - -// -// Validate Input Args for Initialization ... -bool ValidateInputs() -{ - // - bool result = false; - - // - // Validate Args ... - - // - // Validate XEU5 Provider Inputs ... - result = XEU5ValidateInputs(); - if (!result) - { - return false; - } - - // - // Logging State ... - string message = "Validation of (" + logTag + ") Inputs " + (result ? "Succeeded" : "Failed") + " ..."; - LogMessage(message); - - // - return result; -} - -// -// END Functions ... -// diff --git a/BKP/XAU5-0.43/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 b/BKP/XAU5-0.43/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 deleted file mode 100644 index f565e415..00000000 --- a/BKP/XAU5-0.43/Helpers/x-saherelm.xama.indicator.helper.lib.mq5 +++ /dev/null @@ -1,607 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// -// 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 ... -// diff --git a/BKP/XAU5-0.43/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 b/BKP/XAU5-0.43/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 deleted file mode 100644 index d7071b48..00000000 --- a/BKP/XAU5-0.43/Helpers/x-saherelm.xchlh.oscillator.helper.lib.mq5 +++ /dev/null @@ -1,1032 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XCHLH 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 - -// -// Includes ... -#include "../Libraries/x-saherelm.log.lib.mq5" -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Enum Definitions ... -// - -// -// Cycles Enumeration ... -enum ENUM_X_XCHLH_CYCLES -{ - X_XCHLH_CYCLE_LONG, - X_XCHLH_CYCLE_MEDIUM, - X_XCHLH_CYCLE_SHORT, -}; - -// -// XCHLH Hot States ... -enum ENUM_X_XCHLH_HOT_STATES -{ - X_XCHLH_HOT_HH = 1, - X_XCHLH_NEUTURAL = 0, - X_XCHLH_HOT_LL = -1, -}; - -// -// XCHLH Buffer Lines ... -enum ENUM_X_XCHLH_BUFFER_LINES -{ - X_XCHLH_LC_HH_LINE = 0, - X_XCHLH_LC_LL_LINE = 1, - X_XCHLH_MC_HH_LINE = 2, - X_XCHLH_MC_LL_LINE = 3, - X_XCHLH_SC_HH_LINE = 4, - X_XCHLH_SC_LL_LINE = 5, - X_XCHLH_SIGNAL_T_LINE = 6, - X_XCHLH_SIGNAL_B_LINE = 7, - X_XCHLH_HOT_STATE_LINE = 8, -}; - -// -// END Enum Definitions ... -// - -// -// START Inputs ... -// - -// // -// input group "XCHLH Oscillator"; - -// // -// // Common ... -// input group "XCHLH Hot Areas"; -// input bool xCHLHDrawHotAreas = false; // Draw Hot Areas Symbol -// input uchar xCHLHHotHHArrowCode = 234; // Hot HH Arrow Code -// input color xCHLHHotHHArrowColor = clrAqua; // Hot HH Arrow Color -// input uchar xCHLHHotLLArrowCode = 233; // Hot LL Arrow Code -// input color xCHLHHotLLArrowColor = clrFuchsia; // Hot LL Arrow Color - -// // -// // LC Inputs ... -// input group "XCHLH Long Cycle"; -// input group "XCHLH LC Market"; -// input int xCHLHLcLength = 288; // Length -// input double xCHLHLcThresholdInPips = 0.3; // Threshold In Pips -// input ENUM_SERIESMODE xCHLHLcHHMode = MODE_HIGH; // Highest High Calculation Method -// input ENUM_SERIESMODE xCHLHLcLLMode = MODE_LOW; // Lowest Low Calculation Method -// input group "XCHLH LC Style"; -// input int xCHLHLcDrawWidth = 1; // Draw Width -// input ENUM_DRAW_TYPE xCHLHLcDrawType = DRAW_LINE; // Draw Type -// input ENUM_LINE_STYLE xCHLHLcDrawStyle = STYLE_DOT; // Draw Style -// input color xCHLHLcHHColor = clrAqua; // Highest High Color -// input color xCHLHLcLLColor = clrFuchsia; // Lowest Low Color -// input group "XCHLH LC Drawings"; -// input bool xCHLHLcDrawHH = true; // Draw Highest High -// input bool xCHLHLcDrawLL = true; // Draw Lowest Low - -// // -// // MC Inputs ... -// input group "XCHLH Medium Cycle"; -// input group "XCHLH MC Market"; -// input int xCHLHMcLength = 72; // Length -// input double xCHLHMcThresholdInPips = 0.3; // Threshold In Pips -// input ENUM_SERIESMODE xCHLHMcHHMode = MODE_HIGH; // Highest High Calculation Method -// input ENUM_SERIESMODE xCHLHMcLLMode = MODE_LOW; // Lowest Low Calculation Method -// input group "XCHLH MC Style"; -// input int xCHLHMcDrawWidth = 1; // Draw Width -// input ENUM_DRAW_TYPE xCHLHMcDrawType = DRAW_LINE; // Draw Type -// input ENUM_LINE_STYLE xCHLHMcDrawStyle = STYLE_DOT; // Draw Style -// input color xCHLHMcHHColor = clrLime; // Highest High Color -// input color xCHLHMcLLColor = clrRed; // Lowest Low Color -// input group "XCHLH MC Drawings"; -// input bool xCHLHMcDrawHH = true; // Draw Highest High -// input bool xCHLHMcDrawLL = true; // Draw Lowest Low - -// // -// // SC Inputs ... -// input group "XCHLH Short Cycle"; -// input group "XCHLH SC Market"; -// input int xCHLHScLength = 7; // Length -// input double xCHLHScThresholdInPips = 0.3; // Threshold In Pips -// input ENUM_SERIESMODE xCHLHScHHMode = MODE_HIGH; // Highest High Calculation Method -// input ENUM_SERIESMODE xCHLHScLLMode = MODE_LOW; // Lowest Low Calculation Method -// input group "XCHLH SC Style"; -// input int xCHLHScDrawWidth = 1; // Draw Width -// input ENUM_DRAW_TYPE xCHLHScDrawType = DRAW_LINE; // Draw Type -// input ENUM_LINE_STYLE xCHLHScDrawStyle = STYLE_DOT; // Draw Style -// input color xCHLHScHHColor = clrLightBlue; // Highest High Color -// input color xCHLHScLLColor = clrLightSalmon; // Lowest Low Color -// input group "XCHLH SC Drawings"; -// input bool xCHLHScDrawHH = true; // Draw Highest High -// input bool xCHLHScDrawLL = true; // Draw Lowest Low - -// -// Configurations ... -// -// Common ... -bool xCHLHDrawHotAreas = false; // Draw Hot Areas Symbol -uchar xCHLHHotHHArrowCode = 234; // Hot HH Arrow Code -color xCHLHHotHHArrowColor = clrAqua; // Hot HH Arrow Color -uchar xCHLHHotLLArrowCode = 233; // Hot LL Arrow Code -color xCHLHHotLLArrowColor = clrFuchsia; // Hot LL Arrow Color - -// -// LC Inputs ... -int xCHLHLcLength = 288; // Length -double xCHLHLcThresholdInPips = 0.3; // Threshold In Pips -ENUM_SERIESMODE xCHLHLcHHMode = MODE_HIGH; // Highest High Calculation Method -ENUM_SERIESMODE xCHLHLcLLMode = MODE_LOW; // Lowest Low Calculation Method -int xCHLHLcDrawWidth = 1; // Draw Width -ENUM_DRAW_TYPE xCHLHLcDrawType = DRAW_LINE; // Draw Type -ENUM_LINE_STYLE xCHLHLcDrawStyle = STYLE_DOT; // Draw Style -color xCHLHLcHHColor = clrAqua; // Highest High Color -color xCHLHLcLLColor = clrFuchsia; // Lowest Low Color -bool xCHLHLcDrawHH = true; // Draw Highest High -bool xCHLHLcDrawLL = true; // Draw Lowest Low - -// -// MC Inputs ... -int xCHLHMcLength = 72; // Length -double xCHLHMcThresholdInPips = 0.3; // Threshold In Pips -ENUM_SERIESMODE xCHLHMcHHMode = MODE_HIGH; // Highest High Calculation Method -ENUM_SERIESMODE xCHLHMcLLMode = MODE_LOW; // Lowest Low Calculation Method -int xCHLHMcDrawWidth = 1; // Draw Width -ENUM_DRAW_TYPE xCHLHMcDrawType = DRAW_LINE; // Draw Type -ENUM_LINE_STYLE xCHLHMcDrawStyle = STYLE_DOT; // Draw Style -color xCHLHMcHHColor = clrLime; // Highest High Color -color xCHLHMcLLColor = clrRed; // Lowest Low Color -bool xCHLHMcDrawHH = true; // Draw Highest High -bool xCHLHMcDrawLL = true; // Draw Lowest Low - -// -// SC Inputs ... -int xCHLHScLength = 7; // Length -double xCHLHScThresholdInPips = 0.3; // Threshold In Pips -ENUM_SERIESMODE xCHLHScHHMode = MODE_HIGH; // Highest High Calculation Method -ENUM_SERIESMODE xCHLHScLLMode = MODE_LOW; // Lowest Low Calculation Method -int xCHLHScDrawWidth = 1; // Draw Width -ENUM_DRAW_TYPE xCHLHScDrawType = DRAW_LINE; // Draw Type -ENUM_LINE_STYLE xCHLHScDrawStyle = STYLE_DOT; // Draw Style -color xCHLHScHHColor = clrLightBlue; // Highest High Color -color xCHLHScLLColor = clrLightSalmon; // Lowest Low Color -bool xCHLHScDrawHH = true; // Draw Highest High -bool xCHLHScDrawLL = true; // Draw Lowest Low - -// -// END Inputs ... -// - -// -// START Definitions ... -// - -int xCHLHHandler = INVALID_HANDLE; -double xCHLHLcHHBuffer[]; -double xCHLHLcLLBuffer[]; -double xCHLHMcHHBuffer[]; -double xCHLHMcLLBuffer[]; -double xCHLHScHHBuffer[]; -double xCHLHScLLBuffer[]; - -// -// END Definitions ... -// - -// -// START Handler Functions ... -// - -// -// Validate Inputs ... -bool XCHLHValidateInputs() -{ - // - bool result = false; - - // - result = - xCHLHScLength >= 2 && - xCHLHMcLength > xCHLHScLength && - xCHLHLcLength > xCHLHMcLength; - - // - if (!result) - { - // - LogMessage("XCHLH Oscillator Inputs Validation Failed ..."); - } - - // - return result; -} - -// -// Init Oscillators ... -bool XCHLHInitHandlers() -{ - // - bool result = false; - - // - // Initialize Indicator/Oscillator Handlers ... - ResetLastError(); - - // - // XCHLH Handler ... - ArraySetAsSeries(xCHLHLcHHBuffer, true); - ArraySetAsSeries(xCHLHLcLLBuffer, true); - ArraySetAsSeries(xCHLHMcHHBuffer, true); - ArraySetAsSeries(xCHLHMcLLBuffer, true); - ArraySetAsSeries(xCHLHScHHBuffer, true); - ArraySetAsSeries(xCHLHScLLBuffer, true); - xCHLHHandler = iCustom( - _Symbol, - _Period, - "x-saherelm.xchlh.oscillator", - // - // Inputs ... - // - // Commons ... - "", - xCHLHDrawHotAreas, - xCHLHHotHHArrowCode, - xCHLHHotHHArrowColor, - xCHLHHotLLArrowCode, - xCHLHHotLLArrowColor, - // - // LC ... - "", - "", - xCHLHLcLength, - xCHLHLcThresholdInPips, - xCHLHLcHHMode, - xCHLHLcLLMode, - "", - xCHLHLcDrawWidth, - xCHLHLcDrawType, - xCHLHLcDrawStyle, - xCHLHLcHHColor, - xCHLHLcLLColor, - "", - xCHLHLcDrawHH, - xCHLHLcDrawLL, - // - // MC ... - "", - "", - xCHLHMcLength, - xCHLHMcThresholdInPips, - xCHLHMcHHMode, - xCHLHMcLLMode, - "", - xCHLHMcDrawWidth, - xCHLHMcDrawType, - xCHLHMcDrawStyle, - xCHLHMcHHColor, - xCHLHMcLLColor, - "", - xCHLHMcDrawHH, - xCHLHMcDrawLL, - // - // SC ... - "", - "", - xCHLHScLength, - xCHLHScThresholdInPips, - xCHLHScHHMode, - xCHLHScLLMode, - "", - xCHLHScDrawWidth, - xCHLHScDrawType, - xCHLHScDrawStyle, - xCHLHScHHColor, - xCHLHScLLColor, - "", - xCHLHScDrawHH, - xCHLHScDrawLL); - if (xCHLHHandler == INVALID_HANDLE) - { - // - LogMessage("failed to Initialize XCHLH Indicator: " + (string)GetLastError()); - return result; - } - - // - result = true; - - // - return result; -} - -// -// Release Oscillators ... -void XCHLHReleaseHandlers() -{ - IndicatorRelease(xCHLHHandler); -} - -// -// Handle Reading Buffers ... -void XCHLHReadBuffers( - int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick -) -{ - // - // XCHLH LC HH Buffer ... - CopyBuffer( - xCHLHHandler, - X_XCHLH_LC_HH_LINE, - 0, - xCHLHItemsPerTick, - xCHLHLcHHBuffer); - - // - // XCHLH LC LL Buffer ... - CopyBuffer( - xCHLHHandler, - X_XCHLH_LC_LL_LINE, - 0, - xCHLHItemsPerTick, - xCHLHLcLLBuffer); - - // - // XCHLH MC HH Buffer ... - CopyBuffer( - xCHLHHandler, - X_XCHLH_MC_HH_LINE, - 0, - xCHLHItemsPerTick, - xCHLHMcHHBuffer); - - // - // XCHLH MC LL Buffer ... - CopyBuffer( - xCHLHHandler, - X_XCHLH_MC_LL_LINE, - 0, - xCHLHItemsPerTick, - xCHLHMcLLBuffer); - - // - // XCHLH SC HH Buffer ... - CopyBuffer( - xCHLHHandler, - X_XCHLH_SC_HH_LINE, - 0, - xCHLHItemsPerTick, - xCHLHScHHBuffer); - - // - // XCHLH SC LL Buffer ... - CopyBuffer( - xCHLHHandler, - X_XCHLH_SC_LL_LINE, - 0, - xCHLHItemsPerTick, - xCHLHScLLBuffer); -} - -// -// END Handler Funcions ... -// - -// -// START XCHLH Custom Functions ... -// - -// -// Check LC and MC has Same HH ... -bool XCHLHIsLCMCHasSameHH( - int bar_index // Specified Bar Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if (!XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - double lcValue = xCHLHLcHHBuffer[bar_index]; - double mcValue = xCHLHMcHHBuffer[bar_index]; - - // - result = lcValue == mcValue; - - // - return result; -} - -// -// Check LC and MC has Same LL ... -bool XCHLHIsLCMCHasSameLL( - int bar_index // Specified Bar Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if (!XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - double lcValue = xCHLHLcLLBuffer[bar_index]; - double mcValue = xCHLHMcLLBuffer[bar_index]; - - // - result = lcValue == mcValue; - - // - return result; -} - -// -// Check LC and SC has Same HH ... -bool XCHLHIsLCSCHasSameHH( - int bar_index // Specified Bar Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if (!XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - double lcValue = xCHLHLcHHBuffer[bar_index]; - double scValue = xCHLHScHHBuffer[bar_index]; - - // - result = lcValue == scValue; - - // - return result; -} - -// -// Check LC and SC has Same LL ... -bool XCHLHIsLCSCHasSameLL( - int bar_index // Specified Bar Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if (!XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - double lcValue = xCHLHLcLLBuffer[bar_index]; - double scValue = xCHLHScLLBuffer[bar_index]; - - // - result = lcValue == scValue; - - // - return result; -} - -// -// Check MC and SC has Same HH ... -bool XCHLHIsMCSCHasSameHH( - int bar_index // Specified Bar Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if (!XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - double mcValue = xCHLHMcHHBuffer[bar_index]; - double scValue = xCHLHScHHBuffer[bar_index]; - - // - result = mcValue == scValue; - - // - return result; -} - -// -// Check MC and SC has Same LL ... -bool XCHLHIsMCSCHasSameLL( - int bar_index // Specified Bar Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if (!XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - double mcValue = xCHLHMcLLBuffer[bar_index]; - double scValue = xCHLHScLLBuffer[bar_index]; - - // - result = mcValue == scValue; - - // - return result; -} - -// -// Check Is Same Highest Highs ... -bool XCHLHIsSameHHs( - int bar_index // Specified Bar Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if (!XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - double lcValue = xCHLHLcHHBuffer[bar_index]; - double mcValue = xCHLHMcHHBuffer[bar_index]; - double scValue = xCHLHScHHBuffer[bar_index]; - - // - result = - // - lcValue == mcValue && - mcValue == scValue - // - ; - - // - return result; -} - -// -// Check Is Same Lowest Lows ... -bool XCHLHIsSameLLs( - int bar_index // Specified Bar Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if (!XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - double lcValue = xCHLHLcLLBuffer[bar_index]; - double mcValue = xCHLHMcLLBuffer[bar_index]; - double scValue = xCHLHScLLBuffer[bar_index]; - - // - result = - // - lcValue == mcValue && - mcValue == scValue - // - ; - - // - return result; -} - -// -// Check Medium Cycle is On Top of Long Cycle's Mid ... -bool XCHLHIsMCOnTopOfLC( - int bar_index // Specified Bar Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - ENUM_X_XCHLH_CYCLES sCycle = X_XCHLH_CYCLE_MEDIUM; - ENUM_X_XCHLH_CYCLES dCycle = X_XCHLH_CYCLE_LONG; - - // - result = - // - XCHLHCheckCycleIsOnTopOfAnother( - bar_index, - sCycle, - dCycle) - // - ; - - // - return result; -} - -// -// Check Medium Cycle is In Bottom of Long Cycle's Mid ... -bool XCHLHIsMCInBottomOfLC( - int bar_index // Specified Bar Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - ENUM_X_XCHLH_CYCLES sCycle = X_XCHLH_CYCLE_MEDIUM; - ENUM_X_XCHLH_CYCLES dCycle = X_XCHLH_CYCLE_LONG; - - // - result = - // - XCHLHCheckCycleIsInBottomOfAnother( - bar_index, - sCycle, - dCycle) - // - ; - - // - return result; -} - -// -// Check and Validate Buffer Sizes ... -bool XCHLHIsValidBufferSizes( - int size // Specified Min Size -) -{ - // - bool result = false; - - // - result = - // - ArraySize(xCHLHLcHHBuffer) > size && - ArraySize(xCHLHLcLLBuffer) > size && - // - ArraySize(xCHLHMcHHBuffer) > size && - ArraySize(xCHLHMcLLBuffer) > size && - // - ArraySize(xCHLHScHHBuffer) > size && - ArraySize(xCHLHScLLBuffer) > size; - - // - return result; -} - -// -// Get Cycle Middle Value ... -double XCHLHGetCycleMid( - int bar_index, // Specified Bar Index ... - ENUM_X_XCHLH_CYCLES cycle // Specified Cycle ... -) -{ - // - double result = 0; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - // Retrieve Cycle Max Value ... - double iMax = XCHLHGetCycleMax( - bar_index, - cycle); - - // - // Retrieve Cycle Min Value ... - double iMin = XCHLHGetCycleMin( - bar_index, - cycle); - - // - result = (iMax - iMin) / 2; - - // - return result; -} - -// -// Get Cycle Max Value ... -double XCHLHGetCycleMax( - int bar_index, // Specified Bar Index ... - ENUM_X_XCHLH_CYCLES cycle // Specified Cycle ... -) -{ - // - double result = 0; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - switch (cycle) - { - // - // Long Cycle ... - case X_XCHLH_CYCLE_LONG: - result = xCHLHLcHHBuffer[1]; - break; - - // - // Medium Cycle ... - case X_XCHLH_CYCLE_MEDIUM: - result = xCHLHMcHHBuffer[1]; - break; - - // - // Short Cycle ... - case X_XCHLH_CYCLE_SHORT: - result = xCHLHScHHBuffer[1]; - break; - } - - // - return result; -} - -// -// Get Specified Cycles Max Value ... -double XCHLHGetCyclesMax( - int bar_index, // Specified Bar Index ... - ENUM_X_XCHLH_CYCLES &cycles[] // Specified Cycle ... -) -{ - // - bool result = 0; - - // - // Validate Args ... - if ( - bar_index < 0 || - ArraySize(cycles) <= 0 || - !XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - // Loop Through Cycles ... - for (int i = 0; i < ArraySize(cycles); i++) - { - // - ENUM_X_XCHLH_CYCLES iCycle = cycles[i]; - - // - double iValue = XCHLHGetCycleMax( - bar_index, - iCycle); - - // - result = result == 0 || result < iValue ? iValue : result; - } - - // - return result; -} - -// -// Get Cycle Min Value ... -double XCHLHGetCycleMin( - int bar_index, // Specified Bar Index ... - ENUM_X_XCHLH_CYCLES cycle // Specified Cycle ... -) -{ - // - double result = 0; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - switch (cycle) - { - // - // Long Cycle ... - case X_XCHLH_CYCLE_LONG: - result = xCHLHLcLLBuffer[1]; - break; - - // - // Medium Cycle ... - case X_XCHLH_CYCLE_MEDIUM: - result = xCHLHMcLLBuffer[1]; - break; - - // - // Short Cycle ... - case X_XCHLH_CYCLE_SHORT: - result = xCHLHScLLBuffer[1]; - break; - } - - // - return result; -} - -// -// Get Specified Cycles Min Value ... -double XCHLHGetCyclesMin( - int bar_index, // Specified Bar Index ... - ENUM_X_XCHLH_CYCLES &cycles[] // Specified Cycle ... -) -{ - // - bool result = 0; - - // - // Validate Args ... - if ( - bar_index < 0 || - ArraySize(cycles) <= 0 || - !XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - // Loop Through Cycles ... - for (int i = 0; i < ArraySize(cycles); i++) - { - // - ENUM_X_XCHLH_CYCLES iCycle = cycles[i]; - - // - double iValue = XCHLHGetCycleMin( - bar_index, - iCycle); - - // - result = result == 0 || result > iValue ? iValue : result; - } - - // - return result; -} - -// -// Check a Cycle is On Top of Another Cycle's Mid ... -bool XCHLHCheckCycleIsOnTopOfAnother( - int bar_index, // Specified Bar Index ... - ENUM_X_XCHLH_CYCLES sourceCycle, // Specified Source Cycle which Checks ... - ENUM_X_XCHLH_CYCLES destCycle // Specified Dest Cycle which source Checked based on it ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - // Retrieve Min Value of Source Cycle ... - double iMin = XCHLHGetCycleMin( - bar_index, - sourceCycle); - - // - // Retrieve Mid Value of Dest Cycle ... - double iMid = XCHLHGetCycleMid( - bar_index, - destCycle); - - // - // Generate Result ... - result = - // - iMin >= iMid - // - ; - - // - return result; -} - -// -// Check a Cycle is Under Bottom of Another Cycle's Mid ... -bool XCHLHCheckCycleIsInBottomOfAnother( - int bar_index, // Specified Bar Index ... - ENUM_X_XCHLH_CYCLES sourceCycle, // Specified Source Cycle which Checks ... - ENUM_X_XCHLH_CYCLES destCycle // Specified Dest Cycle which source Checked based on it ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHLHIsValidBufferSizes(bar_index + 1)) - { - return result; - } - - // - // Retrieve Max Value of Source Cycle ... - double iMax = XCHLHGetCycleMax( - bar_index, - sourceCycle); - - // - // Retrieve Mid Value of Dest Cycle ... - double iMid = XCHLHGetCycleMid( - bar_index, - destCycle); - - // - // Generate Result ... - result = - // - iMax <= iMid - // - ; - - // - return result; -} - -// -// END XCHLH Custom Functions ... -// diff --git a/BKP/XAU5-0.43/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 b/BKP/XAU5-0.43/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 deleted file mode 100644 index e84d762f..00000000 --- a/BKP/XAU5-0.43/Helpers/x-saherelm.xchma.oscillator.helper.lib.mq5 +++ /dev/null @@ -1,2229 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XCHMA 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 - -// -// Includes ... -#include "../Libraries/x-saherelm.log.lib.mq5" -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Enum Definitions ... -// - -// -// XCHMA Cycles ... -enum ENUM_XCHMA_CYCLES -{ - X_XCHMA_CYCLE_LONG, - X_XCHMA_CYCLE_MEDIUM, - X_XCHMA_CYCLE_SHORT, -}; - -// -// XCHMA Oscillator Hot State Presentation ... -enum ENUM_XCHMA_HOT_STATES -{ - X_XCHMA_HOT_BULLISH = 1, - X_XCHMA_HOT_NEUTURAL = 0, - X_XCHMA_HOT_BEARISH = -1, -}; - -// -// XCHMA Oscillator Cycles State Presentation ... -enum ENUM_XCHMA_CYCLE_STATES -{ - X_XCHMA_FAST_CROSSED_OVER_SLOW = 2, - X_XCHMA_FAST_OVER_SLOW = 1, - X_XCHMA_NEUTURAL = 0, - X_XCHMA_FAST_UNDER_SLOW = -1, - X_XCHMA_FAST_CROSSED_UNDER_SLOW = -2, -}; - -// -// XCHMA Oscillator Buffer Lines ... -enum ENUM_X_XCHMA_BUFFER_LINES -{ - X_XCHMA_LC_FAST_LINE = 0, - X_XCHMA_LC_SLOW_LINE = 1, - X_XCHMA_LC_STATE_LINE = 6, - X_XCHMA_MC_FAST_LINE = 2, - X_XCHMA_MC_SLOW_LINE = 3, - X_XCHMA_MC_STATE_LINE = 7, - X_XCHMA_SC_FAST_LINE = 4, - X_XCHMA_SC_SLOW_LINE = 5, - X_XCHMA_SC_STATE_LINE = 8, - X_XCHMA_HOT_STATE_LINE = 9, -}; - -// -// END Enum Definitions ... -// - -// -// START Inputs ... -// - -// input group "XCHMA Oscillator"; - -// // -// // Commons ... -// input group "XCHMA Hot Areas"; -// input bool xCHMADrawHotAreas = false; // Draw Hot Areas Symbol; -// input uchar xCHMAHotBullishArrowCode = 228; // Hot Bullish Arrow Code; -// input color xCHMAHotBullishArrowColor = clrAqua; // Hot Bullish Arrow Color; -// input uchar xCHMAHotBearishArrowCode = 230; // Hot Bearish Arrow Code; -// input color xCHMAHotBearishArrowColor = clrFuchsia; // Hot Bearish Arrow Color; - -// // -// // LC Inputs ... -// input group "XCHMA Long Cycle"; -// input group "XCHMA LC Market"; -// input int xCHMALcFastLength = 288; // Fast Length -// input int xCHMALcSlowLength = 576; // Slow Length -// input ENUM_MA_METHOD xCHMALcMethod = MODE_EMA; // Calculation Method -// input ENUM_APPLIED_PRICE xCHMALcAppliedTo = PRICE_CLOSE; // Applied To -// input group "XCHMA LC Style"; -// input int xCHMALcDrawWidth = 1; // Draw Width -// input ENUM_DRAW_TYPE xCHMALcDrawType = DRAW_LINE; // Draw Type -// input ENUM_LINE_STYLE xCHMALcDrawStyle = STYLE_DOT; // Draw Style -// input color xCHMALcFastColor = clrAqua; // Fast Color -// input color xCHMALcSlowColor = clrFuchsia; // Slow Color -// input group "XCHMA LC Drawings"; -// input bool xCHMALcDrawFast = true; // Draw Fast -// input bool xCHMALcDrawSlow = true; // Draw Slow -// input bool xCHMALcDrawCrosses = false; // Draw Cross Lines - -// // -// // MC Inputs ... -// input group "XCHMA Medium Cycle"; -// input group "XCHMA MC Market"; -// input int xCHMAMcFastLength = 72; // Fast Length -// input int xCHMAMcSlowLength = 144; // Slow Length -// input ENUM_MA_METHOD xCHMAMcMethod = MODE_EMA; // Calculation Method -// input ENUM_APPLIED_PRICE xCHMAMcAppliedTo = PRICE_CLOSE; // Applied To -// input group "XCHMA MC Style"; -// input int xCHMAMcDrawWidth = 1; // Draw Width -// input ENUM_DRAW_TYPE xCHMAMcDrawType = DRAW_LINE; // Draw Type -// input ENUM_LINE_STYLE xCHMAMcDrawStyle = STYLE_DOT; // Draw Style -// input color xCHMAMcFastColor = clrLime; // Fast Color -// input color xCHMAMcSlowColor = clrRed; // Slow Color -// input group "XCHMA MC Drawings"; -// input bool xCHMAMcDrawFast = true; // Draw Fast -// input bool xCHMAMcDrawSlow = true; // Draw Slow -// input bool xCHMAMcDrawCrosses = false; // Draw Cross Lines - -// // -// // SC Inputs ... -// input group "XCHMA Short Cycle"; -// input group "XCHMA SC Market"; -// input int xCHMAScFastLength = 7; // Fast Length -// input int xCHMAScSlowLength = 14; // Slow Length -// input ENUM_MA_METHOD xCHMAScMethod = MODE_SMA; // Calculation Method -// input ENUM_APPLIED_PRICE xCHMAScAppliedTo = PRICE_CLOSE; // Applied To -// input group "XCHMA SC Style"; -// input int xCHMAScDrawWidth = 1; // Draw Width -// input ENUM_DRAW_TYPE xCHMAScDrawType = DRAW_LINE; // Draw Type -// input ENUM_LINE_STYLE xCHMAScDrawStyle = STYLE_SOLID; // Draw Style -// input color xCHMAScFastColor = clrLightBlue; // Fast Color -// input color xCHMAScSlowColor = clrLightSalmon; // Slow Color -// input group "XCHMA SC Drawings"; -// input bool xCHMAScDrawFast = true; // Draw Fast -// input bool xCHMAScDrawSlow = true; // Draw Slow -// input bool xCHMAScDrawCrosses = false; // Draw Cross Lines - -// -// Configurations ... -// -// Commons ... -bool xCHMADrawHotAreas = false; // Draw Hot Areas Symbol; -uchar xCHMAHotBullishArrowCode = 228; // Hot Bullish Arrow Code; -color xCHMAHotBullishArrowColor = clrAqua; // Hot Bullish Arrow Color; -uchar xCHMAHotBearishArrowCode = 230; // Hot Bearish Arrow Code; -color xCHMAHotBearishArrowColor = clrFuchsia; // Hot Bearish Arrow Color; - -// -// LC Inputs ... -int xCHMALcFastLength = 288; // Fast Length -int xCHMALcSlowLength = 576; // Slow Length -ENUM_MA_METHOD xCHMALcMethod = MODE_EMA; // Calculation Method -ENUM_APPLIED_PRICE xCHMALcAppliedTo = PRICE_CLOSE; // Applied To -int xCHMALcDrawWidth = 1; // Draw Width -ENUM_DRAW_TYPE xCHMALcDrawType = DRAW_LINE; // Draw Type -ENUM_LINE_STYLE xCHMALcDrawStyle = STYLE_DOT; // Draw Style -color xCHMALcFastColor = clrAqua; // Fast Color -color xCHMALcSlowColor = clrFuchsia; // Slow Color -bool xCHMALcDrawFast = true; // Draw Fast -bool xCHMALcDrawSlow = true; // Draw Slow -bool xCHMALcDrawCrosses = false; // Draw Cross Lines - -// -// MC Inputs ... -int xCHMAMcFastLength = 72; // Fast Length -int xCHMAMcSlowLength = 144; // Slow Length -ENUM_MA_METHOD xCHMAMcMethod = MODE_EMA; // Calculation Method -ENUM_APPLIED_PRICE xCHMAMcAppliedTo = PRICE_CLOSE; // Applied To -int xCHMAMcDrawWidth = 1; // Draw Width -ENUM_DRAW_TYPE xCHMAMcDrawType = DRAW_LINE; // Draw Type -ENUM_LINE_STYLE xCHMAMcDrawStyle = STYLE_DOT; // Draw Style -color xCHMAMcFastColor = clrLime; // Fast Color -color xCHMAMcSlowColor = clrRed; // Slow Color -bool xCHMAMcDrawFast = true; // Draw Fast -bool xCHMAMcDrawSlow = true; // Draw Slow -bool xCHMAMcDrawCrosses = false; // Draw Cross Lines - -// -// SC Inputs ... -int xCHMAScFastLength = 7; // Fast Length -int xCHMAScSlowLength = 14; // Slow Length -ENUM_MA_METHOD xCHMAScMethod = MODE_SMA; // Calculation Method -ENUM_APPLIED_PRICE xCHMAScAppliedTo = PRICE_CLOSE; // Applied To -int xCHMAScDrawWidth = 1; // Draw Width -ENUM_DRAW_TYPE xCHMAScDrawType = DRAW_LINE; // Draw Type -ENUM_LINE_STYLE xCHMAScDrawStyle = STYLE_SOLID; // Draw Style -color xCHMAScFastColor = clrLightBlue; // Fast Color -color xCHMAScSlowColor = clrLightSalmon; // Slow Color -bool xCHMAScDrawFast = true; // Draw Fast -bool xCHMAScDrawSlow = true; // Draw Slow -bool xCHMAScDrawCrosses = false; // Draw Cross Lines - -// -// END Inputs ... -// - -// -// START Definitions ... -// - -int xCHMAHandler = INVALID_HANDLE; -double xCHMALcFastBuffer[]; -double xCHMALcSlowBuffer[]; -double xCHMAMcFastBuffer[]; -double xCHMAMcSlowBuffer[]; -double xCHMAScFastBuffer[]; -double xCHMAScSlowBuffer[]; - -// -// END Definitions ... -// - -// -// START Handler Functions ... -// - -// -// Validate Inputs ... -bool XCHMAValidateInputs() -{ - // - bool result = false; - - // - result = - xCHMAScFastLength >= 2 && - xCHMAScSlowLength > xCHMAScFastLength && - xCHMAMcFastLength > xCHMAScSlowLength && - xCHMAMcSlowLength > xCHMAMcFastLength && - xCHMALcFastLength > xCHMAMcSlowLength && - xCHMALcSlowLength > xCHMALcFastLength; - - // - if (!result) - { - // - LogMessage("XCHMA Oscillator Inputs Validation Failed ..."); - } - - // - return result; -} - -// -// Init Oscillators ... -bool XCHMAInitHandlers() -{ - // - bool result = false; - - // - // Initialize Indicator/Oscillator Handlers ... - ResetLastError(); - - // - // XCHMA Handler ... - ArraySetAsSeries(xCHMALcFastBuffer, true); - ArraySetAsSeries(xCHMALcSlowBuffer, true); - ArraySetAsSeries(xCHMAMcFastBuffer, true); - ArraySetAsSeries(xCHMAMcSlowBuffer, true); - ArraySetAsSeries(xCHMAScFastBuffer, true); - ArraySetAsSeries(xCHMAScSlowBuffer, true); - xCHMAHandler = iCustom( - _Symbol, - _Period, - "x-saherelm.xchma.oscillator", - // - // Inputs ... - "", - xCHMADrawHotAreas, - xCHMAHotBullishArrowCode, - xCHMAHotBullishArrowColor, - xCHMAHotBearishArrowCode, - xCHMAHotBearishArrowColor, - // - // Long Cycle ... - "", - "", - xCHMALcFastLength, - xCHMALcSlowLength, - xCHMALcMethod, - xCHMALcAppliedTo, - "", - xCHMALcDrawWidth, - xCHMALcDrawType, - xCHMALcDrawStyle, - xCHMALcFastColor, - xCHMALcSlowColor, - "", - xCHMALcDrawFast, - xCHMALcDrawSlow, - xCHMALcDrawCrosses, - // - // Medium Cycle ... - "", - "", - xCHMAMcFastLength, - xCHMAMcSlowLength, - xCHMAMcMethod, - xCHMAMcAppliedTo, - "", - xCHMAMcDrawWidth, - xCHMAMcDrawType, - xCHMAMcDrawStyle, - xCHMAMcFastColor, - xCHMAMcSlowColor, - "", - xCHMAMcDrawFast, - xCHMAMcDrawSlow, - xCHMAMcDrawCrosses, - // - // Short Cycle ... - "", - "", - xCHMAScFastLength, - xCHMAScSlowLength, - xCHMAScMethod, - xCHMAScAppliedTo, - "", - xCHMAScDrawWidth, - xCHMAScDrawType, - xCHMAScDrawStyle, - xCHMAScFastColor, - xCHMAScSlowColor, - "", - xCHMAScDrawFast, - xCHMAScDrawSlow, - xCHMAScDrawCrosses); - if (xCHMAHandler == INVALID_HANDLE) - { - // - LogMessage("failed to Initialize XCHMA Oscillator: " + (string)GetLastError()); - return result; - } - - // - result = true; - - // - return result; -} - -// -// Release Oscillators ... -void XCHMAReleaseHandlers() -{ - IndicatorRelease(xCHMAHandler); -} - -// -// Handle Reading Buffers ... -void XCHMAReadBuffers( - int xCHMAItemsPerTick // Number Of Reading Buffer Items Per Tick -) -{ - // - // XCHMA Long Cycle ... - // - // XCHMA Fast ... - CopyBuffer( - xCHMAHandler, - X_XCHMA_LC_FAST_LINE, - 0, - xCHMAItemsPerTick, - xCHMALcFastBuffer); - - // - // XCHMA Slow ... - CopyBuffer( - xCHMAHandler, - X_XCHMA_LC_SLOW_LINE, - 0, - xCHMAItemsPerTick, - xCHMALcSlowBuffer); - - // - // XCHMA Medium Cycle ... - // - // XCHMA Fast ... - CopyBuffer( - xCHMAHandler, - X_XCHMA_MC_FAST_LINE, - 0, - xCHMAItemsPerTick, - xCHMAMcFastBuffer); - - // - // XCHMA Slow ... - CopyBuffer( - xCHMAHandler, - X_XCHMA_MC_SLOW_LINE, - 0, - xCHMAItemsPerTick, - xCHMAMcSlowBuffer); - - // - // XCHMA Short Cycle ... - // - // XCHMA Fast ... - CopyBuffer( - xCHMAHandler, - X_XCHMA_SC_FAST_LINE, - 0, - xCHMAItemsPerTick, - xCHMAScFastBuffer); - - // - // XCHMA Slow ... - CopyBuffer( - xCHMAHandler, - X_XCHMA_SC_SLOW_LINE, - 0, - xCHMAItemsPerTick, - xCHMAScSlowBuffer); -} - -// -// END Handler Funcions ... -// - -// -// START XCHMA Custom Functions ... -// - -// -// Retrieve Max Cycles Value ... -double XCHMAGetMax( - int bar_index // Specified Index ... -) -{ - // - double result = 0; - - // - // Validate Args ... - if (!XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - // SC Fast ... - result = MathMax( - result, - xCHMAScFastBuffer[bar_index]); - - // - // SC Slow ... - result = MathMax( - result, - xCHMAScSlowBuffer[bar_index]); - - // - // MC Fast ... - result = MathMax( - result, - xCHMAMcFastBuffer[bar_index]); - - // - // MC Slow ... - result = MathMax( - result, - xCHMAMcSlowBuffer[bar_index]); - - // - // LC Fast ... - result = MathMax( - result, - xCHMALcFastBuffer[bar_index]); - - // - // LC Slow ... - result = MathMax( - result, - xCHMALcSlowBuffer[bar_index]); - - // - return result; -} - -// -// Retrieve Max Cycles Value ... -double XCHMAGetMin( - int bar_index // Specified Index ... -) -{ - // - double result = 0; - - // - // Validate Args ... - if (!XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = xCHMAScFastBuffer[bar_index]; - - // - // SC Fast ... - result = MathMin( - result, - xCHMAScFastBuffer[bar_index]); - - // - // SC Slow ... - result = MathMin( - result, - xCHMAScSlowBuffer[bar_index]); - - // - // MC Fast ... - result = MathMin( - result, - xCHMAMcFastBuffer[bar_index]); - - // - // MC Slow ... - result = MathMin( - result, - xCHMAMcSlowBuffer[bar_index]); - - // - // LC Fast ... - result = MathMin( - result, - xCHMALcFastBuffer[bar_index]); - - // - // LC Slow ... - result = MathMin( - result, - xCHMALcSlowBuffer[bar_index]); - - // - return result; -} - -// -// Short Cycle Over Max Of Cycle Channels ... -bool XCHMAIsSCOverMax( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - double shortCycleMax1 = XCHMAGetCycleMaxValue( - bar_index, - X_XCHMA_CYCLE_SHORT); - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( - bar_index, - cycles); - - // - // Calculate Result ... - result = - // - shortCycleMax1 > nonOfShortCycleMax1 - // - ; - - // - return result; -} - -// -// Short Cycle Under Max Of Cycle Channels ... -bool XCHMAIsSCUnderMax( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - double shortCycleMin1 = XCHMAGetCycleMinValue( - bar_index, - X_XCHMA_CYCLE_SHORT); - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( - bar_index, - cycles); - - // - // Calculate Result ... - result = - // - shortCycleMin1 < nonOfShortCycleMax1 - // - ; - - // - return result; -} - -// -// Short Cycle Over Min Of Cycle Channels ... -bool XCHMAIsSCOverMin( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - double shortCycleMax1 = XCHMAGetCycleMaxValue( - bar_index, - X_XCHMA_CYCLE_SHORT); - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( - bar_index, - cycles); - - // - // Calculate Result ... - result = - // - shortCycleMax1 > nonOfShortCycleMin1 - // - ; - - // - return result; -} - -// -// Short Cycle Under Min Of Cycle Channels ... -bool XCHMAIsSCUnderMin( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - double shortCycleMin1 = XCHMAGetCycleMinValue( - bar_index, - X_XCHMA_CYCLE_SHORT); - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( - bar_index, - cycles); - - // - // Calculate Result ... - result = - // - shortCycleMin1 < nonOfShortCycleMin1 - // - ; - - // - return result; -} - -// -// Short Cycle Crossed Over Max Of Cycle Channels ... -bool XCHMAIsSCCrossedOverMax( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHMAIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - double shortCycleMin1 = XCHMAGetCycleMinValue( - bar_index, - X_XCHMA_CYCLE_SHORT); - double shortCycleMin2 = XCHMAGetCycleMinValue( - bar_index + 1, - X_XCHMA_CYCLE_SHORT); - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( - bar_index, - cycles); - double nonOfShortCycleMax2 = XCHMAGetCyclesMaxValue( - bar_index + 1, - cycles); - - // - // Calculate Result ... - result = - // - shortCycleMin1 > nonOfShortCycleMax1 && - shortCycleMin2 <= nonOfShortCycleMax2 - // - ; - - // - return result; -} - -// -// Short Cycle Crossed Under Max Of Cycle Channels ... -bool XCHMAIsSCCrossedUnderMax( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHMAIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - double shortCycleMax1 = XCHMAGetCycleMaxValue( - bar_index, - X_XCHMA_CYCLE_SHORT); - double shortCycleMax2 = XCHMAGetCycleMaxValue( - bar_index + 1, - X_XCHMA_CYCLE_SHORT); - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double nonOfShortCycleMax1 = XCHMAGetCyclesMaxValue( - bar_index, - cycles); - double nonOfShortCycleMax2 = XCHMAGetCyclesMaxValue( - bar_index + 1, - cycles); - - // - // Calculate Result ... - result = - // - shortCycleMax1 < nonOfShortCycleMax1 && - shortCycleMax2 >= nonOfShortCycleMax2 - // - ; - - // - return result; -} - -// -// Short Cycle Crossed Over Min Of Cycle Channels ... -bool XCHMAIsSCCrossedOverMin( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHMAIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - double shortCycleMin1 = XCHMAGetCycleMinValue( - bar_index, - X_XCHMA_CYCLE_SHORT); - double shortCycleMin2 = XCHMAGetCycleMinValue( - bar_index + 1, - X_XCHMA_CYCLE_SHORT); - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( - bar_index, - cycles); - double nonOfShortCycleMin2 = XCHMAGetCyclesMinValue( - bar_index + 1, - cycles); - - // - // Calculate Result ... - result = - // - shortCycleMin1 > nonOfShortCycleMin1 && - shortCycleMin2 <= nonOfShortCycleMin2 - // - ; - - // - return result; -} - -// -// Short Cycle Crossed Under Min Of Cycle Channels ... -bool XCHMAIsSCCrossedUnderMin( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XCHMAIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - double shortCycleMax1 = XCHMAGetCycleMaxValue( - bar_index, - X_XCHMA_CYCLE_SHORT); - double shortCycleMax2 = XCHMAGetCycleMaxValue( - bar_index + 1, - X_XCHMA_CYCLE_SHORT); - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double nonOfShortCycleMin1 = XCHMAGetCyclesMinValue( - bar_index, - cycles); - double nonOfShortCycleMin2 = XCHMAGetCyclesMinValue( - bar_index + 1, - cycles); - - // - // Calculate Result ... - result = - // - shortCycleMax1 < nonOfShortCycleMin1 && - shortCycleMax2 >= nonOfShortCycleMin2 - // - ; - - // - return result; -} - -// -// Long Cycle ... -// - -// -// Check LC is Peak ... -bool XCHMAIsLCPeak( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsIncreasing( - bar_index + length, - bar_index, - xCHMALcSlowBuffer - // - ); - - // - return result; -} - -// -// Check LC is Vale ... -bool XCHMAIsLCVale( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsDecreasing( - bar_index + length, - bar_index, - xCHMALcSlowBuffer - // - ); - - // - return result; -} - -// -// Check LC Fast Crossed Over Slow ... -bool XCHMAIsLCFastCrossedOverSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsCrossOver( - xCHMALcFastBuffer, - xCHMALcSlowBuffer, - bar_index); - - // - return result; -} - -// -// Check LC Fast Over Slow ... -bool XCHMAIsLCFastOverSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsOver( - xCHMALcFastBuffer, - xCHMALcSlowBuffer, - bar_index); - - // - return result; -} - -// -// Check LC Fast Crossed Under Slow ... -bool XCHMAIsLCFastCrossedUnderSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsCrossUnder( - xCHMALcFastBuffer, - xCHMALcSlowBuffer, - bar_index); - - // - return result; -} - -// -// Check LC Fast Under Slow ... -bool XCHMAIsLCFastUnderSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsUnder( - xCHMALcFastBuffer, - xCHMALcSlowBuffer, - bar_index); - - // - return result; -} - -// -// Get Trend Power ... -double XCHMAGetLCTrendPower( - int bar_index // Specified Index ... -) -{ - // - double result = 0; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = - // - MathAbs(xCHMALcFastBuffer[bar_index] - xCHMALcSlowBuffer[bar_index]) - // - ; - - // - return result; -} - -// -// Check XTM TrendsDown or Up ... -bool XCHMAIsLCTrendsUp( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 2)) - { - return result; - } - - // - double trend1 = XCHMAGetLCTrendPower(bar_index); - - // - int trendsUpCount = 0; - int trendsDownCount = 0; - for (int i = bar_index + 1; i < bar_index + length + 1; i++) - { - // - double iPrevTrend = XCHMAGetLCTrendPower(i + 1); - double iTrend = XCHMAGetLCTrendPower(i); - - // - if ( - trend1 > iTrend && - iTrend >= iPrevTrend && - trend1 >= iPrevTrend) - { - trendsUpCount++; - } - else if ( - trend1 < iTrend && - iTrend <= iPrevTrend && - trend1 <= iPrevTrend) - { - trendsDownCount++; - } - } - - // - result = - // - trendsUpCount > trendsDownCount - // - ; - - // - return result; -} - -// -// Check XTM TrendsDown or Up ... -bool XCHMAIsLCTrendsDown( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 2)) - { - return result; - } - - // - double trend1 = XCHMAGetLCTrendPower(bar_index); - - // - int trendsUpCount = 0; - int trendsDownCount = 0; - for (int i = bar_index + 1; i < bar_index + length + 1; i++) - { - // - double iPrevTrend = XCHMAGetLCTrendPower(i + 1); - double iTrend = XCHMAGetLCTrendPower(i); - - // - if ( - trend1 > iTrend && - iTrend >= iPrevTrend && - trend1 >= iPrevTrend) - { - trendsUpCount++; - } - else if ( - trend1 < iTrend && - iTrend <= iPrevTrend && - trend1 <= iPrevTrend) - { - trendsDownCount++; - } - } - - // - result = - // - trendsDownCount > trendsUpCount - // - ; - - // - return result; -} - -// -// Medium Cycle ... -// - -// -// Check MC is Peak ... -bool XCHMAIsMCPeak( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsIncreasing( - bar_index + length, - bar_index, - xCHMAMcSlowBuffer - // - ); - - // - return result; -} - -// -// Check MC is Vale ... -bool XCHMAIsMCVale( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsDecreasing( - bar_index + length, - bar_index, - xCHMAMcSlowBuffer - // - ); - - // - return result; -} - -// -// Check MC Fast Crossed Over Slow ... -bool XCHMAIsMCFastCrossedOverSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsCrossOver( - xCHMAMcFastBuffer, - xCHMAMcSlowBuffer, - bar_index); - - // - return result; -} - -// -// Check MC Fast Over Slow ... -bool XCHMAIsMCFastOverSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsOver( - xCHMAMcFastBuffer, - xCHMAMcSlowBuffer, - bar_index); - - // - return result; -} - -// -// Check MC Fast Crossed Under Slow ... -bool XCHMAIsMCFastCrossedUnderSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsCrossUnder( - xCHMAMcFastBuffer, - xCHMAMcSlowBuffer, - bar_index); - - // - return result; -} - -// -// Check MC Fast Under Slow ... -bool XCHMAIsMCFastUnderSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsUnder( - xCHMAMcFastBuffer, - xCHMAMcSlowBuffer, - bar_index); - - // - return result; -} - -// -// Get Trend Power ... -double XCHMAGetMCTrendPower( - int bar_index // Specified Index ... -) -{ - // - double result = 0; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = - // - MathAbs(xCHMAMcFastBuffer[bar_index] - xCHMAMcSlowBuffer[bar_index]) - // - ; - - // - return result; -} - -// -// Check XTM TrendsDown or Up ... -bool XCHMAIsMCTrendsUp( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 2)) - { - return result; - } - - // - double trend1 = XCHMAGetMCTrendPower(bar_index); - - // - int trendsUpCount = 0; - int trendsDownCount = 0; - for (int i = bar_index + 1; i < bar_index + length + 1; i++) - { - // - double iPrevTrend = XCHMAGetMCTrendPower(i + 1); - double iTrend = XCHMAGetMCTrendPower(i); - - // - if ( - trend1 > iTrend && - iTrend >= iPrevTrend && - trend1 >= iPrevTrend) - { - trendsUpCount++; - } - else if ( - trend1 < iTrend && - iTrend <= iPrevTrend && - trend1 <= iPrevTrend) - { - trendsDownCount++; - } - } - - // - result = - // - trendsUpCount > trendsDownCount - // - ; - - // - return result; -} - -// -// Check XTM TrendsDown or Up ... -bool XCHMAIsMCTrendsDown( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 2)) - { - return result; - } - - // - double trend1 = XCHMAGetMCTrendPower(bar_index); - - // - int trendsUpCount = 0; - int trendsDownCount = 0; - for (int i = bar_index + 1; i < bar_index + length + 1; i++) - { - // - double iPrevTrend = XCHMAGetMCTrendPower(i + 1); - double iTrend = XCHMAGetMCTrendPower(i); - - // - if ( - trend1 > iTrend && - iTrend >= iPrevTrend && - trend1 >= iPrevTrend) - { - trendsUpCount++; - } - else if ( - trend1 < iTrend && - iTrend <= iPrevTrend && - trend1 <= iPrevTrend) - { - trendsDownCount++; - } - } - - // - result = - // - trendsDownCount > trendsUpCount - // - ; - - // - return result; -} - -// -// Short Cycle ... -// - -// -// Check SC is Peak ... -bool XCHMAIsSCPeak( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsIncreasing( - bar_index + length, - bar_index, - xCHMAScSlowBuffer - // - ); - - // - return result; -} - -// -// Check SC is Vale ... -bool XCHMAIsSCVale( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsDecreasing( - bar_index + length, - bar_index, - xCHMAScSlowBuffer - // - ); - - // - return result; -} - -// -// Check SC Fast Crossed Over Slow ... -bool XCHMAIsSCFastCrossedOverSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsCrossOver( - xCHMAScFastBuffer, - xCHMAScSlowBuffer, - bar_index); - - // - return result; -} - -// -// Check SC Fast Over Slow ... -bool XCHMAIsSCFastOverSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsOver( - xCHMAScFastBuffer, - xCHMAScSlowBuffer, - bar_index); - - // - return result; -} - -// -// Check SC Fast Crossed Under Slow ... -bool XCHMAIsSCFastCrossedUnderSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsCrossUnder( - xCHMAScFastBuffer, - xCHMAScSlowBuffer, - bar_index); - - // - return result; -} - -// -// Check SC Fast Under Slow ... -bool XCHMAIsSCFastUnderSlow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsUnder( - xCHMAScFastBuffer, - xCHMAScSlowBuffer, - bar_index); - - // - return result; -} - -// -// Get SC Trend Power ... -double XCHMAGetSCTrendPower( - int bar_index // Specified Index ... -) -{ - // - double result = 0; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = - // - MathAbs(xCHMAScFastBuffer[bar_index] - xCHMAScSlowBuffer[bar_index]) - // - ; - - // - return result; -} - -// -// Check SC Trends Up ... -bool XCHMAIsSCTrendsUp( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 2)) - { - return result; - } - - // - double trend1 = XCHMAGetSCTrendPower(bar_index); - - // - int trendsUpCount = 0; - int trendsDownCount = 0; - for (int i = bar_index + 1; i < bar_index + length + 1; i++) - { - // - double iPrevTrend = XCHMAGetSCTrendPower(i + 1); - double iTrend = XCHMAGetSCTrendPower(i); - - // - if ( - trend1 > iTrend && - iTrend >= iPrevTrend && - trend1 >= iPrevTrend) - { - trendsUpCount++; - } - else if ( - trend1 < iTrend && - iTrend <= iPrevTrend && - trend1 <= iPrevTrend) - { - trendsDownCount++; - } - } - - // - result = - // - trendsUpCount > trendsDownCount - // - ; - - // - return result; -} - -// -// Check SC Trends Down ... -bool XCHMAIsSCTrendsDown( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + length + 2)) - { - return result; - } - - // - double trend1 = XCHMAGetSCTrendPower(bar_index); - - // - int trendsUpCount = 0; - int trendsDownCount = 0; - for (int i = bar_index + 1; i < bar_index + length + 1; i++) - { - // - double iPrevTrend = XCHMAGetSCTrendPower(i + 1); - double iTrend = XCHMAGetSCTrendPower(i); - - // - if ( - trend1 > iTrend && - iTrend >= iPrevTrend && - trend1 >= iPrevTrend) - { - trendsUpCount++; - } - else if ( - trend1 < iTrend && - iTrend <= iPrevTrend && - trend1 <= iPrevTrend) - { - trendsDownCount++; - } - } - - // - result = - // - trendsDownCount > trendsUpCount - // - ; - - // - return result; -} - -// -// Utility Functions ... -// - -// -// Check a Cycle is Over of Another ... -bool XCHMAIsCycleOverAnother( - int bar_index, // Specified Index ... - ENUM_XCHMA_CYCLES sourceCycle, // Specified Cycle ... - ENUM_XCHMA_CYCLES destCycle // Specified Cycle ... -) -{ - // - bool result = false; - - // - // Validate BufferSize ... - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - double sourceMinValue = XCHMAGetCycleMinValue(bar_index, sourceCycle); - double destMaxValue = XCHMAGetCycleMaxValue(bar_index, destCycle); - - // - result = - // - sourceMinValue > destMaxValue - // - ; - - // - return result; -} - -// -// Check a Cycle is Under of Another ... -bool XCHMAIsCycleUnderAnother( - int bar_index, // Specified Index ... - ENUM_XCHMA_CYCLES sourceCycle, // Specified Cycle ... - ENUM_XCHMA_CYCLES destCycle // Specified Cycle ... -) -{ - // - bool result = false; - - // - // Validate BufferSize ... - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - double sourceMaxValue = XCHMAGetCycleMaxValue(bar_index, sourceCycle); - double destMinValue = XCHMAGetCycleMinValue(bar_index, destCycle); - - // - result = - // - sourceMaxValue < destMinValue - // - ; - - // - return result; -} - -// -// Get Cycle Min Value ... -double XCHMAGetCycleMinValue( - int bar_index, // Specified Index ... - ENUM_XCHMA_CYCLES cycle // Specified Cycle ... -) -{ - // - double result = 0; - - // - // Validate BufferSize ... - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - switch (cycle) - { - // - case X_XCHMA_CYCLE_LONG: - result = MathMin( - xCHMALcFastBuffer[bar_index], - xCHMALcSlowBuffer[bar_index]); - break; - - // - case X_XCHMA_CYCLE_MEDIUM: - result = MathMin( - xCHMAMcFastBuffer[bar_index], - xCHMAMcSlowBuffer[bar_index]); - break; - - // - case X_XCHMA_CYCLE_SHORT: - result = MathMin( - xCHMAScFastBuffer[bar_index], - xCHMAScSlowBuffer[bar_index]); - break; - } - - // - return result; -} - -// -// Get Cycles Min Value ... -double XCHMAGetCyclesMinValue( - int bar_index, // Specified Index ... - ENUM_XCHMA_CYCLES &cycle[] // Specified Cycles ... -) -{ - // - double result = 0; - - // - // Validate Args ... - if ( - // - bar_index <= 0 || - ArraySize(cycle) <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1) - // - ) - { - return result; - } - - // - // Loop Through Cycles ... - for (int i = 0; i < ArraySize(cycle); i++) - { - // - ENUM_XCHMA_CYCLES iCycle = cycle[i]; - double iValue = XCHMAGetCycleMinValue( - bar_index, - iCycle); - - // - result = result == 0 || result > iValue ? iValue : result; - } - - // - return result; -} - -// -// Get Cycle Max Value ... -double XCHMAGetCycleMaxValue( - int bar_index, // Specified Index ... - ENUM_XCHMA_CYCLES cycle // Specified Cycle ... -) -{ - // - double result = 0; - - // - // Validate BufferSize ... - if ( - bar_index <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - switch (cycle) - { - // - case X_XCHMA_CYCLE_LONG: - result = MathMax( - xCHMALcFastBuffer[bar_index], - xCHMALcSlowBuffer[bar_index]); - break; - - // - case X_XCHMA_CYCLE_MEDIUM: - result = MathMax( - xCHMAMcFastBuffer[bar_index], - xCHMAMcSlowBuffer[bar_index]); - break; - - // - case X_XCHMA_CYCLE_SHORT: - result = MathMax( - xCHMAScFastBuffer[bar_index], - xCHMAScSlowBuffer[bar_index]); - break; - } - - // - return result; -} - -// -// Get Cycles Max Value ... -double XCHMAGetCyclesMaxValue( - int bar_index, // Specified Index ... - ENUM_XCHMA_CYCLES &cycle[] // Specified Cycles ... -) -{ - // - double result = 0; - - // - // Validate Args ... - if ( - // - bar_index <= 0 || - ArraySize(cycle) <= 0 || - !XCHMAIsValidBuffersSize(bar_index + 1) - // - ) - { - return result; - } - - // - // Loop Through Cycles ... - for (int i = 0; i < ArraySize(cycle); i++) - { - // - ENUM_XCHMA_CYCLES iCycle = cycle[i]; - double iValue = XCHMAGetCycleMaxValue( - bar_index, - iCycle); - - // - result = result == 0 || result < iValue ? iValue : result; - } - - // - return result; -} - -// -// Check all Buffers has valid Size ... -bool XCHMAIsValidBuffersSize( - int size // the size of buffers which min size for requirements -) -{ - // - bool result = false; - - // - if ( - size <= 0 || - // - ArraySize(xCHMALcFastBuffer) < size || - ArraySize(xCHMALcSlowBuffer) < size || - // - ArraySize(xCHMAMcFastBuffer) < size || - ArraySize(xCHMAMcSlowBuffer) < size || - // - ArraySize(xCHMAScFastBuffer) < size || - ArraySize(xCHMAScSlowBuffer) < size - // - ) - { - result = false; - } - else - { - result = true; - } - - // - return result; -} - -// -// Add Specified Object to it's correspond Buffer ... -void Add( - ENUM_XCHMA_CYCLES item, - ENUM_XCHMA_CYCLES &buffer[]) -{ - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; -} - -// -// END XCHMA Custom Functions ... -// diff --git a/BKP/XAU5-0.43/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 b/BKP/XAU5-0.43/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 deleted file mode 100644 index 19d3417c..00000000 --- a/BKP/XAU5-0.43/Helpers/x-saherelm.xfi.oscillator.helper.lib.mq5 +++ /dev/null @@ -1,358 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XFI 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 - -// -// Includes ... -#include "../Libraries/x-saherelm.log.lib.mq5" -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Enum Definitions ... -// - -// -// END Enum Definitions ... -// - -// -// START Inputs ... -// - -// input group "XFI Oscillator"; - -// // -// input int xFILength = 18; // Market Length -// input ENUM_MA_METHOD xFIMethod = MODE_SMA; // MA Method -// input ENUM_APPLIED_VOLUME xFIAppliedTo = VOLUME_TICK; // Applied To - -// -// Configurations ... -int xFILength = 18; // Market Length -ENUM_MA_METHOD xFIMethod = MODE_SMA; // MA Method -ENUM_APPLIED_VOLUME xFIAppliedTo = VOLUME_TICK; // Applied To - -// -// END Inputs ... -// - -// -// START Definitions ... -// - -int xFIHandler = INVALID_HANDLE; -double xFIBuffer[]; - -// -// END Definitions ... -// - -// -// START Handler Functions ... -// - -// -// Validate Inputs ... -bool XFIValidateInputs() -{ - // - bool result = false; - - // - result = xFILength > 2; - - // - if (!result) - { - // - LogMessage("XFI Oscillator Inputs Validation Failed ..."); - } - - // - return result; -} - -// -// Init Oscillators ... -bool XFIInitHandlers() -{ - // - bool result = false; - - // - // Initialize Indicator/Oscillator Handlers ... - ResetLastError(); - - // - // XFI Handler ... - ArraySetAsSeries(xFIBuffer, true); - xFIHandler = iCustom( - _Symbol, - _Period, - "x-saherelm.xfi.oscillator", - // - // Inputs ... - xFILength, - xFIMethod, - xFIAppliedTo - // - ); - if (xFIHandler == INVALID_HANDLE) - { - // - LogMessage("failed to Initialize XFI Oscillator: " + (string)GetLastError()); - return result; - } - - // - result = true; - - // - return result; -} - -// -// Release Oscillators ... -void XFIReleaseHandlers() -{ - IndicatorRelease(xFIHandler); -} - -// -// Handle Reading Buffers ... -void XFIReadBuffers( - int xFIItemsPerTick // Number Of Reading Buffer Items Per Tick -) -{ - // - // XFI Signal ... - CopyBuffer( - xFIHandler, - 0, - 0, - xFIItemsPerTick, - xFIBuffer); -} - -// -// END Handler Funcions ... -// - -// -// START XFI Custom Functions ... -// - -// -// Check SC is Peak ... -bool XFIIsPeak( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XFIIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - // Must Decreasing ... - bool isIncreasing = IsIncreasing( - bar_index + length, - bar_index, - xFIBuffer - // - ); - - // - return result; -} - -// -// Check SC is Vale ... -bool XFIIsVale( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XFIIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsDecreasing( - bar_index + length, - bar_index, - xFIBuffer - // - ); - - // - return result; -} - -// -// Detect XFI Crossed Over Zero ... -bool XFIIsCrossedOverZero( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XFIIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - result = - xFIBuffer[bar_index] > 0 && - xFIBuffer[bar_index + 1] <= 0; - - // - return result; -} - -// -// Detect XFI Over Zero ... -bool XFIIsOverZero( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XFIIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = - xFIBuffer[bar_index] > 0; - - // - return result; -} - -// -// Detect XFI Crossed Under Zero ... -bool XFIIsCrossedUnderZero( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XFIIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - result = - xFIBuffer[bar_index] < 0 && - xFIBuffer[bar_index + 1] >= 0; - - // - return result; -} - -// -// Detect XFI Under Zero ... -bool XFIIsUnderZero( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XFIIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = - xFIBuffer[bar_index] < 0; - - // - return result; -} - -// -// Check all Buffers has valid Size ... -bool XFIIsValidBuffersSize( - int size // the size of buffers which min size for requirements -) -{ - // - bool result = false; - - // - if ( - size <= 0 || - // - ArraySize(xFIBuffer) < size - // - ) - { - result = false; - } - else - { - result = true; - } - - // - return result; -} - -// -// END XFI Custom Functions ... -// diff --git a/BKP/XAU5-0.43/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 b/BKP/XAU5-0.43/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 deleted file mode 100644 index e6a92f65..00000000 --- a/BKP/XAU5-0.43/Helpers/x-saherelm.xlh.indicator.helper.lib.mq5 +++ /dev/null @@ -1,668 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XLH 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 ... -// - -// -// XLH Indicator Buffer Lines ... -enum ENUM_X_XLH_BUFFER_LINES -{ - X_XLH_HH_LINE = 0, - X_XLH_LL_LINE = 1, - X_XLH_SIGNAL_LINE = 2, -}; - -// -// END Enum Definitions ... -// - -// -// START Inputs ... -// - -// input group "XLH Indicator"; - -// input int xLHLength = 72; // Length -// input ENUM_SERIESMODE xLHHHMode = MODE_HIGH; // Highest High Calculation Method -// input ENUM_SERIESMODE xLHLLMode = MODE_LOW; // Lowest Low Calculation Method - -// -// Configurations ... -int xLHLength = 72; // Length -ENUM_SERIESMODE xLHHHMode = MODE_HIGH; // Highest High Calculation Method -ENUM_SERIESMODE xLHLLMode = MODE_LOW; // Lowest Low Calculation Method - -// -// END Inputs ... -// - -// -// START Definitions ... -// - -// -int xLHHandler = INVALID_HANDLE; - -// -double xLHHHBuffer[]; -double xLHLLBuffer[]; -double xLHSignalBuffer[]; - -// -// END Definitions ... -// - -// -// START Handler Functions ... -// - -// -// Validate Inputs ... -bool XLHValidateInputs() -{ - // - bool result = false; - - // - result = xLHLength >= 2; - - // - if (!result) - { - // - LogMessage("XLH Indicator Inputs Validation Failed ..."); - } - - // - return result; -} - -// -// Init Indicators ... -bool XLHInitHandlers() -{ - // - bool result = false; - - // - // Initialize Indicator/Oscillator Handlers ... - ResetLastError(); - - // - // XLH Handler ... - ArraySetAsSeries(xLHHHBuffer, true); - ArraySetAsSeries(xLHLLBuffer, true); - ArraySetAsSeries(xLHSignalBuffer, true); - - // - xLHHandler = iCustom( - _Symbol, - _Period, - "x-saherelm.xlh.indicator", - // - // Inputs ... - xLHLength, - xLHHHMode, - xLHLLMode - // - ); - if (xLHHandler == INVALID_HANDLE) - { - // - LogMessage("failed to Initialize XLH Indicator: " + (string)GetLastError()); - return result; - } - - // - result = true; - - // - return result; -} - -// -// Release Indicators ... -void XLHReleaseHandlers() -{ - IndicatorRelease(xLHHandler); -} - -// -// Handle Reading Buffers ... -void XLHReadBuffers( - int xLHItemsPerTick // Number Of Reading Buffer Items Per Tick -) -{ - // - // HH Buffer ... - CopyBuffer( - xLHHandler, - X_XLH_HH_LINE, - 0, - xLHItemsPerTick, - xLHHHBuffer - // - ); - - // - // LL Buffer ... - CopyBuffer( - xLHHandler, - X_XLH_LL_LINE, - 0, - xLHItemsPerTick, - xLHLLBuffer - // - ); - - // - // Signal Buffer ... - CopyBuffer( - xLHHandler, - X_XLH_SIGNAL_LINE, - 0, - xLHItemsPerTick, - xLHSignalBuffer - // - ); -} - -// -// END Handler Funcions ... -// - -// -// START XLH Custom Functions ... -// - -// -// TODO: What we have to Implement ... -// - [] - -// -// Check Candle High is HH ... -bool XLHIsHighAttachedHH( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - XOHCL candle = GetCandle(bar_index); - - // - result = - // - candle.high == xLHHHBuffer[bar_index] - // - ; - - // - return result; -} - -// -// Check Candle Low is LL ... -bool XLHIsLowAttachedLL( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - XOHCL candle = GetCandle(bar_index); - - // - result = - // - candle.low == xLHLLBuffer[bar_index] - // - ; - - // - return result; -} - -// -// Check Price Jumping Up Signal ... -bool XLHIsPriceCrossedOverSignal( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - XOHCL candle1 = GetCandle(bar_index); - XOHCL candle2 = GetCandle(bar_index + 1); - - // - result = - // - candle1.low > xLHSignalBuffer[bar_index] && - candle2.low < xLHSignalBuffer[bar_index + 1] - // - ; - - // - return result; -} - -// -// Check Price Over Signal ... -bool XLHIsPriceOverSignal( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - XOHCL candle1 = GetCandle(bar_index); - - // - result = - // - candle1.low > xLHSignalBuffer[bar_index] - // - ; - - // - return result; -} - -// -// Check Price Jumping Down Signal ... -bool XLHIsPriceCrossedUnderSignal( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - XOHCL candle1 = GetCandle(bar_index); - XOHCL candle2 = GetCandle(bar_index + 1); - - // - result = - // - candle1.high < xLHSignalBuffer[bar_index] && - candle2.high > xLHSignalBuffer[bar_index + 1] - // - ; - - // - return result; -} - -// -// Check Price Down Signal ... -bool XLHIsPriceUnderSignal( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - XOHCL candle1 = GetCandle(bar_index); - - // - result = - // - candle1.high < xLHSignalBuffer[bar_index] - // - ; - - // - return result; -} - -// -// Check Price Ranging Signal ... -bool XLHIsPriceInSignalRange( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - XOHCL candle1 = GetCandle(bar_index); - - // - result = - // - candle1.high > xLHSignalBuffer[bar_index] && - candle1.low < xLHSignalBuffer[bar_index] - // - ; - - // - return result; -} - -// -// Check HH Increased ... -bool XLHIsHHIncreased( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsIncreasing( - bar_index + length, - bar_index, - xLHHHBuffer - // - ); - - // - return result; -} - -// -// Check HH Decreased ... -bool XLHIsHHDecreased( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsDecreasing( - bar_index + length, - bar_index, - xLHHHBuffer - // - ); - - // - return result; -} - -// -// Check LL Increased ... -bool XLHIsLLIncreased( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsIncreasing( - bar_index + length, - bar_index, - xLHLLBuffer - // - ); - - // - return result; -} - -// -// Check LL Decreased ... -bool XLHIsLLDecreased( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsDecreasing( - bar_index + length, - bar_index, - xLHLLBuffer - // - ); - - // - return result; -} - -// -// Check HH Same in Length ... -bool XLHIsHHSameInLength( - int bar_index, // Specified Index ... - int length = 5 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - double value1 = xLHHHBuffer[bar_index]; - - // - // Loop ... - result = true; - for (int i = bar_index + 1; i < bar_index + length + 1; i++) - { - // - double iValue = xLHHHBuffer[i]; - if (iValue != value1) - { - // - result = false; - - // - break; - } - } - - // - return result; -} - -// -// Check LL Same in Length ... -bool XLHIsLLSameInLength( - int bar_index, // Specified Index ... - int length = 5 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XLHIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - double value1 = xLHLLBuffer[bar_index]; - - // - // Loop ... - result = true; - for (int i = bar_index + 1; i < bar_index + length + 1; i++) - { - // - double iValue = xLHLLBuffer[i]; - if (iValue != value1) - { - // - result = false; - - // - break; - } - } - - // - return result; -} - -// -// Check all Buffers has valid Size ... -bool XLHIsValidBuffersSize( - int size // the size of buffers which min size for requirements -) -{ - // - bool result = false; - - // - if ( - size <= 0 || - // - ArraySize(xLHHHBuffer) < size || - ArraySize(xLHLLBuffer) < size || - ArraySize(xLHSignalBuffer) < size - // - ) - { - result = false; - } - else - { - result = true; - } - - // - return result; -} - -// -// END XLH Custom Functions ... -// diff --git a/BKP/XAU5-0.43/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 b/BKP/XAU5-0.43/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 deleted file mode 100644 index f90f15b2..00000000 --- a/BKP/XAU5-0.43/Helpers/x-saherelm.xobd.indicator.helper.lib.mq5 +++ /dev/null @@ -1,249 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XOBD 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 ... -// - -// -// END Enum Definitions ... -// - -// -// START Inputs ... -// - -// input group "XOBD Indicator"; - -// input int xOBDLength = 5; // Swing Length -// input uchar xOBDSwingHighArrowCode = 108; // Swing High Arrow Code -// input color xOBDSwingHighArrowColor = clrMagenta; // Swing High Arrow Color -// input uchar xOBDSwingLowArrowCode = 108; // Swing Low Arrow Code -// input color xOBDSwingLowArrowColor = clrAqua; // Swing Low Arrow Color - -// -// Configurations ... -int xOBDLength = 5; // Swing Length -uchar xOBDSwingHighArrowCode = 108; // Swing High Arrow Code -color xOBDSwingHighArrowColor = clrMagenta; // Swing High Arrow Color -uchar xOBDSwingLowArrowCode = 108; // Swing Low Arrow Code -color xOBDSwingLowArrowColor = clrAqua; // Swing Low Arrow Color - -// -// END Inputs ... -// - -// -// START Definitions ... -// - -// -int xOBDHandler = INVALID_HANDLE; - -// -double xOBDBuffer[]; - -// -// END Definitions ... -// - -// -// START Handler Functions ... -// - -// -// Validate Inputs ... -bool XOBDValidateInputs() -{ - // - bool result = false; - - // - result = xOBDLength >= 2; - - // - if (!result) - { - // - LogMessage("XOBD Indicator Inputs Validation Failed ..."); - } - - // - return result; -} - -// -// Init Indicators ... -bool XOBDInitHandlers() -{ - // - bool result = false; - - // - // Initialize Indicator/Oscillator Handlers ... - ResetLastError(); - - // - // XOBD Handler ... - ArraySetAsSeries(xOBDBuffer, true); - - // - xOBDHandler = iCustom( - _Symbol, - _Period, - "x-saherelm.xobd.indicator", - // - // Inputs ... - xOBDLength, - xOBDSwingHighArrowCode, - xOBDSwingHighArrowColor, - xOBDSwingLowArrowCode, - xOBDSwingLowArrowColor - // - ); - if (xOBDHandler == INVALID_HANDLE) - { - // - LogMessage("failed to Initialize XOBD Indicator: " + (string)GetLastError()); - return result; - } - - // - result = true; - - // - return result; -} - -// -// Release Indicators ... -void XOBDReleaseHandlers() -{ - IndicatorRelease(xOBDHandler); -} - -// -// Handle Reading Buffers ... -void XOBDReadBuffers( - int xOBDItemsPerTick // Number Of Reading Buffer Items Per Tick -) -{ - // - // OBD Buffer ... - CopyBuffer( - xOBDHandler, - 0, - 0, - xOBDItemsPerTick, - xOBDBuffer - // - ); -} - -// -// END Handler Funcions ... -// - -// -// START XOBD Custom Functions ... -// - -// -// Check is Swing Low Occured or not ... -bool XOBDIsSwingLow( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XOBDIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - result = xOBDBuffer[bar_index] == X_SWING_LOW; - - // - return result; -} - -// -// Check is Swing High Occured or not ... -bool XOBDIsSwingHigh( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XOBDIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - result = xOBDBuffer[bar_index] == X_SWING_HIGH; - - // - return result; -} - -// -// Check all Buffers has valid Size ... -bool XOBDIsValidBuffersSize( - int size // the size of buffers which min size for requirements -) -{ - // - bool result = false; - - // - if ( - size <= 0 || - // - ArraySize(xOBDBuffer) < size - // - ) - { - result = false; - } - else - { - result = true; - } - - // - return result; -} - -// -// END XOBD Custom Functions ... -// diff --git a/BKP/XAU5-0.43/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 b/BKP/XAU5-0.43/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 deleted file mode 100644 index e6971b7a..00000000 --- a/BKP/XAU5-0.43/Helpers/x-saherelm.xrsi.oscillator.helper.lib.mq5 +++ /dev/null @@ -1,433 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XRSI 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 - -// -// Includes ... -#include "../Libraries/x-saherelm.log.lib.mq5" -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Enum Definitions ... -// - -// -// XRSI Oscillator Buffer Lines ... -// - -// -// END Enum Definitions ... -// - -// -// START Inputs ... -// - -// input group "XRSI Oscillator"; - -// // -// input group "XRSI Market"; -// input int xRSILength = 18; // Market Length -// input ENUM_APPLIED_PRICE xRSIAppliedTo = PRICE_OPEN; // Applied To - -// // -// input group "XRSI Short Entry"; -// input double xRSIShortEntryValue = 70; // Short Entry Level -// input color xRSIShortEntryColor = clrRed; // Short Entry Level Color -// input ENUM_LINE_STYLE xRSIShortEntryLineStyle = STYLE_SOLID; // Short Entry Style - -// // -// input group "XRSI Short Exit"; -// input double xRSIShortExitValue = 40; // Short Exit Level -// input color xRSIShortExitColor = clrRed; // Short Exit Level Color -// input ENUM_LINE_STYLE xRSIShortExitLineStyle = STYLE_DOT; // Short Exit Style - -// // -// input group "XRSI Long Entry"; -// input double xRSILongEntryValue = 30; // Long Entry Level -// input color xRSILongEntryColor = clrRed; // Long Entry Level Color -// input ENUM_LINE_STYLE xRSILongEntryLineStyle = STYLE_SOLID; // Long Entry Style - -// // -// input group "XRSI Long Exit"; -// input double xRSILongExitValue = 60; // Long Exit Level -// input color xRSILongExitColor = clrRed; // Long Exit Level Color -// input ENUM_LINE_STYLE xRSILongExitLineStyle = STYLE_DOT; // Long Exit Style - -// -// Configurations ... -int xRSILength = 18; // Market Length -ENUM_APPLIED_PRICE xRSIAppliedTo = PRICE_OPEN; // Applied To - -// -double xRSIShortEntryValue = 70; // Short Entry Level -color xRSIShortEntryColor = clrRed; // Short Entry Level Color -ENUM_LINE_STYLE xRSIShortEntryLineStyle = STYLE_SOLID; // Short Entry Style - -// -double xRSIShortExitValue = 40; // Short Exit Level -color xRSIShortExitColor = clrRed; // Short Exit Level Color -ENUM_LINE_STYLE xRSIShortExitLineStyle = STYLE_DOT; // Short Exit Style - -// -double xRSILongEntryValue = 30; // Long Entry Level -color xRSILongEntryColor = clrRed; // Long Entry Level Color -ENUM_LINE_STYLE xRSILongEntryLineStyle = STYLE_SOLID; // Long Entry Style - -// -double xRSILongExitValue = 60; // Long Exit Level -color xRSILongExitColor = clrRed; // Long Exit Level Color -ENUM_LINE_STYLE xRSILongExitLineStyle = STYLE_DOT; // Long Exit Style - -// -// END Inputs ... -// - -// -// START Definitions ... -// - -int xRSIHandler = INVALID_HANDLE; -double xRSIBuffer[]; - -// -// END Definitions ... -// - -// -// START Handler Functions ... -// - -// -// Validate Inputs ... -bool XRSIValidateInputs() -{ - // - bool result = false; - - // - result = - xRSILongEntryValue < xRSILongExitValue && - xRSIShortEntryValue > xRSIShortExitValue && - xRSIShortEntryValue > xRSILongExitValue && - xRSIShortExitValue < xRSILongExitValue; - - // - if (!result) - { - // - LogMessage("XRSI Oscillator Inputs Validation Failed ..."); - } - - // - return result; -} - -// -// Init Oscillators ... -bool XRSIInitHandlers() -{ - // - bool result = false; - - // - // Initialize Indicator/Oscillator Handlers ... - ResetLastError(); - - // - // XRSI Handler ... - ArraySetAsSeries(xRSIBuffer, true); - xRSIHandler = iCustom( - _Symbol, - _Period, - "x-saherelm.xrsi.oscillator", - // - // Inputs ... - // - // Market ... - "", - xRSILength, - xRSIAppliedTo, - // - // Short Entry ... - "", - xRSIShortEntryValue, - xRSIShortEntryColor, - xRSIShortEntryLineStyle, - // - // Short Exit ... - "", - xRSIShortExitValue, - xRSIShortExitColor, - xRSIShortExitLineStyle, - // - // Long Entry ... - "", - xRSILongEntryValue, - xRSILongEntryColor, - xRSILongEntryLineStyle, - // - // Long Exit ... - "", - xRSILongExitValue, - xRSILongExitColor, - xRSILongExitLineStyle - // - ); - if (xRSIHandler == INVALID_HANDLE) - { - // - LogMessage("failed to Initialize XRSI Oscillator: " + (string)GetLastError()); - return result; - } - - // - result = true; - - // - return result; -} - -// -// Release Oscillators ... -void XRSIReleaseHandlers() -{ - IndicatorRelease(xRSIHandler); -} - -// -// Handle Reading Buffers ... -void XRSIReadBuffers( - int xRSIItemsPerTick // Number Of Reading Buffer Items Per Tick -) -{ - // - // XRSI Signal ... - CopyBuffer( - xRSIHandler, - 0, - 0, - xRSIItemsPerTick, - xRSIBuffer); -} - -// -// END Handler Funcions ... -// - -// -// START XRSI Custom Functions ... -// - -// -// Check SC is Peak ... -bool XRSIIsPeak( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XRSIIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - // Must Decreasing ... - bool isIncreasing = IsIncreasing( - bar_index + length, - bar_index, - xRSIBuffer - // - ); - - // - return result; -} - -// -// Check SC is Vale ... -bool XRSIIsVale( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XRSIIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsDecreasing( - bar_index + length, - bar_index, - xRSIBuffer - // - ); - - // - return result; -} - -// -// RSI Value GO Up from Long Entry ... -bool XRSIIsCrossedOverLongEntry( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XRSIIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - result = - xRSIBuffer[bar_index + 1] > xRSILongEntryValue && - xRSIBuffer[bar_index + 2] <= xRSILongEntryValue; - - // - return result; -} - -// -// RSI Value GO Up from Long Exit ... -bool XRSIIsCrossedOverLongExit( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XRSIIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - result = - xRSIBuffer[bar_index + 1] > xRSILongExitValue && - xRSIBuffer[bar_index + 2] <= xRSILongExitValue; - - // - return result; -} - -// -// RSI Value Go Down Short Entry ... -bool XRSIIsCrossedUnderShortEntry( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XRSIIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - result = - xRSIBuffer[bar_index + 1] < xRSIShortEntryValue && - xRSIBuffer[bar_index + 2] >= xRSIShortEntryValue; - - // - return result; -} - -// -// RSI Value Go Down Short Exit ... -bool XRSIIsCrossedUnderShortExit( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XRSIIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - result = - xRSIBuffer[bar_index + 1] < xRSIShortExitValue && - xRSIBuffer[bar_index + 2] >= xRSIShortExitValue; - - // - return result; -} - -// -// Check all Buffers has valid Size ... -bool XRSIIsValidBuffersSize( - int size // the size of buffers which min size for requirements -) -{ - // - bool result = false; - - // - if ( - size <= 0 || - // - ArraySize(xRSIBuffer) < size - // - ) - { - result = false; - } - else - { - result = true; - } - - // - return result; -} - -// -// END XRSI Custom Functions ... -// diff --git a/BKP/XAU5-0.43/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 b/BKP/XAU5-0.43/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 deleted file mode 100644 index 6286228b..00000000 --- a/BKP/XAU5-0.43/Helpers/x-saherelm.xtd.oscillator.helper.lib.mq5 +++ /dev/null @@ -1,931 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// -// 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 - -// -// Includes ... -#include "../Libraries/x-saherelm.log.lib.mq5" -#include "../Libraries/x-saherelm.common.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 = 18; // 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 - -// -// Configurations ... -int xTDLength = 18; // Market Length -bool xTDDrawCrosses = false; // Draw Cross Arrows -uchar xTDBullishArrowCode = 228; // Cross Over Arrow Code -color xTDBullishArrowColor = clrAqua; // Cross Over Arrow Color -uchar xTDBearishArrowCode = 230; // Cross Under Arrow Code -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 ... -// - -// -// Validate Inputs ... -bool XTDValidateInputs() -{ - // - bool result = false; - - // - result = xTDLength >= 2; - - // - if (!result) - { - // - LogMessage("XTD Oscillator Inputs Validation Failed ..."); - } - - // - return result; -} - -// -// Init Oscillators ... -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 Oscillators ... -void XTDReleaseHandlers() -{ - IndicatorRelease(xTDHandler); -} - -// -// Handle Reading Buffers ... -void XTDReadBuffers( - int xTDItemsPerTick // Number Of Reading Buffer Items Per Tick -) -{ - // - // XTD Bullish Buffer ... - CopyBuffer( - xTDHandler, - X_XTD_BULLISH_POWER_LINE, - 0, - xTDItemsPerTick, - xTDBullishBuffer); - - // - // XTD Bullish Buffer ... - CopyBuffer( - xTDHandler, - X_XTD_BEARISH_POWER_LINE, - 0, - xTDItemsPerTick, - xTDBearishBuffer); - - // - // XTD Signal Buffer ... - CopyBuffer( - xTDHandler, - X_XTD_SIGNAL_LINE, - 0, - xTDItemsPerTick, - xTDSignalBuffer); -} - -// -// END Handler Funcions ... -// - -// -// START XTD Custom Functions ... -// - -// -// Check Signal Vale ... -bool XTDIsSignalVale( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsDecreasing( - bar_index + length, - bar_index, - xTDSignalBuffer - // - ); - - // - return result; -} - -// -// Check Signal Peak ... -bool XTDIsSignalPeak( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - // Must Decreasing ... - bool isIncreasing = IsIncreasing( - bar_index + length, - bar_index, - xTDSignalBuffer - // - ); - - // - return result; -} - -// -// Check Signal Vale ... -bool XTDIsBullishVale( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsDecreasing( - bar_index + length, - bar_index, - xTDBullishBuffer - // - ); - - // - return result; -} - -// -// Check Signal Peak ... -bool XTDIsBullishPeak( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - // Must Decreasing ... - bool isIncreasing = IsIncreasing( - bar_index + length, - bar_index, - xTDBullishBuffer - // - ); - - // - return result; -} - -// -// Check Signal Vale ... -bool XTDIsBearishVale( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - result = IsDecreasing( - bar_index + length, - bar_index, - xTDBearishBuffer - // - ); - - // - return result; -} - -// -// Check Signal Peak ... -bool XTDIsBearishPeak( - int bar_index, // Specified Index ... - int length = 10 // Specified Length ... -) -{ - // - bool result = false; - - // - if ( - length <= 0 || - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + length + 1)) - { - return result; - } - - // - // Must Decreasing ... - bool isIncreasing = IsIncreasing( - bar_index + length, - bar_index, - xTDBearishBuffer - // - ); - - // - return result; -} - -// -// Check Signal Peak ... - -// -// Check Bullish Crossed Over Bearish ... -bool XTDIsBullCrossedOverBear( - int bar_index // Specified Bar Index -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsCrossOver( - xTDBullishBuffer, - xTDBearishBuffer, - 1); - - // - return result; -} - -// -// Check Bullish Over Bearish ... -bool XTDIsBullOverBear( - int bar_index // Specified Bar Index -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsOver( - xTDBullishBuffer, - xTDBearishBuffer, - 1); - - // - return result; -} - -// -// Check Bullish Crossed Under Bearish ... -bool XTDIsBullCrossedUnderBear( - int bar_index // Specified Bar Index -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsCrossUnder( - xTDBullishBuffer, - xTDBearishBuffer, - 1); - - // - return result; -} - -// -// Check Bullish Under Bearish ... -bool XTDIsBullUnderBear( - int bar_index // Specified Bar Index -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsUnder( - xTDBullishBuffer, - xTDBearishBuffer, - 1); - - // - return result; -} - -// -// Check Signal Crossed Over Bearish ... -bool XTDIsSignalCrossedOverBear( - int bar_index // Specified Bar Index -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsCrossOver( - xTDSignalBuffer, - xTDBearishBuffer, - 1); - - // - return result; -} - -// -// Check Signal Over Bearish ... -bool XTDIsSignalOverBear( - int bar_index // Specified Bar Index -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsOver( - xTDSignalBuffer, - xTDBearishBuffer, - 1); - - // - return result; -} - -// -// Check Signal Crossed Under Bearish ... -bool XTDIsSignalCrossedUnderBear( - int bar_index // Specified Bar Index -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsCrossUnder( - xTDSignalBuffer, - xTDBearishBuffer, - 1); - - // - return result; -} - -// -// Check Signal Under Bearish ... -bool XTDIsSignalUnderBear( - int bar_index // Specified Bar Index -) -{ - // - bool result = false; - - // - if ( - bar_index <= 0 || - !XTDIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = IsUnder( - xTDSignalBuffer, - xTDBearishBuffer, - 1); - - // - return result; -} - -// -// Check all Buffers has valid Size ... -bool XTDIsValidBuffersSize( - int size // the size of buffers which min size for requirements -) -{ - // - bool result = false; - - // - if ( - size <= 0 || - ArraySize(xTDBullishBuffer) < size || - ArraySize(xTDBullishBuffer) < size || - ArraySize(xTDSignalBuffer) < size) - { - result = false; - } - else - { - result = true; - } - - // - return result; -} - -// -// Count Signal Crossed Over Bear ... -int XTDCountSignalCrossedOverBearIndex( - int bar_index // Specified Bar Index -) -{ - // - int result = 0; - - // - int count = ArraySize(xTDSignalBuffer) - 1; - if ( - bar_index <= 0 || - count <= bar_index + 1) - { - return result; - } - - // - // Loop Through ... - for (int i = bar_index + 1; i < count && result == -1; i++) - { - // - // Check Cross On i Point ... - bool isCrossedOnI = XTDIsSignalCrossedOverBear(i); - if (isCrossedOnI) - { - result++; - } - } - - // - return result; -} - -// -// Count Signal Crossed Under Bear ... -int XTDCountSignalCrossedUnderBearIndex( - int bar_index // Specified Bar Index -) -{ - // - int result = 0; - - // - int count = ArraySize(xTDSignalBuffer) - 1; - if ( - bar_index <= 0 || - count <= bar_index + 1) - { - return result; - } - - // - // Loop Through ... - for (int i = bar_index + 1; i < count && result == -1; i++) - { - // - // Check Cross On i Point ... - bool isCrossedOnI = XTDIsSignalCrossedUnderBear(i); - if (isCrossedOnI) - { - result++; - } - } - - // - return result; -} - -// -// Count Bull Crossed Over Bear ... -int XTDCountBullCrossedOverBearIndex( - int bar_index // Specified Bar Index -) -{ - // - int result = 0; - - // - int count = ArraySize(xTDSignalBuffer) - 1; - if ( - bar_index <= 0 || - count <= bar_index + 1) - { - return result; - } - - // - // Loop Through ... - for (int i = bar_index + 1; i < count && result == -1; i++) - { - // - // Check Cross On i Point ... - bool isCrossedOnI = XTDIsBullCrossedOverBear(i); - if (isCrossedOnI) - { - result++; - } - } - - // - return result; -} - -// -// Count Bull Crossed Under Bear ... -int XTDCountBullCrossedUnderBearIndex( - int bar_index // Specified Bar Index -) -{ - // - int result = 0; - - // - int count = ArraySize(xTDSignalBuffer) - 1; - if ( - bar_index <= 0 || - count <= bar_index + 1) - { - return result; - } - - // - // Loop Through ... - for (int i = bar_index + 1; i < count && result == -1; i++) - { - // - // Check Cross On i Point ... - bool isCrossedOnI = XTDIsBullCrossedUnderBear(i); - if (isCrossedOnI) - { - result++; - } - } - - // - return result; -} - -// -// Find Last Signal Crossed Over Bear ... -int XTDFindLastSignalCrossedOverBearIndex( - int bar_index // Specified Bar Index -) -{ - // - int result = -1; - - // - int count = ArraySize(xTDSignalBuffer) - 1; - if ( - bar_index <= 0 || - count <= bar_index + 1) - { - return result; - } - - // - // Loop Through ... - for (int i = bar_index + 1; i < count && result == -1; i++) - { - // - // Check Cross On i Point ... - bool isCrossedOnI = XTDIsSignalCrossedOverBear(i); - if (isCrossedOnI) - { - // - result = i; - break; - } - } - - // - return result; -} - -// -// Find Last Signal Crossed Onder Bear ... -int XTDFindLastSignalCrossedUnderBearIndex( - int bar_index // Specified Bar Index -) -{ - // - int result = -1; - - // - int count = ArraySize(xTDSignalBuffer) - 1; - if ( - bar_index <= 0 || - count <= bar_index + 1) - { - return result; - } - - // - // Loop Through ... - for (int i = bar_index + 1; i < count && result == -1; i++) - { - // - // Check Cross On i Point ... - bool isCrossedOnI = XTDIsSignalCrossedUnderBear(i); - if (isCrossedOnI) - { - // - result = i; - break; - } - } - - // - return result; -} - -// -// Find Last Bull Crossed Over Bear ... -int XTDFindLastBullCrossedOverBearIndex( - int bar_index // Specified Bar Index -) -{ - // - int result = -1; - - // - int count = ArraySize(xTDSignalBuffer) - 1; - if ( - bar_index <= 0 || - count <= bar_index + 1) - { - return result; - } - - // - // Loop Through ... - for (int i = bar_index + 1; i < count && result == -1; i++) - { - // - // Check Cross On i Point ... - bool isCrossedOnI = XTDIsBullCrossedOverBear(i); - if (isCrossedOnI) - { - // - result = i; - break; - } - } - - // - return result; -} - -// -// Find Last Bull Crossed Under Bear ... -int XTDFindLastBullCrossedUnderBearIndex( - int bar_index // Specified Bar Index -) -{ - // - int result = -1; - - // - int count = ArraySize(xTDSignalBuffer) - 1; - if ( - bar_index <= 0 || - count <= bar_index + 1) - { - return result; - } - - // - // Loop Through ... - for (int i = bar_index + 1; i < count && result == -1; i++) - { - // - // Check Cross On i Point ... - bool isCrossedOnI = XTDIsBullCrossedUnderBear(i); - if (isCrossedOnI) - { - // - result = i; - break; - } - } - - // - return result; -} - -// -// END XTD Custom Functions ... -// diff --git a/BKP/XAU5-0.43/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 b/BKP/XAU5-0.43/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 deleted file mode 100644 index a871ed42..00000000 --- a/BKP/XAU5-0.43/Helpers/x-saherelm.xtm.indicator.helper.lib.mq5 +++ /dev/null @@ -1,598 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// -// 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 - -// -// Configurations ... -int xTMMaPeriod = 18; // Period -int xTMMaShift = 0; // Shift -ENUM_MA_METHOD xTMMaMethod = MODE_EMA; // Method -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 ... -// - -// -// Validate Inputs ... -bool XTMValidateInputs() -{ - // - bool result = false; - - // - result = xTMMaPeriod >= 2; - - // - if (!result) - { - // - LogMessage("XTM Indicator Inputs Validation Failed ..."); - } - - // - return result; -} - -// -// 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 ... -// diff --git a/BKP/XAU5-0.43/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 b/BKP/XAU5-0.43/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 deleted file mode 100644 index 875eec08..00000000 --- a/BKP/XAU5-0.43/Helpers/x-saherelm.xts.oscillator.helper.lib.mq5 +++ /dev/null @@ -1,1179 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XTS 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 - -// -// Includes ... -#include "../Libraries/x-saherelm.log.lib.mq5" -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Enum Definitions ... -// - -// -// Methods to Calculate TimeFrames ... -enum ENUM_X_PERIOD_METHOD -{ - // - X_PERIOD_NOTHING, - // - X_PERIOD_AUTO, - // - X_PERIOD_MANUALLY -}; - -// -// Buffer Lines ... -enum ENUM_X_XTS_BUFFER_LINES -{ - X_XTS_CURRENT_LINE = 0, - X_XTS_NEAREST_LINE = 1, - X_XTS_MEDIEST_LINE = 2, - X_XTS_FAREST_LINE = 3, -}; - -// -// Periods ... -enum ENUM_X_XTS_PERIODS -{ - // - // Current Period ... - X_XTS_PERIOD_CURRENT, - // - // Nearest Period ... - X_XTS_PERIOD_NEAREST, - // - // Mediest Period ... - X_XTS_PERIOD_MEDIEST, - // - // Farest Period ... - X_XTS_PERIOD_FAREST, -}; - -// -// END Enum Definitions ... -// - -// -// START Inputs ... -// - -// // -// input group "XTS Oscillator"; - -// // -// input group "XTS Current Period"; -// input ENUM_APPLIED_PRICE xTSCurrentAppliedTo = PRICE_CLOSE; // Current Applied To -// // -// input group "XTS Nearest Period"; -// input ENUM_X_PERIOD_METHOD xTSNearestMethod = X_PERIOD_AUTO; // How to Find Nearest Period -// input ENUM_TIMEFRAMES xTSNearestPeriod = NULL; // Nearest Time Frame -// input ENUM_APPLIED_PRICE xTSNearestAppliedTo = PRICE_CLOSE; // Nearest Applied To -// // -// input group "XTS Mediest Period"; -// input ENUM_X_PERIOD_METHOD xTSMediestMethod = X_PERIOD_AUTO; // How to Find Mediest Period -// input ENUM_TIMEFRAMES xTSMediestPeriod = NULL; // Mediest Time Frame -// input ENUM_APPLIED_PRICE xTSMediestAppliedTo = PRICE_CLOSE; // Mediest Applied To -// // -// input group "XTS Farest Period"; -// input ENUM_X_PERIOD_METHOD xTSFarestMethod = X_PERIOD_AUTO; // How to Find Farest Period -// input ENUM_TIMEFRAMES xTSFarestPeriod = NULL; // Farest Time Frame -// input ENUM_APPLIED_PRICE xTSFarestAppliedTo = PRICE_CLOSE; // Farest Applied To - -// -// Configurations ... -ENUM_APPLIED_PRICE xTSCurrentAppliedTo = PRICE_CLOSE; // Current Applied To -// -ENUM_X_PERIOD_METHOD xTSNearestMethod = X_PERIOD_AUTO; // How to Find Nearest Period -ENUM_TIMEFRAMES xTSNearestPeriod = NULL; // Nearest Time Frame -ENUM_APPLIED_PRICE xTSNearestAppliedTo = PRICE_CLOSE; // Nearest Applied To -// -ENUM_X_PERIOD_METHOD xTSMediestMethod = X_PERIOD_AUTO; // How to Find Mediest Period -ENUM_TIMEFRAMES xTSMediestPeriod = NULL; // Mediest Time Frame -ENUM_APPLIED_PRICE xTSMediestAppliedTo = PRICE_CLOSE; // Mediest Applied To -// -ENUM_X_PERIOD_METHOD xTSFarestMethod = X_PERIOD_AUTO; // How to Find Farest Period -ENUM_TIMEFRAMES xTSFarestPeriod = NULL; // Farest Time Frame -ENUM_APPLIED_PRICE xTSFarestAppliedTo = PRICE_CLOSE; // Farest Applied To - -// -// END Inputs ... -// - -// -// START Definitions ... -// - -int xTSHandler = INVALID_HANDLE; -double xTSCurrentBuffer[]; -double xTSNearestBuffer[]; -double xTSMediestBuffer[]; -double xTSFarestBuffer[]; - -// -// END Definitions ... -// - -// -// START Handler Functions ... -// - -// -// Validate Inputs ... -bool XTSValidateInputs() -{ - // - bool result = false; - - // - result = true; - - // - if (!result) - { - // - LogMessage("XTS Oscillator Inputs Validation Failed ..."); - } - - // - return result; -} - -// -// Init Oscillators ... -bool XTSInitHandlers() -{ - // - bool result = false; - - // - // Initialize Indicator/Oscillator Handlers ... - ResetLastError(); - - // - // XTS Handler ... - ArraySetAsSeries(xTSCurrentBuffer, true); - ArraySetAsSeries(xTSNearestBuffer, true); - ArraySetAsSeries(xTSMediestBuffer, true); - ArraySetAsSeries(xTSFarestBuffer, true); - xTSHandler = iCustom( - _Symbol, - _Period, - "x-saherelm.xts.oscillator", - // - // Inputs ... - "", - xTSCurrentAppliedTo, - "", - xTSNearestMethod, - xTSNearestPeriod, - xTSNearestAppliedTo, - "", - xTSMediestMethod, - xTSMediestPeriod, - xTSMediestAppliedTo, - "", - xTSFarestMethod, - xTSFarestPeriod, - xTSFarestAppliedTo - // - ); - if (xTSHandler == INVALID_HANDLE) - { - // - LogMessage("failed to Initialize XTS Oscillator: " + (string)GetLastError()); - return result; - } - - // - result = true; - - // - return result; -} - -// -// Release Oscillators ... -void XTSReleaseHandlers() -{ - IndicatorRelease(xTSHandler); -} - -// -// Handle Reading Buffers ... -void XTSReadBuffers( - int xTSItemsPerTick // Number Of Reading Buffer Items Per Tick -) -{ - // - // XTS Current ... - CopyBuffer( - xTSHandler, - X_XTS_CURRENT_LINE, - 0, - xTSItemsPerTick, - xTSCurrentBuffer); - - // - // XTS Nearest ... - CopyBuffer( - xTSHandler, - X_XTS_NEAREST_LINE, - 0, - xTSItemsPerTick, - xTSNearestBuffer); - - // - // XTS Mediest ... - CopyBuffer( - xTSHandler, - X_XTS_MEDIEST_LINE, - 0, - xTSItemsPerTick, - xTSMediestBuffer); - - // - // XTS Farest ... - CopyBuffer( - xTSHandler, - X_XTS_FAREST_LINE, - 0, - xTSItemsPerTick, - xTSFarestBuffer); -} - -// -// END Handler Funcions ... -// - -// -// START XTS Custom Functions ... -// - -// -// Calculate Min Value ... -double XTSGetMinValue( - int bar_index // Specified Index ... -) -{ - // - ENUM_X_XTS_PERIODS periods[]; - XTSGetAllPeriodsEnum(periods); - - // - double result = XTSGetPeriodsMinValue( - periods, - bar_index); - - // - return result; -} - -// -// Calculate Max Value ... -double XTSGetMaxValue( - int bar_index // Specified Index ... -) -{ - // - ENUM_X_XTS_PERIODS periods[]; - XTSGetAllPeriodsEnum(periods); - - // - double result = XTSGetPeriodsMaxValue( - periods, - bar_index); - - // - return result; -} - -// -// Check if all Periods Values are Same ... -bool XTSIsAllSame( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XTSIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - result = - xTSCurrentBuffer[bar_index] == xTSNearestBuffer[bar_index] && - xTSNearestBuffer[bar_index] == xTSMediestBuffer[bar_index] && - xTSMediestBuffer[bar_index] == xTSFarestBuffer[bar_index]; - - // - return result; -} - -// -// Current ... - -// -// Check Current Buffer is Min Or Not ... -bool XTSIsCurrentMin( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XTSIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - double minValue = XTSGetMinValue(bar_index); - - // - result = - xTSCurrentBuffer[bar_index] == minValue; - - // - return result; -} - -// -// Check Current Buffer is Max Or Not ... -bool XTSIsCurrentMax( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XTSIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - double maxValue = XTSGetMaxValue(bar_index); - - // - result = - xTSCurrentBuffer[bar_index] == maxValue; - - // - return result; -} - -// -// Current VS Nearest ... - -// -// Check Current Crossed Over Nearest ... -bool XTSIsCurrentCrossedOverNearest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodCrossedOverAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_NEAREST, - bar_index); - - // - return result; -} - -// -// Check Current Over Nearest ... -bool XTSIsCurrentOverNearest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodOverAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_NEAREST, - bar_index); - - // - return result; -} - -// -// Check Current Crossed Under Nearest ... -bool XTSIsCurrentCrossedUnderNearest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodCrossedUnderAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_NEAREST, - bar_index); - - // - return result; -} - -// -// Check Current Under Nearest ... -bool XTSIsCurrentUnderNearest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodUnderAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_NEAREST, - bar_index); - - // - return result; -} - -// -// Current VS Mediest ... - -// -// Check Current Crossed Over Mediest ... -bool XTSIsCurrentCrossedOverMediest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodCrossedOverAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_MEDIEST, - bar_index); - - // - return result; -} - -// -// Check Current Over Mediest ... -bool XTSIsCurrentOverMediest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodOverAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_MEDIEST, - bar_index); - - // - return result; -} - -// -// Check Current Crossed Under Mediest ... -bool XTSIsCurrentCrossedUnderMediest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodCrossedUnderAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_MEDIEST, - bar_index); - - // - return result; -} - -// -// Check Current Under Mediest ... -bool XTSIsCurrentUnderMediest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodUnderAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_MEDIEST, - bar_index); - - // - return result; -} - -// -// Current VS Farest ... - -// -// Check Current Crossed Over Farest ... -bool XTSIsCurrentCrossedOverFarest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodCrossedOverAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_FAREST, - bar_index); - - // - return result; -} - -// -// Check Current Over Farest ... -bool XTSIsCurrentOverFarest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodOverAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_FAREST, - bar_index); - - // - return result; -} - -// -// Check Current Crossed Under Farest ... -bool XTSIsCurrentCrossedUnderFarest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodCrossedUnderAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_FAREST, - bar_index); - - // - return result; -} - -// -// Check Current Under Farest ... -bool XTSIsCurrentUnderFarest( - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - result = XTSIsPeriodUnderAnother( - X_XTS_PERIOD_CURRENT, - X_XTS_PERIOD_FAREST, - bar_index); - - // - return result; -} - -// -// Globally Custom Functions ... - -// -// Check a Period Crossed Over another one ... -bool XTSIsPeriodCrossedOverAnother( - ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... - ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XTSIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - double sourceValue = XTSGetPeriodValue( - source, - bar_index); - double sourceValue1 = XTSGetPeriodValue( - source, - bar_index + 1); - - // - double destValue = XTSGetPeriodValue( - dest, - bar_index); - double destValue1 = XTSGetPeriodValue( - dest, - bar_index + 1); - - // - result = - sourceValue > destValue && - sourceValue1 <= destValue1; - - // - return result; -} - -// -// Check a Period Over another one ... -bool XTSIsPeriodOverAnother( - ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... - ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XTSIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - double sourceValue = XTSGetPeriodValue( - source, - bar_index); - - // - double destValue = XTSGetPeriodValue( - dest, - bar_index); - - // - result = - sourceValue > destValue; - - // - return result; -} - -// -// Check a Period Crossed Under another one ... -bool XTSIsPeriodCrossedUnderAnother( - ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... - ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XTSIsValidBuffersSize(bar_index + 2)) - { - return result; - } - - // - double sourceValue = XTSGetPeriodValue( - source, - bar_index); - double sourceValue1 = XTSGetPeriodValue( - source, - bar_index + 1); - - // - double destValue = XTSGetPeriodValue( - dest, - bar_index); - double destValue1 = XTSGetPeriodValue( - dest, - bar_index + 1); - - // - result = - sourceValue < destValue && - sourceValue1 >= destValue1; - - // - return result; -} - -// -// Check a Period Under another one ... -bool XTSIsPeriodUnderAnother( - ENUM_X_XTS_PERIODS source, // Specified Source Period which Check it's Crossed ... - ENUM_X_XTS_PERIODS dest, // Specified Dest Period Which used to Check Source Crosses ... - int bar_index // Specified Index ... -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XTSIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - double sourceValue = XTSGetPeriodValue( - source, - bar_index); - - // - double destValue = XTSGetPeriodValue( - dest, - bar_index); - - // - result = - sourceValue < destValue; - - // - return result; -} - -// -// Retrieve Specific Period's Value from Buffer for Specific Bar Index ... -double XTSGetPeriodValue( - ENUM_X_XTS_PERIODS period, // Specified Period to read it's Value ... - int bar_index // Specified Index ... -) -{ - // - double result = 0; - - // - // Validate Args ... - if ( - bar_index < 0 || - !XTSIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - switch (period) - { - // - case X_XTS_PERIOD_CURRENT: - result = xTSCurrentBuffer[bar_index]; - break; - - // - case X_XTS_PERIOD_NEAREST: - result = xTSNearestBuffer[bar_index]; - break; - - // - case X_XTS_PERIOD_MEDIEST: - result = xTSMediestBuffer[bar_index]; - break; - - // - case X_XTS_PERIOD_FAREST: - result = xTSFarestBuffer[bar_index]; - break; - } - - // - return result; -} - -// -// Fill All Exists Periods ... -void XTSGetAllPeriodsEnum( - ENUM_X_XTS_PERIODS &result[] // Hold's Result ... -) -{ - // - CleanBuffer(result); - - // - Add( - X_XTS_PERIOD_CURRENT, - result); - - // - Add( - X_XTS_PERIOD_NEAREST, - result); - - // - Add( - X_XTS_PERIOD_MEDIEST, - result); - - // - Add( - X_XTS_PERIOD_FAREST, - result); -} - -// -// Fill All Exists Periods Except ... -void XTSGetAllPeriodsEnumExcept( - ENUM_X_XTS_PERIODS &result[], // Hold's Result ... - ENUM_X_XTS_PERIODS exception // Excepted Period ... -) -{ - // - CleanBuffer(result); - - // - ENUM_X_XTS_PERIODS allPeriods[]; - XTSGetAllPeriodsEnum(allPeriods); - int periodsCount = ArraySize(allPeriods); - if (periodsCount <= 0) - { - return; - } - - // - // Loop ... - for (int i = 0; i < periodsCount; i++) - { - // - ENUM_X_XTS_PERIODS iPeriod = allPeriods[i]; - - // - if (iPeriod != exception) - { - Add( - iPeriod, - result); - } - } -} - -// -// Fill All Exists Periods Except ... -void XTSGetAllPeriodsEnumExcept( - ENUM_X_XTS_PERIODS &result[], // Hold's Result ... - ENUM_X_XTS_PERIODS &exceptions[] // Excepted Periods ... -) -{ - // - CleanBuffer(result); - - // - ENUM_X_XTS_PERIODS allPeriods[]; - XTSGetAllPeriodsEnum(allPeriods); - int periodsCount = ArraySize(allPeriods); - if (periodsCount <= 0) - { - return; - } - - // - int exceptionsCount = ArraySize(exceptions); - - // - // Loop ... - for (int i = 0; i < periodsCount; i++) - { - // - ENUM_X_XTS_PERIODS iPeriod = allPeriods[i]; - - // - bool canAddIPeriod = false; - if (exceptionsCount <= 0) - { - canAddIPeriod = true; - } - else - { - // - // Loop through Exceptions ... - for (int j = 0; j < exceptionsCount; j++) - { - // - ENUM_X_XTS_PERIODS jException = exceptions[j]; - - // - if (iPeriod == jException) - { - // - canAddIPeriod = false; - break; - } - - // - canAddIPeriod = true; - } - } - - // - if (canAddIPeriod) - { - // - Add( - iPeriod, - result); - } - } -} - -// -// Calculate Periods Min Value ... -double XTSGetPeriodsMinValue( - ENUM_X_XTS_PERIODS &periods[], // Specified Periods ... - int bar_index // Specified Index ... -) -{ - // - double result = 0; - - // - int periodsCount = ArraySize(periods); - - // - // Validate Args ... - if ( - bar_index < 0 || - periodsCount <= 0 || - !XTSIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - // Loop ... - for (int i = 0; i < periodsCount; i++) - { - // - ENUM_X_XTS_PERIODS iPeriod = periods[i]; - - // - double iValue = 0; - - // - switch (iPeriod) - { - // - case X_XTS_PERIOD_CURRENT: - iValue = xTSCurrentBuffer[bar_index]; - break; - - // - case X_XTS_PERIOD_NEAREST: - iValue = xTSNearestBuffer[bar_index]; - break; - - // - case X_XTS_PERIOD_MEDIEST: - iValue = xTSMediestBuffer[bar_index]; - break; - - // - case X_XTS_PERIOD_FAREST: - iValue = xTSFarestBuffer[bar_index]; - break; - } - - // - // Compare iValue to result ... - result = - result == 0 || - result > iValue - ? iValue - : result; - } - - // - return result; -} - -// -// Calculate Periods Max Value ... -double XTSGetPeriodsMaxValue( - ENUM_X_XTS_PERIODS &periods[], // Specified Periods ... - int bar_index // Specified Index ... -) -{ - // - double result = 0; - - // - int periodsCount = ArraySize(periods); - - // - // Validate Args ... - if ( - bar_index < 0 || - periodsCount <= 0 || - !XTSIsValidBuffersSize(bar_index + 1)) - { - return result; - } - - // - // Loop ... - for (int i = 0; i < periodsCount; i++) - { - // - ENUM_X_XTS_PERIODS iPeriod = periods[i]; - - // - double iValue = 0; - - // - switch (iPeriod) - { - // - case X_XTS_PERIOD_CURRENT: - iValue = xTSCurrentBuffer[bar_index]; - break; - - // - case X_XTS_PERIOD_NEAREST: - iValue = xTSNearestBuffer[bar_index]; - break; - - // - case X_XTS_PERIOD_MEDIEST: - iValue = xTSMediestBuffer[bar_index]; - break; - - // - case X_XTS_PERIOD_FAREST: - iValue = xTSFarestBuffer[bar_index]; - break; - } - - // - // Compare iValue to result ... - result = - result == 0 || - result < iValue - ? iValue - : result; - } - - // - return result; -} - -// -// Check all Buffers has valid Size ... -bool XTSIsValidBuffersSize( - int size // the size of buffers which min size for requirements -) -{ - // - bool result = false; - - // - if ( - size <= 0 || - // - ArraySize(xTSCurrentBuffer) < size - // - ) - { - result = false; - } - else - { - result = true; - } - - // - return result; -} - -// -void Add( - ENUM_X_XTS_PERIODS item, // Specified Item ... - ENUM_X_XTS_PERIODS &buffer[] // Specified Buffer ... -) -{ - // - int bufferSize = ArraySize(buffer); - - // - ArrayResize( - buffer, - bufferSize + 1); - - // - buffer[bufferSize] = item; -} - -void CleanBuffer( - ENUM_X_XTS_PERIODS &buffer[] // Specified Buffer ... -) -{ - // - ArrayFree(buffer); - ArrayResize(buffer, 0); -} - -// -// END XTS Custom Functions ... -// diff --git a/BKP/XAU5-0.43/Indicators/x-saherelm.xama.indicator.mq5 b/BKP/XAU5-0.43/Indicators/x-saherelm.xama.indicator.mq5 deleted file mode 100644 index 14d1ef70..00000000 --- a/BKP/XAU5-0.43/Indicators/x-saherelm.xama.indicator.mq5 +++ /dev/null @@ -1,353 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XAMA Indicator -// --------------------------------------------- -// Name: XAMA -// Description: Trend Magic Indicator ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XAMA Indicator" -#property strict - -// -// START Constants ... -// -#define ShortName "XAMA" - -// -// XAMA Indicator States ... -enum ENUM_X_XAMA_STATES -{ - X_XAMA_BULLISH = 1, - X_XAMA_BEARISH = -1, - X_XAMA_NEUTURAL = 0, -}; -// -// END Constants ... -// - -// -// START Inputs ... -// -input int length = 18; // Period -input int fastEMA = 2; // Fast EMA Period -input int slowEMA = 30; // Slow EMA Period -input int maShift = 0; // Shift -input ENUM_APPLIED_PRICE appliedTo = PRICE_CLOSE; // Applied To -// -// END Inputs ... -// - -// -// Includes Logging Library ... -#include "../Libraries/x-saherelm.log.lib.mq5" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Buffers ... -// -#property indicator_chart_window - -// -#property indicator_buffers 3 -#property indicator_plots 1 - -// -// maBuffer ... -#define maBufferIndex 0 -#define maColorBufferIndex 1 -#define stateBufferIndex 2 - -double maBuffer[]; -double maColorBuffer[]; -double stateBuffer[]; - -#property indicator_label1 "XAMA" -#property indicator_type1 DRAW_COLOR_LINE -#property indicator_color1 clrLime, clrGray, clrRed -#property indicator_style1 STYLE_SOLID -#property indicator_width1 1 -// -// END Buffers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// -int maHandler = INVALID_HANDLE; -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Event Handlers ... -// -// -// Initialization ... -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - logTag = ShortName; - - // - // Initializing MA Handler ... - maHandler = iAMA( - _Symbol, - _Period, - length, - fastEMA, - slowEMA, - maShift, - appliedTo); - if (maHandler == INVALID_HANDLE) - { - // - string message = "Error Initializing Ma Handler ..."; - LogMessage(message); - - // - return INIT_FAILED; - } - - // - // Define Index Buffers ... - DefineBuffers(); - - // - // Set Indicator ShortName ... - SetIndicatorName(); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function - // REASON_REMOVE 1 Program removed from a chart - // REASON_RECOMPILE 2 Program recompiled - // REASON_CHARTCHANGE 3 A symbol or a chart period is changed - // REASON_CHARTCLOSE 4 Chart closed - // REASON_PARAMETERS 5 Inputs changed by a user - // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings - // REASON_TEMPLATE 7 Another chart template applied - // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value - // REASON_CLOSE 9 Terminal closed - - // - // Here we can handle De Initialization Reasons ... - IndicatorRelease(maHandler); -} - -// -// Calculations ... -// -// Calculating what we want ... -int OnCalculate( - // - // total Candles on chart ... - const int rates_total, - // - // total calculated Candles on charts ... - const int prev_calculated, - // - // history of Candles Open Time ... - const datetime &time[], - // - // history of Candles Open Price ... - const double &open[], - // - // history of Candles High Price ... - const double &high[], - // - // history of Candles Low Price ... - const double &low[], - // - // history of Candles Close Price ... - const double &close[], - // - // history of Tick Volumes on Candle ... - const long &tick_volume[], - // - // history of Trade Volumes ... - const long &volume[], - // - // history of Candles Spread Price ... - const int &spread[]) -{ - // - // Prepare Buffers ... - ArraySetAsSeries(time, true); - ArraySetAsSeries(open, true); - ArraySetAsSeries(high, true); - ArraySetAsSeries(low, true); - ArraySetAsSeries(close, true); - ArraySetAsSeries(tick_volume, true); - ArraySetAsSeries(volume, true); - ArraySetAsSeries(spread, true); - - // - // this counts Available Bars ... - int limit; - - // - // because in some cases we may have more than one input for - // calculation and we must prevent any calculation - // untill we pass the biggest input length, here we get max Input length - // and then wait until pass it ... - int maxLength = MathMax(fastEMA, slowEMA); - maxLength = MathMax(maxLength, length); - - // - // Check Calculated Bars ... - int maCalculatedBars = BarsCalculated(maHandler); - if (maCalculatedBars < maxLength) - { - return prev_calculated; - } - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; - - // - // Buffers Copy ... - int copiedMas = CopyBuffer(maHandler, 0, 0, limit, maBuffer); - if (copiedMas <= 0) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - // Do Buffers Calculation ... - CalculateBuffers(i); - } - - // - return rates_total; -} -// -// END Event Handlers ... -// - -// -// START Functions ... -// -// -// Validate Input Args for Initialization ... -bool ValidateInputs() -{ - // - bool result = false; - - // - // Validate Args ... - if (length >= 2) - { - result = true; - } - - // - return result; -} - -// -// Define Indexes and Styles ... -void DefineBuffers() -{ - // - string maBufferLabel = "XAMA " + "(" + (string)length + ")"; - - // - // Ma Buffer ... - ArraySetAsSeries(maBuffer, true); - SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA); - PlotIndexSetString(maBufferIndex, PLOT_LABEL, maBufferLabel); - - // - // Ma Color Buffer ... - ArraySetAsSeries(maColorBuffer, true); - SetIndexBuffer(maColorBufferIndex, maColorBuffer, INDICATOR_COLOR_INDEX); - - // - // State Buffer ... - ArraySetAsSeries(stateBuffer, true); - SetIndexBuffer(stateBufferIndex, stateBuffer, INDICATOR_CALCULATIONS); -} - -// -// Set Indicator Short Name and also we can define Buffers Labels ... -void SetIndicatorName() -{ - // - string indicatorShortName = ""; - StringConcatenate(indicatorShortName, ShortName, " ", "(", length, ")"); - - // - IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); -} - -// -// Calculate Buffers ... -void CalculateBuffers(int bar_index) -{ - // - // Requirements ... - XOHCL candle = GetCandle(bar_index); - - // - double maValue = maBuffer[bar_index]; - - // - double lineColorIndex = - maValue < candle.low ? 0 : maValue > candle.high ? 2 - : 1; - - // - // Define State Value ... - // lineColorIndex == 0 => Bullish => 1; - // lineColorIndex == 1 => Neutural => 0; - // lineColorIndex == 2 => Bearish => -1; - double stateValue = - lineColorIndex == 0 ? X_XAMA_BULLISH : lineColorIndex == 2 ? X_XAMA_BEARISH - : X_XAMA_NEUTURAL; - - // - // Set Ma Buffer Color Index ... - maColorBuffer[bar_index] = lineColorIndex; - - // - // Set State Buffer Value ... - stateBuffer[bar_index] = stateValue; -} - -// -// END Functions ... -// diff --git a/BKP/XAU5-0.43/Indicators/x-saherelm.xchlh.oscillator.mq5 b/BKP/XAU5-0.43/Indicators/x-saherelm.xchlh.oscillator.mq5 deleted file mode 100644 index 5c74787c..00000000 --- a/BKP/XAU5-0.43/Indicators/x-saherelm.xchlh.oscillator.mq5 +++ /dev/null @@ -1,753 +0,0 @@ -////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Cycle Channel LH Oscillator -// --------------------------------------------------- -// Name: XCHLH -// Description: detecting HH and LL based on cycles ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XCHLH Oscillator" -#property strict - -// -// START Constants ... -// -#define ShortName "XCHLH" - -// -// XCHLH Hot States ... -enum ENUM_X_XCHLH_HOT_STATES -{ - X_XCHLH_HOT_HH = 1, - X_XCHLH_NEUTURAL = 0, - X_XCHLH_HOT_LL = -1, -}; - -// -// Including Models Library ... -#include "../Libraries/x-saherelm.models.lib.mq5" -// -// END Constants ... -// - -// -// START Inputs ... -// -// -// Common ... -input group "Hot Areas"; -input bool drawHotAreas = true; // Draw Hot Areas Symbol -input uchar hotHHArrowCode = 234; // Hot HH Arrow Code -input color hotHHArrowColor = clrAqua; // Hot HH Arrow Color -input uchar hotLLArrowCode = 233; // Hot LL Arrow Code -input color hotLLArrowColor = clrFuchsia; // Hot LL Arrow Color - -// -// LC Inputs ... -input group "Long Cycle"; -input group "LC Market"; -input int lcLength = 28; // Length -input double lcThresholdInPips = 0.3; // Threshold In Pips -input ENUM_SERIESMODE lcHHMode = MODE_HIGH; // Highest High Calculation Method -input ENUM_SERIESMODE lcLLMode = MODE_LOW; // Lowest Low Calculation Method -input group "LC Style"; -input int lcDrawWidth = 1; // Draw Width -input ENUM_DRAW_TYPE lcDrawType = DRAW_LINE; // Draw Type -input ENUM_LINE_STYLE lcDrawStyle = STYLE_DOT; // Draw Style -input color lcHHColor = clrAqua; // Highest High Color -input color lcLLColor = clrFuchsia; // Lowest Low Color -input group "LC Drawings"; -input bool lcDrawHH = true; // Draw Highest High -input bool lcDrawLL = true; // Draw Lowest Low - -// -// MC Inputs ... -input group "Medium Cycle"; -input group "MC Market"; -input int mcLength = 14; // Length -input double mcThresholdInPips = 0.3; // Threshold In Pips -input ENUM_SERIESMODE mcHHMode = MODE_HIGH; // Highest High Calculation Method -input ENUM_SERIESMODE mcLLMode = MODE_LOW; // Lowest Low Calculation Method -input group "MC Style"; -input int mcDrawWidth = 1; // Draw Width -input ENUM_DRAW_TYPE mcDrawType = DRAW_LINE; // Draw Type -input ENUM_LINE_STYLE mcDrawStyle = STYLE_DOT; // Draw Style -input color mcHHColor = clrLime; // Highest High Color -input color mcLLColor = clrRed; // Lowest Low Color -input group "MC Drawings"; -input bool mcDrawHH = true; // Draw Highest High -input bool mcDrawLL = true; // Draw Lowest Low - -// -// SC Inputs ... -input group "Short Cycle"; -input group "SC Market"; -input int scLength = 7; // Length -input double scThresholdInPips = 0.3; // Threshold In Pips -input ENUM_SERIESMODE scHHMode = MODE_HIGH; // Highest High Calculation Method -input ENUM_SERIESMODE scLLMode = MODE_LOW; // Lowest Low Calculation Method -input group "SC Style"; -input int scDrawWidth = 1; // Draw Width -input ENUM_DRAW_TYPE scDrawType = DRAW_LINE; // Draw Type -input ENUM_LINE_STYLE scDrawStyle = STYLE_DOT; // Draw Style -input color scHHColor = clrLightBlue; // Highest High Color -input color scLLColor = clrLightSalmon; // Lowest Low Color -input group "SC Drawings"; -input bool scDrawHH = true; // Draw Highest High -input bool scDrawLL = true; // Draw Lowest Low -// -// END Inputs ... -// - -// -// Includes Logging Library ... -#include "../Libraries/x-saherelm.log.lib.mq5"; - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5"; - -// -// Includes Draw Library ... -#include "../Libraries/x-saherelm.draw.lib.mq5"; - -// -// START Buffers ... -// -#property indicator_separate_window - -// -#property indicator_buffers 7 -#property indicator_plots 6 - -// -// LC ... -#define lcHHBufferIndex 0 -#define lcLLBufferIndex 1 - -// -double lcHHBuffer[]; -double lcLLBuffer[]; - -// -// MC ... -#define mcHHBufferIndex 2 -#define mcLLBufferIndex 3 - -// -double mcHHBuffer[]; -double mcLLBuffer[]; - -// -// SC ... -#define scHHBufferIndex 4 -#define scLLBufferIndex 5 - -// -double scHHBuffer[]; -double scLLBuffer[]; - -// -// Hot State ... -// -#define hotStateBufferIndex 6 - -// -double hotStateBuffer[]; -// -// END Buffers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Event Handlers ... -// -// -// Initialization ... -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - logTag = ShortName; - drawPrefix = ShortName; - - // - // Define Index Buffers ... - DefineBuffers(); - - // - // Set Indicator ShortName ... - SetIndicatorName(); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function - // REASON_REMOVE 1 Program removed from a chart - // REASON_RECOMPILE 2 Program recompiled - // REASON_CHARTCHANGE 3 A symbol or a chart period is changed - // REASON_CHARTCLOSE 4 Chart closed - // REASON_PARAMETERS 5 Inputs changed by a user - // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings - // REASON_TEMPLATE 7 Another chart template applied - // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value - // REASON_CLOSE 9 Terminal closed - - // - // Here we can handle De Initialization Reasons ... - - // - // ReDraw Chart ... - ChartRedraw(); - - // - // De Init Draw Library ... - OnDeinitDrawLibrary(); - - // - Comment(""); -} - -// -// Calculations ... -// -// Calculating what we want ... -int OnCalculate( - // - // total Candles on chart ... - const int rates_total, - // - // total calculated Candles on charts ... - const int prev_calculated, - // - // history of Candles Open Time ... - const datetime &time[], - // - // history of Candles Open Price ... - const double &open[], - // - // history of Candles High Price ... - const double &high[], - // - // history of Candles Low Price ... - const double &low[], - // - // history of Candles Close Price ... - const double &close[], - // - // history of Tick Volumes on Candle ... - const long &tick_volume[], - // - // history of Trade Volumes ... - const long &volume[], - // - // history of Candles Spread Price ... - const int &spread[]) -{ - // - // Prepare Buffers ... - ArraySetAsSeries(time, true); - ArraySetAsSeries(open, true); - ArraySetAsSeries(high, true); - ArraySetAsSeries(low, true); - ArraySetAsSeries(close, true); - ArraySetAsSeries(tick_volume, true); - ArraySetAsSeries(volume, true); - ArraySetAsSeries(spread, true); - - // - // this counts Available Bars ... - int limit; - - // - // because in some cases we may have more than one input for - // calculation and we must prevent any calculation - // untill we pass the biggest input length, here we get max Input length - // and then wait until pass it ... - int maxLength = MathMax(lcLength, mcLength); - maxLength = MathMax(maxLength, scLength); - - // - limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; - - // - // Main Loop ... - for (int i = limit; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers(i); - } - - // - return rates_total; -} -// -// END Event Handlers ... -// - -// -// START Functions ... -// -// -// Validate Input Args for Initialization ... -bool ValidateInputs() -{ - // - bool result = false; - - // - // Validate Args ... - bool isLCInputsValid = - lcLength >= 4 && - lcLength > mcLength && - lcLength > scLength; - bool isMCInputsValid = - mcLength >= 4 && - mcLength > scLength && - mcLength < lcLength; - bool isSCInputsValid = - scLength >= 4 && - scLength < mcLength && - scLength < lcLength; - if ( - isLCInputsValid && - isMCInputsValid && - isSCInputsValid) - { - result = true; - } - - // - return result; -} - -// -// Define Indexes and Styles ... -void DefineBuffers() -{ - // - // LC ... - LCDefineBuffers(); - - // - // MC ... - MCDefineBuffers(); - - // - // SC ... - SCDefineBuffers(); - - // - // Hot State Buffer ... - HotStateDefineBuffers(); -} - -// -// Set Indicator Short Name and also we can define Buffers Labels ... -void SetIndicatorName() -{ - // - string indicatorShortName = ""; - StringConcatenate(indicatorShortName, ShortName, ""); - - // - IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); -} - -// -// Calculate Buffers ... -void CalculateBuffers( - int bar_index // Current Candle Index ... -) -{ - // - // LC ... - LCCalculateBuffers(bar_index); - - // - // MC ... - MCCalculateBuffers(bar_index); - - // - // SC ... - SCCalculateBuffers(bar_index); - - // - // SIGNAL ... - SignalCalculateBuffers(bar_index); - - // - // HOT State Buffer ... - HotStateCalculateBuffers(bar_index); - - // - // After all Calculations we are ready to Draw what we want ... - DrawBuffers(bar_index); -} - -// -// LC Buffers Definitions ... -void LCDefineBuffers() -{ - // - // LC HH Buffer ... - string lcHHBufferLabel = ShortName + " LC HH (" + (string)lcLength + ")"; - ENUM_DRAW_TYPE lcHHDrawType = lcDrawHH ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(lcHHBuffer, true); - SetIndexBuffer(lcHHBufferIndex, lcHHBuffer, INDICATOR_DATA); - PlotIndexSetInteger(lcHHBufferIndex, PLOT_DRAW_BEGIN, lcLength); - PlotIndexSetString(lcHHBufferIndex, PLOT_LABEL, lcHHBufferLabel); - PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_COLOR, lcHHColor); - PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); - PlotIndexSetInteger(lcHHBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); - PlotIndexSetInteger(lcHHBufferIndex, PLOT_DRAW_TYPE, lcHHDrawType); - - // - // LC LL Buffer ... - string lcLLBufferLabel = ShortName + " LC LL (" + (string)lcLength + ")"; - ENUM_DRAW_TYPE lcLLDrawType = lcDrawLL ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(lcLLBuffer, true); - SetIndexBuffer(lcLLBufferIndex, lcLLBuffer, INDICATOR_DATA); - PlotIndexSetInteger(lcLLBufferIndex, PLOT_DRAW_BEGIN, lcLength); - PlotIndexSetString(lcLLBufferIndex, PLOT_LABEL, lcLLBufferLabel); - PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_COLOR, lcLLColor); - PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); - PlotIndexSetInteger(lcLLBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); - PlotIndexSetInteger(lcLLBufferIndex, PLOT_DRAW_TYPE, lcLLDrawType); -} - -// -// MC Buffers Definitions ... -void MCDefineBuffers() -{ - // - // MC HH Buffer ... - string mcHHBufferLabel = ShortName + " MC HH (" + (string)mcLength + ")"; - ENUM_DRAW_TYPE mcHHDrawType = mcDrawHH ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(mcHHBuffer, true); - SetIndexBuffer(mcHHBufferIndex, mcHHBuffer, INDICATOR_DATA); - PlotIndexSetInteger(mcHHBufferIndex, PLOT_DRAW_BEGIN, mcLength); - PlotIndexSetString(mcHHBufferIndex, PLOT_LABEL, mcHHBufferLabel); - PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_COLOR, mcHHColor); - PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); - PlotIndexSetInteger(mcHHBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); - PlotIndexSetInteger(mcHHBufferIndex, PLOT_DRAW_TYPE, mcHHDrawType); - - // - // MC LL Buffer ... - string mcLLBufferLabel = ShortName + " MC LL (" + (string)mcLength + ")"; - ENUM_DRAW_TYPE mcLLDrawType = mcDrawLL ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(mcLLBuffer, true); - SetIndexBuffer(mcLLBufferIndex, mcLLBuffer, INDICATOR_DATA); - PlotIndexSetInteger(mcLLBufferIndex, PLOT_DRAW_BEGIN, mcLength); - PlotIndexSetString(mcLLBufferIndex, PLOT_LABEL, mcLLBufferLabel); - PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_COLOR, mcLLColor); - PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); - PlotIndexSetInteger(mcLLBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); - PlotIndexSetInteger(mcLLBufferIndex, PLOT_DRAW_TYPE, mcLLDrawType); -} - -// -// SC Buffers Definitions ... -void SCDefineBuffers() -{ - // - // SC HH Buffer ... - string scHHBufferLabel = ShortName + " SC HH (" + (string)scLength + ")"; - ENUM_DRAW_TYPE scHHDrawType = scDrawHH ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(scHHBuffer, true); - SetIndexBuffer(scHHBufferIndex, scHHBuffer, INDICATOR_DATA); - PlotIndexSetInteger(scHHBufferIndex, PLOT_DRAW_BEGIN, scLength); - PlotIndexSetString(scHHBufferIndex, PLOT_LABEL, scHHBufferLabel); - PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_COLOR, scHHColor); - PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_STYLE, scDrawStyle); - PlotIndexSetInteger(scHHBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); - PlotIndexSetInteger(scHHBufferIndex, PLOT_DRAW_TYPE, scHHDrawType); - - // - // SC LL Buffer ... - string scLLBufferLabel = ShortName + " SC LL (" + (string)scLength + ")"; - ENUM_DRAW_TYPE scLLDrawType = scDrawLL ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(scLLBuffer, true); - SetIndexBuffer(scLLBufferIndex, scLLBuffer, INDICATOR_DATA); - PlotIndexSetInteger(scLLBufferIndex, PLOT_DRAW_BEGIN, scLength); - PlotIndexSetString(scLLBufferIndex, PLOT_LABEL, scLLBufferLabel); - PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_COLOR, scLLColor); - PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_STYLE, scDrawStyle); - PlotIndexSetInteger(scLLBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); - PlotIndexSetInteger(scLLBufferIndex, PLOT_DRAW_TYPE, scLLDrawType); -} - -// -// Hot State Buffer ... -void HotStateDefineBuffers() -{ - // - // Hot State Buffer ... - ArraySetAsSeries(hotStateBuffer, true); - SetIndexBuffer(hotStateBufferIndex, hotStateBuffer, INDICATOR_CALCULATIONS); -} - -// -// LC Calculations ... -void LCCalculateBuffers( - int bar_index // Current Candle Index ... -) -{ - // - // Detect Cycle HH and LL ... - int length = lcLength; - ENUM_SERIESMODE hhMode = lcHHMode; - ENUM_SERIESMODE llMode = lcLLMode; - double threshold = PipsToPrice(lcThresholdInPips); - double hh = GetHighestHigh( - length, - bar_index, - hhMode); - double hhValue = hh + threshold; - double ll = GetLowestLow( - length, - bar_index, - llMode); - double llValue = ll - threshold; - - // - lcHHBuffer[bar_index] = hhValue; - lcLLBuffer[bar_index] = llValue; -} - -// -// MC Calculations ... -void MCCalculateBuffers( - int bar_index // Current Candle Index ... -) -{ - // - // Detect Cycle HH and LL ... - int length = mcLength; - ENUM_SERIESMODE hhMode = mcHHMode; - ENUM_SERIESMODE llMode = mcLLMode; - double threshold = PipsToPrice(mcThresholdInPips); - double hh = GetHighestHigh( - length, - bar_index, - hhMode); - double hhValue = hh + threshold; - double ll = GetLowestLow( - length, - bar_index, - llMode); - double llValue = ll - threshold; - - // - mcHHBuffer[bar_index] = hhValue; - mcLLBuffer[bar_index] = llValue; -} - -// -// SC Calculations ... -void SCCalculateBuffers( - int bar_index // Current Candle Index ... -) -{ - // - // Detect Cycle HH and LL ... - int length = scLength; - ENUM_SERIESMODE hhMode = scHHMode; - ENUM_SERIESMODE llMode = scLLMode; - double threshold = PipsToPrice(scThresholdInPips); - double hh = GetHighestHigh( - length, - bar_index, - hhMode); - double hhValue = hh + threshold; - double ll = GetLowestLow( - length, - bar_index, - llMode); - double llValue = ll - threshold; - - // - scHHBuffer[bar_index] = hhValue; - scLLBuffer[bar_index] = llValue; -} - -// -// SIGNAL Calculations ... -void SignalCalculateBuffers( - int bar_index // Current Candle Index ... -) -{ - // - // LC Values ... - double lcHH = lcHHBuffer[bar_index]; - double lcLL = lcLLBuffer[bar_index]; - double lcDelta = lcHH - lcLL; - double lcAvg = lcDelta / 2; - - // - // MC Values ... - double mcHH = mcHHBuffer[bar_index]; - double mcLL = mcLLBuffer[bar_index]; - double mcDelta = mcHH - mcLL; - double mcAvg = mcDelta / 2; - - // - // SC Values ... - double scHH = scHHBuffer[bar_index]; - double scLL = scLLBuffer[bar_index]; - double scDelta = scHH - scLL; - double scAvg = scDelta / 2; - - // - // Min Value ... - double minValue = MathMin( - scLL, mcLL); - minValue = MathMin( - lcLL, minValue); - - // - // Max Value ... - double maxValue = MathMin( - scHH, mcHH); - maxValue = MathMin( - lcHH, maxValue); -} - -// -// HOT State Calculate Buffers ... -void HotStateCalculateBuffers( - int bar_index // Current Candle Index ... -) -{ - // - // LC ... - double lcHH = lcHHBuffer[bar_index]; - double lcLL = lcLLBuffer[bar_index]; - // - double lcHH1 = lcHHBuffer[bar_index + 1]; - double lcLL1 = lcLLBuffer[bar_index + 1]; - - // - // MC ... - double mcHH = mcHHBuffer[bar_index]; - double mcLL = mcLLBuffer[bar_index]; - // - double mcHH1 = mcHHBuffer[bar_index + 1]; - double mcLL1 = mcLLBuffer[bar_index + 1]; - - // - // SC ... - double scHH = scHHBuffer[bar_index]; - double scLL = scLLBuffer[bar_index]; - // - double scHH1 = scHHBuffer[bar_index + 1]; - double scLL1 = scLLBuffer[bar_index + 1]; - - // - bool isHotLLState = scLL == mcLL && mcLL == lcLL; - bool isHotLLState1 = scLL1 == mcLL1 && mcLL1 == lcLL1; - // - bool isHotHHState = scHH == mcHH && mcHH == lcHH; - bool isHotHHState1 = scHH1 == mcHH1 && mcHH1 == lcHH1; - - // - bool isHotLL = isHotLLState && !isHotLLState1; - bool isHotHH = isHotHHState && !isHotHHState1; - - // - double hotStateValue = X_XCHLH_NEUTURAL; - if (isHotHH) - { - hotStateValue = X_XCHLH_HOT_HH; - } - else if (isHotLL) - { - hotStateValue = X_XCHLH_HOT_LL; - } - - // - hotStateBuffer[bar_index] = hotStateValue; -} - -// -// Draw Buffers ... -void DrawBuffers( - int bar_index // Current Candle Index ... -) -{ - // - // General Requirements ... - - // - // Retrieve Candle Model ... - XOHCL candle = GetCandle(bar_index); - datetime time = iTime(_Symbol, _Period, bar_index); - - // - // Draw Arrow on Hot Areas ... - if (drawHotAreas) - { - // - double hotStateValue = hotStateBuffer[bar_index]; - bool isHotHHArea = hotStateValue == 1; - bool isHotLLArea = hotStateValue == -1; - if (isHotHHArea || isHotLLArea) - { - // - bool isHH = isHotHHArea; - - // - double price = isHH ? candle.high : candle.low; - ENUM_ARROW_ANCHOR anchor = isHH ? ANCHOR_BOTTOM : ANCHOR_TOP; - color clr = isHH ? hotHHArrowColor : hotLLArrowColor; - uchar arrowCode = isHH ? hotHHArrowCode : hotLLArrowCode; - string name = "HOT " + (isHH ? "HH" : "LL") + "_" + (string)price + "_" + (string)time; - - // - DrawArrow( - 0, - name, - 0, - time, - price, - arrowCode, - anchor, - clr, - STYLE_SOLID, - 1); - } - } -} -// -// END Functions ... -// diff --git a/BKP/XAU5-0.43/Indicators/x-saherelm.xchma.oscillator.mq5 b/BKP/XAU5-0.43/Indicators/x-saherelm.xchma.oscillator.mq5 deleted file mode 100644 index 12d6c691..00000000 --- a/BKP/XAU5-0.43/Indicators/x-saherelm.xchma.oscillator.mq5 +++ /dev/null @@ -1,1153 +0,0 @@ -/////////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Cycle Channel Moving Averages Oscillator -// ---------------------------------------------------------------- -// Name: XCHMA -// Description: trend detecting based on cycles ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XCHMA Oscillator" -#property strict - -// -// START Constants ... -// -#define ShortName "XCHMA" - -// -// XCHMA Oscillator Cycles State Presentation ... -enum ENUM_XCHMA_CYCLE_STATES -{ - X_XCHMA_FAST_CROSSED_OVER_SLOW = 2, - X_XCHMA_FAST_OVER_SLOW = 1, - X_XCHMA_NEUTURAL = 0, - X_XCHMA_FAST_UNDER_SLOW = -1, - X_XCHMA_FAST_CROSSED_UNDER_SLOW = -2, -}; -// -// END Constants ... -// - -// -// START Inputs ... -// -// -// Common ... -input group "Hot Areas"; -input bool drawHotAreas = true; // Draw Hot Areas Symbol -input uchar hotBullishArrowCode = 228; // Hot Bullish Arrow Code -input color hotBullishArrowColor = clrAqua; // Hot Bullish Arrow Color -input uchar hotBearishArrowCode = 230; // Hot Bearish Arrow Code -input color hotBearishArrowColor = clrFuchsia; // Hot Bearish Arrow Color - -// -// LC Inputs ... -input group "Long Cycle"; -input group "LC Market"; -input int lcFastLength = 20; // Fast Length -input int lcSlowLength = 50; // Slow Length -input ENUM_MA_METHOD lcMethod = MODE_EMA; // Calculation Method -input ENUM_APPLIED_PRICE lcAppliedTo = PRICE_CLOSE; // Applied To -input group "LC Style"; -input int lcDrawWidth = 1; // Draw Width -input ENUM_DRAW_TYPE lcDrawType = DRAW_LINE; // Draw Type -input ENUM_LINE_STYLE lcDrawStyle = STYLE_DOT; // Draw Style -input color lcFastColor = clrAqua; // Fast Color -input color lcSlowColor = clrFuchsia; // Slow Color -input group "LC Drawings"; -input bool lcDrawFast = true; // Draw Fast -input bool lcDrawSlow = true; // Draw Slow -input bool lcDrawCrosses = true; // Draw Cross Lines - -// -// MC Inputs ... -input group "Medium Cycle"; -input group "MC Market"; -input int mcFastLength = 10; // Fast Length -input int mcSlowLength = 30; // Slow Length -input ENUM_MA_METHOD mcMethod = MODE_EMA; // Calculation Method -input ENUM_APPLIED_PRICE mcAppliedTo = PRICE_CLOSE; // Applied To -input group "MC Style"; -input int mcDrawWidth = 1; // Draw Width -input ENUM_DRAW_TYPE mcDrawType = DRAW_LINE; // Draw Type -input ENUM_LINE_STYLE mcDrawStyle = STYLE_DOT; // Draw Style -input color mcFastColor = clrLime; // Fast Color -input color mcSlowColor = clrRed; // Slow Color -input group "MC Drawings"; -input bool mcDrawFast = true; // Draw Fast -input bool mcDrawSlow = true; // Draw Slow -input bool mcDrawCrosses = false; // Draw Cross Lines - -// -// SC Inputs ... -input group "Short Cycle"; -input group "SC Market"; -input int scFastLength = 7; // Fast Length -input int scSlowLength = 14; // Slow Length -input ENUM_MA_METHOD scMethod = MODE_EMA; // Calculation Method -input ENUM_APPLIED_PRICE scAppliedTo = PRICE_CLOSE; // Applied To -input group "SC Style"; -input int scDrawWidth = 1; // Draw Width -input ENUM_DRAW_TYPE scDrawType = DRAW_LINE; // Draw Type -input ENUM_LINE_STYLE scDrawStyle = STYLE_SOLID; // Draw Style -input color scFastColor = clrLightBlue; // Fast Color -input color scSlowColor = clrLightSalmon; // Slow Color -input group "SC Drawings"; -input bool scDrawFast = true; // Draw Fast -input bool scDrawSlow = true; // Draw Slow -input bool scDrawCrosses = false; // Draw Cross Lines -// -// END Inputs ... -// - -// -// Includes Logging Library ... -#include "../Libraries/x-saherelm.log.lib.mq5" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Includes Draw Library ... -#include "../Libraries/x-saherelm.draw.lib.mq5" - -// -// START Buffers ... -// -#property indicator_separate_window - -// -#property indicator_buffers 7 -#property indicator_plots 6 - -// -// LC ... -#define lcFastBufferIndex 0 -#define lcSlowBufferIndex 1 - -// -double lcFastBuffer[]; -double lcSlowBuffer[]; - -// -// MC ... -#define mcFastBufferIndex 2 -#define mcSlowBufferIndex 3 - -// -double mcFastBuffer[]; -double mcSlowBuffer[]; - -// -// SC ... -#define scFastBufferIndex 4 -#define scSlowBufferIndex 5 - -// -double scFastBuffer[]; -double scSlowBuffer[]; - -// -// Hot State ... -// -#define hotStateBufferIndex 6 - -// -double hotStateBuffer[]; -// -// END Buffers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// -// -// LC ... -int lcFastHandler = INVALID_HANDLE; -int lcSlowHandler = INVALID_HANDLE; - -// -// MC ... -int mcFastHandler = INVALID_HANDLE; -int mcSlowHandler = INVALID_HANDLE; - -// -// SC ... -int scFastHandler = INVALID_HANDLE; -int scSlowHandler = INVALID_HANDLE; -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Event Handlers ... -// -// -// Initialization ... -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - logTag = ShortName; - drawPrefix = ShortName; - - // - // Define Index Buffers ... - DefineBuffers(); - - // - // Set Indicator ShortName ... - SetIndicatorName(); - - // - // Init All Required Handlers ... - if (!InitHandlers()) - { - return INIT_FAILED; - } - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function - // REASON_REMOVE 1 Program removed from a chart - // REASON_RECOMPILE 2 Program recompiled - // REASON_CHARTCHANGE 3 A symbol or a chart period is changed - // REASON_CHARTCLOSE 4 Chart closed - // REASON_PARAMETERS 5 Inputs changed by a user - // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings - // REASON_TEMPLATE 7 Another chart template applied - // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value - // REASON_CLOSE 9 Terminal closed - - // - // Here we can handle De Initialization Reasons ... - - // - // ReDraw Chart ... - ChartRedraw(); - - // - // De Init Draw Library ... - OnDeinitDrawLibrary(); - - // - Comment(""); -} - -// -// Calculations ... -// -// Calculating what we want ... -int OnCalculate( - // - // total Candles on chart ... - const int rates_total, - // - // total calculated Candles on charts ... - const int prev_calculated, - // - // history of Candles Open Time ... - const datetime &time[], - // - // history of Candles Open Price ... - const double &open[], - // - // history of Candles High Price ... - const double &high[], - // - // history of Candles Low Price ... - const double &low[], - // - // history of Candles Close Price ... - const double &close[], - // - // history of Tick Volumes on Candle ... - const long &tick_volume[], - // - // history of Trade Volumes ... - const long &volume[], - // - // history of Candles Spread Price ... - const int &spread[]) -{ - // - // Prepare Buffers ... - ArraySetAsSeries(time, true); - ArraySetAsSeries(open, true); - ArraySetAsSeries(high, true); - ArraySetAsSeries(low, true); - ArraySetAsSeries(close, true); - ArraySetAsSeries(tick_volume, true); - ArraySetAsSeries(volume, true); - ArraySetAsSeries(spread, true); - - // - // this counts Available Bars ... - int limit; - - // - // because in some cases we may have more than one input for - // calculation and we must prevent any calculation - // untill we pass the biggest input length, here we get max Input length - // and then wait until pass it ... - int maxLength = MathMax(lcFastLength, lcSlowLength); - - // - // Get Retrieved Values from indicators ... - // - // LC ... - int lcFastCalculatedBars = BarsCalculated(lcFastHandler); - int lcSlowCalculatedBars = BarsCalculated(lcSlowHandler); - - // - // MC ... - int mcFastCalculatedBars = BarsCalculated(mcFastHandler); - int mcSlowCalculatedBars = BarsCalculated(mcSlowHandler); - - // - // SC ... - int scFastCalculatedBars = BarsCalculated(scFastHandler); - int scSlowCalculatedBars = BarsCalculated(scSlowHandler); - - // - // Check Calculated Bars ... - if ( - // - // LC ... - lcFastCalculatedBars < maxLength || - lcSlowCalculatedBars < maxLength || - // - // MC ... - mcFastCalculatedBars < maxLength || - mcSlowCalculatedBars < maxLength || - // - // SC ... - scFastCalculatedBars < maxLength || - scSlowCalculatedBars < maxLength) - { - return prev_calculated; - } - - // - limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; - - // - // Copy Buffers from indicators ... - // - // LC ... - int lcFastCopiedItems = CopyBuffer(lcFastHandler, 0, 0, limit + 1, lcFastBuffer); - int lcSlowCopiedItems = CopyBuffer(lcSlowHandler, 0, 0, limit + 1, lcSlowBuffer); - - // - // MC ... - int mcFastCopiedItems = CopyBuffer(mcFastHandler, 0, 0, limit + 1, mcFastBuffer); - int mcSlowCopiedItems = CopyBuffer(mcSlowHandler, 0, 0, limit + 1, mcSlowBuffer); - - // - // SC ... - int scFastCopiedItems = CopyBuffer(scFastHandler, 0, 0, limit + 1, scFastBuffer); - int scSlowCopiedItems = CopyBuffer(scSlowHandler, 0, 0, limit + 1, scSlowBuffer); - - // - // Check Copied Items Number ... - if ( - // - // LC ... - lcFastCopiedItems <= 0 || - lcSlowCopiedItems <= 0 || - // - // MC ... - mcFastCopiedItems <= 0 || - mcSlowCopiedItems <= 0 || - // - // MC ... - mcFastCopiedItems <= 0 || - mcSlowCopiedItems <= 0) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers(i); - } - - // - return rates_total; -} -// -// END Event Handlers ... -// - -// -// START Functions ... -// -// -// Validate Input Args for Initialization ... -bool ValidateInputs() -{ - // - bool result = false; - - // - // Validate Args ... - bool isLCInputsValid = lcFastLength >= 4 && lcSlowLength > lcFastLength; - bool isMCInputsValid = mcFastLength >= 4 && mcSlowLength > mcFastLength; - bool isSCInputsValid = scFastLength >= 4 && scSlowLength > scFastLength; - if ( - isLCInputsValid && - isMCInputsValid && - isSCInputsValid && - lcFastLength > mcFastLength && - mcFastLength > scFastLength) - { - result = true; - } - - // - return result; -} - -// -// Define Indexes and Styles ... -void DefineBuffers() -{ - // - // LC ... - LCDefineBuffers(); - - // - // MC ... - MCDefineBuffers(); - - // - // SC ... - SCDefineBuffers(); - - // - // Hot State Buffer ... - HotStateDefineBuffers(); -} - -// -// Init Handlers ... -bool InitHandlers() -{ - // - bool result = false; - - // - // LC ... - result = LCInitHandlers(); - if (!result) - { - return result; - } - - // - // MC ... - result = MCInitHandlers(); - if (!result) - { - return result; - } - - // - // SC ... - result = SCInitHandlers(); - if (!result) - { - return result; - } - - // - return result; -} - -// -// Set Indicator Short Name and also we can define Buffers Labels ... -void SetIndicatorName() -{ - // - string indicatorShortName = ""; - StringConcatenate(indicatorShortName, ShortName, ""); - - // - IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); -} - -// -// Calculate Buffers ... -void CalculateBuffers( - int bar_index // Current Candle Index ... -) -{ - // - // HOT State Buffer ... - HotStateCalculateBuffers(bar_index); - - // - // After all Calculations we are ready to Draw what we want ... - DrawBuffers(bar_index); -} - -// -// LC Buffers Definitions ... -void LCDefineBuffers() -{ - // - // LC Fast Buffer ... - string lcFastBufferLabel = ShortName + " LC Fast (" + (string)lcFastLength + ")"; - ENUM_DRAW_TYPE lcFastDrawType = lcDrawFast ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(lcFastBuffer, true); - SetIndexBuffer(lcFastBufferIndex, lcFastBuffer, INDICATOR_DATA); - PlotIndexSetString(lcFastBufferIndex, PLOT_LABEL, lcFastBufferLabel); - PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_COLOR, lcFastColor); - PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); - PlotIndexSetInteger(lcFastBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); - PlotIndexSetInteger(lcFastBufferIndex, PLOT_DRAW_BEGIN, lcFastLength); - PlotIndexSetInteger(lcFastBufferIndex, PLOT_DRAW_TYPE, lcFastDrawType); - - // - // LC Slow Buffer ... - string lcSlowBufferLabel = ShortName + " LC Slow (" + (string)lcSlowLength + ")"; - ENUM_DRAW_TYPE lcSlowDrawType = lcDrawSlow ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(lcSlowBuffer, true); - SetIndexBuffer(lcSlowBufferIndex, lcSlowBuffer, INDICATOR_DATA); - PlotIndexSetString(lcSlowBufferIndex, PLOT_LABEL, lcSlowBufferLabel); - PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_COLOR, lcSlowColor); - PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_STYLE, lcDrawStyle); - PlotIndexSetInteger(lcSlowBufferIndex, PLOT_LINE_WIDTH, lcDrawWidth); - PlotIndexSetInteger(lcSlowBufferIndex, PLOT_DRAW_BEGIN, lcSlowLength); - PlotIndexSetInteger(lcSlowBufferIndex, PLOT_DRAW_TYPE, lcSlowDrawType); -} - -// -// MC Buffers Definitions ... -void MCDefineBuffers() -{ - // - // MC Fast Buffer ... - string mcFastBufferLabel = ShortName + " MC Fast (" + (string)mcFastLength + ")"; - ENUM_DRAW_TYPE mcFastDrawType = mcDrawFast ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(mcFastBuffer, true); - SetIndexBuffer(mcFastBufferIndex, mcFastBuffer, INDICATOR_DATA); - PlotIndexSetString(mcFastBufferIndex, PLOT_LABEL, mcFastBufferLabel); - PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_COLOR, mcFastColor); - PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); - PlotIndexSetInteger(mcFastBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); - PlotIndexSetInteger(mcFastBufferIndex, PLOT_DRAW_BEGIN, mcFastLength); - PlotIndexSetInteger(mcFastBufferIndex, PLOT_DRAW_TYPE, mcFastDrawType); - - // - // MC Slow Buffer ... - string mcSlowBufferLabel = ShortName + " MC Slow (" + (string)mcSlowLength + ")"; - ENUM_DRAW_TYPE mcSlowDrawType = mcDrawSlow ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(mcSlowBuffer, true); - SetIndexBuffer(mcSlowBufferIndex, mcSlowBuffer, INDICATOR_DATA); - PlotIndexSetString(mcSlowBufferIndex, PLOT_LABEL, mcSlowBufferLabel); - PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_COLOR, mcSlowColor); - PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_STYLE, mcDrawStyle); - PlotIndexSetInteger(mcSlowBufferIndex, PLOT_LINE_WIDTH, mcDrawWidth); - PlotIndexSetInteger(mcSlowBufferIndex, PLOT_DRAW_BEGIN, mcSlowLength); - PlotIndexSetInteger(mcSlowBufferIndex, PLOT_DRAW_TYPE, mcSlowDrawType); -} - -// -// SC Buffers Definitions ... -void SCDefineBuffers() -{ - // - // SC Fast Buffer ... - string scFastBufferLabel = ShortName + " SC Fast (" + (string)scFastLength + ")"; - ENUM_DRAW_TYPE scFastDrawType = scDrawFast ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(scFastBuffer, true); - SetIndexBuffer(scFastBufferIndex, scFastBuffer, INDICATOR_DATA); - PlotIndexSetString(scFastBufferIndex, PLOT_LABEL, scFastBufferLabel); - PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_COLOR, scFastColor); - PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_STYLE, scDrawStyle); - PlotIndexSetInteger(scFastBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); - PlotIndexSetInteger(scFastBufferIndex, PLOT_DRAW_BEGIN, scFastLength); - PlotIndexSetInteger(scFastBufferIndex, PLOT_DRAW_TYPE, scFastDrawType); - - // - // SC Slow Buffer ... - string scSlowBufferLabel = ShortName + " SC Slow (" + (string)scSlowLength + ")"; - ENUM_DRAW_TYPE scSlowDrawType = scDrawSlow ? lcDrawType : DRAW_NONE; - ArraySetAsSeries(scSlowBuffer, true); - SetIndexBuffer(scSlowBufferIndex, scSlowBuffer, INDICATOR_DATA); - PlotIndexSetString(scSlowBufferIndex, PLOT_LABEL, scSlowBufferLabel); - PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_COLOR, scSlowColor); - PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_STYLE, scDrawStyle); - PlotIndexSetInteger(scSlowBufferIndex, PLOT_LINE_WIDTH, scDrawWidth); - PlotIndexSetInteger(scSlowBufferIndex, PLOT_DRAW_BEGIN, scSlowLength); - PlotIndexSetInteger(scSlowBufferIndex, PLOT_DRAW_TYPE, scSlowDrawType); -} - -// -// Hot State Buffer ... -void HotStateDefineBuffers() -{ - // - // Hot State Buffer ... - ArraySetAsSeries(hotStateBuffer, true); - SetIndexBuffer(hotStateBufferIndex, hotStateBuffer, INDICATOR_CALCULATIONS); -} - -// -// LC Init Handlers ... -bool LCInitHandlers() -{ - // - ResetLastError(); - - // - // LC Fast Handler ... - lcFastHandler = iMA( - _Symbol, - _Period, - lcFastLength, - 0, - lcMethod, - lcAppliedTo); - if (lcFastHandler == INVALID_HANDLE) - { - // - LogMessage("LC Fast Indicator initialization failed: " + (string)GetLastError()); - - // - return false; - } - - // - // LC Slow Handler ... - lcSlowHandler = iMA( - _Symbol, - _Period, - lcSlowLength, - 0, - lcMethod, - lcAppliedTo); - if (lcSlowHandler == INVALID_HANDLE) - { - // - LogMessage("LC Slow Indicator initialization failed: " + (string)GetLastError()); - - // - return false; - } - - // - return true; -} - -// -// MC Init Handlers ... -bool MCInitHandlers() -{ - // - ResetLastError(); - - // - // MC Fast Handler ... - mcFastHandler = iMA( - _Symbol, - _Period, - mcFastLength, - 0, - mcMethod, - mcAppliedTo); - if (mcFastHandler == INVALID_HANDLE) - { - // - LogMessage("MC Fast Indicator initialization failed: " + (string)GetLastError()); - - // - return false; - } - - // - // MC Slow Handler ... - mcSlowHandler = iMA( - _Symbol, - _Period, - mcSlowLength, - 0, - mcMethod, - mcAppliedTo); - if (mcSlowHandler == INVALID_HANDLE) - { - // - LogMessage("MC Slow Indicator initialization failed: " + (string)GetLastError()); - - // - return false; - } - - // - return true; -} - -// -// SC Init Handlers ... -bool SCInitHandlers() -{ - // - ResetLastError(); - - // - // SC Fast Handler ... - scFastHandler = iMA( - _Symbol, - _Period, - scFastLength, - 0, - scMethod, - scAppliedTo); - if (scFastHandler == INVALID_HANDLE) - { - // - LogMessage("SC Fast Indicator initialization failed: " + (string)GetLastError()); - - // - return false; - } - - // - // SC Slow Handler ... - scSlowHandler = iMA( - _Symbol, - _Period, - scSlowLength, - 0, - scMethod, - scAppliedTo); - if (scSlowHandler == INVALID_HANDLE) - { - // - LogMessage("SC Slow Indicator initialization failed: " + (string)GetLastError()); - - // - return false; - } - - // - return true; -} - -// -// LC State ... -double GetLCState( - int bar_index // Current Candle Index ... -) -{ - // - // Fast Cross Over Slow Detection ... - bool isFastCrossedOverSlow = IsCrossOver( - lcFastBuffer, - lcSlowBuffer, - bar_index); - - // - // Fast Over Slow Detection ... - bool isFastOverSlow = IsOver( - lcFastBuffer, - lcSlowBuffer, - bar_index); - - // - // Fast Cross Under Slow Detection ... - bool isFastCrossedUnderSlow = IsCrossUnder( - lcFastBuffer, - lcSlowBuffer, - bar_index); - - // - // Fast Under Slow Detection ... - bool isFastUnderSlow = IsUnder( - lcFastBuffer, - lcSlowBuffer, - bar_index); - - // - // Generate state value which represent curren bar index - // state between fast and slow lines ... - double result = X_XCHMA_NEUTURAL; - - // - // Filling state value based on Market Conditions ... - if (isFastCrossedOverSlow) - { - result = X_XCHMA_FAST_CROSSED_OVER_SLOW; - } - else if (isFastCrossedUnderSlow) - { - result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; - } - else if (isFastOverSlow) - { - result = X_XCHMA_FAST_OVER_SLOW; - } - else if (isFastUnderSlow) - { - result = X_XCHMA_FAST_UNDER_SLOW; - } - - // - return result; -} - -// -// MC State ... -double GetMCState( - int bar_index // Current Candle Index ... -) -{ - // - // Fast Cross Over Slow Detection ... - bool isFastCrossedOverSlow = IsCrossOver( - mcFastBuffer, - mcSlowBuffer, - bar_index); - - // - // Fast Over Slow Detection ... - bool isFastOverSlow = IsOver( - mcFastBuffer, - mcSlowBuffer, - bar_index); - - // - // Fast Cross Under Slow Detection ... - bool isFastCrossedUnderSlow = IsCrossUnder( - mcFastBuffer, - mcSlowBuffer, - bar_index); - - // - // Fast Under Slow Detection ... - bool isFastUnderSlow = IsUnder( - mcFastBuffer, - mcSlowBuffer, - bar_index); - - // - // Generate state value which represent curren bar index - // state between fast and slow lines ... - double result = X_XCHMA_NEUTURAL; - - // - // Filling state value based on Market Conditions ... - if (isFastCrossedOverSlow) - { - result = X_XCHMA_FAST_CROSSED_OVER_SLOW; - } - else if (isFastCrossedUnderSlow) - { - result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; - } - else if (isFastOverSlow) - { - result = X_XCHMA_FAST_OVER_SLOW; - } - else if (isFastUnderSlow) - { - result = X_XCHMA_FAST_UNDER_SLOW; - } - - // - return result; -} - -// -// SC State ... -double GetSCState( - int bar_index // Current Candle Index ... -) -{ - // - // Fast Cross Over Slow Detection ... - bool isFastCrossedOverSlow = IsCrossOver( - scFastBuffer, - scSlowBuffer, - bar_index); - - // - // Fast Over Slow Detection ... - bool isFastOverSlow = IsOver( - scFastBuffer, - scSlowBuffer, - bar_index); - - // - // Fast Cross Under Slow Detection ... - bool isFastCrossedUnderSlow = IsCrossUnder( - scFastBuffer, - scSlowBuffer, - bar_index); - - // - // Fast Under Slow Detection ... - bool isFastUnderSlow = IsUnder( - scFastBuffer, - scSlowBuffer, - bar_index); - - // - // Generate state value which represent curren bar index - // state between fast and slow lines ... - double result = X_XCHMA_NEUTURAL; - - // - // Filling state value based on Market Conditions ... - if (isFastCrossedOverSlow) - { - result = X_XCHMA_FAST_CROSSED_OVER_SLOW; - } - else if (isFastCrossedUnderSlow) - { - result = X_XCHMA_FAST_CROSSED_UNDER_SLOW; - } - else if (isFastOverSlow) - { - result = X_XCHMA_FAST_OVER_SLOW; - } - else if (isFastUnderSlow) - { - result = X_XCHMA_FAST_UNDER_SLOW; - } - - // - return result; -} - -// -// HOT State Calculate Buffers ... -void HotStateCalculateBuffers( - int bar_index // Current Candle Index ... -) -{ - // - // LC ... - double lcFast = lcFastBuffer[bar_index]; - double lcSlow = lcSlowBuffer[bar_index]; - // - double lcFastPrev = lcFastBuffer[bar_index + 1]; - double lcSlowPrev = lcSlowBuffer[bar_index + 1]; - // - double lcState = GetLCState(bar_index); - - // - // MC ... - double mcFast = mcFastBuffer[bar_index]; - double mcSlow = mcSlowBuffer[bar_index]; - // - double mcFastPrev = mcFastBuffer[bar_index + 1]; - double mcSlowPrev = mcSlowBuffer[bar_index + 1]; - // - double mcState = GetMCState(bar_index); - - // - // SC ... - double scFast = scFastBuffer[bar_index]; - double scSlow = scSlowBuffer[bar_index]; - // - double scFastPrev = scFastBuffer[bar_index + 1]; - double scSlowPrev = scSlowBuffer[bar_index + 1]; - // - double scState = GetSCState(bar_index); - - // - // Detect HOT Bearish Area ... - bool isHotBearishArea = - lcFast < lcSlow && - mcFast < mcSlow && - scFast < scSlow; - // - bool isPrevHotBearishArea = - lcFastPrev < lcSlowPrev && - mcFastPrev < mcSlowPrev && - scFastPrev < scSlowPrev; - - // - // Detect HOT Bearish Area ... - bool isHotBullishArea = - lcFast > lcSlow && - mcFast > mcSlow && - scFast > scSlow; - // - bool isPrevHotBullishArea = - lcFastPrev > lcSlowPrev && - mcFastPrev > mcSlowPrev && - scFastPrev > scSlowPrev; - - // - // Generate HotState Value ... - double hotStateValue = - isHotBullishArea && !isPrevHotBullishArea - ? 1 - : isHotBearishArea && !isPrevHotBearishArea - ? -1 - : 0; - hotStateBuffer[bar_index] = hotStateValue; -} - -// -// Draw Buffers ... -void DrawBuffers( - int bar_index // Current Candle Index ... -) -{ - // - // General Requirements ... - - // - // Retrieve Candle Model ... - XOHCL candle = GetCandle(bar_index); - datetime time = iTime(_Symbol, _Period, bar_index); - - // - // Draw Arrow on Hot Areas ... - if (drawHotAreas) - { - // - double hotStateValue = hotStateBuffer[bar_index]; - bool isHotBullishArea = hotStateValue == 1; - bool isHotBearishArea = hotStateValue == -1; - if (isHotBullishArea || isHotBearishArea) - { - // - bool isBull = isHotBullishArea; - - // - double price = isBull ? candle.low : candle.high; - ENUM_ARROW_ANCHOR anchor = isBull ? ANCHOR_TOP : ANCHOR_BOTTOM; - color clr = isBull ? hotBullishArrowColor : hotBearishArrowColor; - uchar arrowCode = isBull ? hotBullishArrowCode : hotBearishArrowCode; - string name = "HOT " + (isBull ? "Bullish" : "Bearish") + "_" + (string)price + "_" + (string)time; - - // - DrawArrow( - 0, - name, - 0, - time, - price, - arrowCode, - anchor, - clr); - } - } - - // - // Draw LC Crosses ... - if (lcDrawCrosses) - { - // - double lcStateValue = GetLCState(bar_index); - bool isLcFastCrossedOverSlow = lcStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; - bool isLcFastCrossedUnderSlow = lcStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; - if (isLcFastCrossedOverSlow || isLcFastCrossedUnderSlow) - { - // - bool isBull = isLcFastCrossedOverSlow; - - // - color clr = isBull ? lcFastColor : lcSlowColor; - string name = "LC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; - - // - DrawVerticalLine( - 0, - name, - 0, - time, - clr); - } - } - - // - // Draw MC Crosses ... - if (mcDrawCrosses) - { - // - double mcStateValue = GetMCState(bar_index); - bool isMcFastCrossedOverSlow = mcStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; - bool isMcFastCrossedUnderSlow = mcStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; - if (isMcFastCrossedOverSlow || isMcFastCrossedUnderSlow) - { - // - bool isBull = isMcFastCrossedOverSlow; - - // - color clr = isBull ? mcFastColor : mcSlowColor; - string name = "MC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; - - // - DrawVerticalLine( - 0, - name, - 0, - time, - clr); - } - } - - // - // Draw SC Crosses ... - if (scDrawCrosses) - { - // - double scStateValue = GetSCState(bar_index); - bool isScFastCrossedOverSlow = scStateValue == X_XCHMA_FAST_CROSSED_OVER_SLOW; - bool isScFastCrossedUnderSlow = scStateValue == X_XCHMA_FAST_CROSSED_UNDER_SLOW; - if (isScFastCrossedOverSlow || isScFastCrossedUnderSlow) - { - // - bool isBull = isScFastCrossedOverSlow; - - // - color clr = isBull ? scFastColor : scSlowColor; - string name = "SC Fast Cross " + (isBull ? "Over" : "Under") + "_" + (string)time; - - // - DrawVerticalLine( - 0, - name, - 0, - time, - clr); - } - } -} -// -// END Functions ... -// diff --git a/BKP/XAU5-0.43/Indicators/x-saherelm.xfi.oscillator.mq5 b/BKP/XAU5-0.43/Indicators/x-saherelm.xfi.oscillator.mq5 deleted file mode 100644 index cfd393ca..00000000 --- a/BKP/XAU5-0.43/Indicators/x-saherelm.xfi.oscillator.mq5 +++ /dev/null @@ -1,317 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XFI Oscillator -// --------------------------------------------- -// Name: XFI -// Description: Price Momentum Power Detection -// Market Analysor ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XFI Oscillator" -#property strict - -// -// START Constants ... -// -#define ShortName "XFI" -// -// END Constants ... -// - -// -// START Inputs ... -// -input int length = 18; // Length -input ENUM_MA_METHOD method = MODE_SMA; // MA Method -input ENUM_APPLIED_VOLUME appliedTo = VOLUME_TICK; // Applied To -// -// END Inputs ... -// - -// -// Includes Logging Library ... -#include "../Libraries/x-saherelm.log.lib.mq5" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Buffers ... -// -#property indicator_separate_window - -// -#property indicator_buffers 2 -#property indicator_plots 1 - -// -// FI Buffer ... -#define fiBufferIndex 0 -#define fiColorBufferIndex 1 - -// -double fiBuffer[]; -double fiColorBuffer[]; - -// -#property indicator_label1 "XFI" -#property indicator_type1 DRAW_COLOR_LINE -#property indicator_color1 clrAqua, clrGray, clrFuchsia -#property indicator_style1 STYLE_DOT -#property indicator_width1 1 -// -// END Buffers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// -int fiHandler = INVALID_HANDLE; -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Event Handlers ... -// -// -// Initialization ... -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - logTag = ShortName; - - // - fiHandler = iForce( - _Symbol, - _Period, - length, - method, - appliedTo); - if (fiHandler == INVALID_HANDLE) - { - // - string message = "Error Initializing Handler ..."; - LogMessage(message); - - // - return INIT_FAILED; - } - - // - // Define Index Buffers ... - DefineBuffers(); - - // - // Set Indicator ShortName ... - SetIndicatorName(); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function - // REASON_REMOVE 1 Program removed from a chart - // REASON_RECOMPILE 2 Program recompiled - // REASON_CHARTCHANGE 3 A symbol or a chart period is changed - // REASON_CHARTCLOSE 4 Chart closed - // REASON_PARAMETERS 5 Inputs changed by a user - // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings - // REASON_TEMPLATE 7 Another chart template applied - // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value - // REASON_CLOSE 9 Terminal closed - - // - // Here we can handle De Initialization Reasons ... - IndicatorRelease(fiHandler); -} - -// -// Calculations ... -// -// Calculating what we want ... -int OnCalculate( - // - // total Candles on chart ... - const int rates_total, - // - // total calculated Candles on charts ... - const int prev_calculated, - // - // history of Candles Open Time ... - const datetime &time[], - // - // history of Candles Open Price ... - const double &open[], - // - // history of Candles High Price ... - const double &high[], - // - // history of Candles Low Price ... - const double &low[], - // - // history of Candles Close Price ... - const double &close[], - // - // history of Tick Volumes on Candle ... - const long &tick_volume[], - // - // history of Trade Volumes ... - const long &volume[], - // - // history of Candles Spread Price ... - const int &spread[]) -{ - // - // Prepare Buffers ... - ArraySetAsSeries(time, true); - ArraySetAsSeries(open, true); - ArraySetAsSeries(high, true); - ArraySetAsSeries(low, true); - ArraySetAsSeries(close, true); - ArraySetAsSeries(tick_volume, true); - ArraySetAsSeries(volume, true); - ArraySetAsSeries(spread, true); - - // - // this counts Available Bars ... - int limit; - - // - // because in some cases we may have more than one input for - // calculation and we must prevent any calculation - // untill we pass the biggest input length, here we get max Input length - // and then wait until pass it ... - int maxLength = MathMax(0, length); - - // - // Check Calculated Bars ... - int fiCalculatedBars = BarsCalculated(fiHandler); - if (fiCalculatedBars < maxLength) - { - return prev_calculated; - } - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; - - // - // Buffers Copy ... - int copiedFis = CopyBuffer(fiHandler, 0, 0, limit, fiBuffer); - if (copiedFis <= 0) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = 0; i < limit && !IsStopped(); i++) - { - // - CalculateBuffers(i); - } - - // - return rates_total; -} -// -// END Event Handlers ... -// - -// -// START Functions ... -// -// -// Validate Input Args for Initialization ... -bool ValidateInputs() -{ - // - bool result = false; - - // - // Validate Args ... - if (length >= 2) - { - result = true; - } - - // - return result; -} - -// -// Define Indexes and Styles ... -void DefineBuffers() -{ - // - string fiBufferLabel = "XFI " + "(" + (string)length + ")"; - - // - // FI Buffer ... - ArraySetAsSeries(fiBuffer, true); - SetIndexBuffer(fiBufferIndex, fiBuffer, INDICATOR_DATA); - PlotIndexSetString(fiBufferIndex, PLOT_LABEL, fiBufferLabel); - - // - // FI Color Buffer ... - ArraySetAsSeries(fiColorBuffer, true); - SetIndexBuffer(fiColorBufferIndex, fiColorBuffer, INDICATOR_COLOR_INDEX); -} - -// -// Set Indicator Short Name and also we can define Buffers Labels ... -void SetIndicatorName() -{ - // - string indicatorShortName = ""; - StringConcatenate(indicatorShortName, ShortName, ""); - - // - IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); -} - -// -// Calculate Buffers ... -void CalculateBuffers( - int bar_index // Selected Bar Index -) -{ - // - double iValue = fiBuffer[bar_index]; - - // - double iColorIndex = - iValue > 0 ? 0 : iValue < 0 ? 2 - : 1; - - // - // Set Buffer Color Index ... - fiColorBuffer[bar_index] = iColorIndex; -} -// -// END Functions ... -// diff --git a/BKP/XAU5-0.43/Indicators/x-saherelm.xlh.indicator.mq5 b/BKP/XAU5-0.43/Indicators/x-saherelm.xlh.indicator.mq5 deleted file mode 100644 index 4dfc64e2..00000000 --- a/BKP/XAU5-0.43/Indicators/x-saherelm.xlh.indicator.mq5 +++ /dev/null @@ -1,346 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XLH Indicator -// --------------------------------------------- -// Name: XLH -// Description: Moving Average Indicator -// Market Analysor ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XLH Indicator" -#property strict - -// -// START Constants ... -// -#define ShortName "XLH" -// -// END Constants ... -// - -// -// START Inputs ... -// -input int length = 14; // Length -input ENUM_SERIESMODE hhMode = MODE_HIGH; // Highest High Calculation Method -input ENUM_SERIESMODE llMode = MODE_LOW; // Lowest Low Calculation Method -// -// END Inputs ... -// - -// -// Includes Logging Library ... -#include "../Libraries/x-saherelm.log.lib.mq5" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Buffers ... -// -#property indicator_chart_window - -// -#property indicator_buffers 3 -#property indicator_plots 3 - -// -// HH Buffer ... -#define hhBufferIndex 0 - -// -double hhBuffer[]; - -// -#property indicator_label1 "XLH HH" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrAqua -#property indicator_style1 STYLE_DOT -#property indicator_width1 1 - -// -// LL Buffer ... -#define llBufferIndex 1 - -// -double llBuffer[]; - -// -#property indicator_label2 "XLH LL" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrFuchsia -#property indicator_style2 STYLE_DOT -#property indicator_width2 1 - -// -// Signal Buffer ... -#define signalBufferIndex 2 - -// -double signalBuffer[]; - -// -#property indicator_label3 "XLH S" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrGold -#property indicator_style3 STYLE_DOT -#property indicator_width3 1 -// -// END Buffers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Event Handlers ... -// -// -// Initialization ... -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - logTag = ShortName; - - // - // Define Index Buffers ... - DefineBuffers(); - - // - // Set Indicator ShortName ... - SetIndicatorName(); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function - // REASON_REMOVE 1 Program removed from a chart - // REASON_RECOMPILE 2 Program recompiled - // REASON_CHARTCHANGE 3 A symbol or a chart period is changed - // REASON_CHARTCLOSE 4 Chart closed - // REASON_PARAMETERS 5 Inputs changed by a user - // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings - // REASON_TEMPLATE 7 Another chart template applied - // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value - // REASON_CLOSE 9 Terminal closed - - // - // Here we can handle De Initialization Reasons ... -} - -// -// Calculations ... -// -// Calculating what we want ... -int OnCalculate( - // - // total Candles on chart ... - const int rates_total, - // - // total calculated Candles on charts ... - const int prev_calculated, - // - // history of Candles Open Time ... - const datetime &time[], - // - // history of Candles Open Price ... - const double &open[], - // - // history of Candles High Price ... - const double &high[], - // - // history of Candles Low Price ... - const double &low[], - // - // history of Candles Close Price ... - const double &close[], - // - // history of Tick Volumes on Candle ... - const long &tick_volume[], - // - // history of Trade Volumes ... - const long &volume[], - // - // history of Candles Spread Price ... - const int &spread[]) -{ - // - // Prepare Buffers ... - ArraySetAsSeries(time, true); - ArraySetAsSeries(open, true); - ArraySetAsSeries(high, true); - ArraySetAsSeries(low, true); - ArraySetAsSeries(close, true); - ArraySetAsSeries(tick_volume, true); - ArraySetAsSeries(volume, true); - ArraySetAsSeries(spread, true); - - // - // this counts Available Bars ... - int limit; - - // - // because in some cases we may have more than one input for - // calculation and we must prevent any calculation - // untill we pass the biggest input length, here we get max Input length - // and then wait until pass it ... - int maxLength = MathMax(0, length); - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers(i); - } - - // - return rates_total; -} -// -// END Event Handlers ... -// - -// -// START Functions ... -// -// -// Validate Input Args for Initialization ... -bool ValidateInputs() -{ - // - bool result = false; - - // - // Validate Args ... - if (length >= 2) - { - result = true; - } - - // - return result; -} - -// -// Define Indexes and Styles ... -void DefineBuffers() -{ - // - // HH Buffer ... - string hhBufferLabel = ShortName + " HH " + "(" + (string)length + ")"; - ArraySetAsSeries(hhBuffer, true); - SetIndexBuffer(hhBufferIndex, hhBuffer, INDICATOR_DATA); - PlotIndexSetInteger(hhBufferIndex, PLOT_DRAW_BEGIN, length); - PlotIndexSetString(hhBufferIndex, PLOT_LABEL, hhBufferLabel); - - // - // LL Buffer ... - string llBufferLabel = ShortName + " LL " + "(" + (string)length + ")"; - ArraySetAsSeries(llBuffer, true); - SetIndexBuffer(llBufferIndex, llBuffer, INDICATOR_DATA); - PlotIndexSetInteger(llBufferIndex, PLOT_DRAW_BEGIN, length); - PlotIndexSetString(llBufferIndex, PLOT_LABEL, llBufferLabel); - - // - // Signal Buffer ... - string signalBufferLabel = ShortName + " S " + "(" + (string)length + ")"; - ArraySetAsSeries(signalBuffer, true); - SetIndexBuffer(signalBufferIndex, signalBuffer, INDICATOR_DATA); - PlotIndexSetInteger(signalBufferIndex, PLOT_DRAW_BEGIN, length); - PlotIndexSetString(signalBufferIndex, PLOT_LABEL, signalBufferLabel); -} - -// -// Set Indicator Short Name and also we can define Buffers Labels ... -void SetIndicatorName() -{ - // - string indicatorShortName = ""; - StringConcatenate(indicatorShortName, ShortName, ""); - - // - IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); -} - -// -// Calculate Buffers ... -void CalculateBuffers( - int bar_index // Selected Bar Index -) -{ - // - // Calculate Threshold ... - // - // HH Buffer ... - int hhIndex = iHighest( - _Symbol, - _Period, - hhMode, - length, - bar_index); - double hhValue = GetAppliedPrice( - hhIndex, - hhMode); - - // - hhBuffer[bar_index] = hhValue; - - // - // LL Buffer ... - int llIndex = iLowest( - _Symbol, - _Period, - llMode, - length, - bar_index); - double llValue = GetAppliedPrice( - llIndex, - llMode); - - // - llBuffer[bar_index] = llValue; - - // - XOHCL c = GetCandle(bar_index); - double lhDiff = hhValue - llValue; - double signalValue = (lhDiff / 2); - - // - signalBuffer[bar_index] = (hhValue - signalValue); -} -// -// END Functions ... -// diff --git a/BKP/XAU5-0.43/Indicators/x-saherelm.xobd.indicator.mq5 b/BKP/XAU5-0.43/Indicators/x-saherelm.xobd.indicator.mq5 deleted file mode 100644 index 4ac05cf6..00000000 --- a/BKP/XAU5-0.43/Indicators/x-saherelm.xobd.indicator.mq5 +++ /dev/null @@ -1,390 +0,0 @@ -///////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 OrderBlock Detector Indicator -// ----------------------------------------------------- -// Name: XOBD -// Description: detect Order Blocks based on Swings ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XOBD Indicator" -#property strict - -// -// START Constants ... -// -#define ShortName "XOBD" -// -// END Constants ... -// - -// -// START Inputs ... -// -// -input int length = 5; // Swing Length - -// -input uchar swingHighArrowCode = 108; // Swing High Arrow Code -input color swingHighArrowColor = clrMagenta; // Swing High Arrow Color - -// -input uchar swingLowArrowCode = 108; // Swing Low Arrow Code -input color swingLowArrowColor = clrAqua; // Swing Low Arrow Color -// -// END Inputs ... -// - -// -// Includes Logging Library ... -#include "../Libraries/x-saherelm.log.lib.mq5" - -// -// Include Common and Models Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Include Draw Library ... -#include "../Libraries/x-saherelm.draw.lib.mq5" - -// -// START Buffers ... -// -#property indicator_chart_window - -// -#property indicator_buffers 1 -#property indicator_plots 0 - -// -#define swingBufferIndex 0 -double swingBuffer[]; -// -// END Buffers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Event Handlers ... -// -// -// Initialization ... -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - logTag = ShortName; - drawPrefix = ShortName; - - // - // Define Index Buffers ... - DefineBuffers(); - - // - // Set Indicator ShortName ... - SetIndicatorName(); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function - // REASON_REMOVE 1 Program removed from a chart - // REASON_RECOMPILE 2 Program recompiled - // REASON_CHARTCHANGE 3 A symbol or a chart period is changed - // REASON_CHARTCLOSE 4 Chart closed - // REASON_PARAMETERS 5 Inputs changed by a user - // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings - // REASON_TEMPLATE 7 Another chart template applied - // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value - // REASON_CLOSE 9 Terminal closed - - // - // Here we can handle De Initialization Reasons ... - OnDeinitDrawLibrary(); -} - -// -// Calculations ... -// -// Calculating what we want ... -int OnCalculate( - // - // total Candles on chart ... - const int rates_total, - // - // total calculated Candles on charts ... - const int prev_calculated, - // - // history of Candles Open Time ... - const datetime &time[], - // - // history of Candles Open Price ... - const double &open[], - // - // history of Candles High Price ... - const double &high[], - // - // history of Candles Low Price ... - const double &low[], - // - // history of Candles Close Price ... - const double &close[], - // - // history of Tick Volumes on Candle ... - const long &tick_volume[], - // - // history of Trade Volumes ... - const long &volume[], - // - // history of Candles Spread Price ... - const int &spread[]) -{ - // - // Prepare Buffers ... - ArraySetAsSeries(time, true); - ArraySetAsSeries(open, true); - ArraySetAsSeries(high, true); - ArraySetAsSeries(low, true); - ArraySetAsSeries(close, true); - ArraySetAsSeries(tick_volume, true); - ArraySetAsSeries(volume, true); - ArraySetAsSeries(spread, true); - - // - // this counts Available Bars ... - int limit; - - // - // because in some cases we may have more than one input for - // calculation and we must prevent any calculation - // untill we pass the biggest input length, here we get max Input length - // and then wait until pass it ... - int maxLength = MathMax(0, length * 3); - - // - limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; - - // - // Main Loop ... - for (int i = limit; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers(i); - } - - // - return rates_total; -} -// -// END Event Handlers ... -// - -// -// START Functions ... -// -// -// Validate Input Args for Initialization ... -bool ValidateInputs() -{ - // - bool result = false; - - // - // Validate Args ... - if (length >= 2) - { - result = true; - } - - // - return result; -} - -// -// Define Indexes and Styles ... -void DefineBuffers() -{ - // - ArraySetAsSeries(swingBuffer, true); - SetIndexBuffer(swingBufferIndex, swingBuffer, INDICATOR_CALCULATIONS); -} - -// -// Set Indicator Short Name and also we can define Buffers Labels ... -void SetIndicatorName() -{ - // - string indicatorShortName = ""; - StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); - - // - IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); -} - -// -// Calculate Buffers ... -void CalculateBuffers(int bar_index) -{ - // - // GetCandleSwing(bar_index); - ENUM_X_SWING_TYPE type = X_NO_SWING; - - // - // Try To Detect Order Blocks ... - bool isSwingLow = false; - bool isSwingHigh = false; - - // - // Reading Candles Data ... - XOHCL candles[]; - for (int i = bar_index; i < bar_index + ((length * 2) + 2); i++) - { - // - XOHCL iCandle = GetCandle( - _Symbol, - _Period, - i); - - // - Add( - iCandle, - candles); - } - - // - // Swing Low ... - isSwingLow = - // - candles[1].close > candles[2].close && - candles[2].close > candles[3].close && - // - candles[3].close < candles[4].close && - // - candles[5].close > candles[4].close && - candles[6].close > candles[5].close - // - ; - - // - if (isSwingLow) - { - type = X_SWING_LOW; - } - - // - if (!isSwingLow) - { - // - // Swing High ... - isSwingHigh = - // - candles[1].close < candles[2].close && - candles[2].close < candles[3].close && - // - candles[3].close > candles[4].close && - // - candles[5].close < candles[4].close && - candles[6].close < candles[5].close - // - ; - - // - if (isSwingHigh) - { - type = X_SWING_HIGH; - } - } - - // - switch (type) - { - // - // Swing High ... - case X_SWING_HIGH: - // - swingBuffer[bar_index] = type; - DrawSwingArrow(1, bar_index); - break; - - // - // Swinmg Low ... - case X_SWING_LOW: - // - swingBuffer[bar_index] = type; - DrawSwingArrow(0, bar_index); - break; - - // - // No Swing ... - default: - case X_NO_SWING: - // - swingBuffer[bar_index] = 0; - break; - } -} - -// -// Draw a Swing Arrow Shape ... -void DrawSwingArrow( - int type, // Swing Type: 0 - Low / 1 - High ... - int bar_index) -{ - // - bool isSwingHigh = type == 1; - XOHCL candle = GetCandle(bar_index + 3); - double arrowDistanceInPoint = 0; - - // - // Define Required Object Properties fro Draw an Arrow ... - datetime time = iTime(_Symbol, _Period, bar_index + 3); - double purePrice = isSwingHigh ? candle.high : candle.low; - color clr = isSwingHigh ? swingHighArrowColor : swingLowArrowColor; - ENUM_ARROW_ANCHOR anchor = isSwingHigh ? ANCHOR_BOTTOM : ANCHOR_TOP; - uchar arrowCode = uchar(isSwingHigh ? swingHighArrowCode : swingLowArrowCode); - double price = isSwingHigh ? purePrice + arrowDistanceInPoint : purePrice - arrowDistanceInPoint; - string name = "Swing " + (isSwingHigh ? "High" : "Low") + "_" + (string)time + "_" + (string)purePrice; - - // - // Draw desired Arrow ... - DrawArrow( - 0, - name, - 0, - time, - price, - arrowCode, - anchor, - clr); -} -// -// END Functions ... -// diff --git a/BKP/XAU5-0.43/Indicators/x-saherelm.xrsi.oscillator.mq5 b/BKP/XAU5-0.43/Indicators/x-saherelm.xrsi.oscillator.mq5 deleted file mode 100644 index 5659e07d..00000000 --- a/BKP/XAU5-0.43/Indicators/x-saherelm.xrsi.oscillator.mq5 +++ /dev/null @@ -1,397 +0,0 @@ -///////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 OrderBlock Detector Oscillator -// ------------------------------------------------------ -// Name: XRSI -// Description: detect market conditions based on RSI ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XRSI Oscillator" -#property strict - -// -// START Constants ... -// - -#define ShortName "XRSI" - -// -// END Constants ... -// - -// -// START Inputs ... -// - -// -input group "Market"; -input int length = 14; // Market Length -input ENUM_APPLIED_PRICE appliedTo = PRICE_CLOSE; // Applied To - -// -input group "Short Entry"; -input double shortEntryValue = 70; // Short Entry Level -input color shortEntryColor = clrRed; // Short Entry Level Color -input ENUM_LINE_STYLE shortEntryLineStyle = STYLE_DOT; // Short Entry Style - -// -input group "Short Exit"; -input double shortExitValue = 40; // Short Exit Level -input color shortExitColor = clrRed; // Short Exit Level Color -input ENUM_LINE_STYLE shortExitLineStyle = STYLE_DOT; // Short Exit Style - -// -input group "Long Entry"; -input double longEntryValue = 30; // Long Entry Level -input color longEntryColor = clrRed; // Long Entry Level Color -input ENUM_LINE_STYLE longEntryLineStyle = STYLE_DOT; // Long Entry Style - -// -input group "Long Exit"; -input double longExitValue = 60; // Long Exit Level -input color longExitColor = clrRed; // Long Exit Level Color -input ENUM_LINE_STYLE longExitLineStyle = STYLE_DOT; // Long Exit Style - -// -// START Inputs ... -// - -// -// Includes Logging Library ... -#include "../Libraries/x-saherelm.log.lib.mq5" - -// -// Include Common and Models Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Buffers ... -// - -// -#property indicator_separate_window -#property indicator_buffers 2 -#property indicator_plots 1 - -// -#define rsiBufferIndex 0 -#define rsiColorBufferIndex 1 - -// -double rsiBuffer[]; -double rsiColorBuffer[]; - -// -#property indicator_label1 "XRSI" -#property indicator_type1 DRAW_COLOR_LINE -#property indicator_color1 clrAqua, clrGray, clrFuchsia -#property indicator_style1 STYLE_DOT -#property indicator_width1 1 - -// -// END Buffers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// - -// -int rsiHandler = INVALID_HANDLE; - -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Event Handlers ... -// -// -// Initialization ... -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - logTag = ShortName; - - // - rsiHandler = iRSI( - _Symbol, - _Period, - length, - appliedTo); - if (rsiHandler == INVALID_HANDLE) - { - return INIT_FAILED; - } - - // - // Define Index Buffers ... - DefineBuffers(); - - // - // Set Indicator ShortName ... - SetIndicatorName(); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function - // REASON_REMOVE 1 Program removed from a chart - // REASON_RECOMPILE 2 Program recompiled - // REASON_CHARTCHANGE 3 A symbol or a chart period is changed - // REASON_CHARTCLOSE 4 Chart closed - // REASON_PARAMETERS 5 Inputs changed by a user - // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings - // REASON_TEMPLATE 7 Another chart template applied - // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value - // REASON_CLOSE 9 Terminal closed - - // - // Here we can handle De Initialization Reasons ... - - // - IndicatorRelease(rsiHandler); -} - -// -// Calculations ... -// -// Calculating what we want ... -int OnCalculate( - // - // total Candles on chart ... - const int rates_total, - // - // total calculated Candles on charts ... - const int prev_calculated, - // - // history of Candles Open Time ... - const datetime &time[], - // - // history of Candles Open Price ... - const double &open[], - // - // history of Candles High Price ... - const double &high[], - // - // history of Candles Low Price ... - const double &low[], - // - // history of Candles Close Price ... - const double &close[], - // - // history of Tick Volumes on Candle ... - const long &tick_volume[], - // - // history of Trade Volumes ... - const long &volume[], - // - // history of Candles Spread Price ... - const int &spread[]) -{ - // - // Prepare Buffers ... - ArraySetAsSeries(time, true); - ArraySetAsSeries(open, true); - ArraySetAsSeries(high, true); - ArraySetAsSeries(low, true); - ArraySetAsSeries(close, true); - ArraySetAsSeries(tick_volume, true); - ArraySetAsSeries(volume, true); - ArraySetAsSeries(spread, true); - - // - // this counts Available Bars ... - int limit; - - // - // because in some cases we may have more than one input for - // calculation and we must prevent any calculation - // untill we pass the biggest input length, here we get max Input length - // and then wait until pass it ... - int maxLength = MathMax(0, length); - - // - int rsiCalculatedBars = BarsCalculated(rsiHandler); - if (rsiCalculatedBars < maxLength) - { - return prev_calculated; - } - - // - limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; - - // - int rsiCopiedItems = CopyBuffer(rsiHandler, 0, 0, limit, rsiBuffer); - if (rsiCopiedItems <= 0) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - CalculateBuffers(i); - } - - // - return rates_total; -} -// -// END Event Handlers ... -// - -// -// START Functions ... -// -// -// Validate Input Args for Initialization ... -bool ValidateInputs() -{ - // - bool result = false; - - // - // Validate Args ... - if (length >= 2) - { - result = true; - } - - // - return result; -} - -// -// Define Indexes and Styles ... -void DefineBuffers() -{ - // - // RSI ... - string rsiBufferLabel = ShortName + " (" + (string)length + ")"; - ArraySetAsSeries(rsiBuffer, true); - SetIndexBuffer(rsiBufferIndex, rsiBuffer, INDICATOR_DATA); - PlotIndexSetInteger(rsiBufferIndex, PLOT_DRAW_BEGIN, length); - PlotIndexSetString(rsiBufferIndex, PLOT_LABEL, rsiBufferLabel); - - // - // RSI Color Buffer ... - ArraySetAsSeries(rsiColorBuffer, true); - SetIndexBuffer(rsiColorBufferIndex, rsiColorBuffer, INDICATOR_COLOR_INDEX); - - // - // Set Indicator Levels here ... - // OB, ExitLong, ExitShort, OS ... - IndicatorSetInteger(INDICATOR_LEVELS, 4); - - // - // SHORTENTRY ... - IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, shortEntryValue); - IndicatorSetInteger(INDICATOR_LEVELCOLOR, 0, shortEntryColor); - IndicatorSetInteger(INDICATOR_LEVELSTYLE, 0, shortEntryLineStyle); - IndicatorSetString(INDICATOR_LEVELTEXT, 0, "Short Entry"); - - // - // LONGEXIT ... - IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, longExitValue); - IndicatorSetInteger(INDICATOR_LEVELCOLOR, 1, longExitColor); - IndicatorSetInteger(INDICATOR_LEVELSTYLE, 1, shortExitLineStyle); - IndicatorSetString(INDICATOR_LEVELTEXT, 1, "Long Exit"); - - // - // SHORTEXIT ... - IndicatorSetDouble(INDICATOR_LEVELVALUE, 2, shortExitValue); - IndicatorSetInteger(INDICATOR_LEVELCOLOR, 2, shortExitColor); - IndicatorSetInteger(INDICATOR_LEVELSTYLE, 2, longEntryLineStyle); - IndicatorSetString(INDICATOR_LEVELTEXT, 2, "Short Exit"); - - // - // LONGENTRY ... - IndicatorSetDouble(INDICATOR_LEVELVALUE, 3, longEntryValue); - IndicatorSetInteger(INDICATOR_LEVELCOLOR, 3, longEntryColor); - IndicatorSetInteger(INDICATOR_LEVELSTYLE, 3, longExitLineStyle); - IndicatorSetString(INDICATOR_LEVELTEXT, 3, "Long Entry"); - - // - // Set Maximum and Minimum for subwindow - IndicatorSetInteger(INDICATOR_DIGITS, 2); - IndicatorSetDouble(INDICATOR_MINIMUM, 0); - IndicatorSetDouble(INDICATOR_MAXIMUM, 100); -} - -// -// Set Indicator Short Name and also we can define Buffers Labels ... -void SetIndicatorName() -{ - // - string indicatorShortName = ""; - StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); - - // - IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); -} - -// -// Calculate Buffers ... -void CalculateBuffers(int bar_index) -{ - // - double iValue = rsiBuffer[bar_index]; - - // - double iColorIndex = 0; - - // - if ( - iValue >= shortEntryValue || - iValue <= longEntryValue || - (iValue < longExitValue && - iValue > shortExitValue)) - { - iColorIndex = 0; - } - else if ( - iValue <= shortEntryValue && - iValue >= longExitValue) - { - iColorIndex = 2; - } - else if ( - iValue < shortExitValue && - iValue > longEntryValue) - { - iColorIndex = 1; - } - - // - rsiColorBuffer[bar_index] = iColorIndex; -} - -// -// END Functions ... -// diff --git a/BKP/XAU5-0.43/Indicators/x-saherelm.xtd.oscillator.mq5 b/BKP/XAU5-0.43/Indicators/x-saherelm.xtd.oscillator.mq5 deleted file mode 100644 index 5f46d187..00000000 --- a/BKP/XAU5-0.43/Indicators/x-saherelm.xtd.oscillator.mq5 +++ /dev/null @@ -1,465 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Trend Detector Oscillator -// -------------------------------------------------- -// Name: XTD -// Description: trend detecting in both sides ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XTD Oscillator" -#property strict - -// -// START Constants ... -// -#define ShortName "XTD" - -// -// 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 -}; -// -// END Constants ... -// - -// -// Include Models Library ... -#include "../Libraries/x-saherelm.models.lib.mq5" - -// -// START Inputs ... -// -input int length = 14; // Market Length -input bool drawCrosses = true; // Draw Cross Arrows - -// -// Bullish ... -input uchar bullishArrowCode = 228; // Cross Over Arrow Code -input color bullishArrowColor = clrAqua; // Cross Over Arrow Color - -// -// Bearish ... -input uchar bearishArrowCode = 230; // Cross Under Arrow Code -input color bearishArrowColor = clrMagenta; // Cross Under Arrow Color -// -// END Inputs ... -// - -// -// Includes Logging Library ... -#include "../Libraries/x-saherelm.log.lib.mq5"; - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5"; - -// -// Includes Draw Library ... -#include "../Libraries/x-saherelm.draw.lib.mq5"; - -// -// START Buffers ... -// -#property indicator_separate_window - -// -#property indicator_buffers 3 -#property indicator_plots 3 - -// -#define bullishBufferIndex 0 -#define bearishBufferIndex 1 -#define signalBufferIndex 2 - -// -double bullishBuffer[]; -double bearishBuffer[]; -double signalBuffer[]; - -// -#property indicator_label1 "XBullPower" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrLime -#property indicator_style1 STYLE_SOLID -#property indicator_width1 1 - -// -#property indicator_label2 "XBearPower" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrRed -#property indicator_style2 STYLE_SOLID -#property indicator_width2 1 - -// -#property indicator_label3 "XSignal" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrGold -#property indicator_style3 STYLE_DOT -#property indicator_width3 1 -// -// END Buffers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// -// -int xtdBullishCandleCount = 0; -int xtdBearishCandleCount = 0; -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Event Handlers ... -// -// -// Initialization ... -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - logTag = ShortName; - drawPrefix = ShortName; - - // - // Define Index Buffers ... - DefineBuffers(); - - // - // Set Indicator ShortName ... - SetIndicatorName(); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function - // REASON_REMOVE 1 Program removed from a chart - // REASON_RECOMPILE 2 Program recompiled - // REASON_CHARTCHANGE 3 A symbol or a chart period is changed - // REASON_CHARTCLOSE 4 Chart closed - // REASON_PARAMETERS 5 Inputs changed by a user - // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings - // REASON_TEMPLATE 7 Another chart template applied - // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value - // REASON_CLOSE 9 Terminal closed - - // - // Here we can handle De Initialization Reasons ... - - // - // De Init Draw Library ... - OnDeinitDrawLibrary(); -} - -// -// Calculations ... -// -// Calculating what we want ... -int OnCalculate( - // - // total Candles on chart ... - const int rates_total, - // - // total calculated Candles on charts ... - const int prev_calculated, - // - // history of Candles Open Time ... - const datetime &time[], - // - // history of Candles Open Price ... - const double &open[], - // - // history of Candles High Price ... - const double &high[], - // - // history of Candles Low Price ... - const double &low[], - // - // history of Candles Close Price ... - const double &close[], - // - // history of Tick Volumes on Candle ... - const long &tick_volume[], - // - // history of Trade Volumes ... - const long &volume[], - // - // history of Candles Spread Price ... - const int &spread[]) -{ - // - // Prepare Buffers ... - ArraySetAsSeries(time, true); - ArraySetAsSeries(open, true); - ArraySetAsSeries(high, true); - ArraySetAsSeries(low, true); - ArraySetAsSeries(close, true); - ArraySetAsSeries(tick_volume, true); - ArraySetAsSeries(volume, true); - ArraySetAsSeries(spread, true); - - // - // this counts Available Bars ... - int limit; - - // - // because in some cases we may have more than one input for - // calculation and we must prevent any calculation - // untill we pass the biggest input length, here we get max Input length - // and then wait until pass it ... - int maxLength = MathMax(0, length); - - // - limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated; - - // - // Main Loop ... - for (int i = limit; i >= 0 && !IsStopped(); i--) - { - // - CalculateBuffers(i, close); - } - - // - return rates_total; -} -// -// END Event Handlers ... -// - -// -// START Functions ... -// -// -// Validate Input Args for Initialization ... -bool ValidateInputs() -{ - // - bool result = false; - - // - // Validate Args ... - if (length >= 5) - { - result = true; - } - - // - return result; -} - -// -// Define Indexes and Styles ... -void DefineBuffers() -{ - // - // Bullish Buffer ... - string bullishBufferLabel = ShortName + "BullPow " + "(" + (string)length + ")"; - ArraySetAsSeries(bullishBuffer, true); - SetIndexBuffer(bullishBufferIndex, bullishBuffer, INDICATOR_DATA); - PlotIndexSetInteger(bullishBufferIndex, PLOT_DRAW_BEGIN, length); - PlotIndexSetString(bullishBufferIndex, PLOT_LABEL, bullishBufferLabel); - - // - // Bearish Buffer ... - string bearishBufferLabel = ShortName + "BearPow " + "(" + (string)length + ")"; - ArraySetAsSeries(bearishBuffer, true); - SetIndexBuffer(bearishBufferIndex, bearishBuffer, INDICATOR_DATA); - PlotIndexSetInteger(bearishBufferIndex, PLOT_DRAW_BEGIN, length); - PlotIndexSetString(bearishBufferIndex, PLOT_LABEL, bearishBufferLabel); - - // - // Signal Buffer ... - string signalBufferLabel = ShortName + "Signal " + "(" + (string)length + ")"; - ArraySetAsSeries(signalBuffer, true); - SetIndexBuffer(signalBufferIndex, signalBuffer, INDICATOR_DATA); - PlotIndexSetInteger(signalBufferIndex, PLOT_DRAW_BEGIN, length); - PlotIndexSetString(signalBufferIndex, PLOT_LABEL, signalBufferLabel); -} - -// -// Set Indicator Short Name and also we can define Buffers Labels ... -void SetIndicatorName() -{ - // - string indicatorShortName = ""; - StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )"); - - // - IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); -} - -// -// Calculate Buffers ... -void CalculateBuffers( - int bar_index, - const double &close[]) -{ - // - // Reset Global Counters ... - xtdBullishCandleCount = 0; - xtdBearishCandleCount = 0; - - // - // Loop through Closes ... - for (int i = bar_index; i <= bar_index + length; i++) - { - for (int j = i + 1; j <= bar_index + length; j++) - { - // - if (close[i] > close[j]) - { - xtdBullishCandleCount++; - } - - // - if (close[i] < close[j]) - { - xtdBearishCandleCount++; - } - } - } - - // - // Bullish Power Buffer ... - bullishBuffer[bar_index] = MathAbs(xtdBullishCandleCount); - - // - // Bearish Power Buffer ... - bearishBuffer[bar_index] = MathAbs(xtdBearishCandleCount); - - // - // Signal Buffer ... - signalBuffer[bar_index] = bullishBuffer[bar_index] - bearishBuffer[bar_index]; - - // - // Check and Draw Crosses if it's Specified ... - if (drawCrosses) - { - DrawCrosses(bar_index); - } -} - -// -// -double GetState( - int bar_index // Specified Bar Index -) -{ - // - // Check Cross Points ... - // bullishCrossedOverBearish = 2; - // bullishOverBearish = 1; - // bullishCrossedUnderBearish = -2; - // bullishUnderBearish = -1; - // OtherWise = 0; - bool isBullishCrossedOverBearish = IsCrossOver( - bullishBuffer, - bearishBuffer, - bar_index); - bool isBullishCrossedUnderBearish = IsCrossUnder( - bullishBuffer, - bearishBuffer, - bar_index); - bool isBullishOverBearish = IsOver( - bullishBuffer, - bearishBuffer, - bar_index); - bool isBullishUnderBearish = IsUnder( - bullishBuffer, - bearishBuffer, - bar_index); - - // - double result = X_XTD_NEUTURAL; - if (isBullishCrossedOverBearish) - { - result = X_XTD_BULLISH_CROSSED_OVER_BEARISH; - } - else if (isBullishCrossedUnderBearish) - { - result = X_XTD_BULLISH_CROSSED_UNDER_BEARISH; - } - else if (isBullishOverBearish) - { - result = X_XTD_BULLISH_OVER_BEARISH; - } - else if (isBullishUnderBearish) - { - result = X_XTD_BULLISH_UNDER_BEARISH; - } - else - { - result = X_XTD_NEUTURAL; - } - - // - return result; -} - -// -// Draw Crosses ... -void DrawCrosses( - int bar_index // the bars which required to draw cross arrow on it ... -) -{ - // - double stateValue = GetState(bar_index); - - // - bool isOver = stateValue == 2; - double low = iLow(_Symbol, _Period, bar_index); - double high = iHigh(_Symbol, _Period, bar_index); - - // - double price = isOver ? low : high; - datetime time = iTime(_Symbol, _Period, bar_index); - ENUM_ARROW_ANCHOR anchor = isOver ? ANCHOR_TOP : ANCHOR_BOTTOM; - uchar arrowCode = isOver ? bullishArrowCode : bearishArrowCode; - color arrowColor = isOver ? bullishArrowColor : bearishArrowColor; - string crossName = "Trend " + (isOver ? "Up" : "Down") + "_" + (string)time + "_" + (string)price; - - // - DrawArrow( - 0, - crossName, - 0, - time, - price, - arrowCode, - anchor, - arrowColor); -} -// -// END Functions ... -// diff --git a/BKP/XAU5-0.43/Indicators/x-saherelm.xtm.indicator.mq5 b/BKP/XAU5-0.43/Indicators/x-saherelm.xtm.indicator.mq5 deleted file mode 100644 index eac88e0a..00000000 --- a/BKP/XAU5-0.43/Indicators/x-saherelm.xtm.indicator.mq5 +++ /dev/null @@ -1,349 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Candle Indicator -// --------------------------------------------- -// Name: XTM -// Description: Trend Magic Indicator ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XTM Indicator" -#property strict - -// -// START Constants ... -// -#define ShortName "XTM" - -// -// XTM Indicator States ... -enum ENUM_X_XTM_STATES -{ - X_XTM_BULLISH = 1, - X_XTM_BEARISH = -1, - X_XTM_NEUTURAL = 0, -}; -// -// END Constants ... -// - -// -// START Inputs ... -// -input int maPeriod = 14; // Period -input int maShift = 0; // Shift -input ENUM_MA_METHOD maMethod = MODE_SMA; // Method -input ENUM_APPLIED_PRICE maAppliedTo = PRICE_CLOSE; // Applied To -// -// END Inputs ... -// - -// -// Includes Logging Library ... -#include "../Libraries/x-saherelm.log.lib.mq5" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Buffers ... -// -#property indicator_chart_window - -// -#property indicator_buffers 3 -#property indicator_plots 1 - -// -// maBuffer ... -#define maBufferIndex 0 -#define maColorBufferIndex 1 -#define stateBufferIndex 2 - -double maBuffer[]; -double maColorBuffer[]; -double stateBuffer[]; - -#property indicator_label1 "XTM" -#property indicator_type1 DRAW_COLOR_LINE -#property indicator_color1 clrLime, clrGray, clrRed -#property indicator_style1 STYLE_SOLID -#property indicator_width1 1 -// -// END Buffers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// -int maHandler = INVALID_HANDLE; -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Event Handlers ... -// -// -// Initialization ... -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - logTag = ShortName; - - // - // Initializing MA Handler ... - maHandler = iMA( - _Symbol, - _Period, - maPeriod, - maShift, - maMethod, - maAppliedTo); - if (maHandler == INVALID_HANDLE) - { - // - string message = "Error Initializing Ma Handler ..."; - LogMessage(message); - - // - return INIT_FAILED; - } - - // - // Define Index Buffers ... - DefineBuffers(); - - // - // Set Indicator ShortName ... - SetIndicatorName(); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function - // REASON_REMOVE 1 Program removed from a chart - // REASON_RECOMPILE 2 Program recompiled - // REASON_CHARTCHANGE 3 A symbol or a chart period is changed - // REASON_CHARTCLOSE 4 Chart closed - // REASON_PARAMETERS 5 Inputs changed by a user - // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings - // REASON_TEMPLATE 7 Another chart template applied - // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value - // REASON_CLOSE 9 Terminal closed - - // - // Here we can handle De Initialization Reasons ... -} - -// -// Calculations ... -// -// Calculating what we want ... -int OnCalculate( - // - // total Candles on chart ... - const int rates_total, - // - // total calculated Candles on charts ... - const int prev_calculated, - // - // history of Candles Open Time ... - const datetime &time[], - // - // history of Candles Open Price ... - const double &open[], - // - // history of Candles High Price ... - const double &high[], - // - // history of Candles Low Price ... - const double &low[], - // - // history of Candles Close Price ... - const double &close[], - // - // history of Tick Volumes on Candle ... - const long &tick_volume[], - // - // history of Trade Volumes ... - const long &volume[], - // - // history of Candles Spread Price ... - const int &spread[]) -{ - // - // Prepare Buffers ... - ArraySetAsSeries(time, true); - ArraySetAsSeries(open, true); - ArraySetAsSeries(high, true); - ArraySetAsSeries(low, true); - ArraySetAsSeries(close, true); - ArraySetAsSeries(tick_volume, true); - ArraySetAsSeries(volume, true); - ArraySetAsSeries(spread, true); - - // - // this counts Available Bars ... - int limit; - - // - // because in some cases we may have more than one input for - // calculation and we must prevent any calculation - // untill we pass the biggest input length, here we get max Input length - // and then wait until pass it ... - int maxLength = MathMax(0, maPeriod); - - // - // Check Calculated Bars ... - int maCalculatedBars = BarsCalculated(maHandler); - if (maCalculatedBars < maxLength) - { - return prev_calculated; - } - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; - - // - // Buffers Copy ... - int copiedMas = CopyBuffer(maHandler, 0, 0, limit, maBuffer); - if (copiedMas <= 0) - { - return prev_calculated; - } - - // - // Main Loop ... - for (int i = limit - 1; i >= 0 && !IsStopped(); i--) - { - // - // Do Buffers Calculation ... - CalculateBuffers(i); - } - - // - return rates_total; -} -// -// END Event Handlers ... -// - -// -// START Functions ... -// -// -// Validate Input Args for Initialization ... -bool ValidateInputs() -{ - // - bool result = false; - - // - // Validate Args ... - if (maPeriod >= 2) - { - result = true; - } - - // - return result; -} - -// -// Define Indexes and Styles ... -void DefineBuffers() -{ - // - string maBufferLabel = "XTM " + "(" + (string)maPeriod + ")"; - - // - // Ma Buffer ... - ArraySetAsSeries(maBuffer, true); - SetIndexBuffer(maBufferIndex, maBuffer, INDICATOR_DATA); - PlotIndexSetString(maBufferIndex, PLOT_LABEL, maBufferLabel); - - // - // Ma Color Buffer ... - ArraySetAsSeries(maColorBuffer, true); - SetIndexBuffer(maColorBufferIndex, maColorBuffer, INDICATOR_COLOR_INDEX); - - // - // State Buffer ... - ArraySetAsSeries(stateBuffer, true); - SetIndexBuffer(stateBufferIndex, stateBuffer, INDICATOR_CALCULATIONS); -} - -// -// Set Indicator Short Name and also we can define Buffers Labels ... -void SetIndicatorName() -{ - // - string indicatorShortName = ""; - StringConcatenate(indicatorShortName, ShortName, " ", "(", maPeriod, ")"); - - // - IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName); -} - -// -// Calculate Buffers ... -void CalculateBuffers(int bar_index) -{ - // - // Requirements ... - XOHCL candle = GetCandle(bar_index); - - // - double maValue = maBuffer[bar_index]; - - // - double lineColorIndex = - maValue < candle.low ? 0 : maValue > candle.high ? 2 - : 1; - - // - // Define State Value ... - // lineColorIndex == 0 => Bullish => 1; - // lineColorIndex == 1 => Neutural => 0; - // lineColorIndex == 2 => Bearish => -1; - double stateValue = - lineColorIndex == 0 ? X_XTM_BULLISH : lineColorIndex == 2 ? X_XTM_BEARISH - : X_XTM_NEUTURAL; - - // - // Set Ma Buffer Color Index ... - maColorBuffer[bar_index] = lineColorIndex; - - // - // Set State Buffer Value ... - stateBuffer[bar_index] = stateValue; -} - -// -// END Functions ... -// diff --git a/BKP/XAU5-0.43/Indicators/x-saherelm.xts.oscillator.mq5 b/BKP/XAU5-0.43/Indicators/x-saherelm.xts.oscillator.mq5 deleted file mode 100644 index 46e9fbf9..00000000 --- a/BKP/XAU5-0.43/Indicators/x-saherelm.xts.oscillator.mq5 +++ /dev/null @@ -1,558 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XTS Oscillator -// --------------------------------------------- -// Name: XTS -// Description: Time Sections Oscillator ... -// -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -////////////////////////////////////////////////////// -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm XTS Oscillator" -#property strict - -// -// START Constants ... -// - -#define ShortName "XTS" - -enum ENUM_X_PERIOD_METHOD -{ - // - X_PERIOD_NOTHING, - // - X_PERIOD_AUTO, - // - X_PERIOD_MANUALLY -}; - -// -// XTS Oscillator States ... - -// -// END Constants ... -// - -// -// START Inputs ... -// -input group "Current Period"; -input ENUM_APPLIED_PRICE currentAppliedTo = PRICE_CLOSE; // Current Applied To -// -input group "Nearest Period"; -input ENUM_X_PERIOD_METHOD nearestMethod = X_PERIOD_AUTO; // How to Find Nearest Period -input ENUM_TIMEFRAMES nearestPeriod = NULL; // Nearest Time Frame -input ENUM_APPLIED_PRICE nearestAppliedTo = PRICE_CLOSE; // Nearest Applied To -// -input group "Mediest Period"; -input ENUM_X_PERIOD_METHOD mediestMethod = X_PERIOD_AUTO; // How to Find Mediest Period -input ENUM_TIMEFRAMES mediestPeriod = NULL; // Mediest Time Frame -input ENUM_APPLIED_PRICE mediestAppliedTo = PRICE_CLOSE; // Mediest Applied To -// -input group "Farest Period"; -input ENUM_X_PERIOD_METHOD farestMethod = X_PERIOD_AUTO; // How to Find Farest Period -input ENUM_TIMEFRAMES farestPeriod = NULL; // Farest Time Frame -input ENUM_APPLIED_PRICE farestAppliedTo = PRICE_CLOSE; // Farest Applied To - -// -// Includes Logging Library ... -#include "../Libraries/x-saherelm.log.lib.mq5" - -// -// Includes Draw Library ... -#include "../Libraries/x-saherelm.draw.lib.mq5" - -// -// Includes Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// START Buffers ... -// -#property indicator_separate_window - -// -#property indicator_buffers 4 -#property indicator_plots 4 - -// -// Current ... -#define currentBufferIndex 0 - -double currentBuffer[]; - -#property indicator_label1 "XTS C" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrBrown -#property indicator_style1 STYLE_SOLID -#property indicator_width1 1 - -// -// Nearest ... -#define nearestBufferIndex 1 - -double nearestBuffer[]; - -#property indicator_label2 "XTS N" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrAqua -#property indicator_style2 STYLE_SOLID -#property indicator_width2 1 - -// -// Mediest ... -#define mediestBufferIndex 2 - -double mediestBuffer[]; - -#property indicator_label3 "XTS M" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrLime -#property indicator_style3 STYLE_SOLID -#property indicator_width3 1 - -// -// Farest ... -#define farestBufferIndex 3 - -double farestBuffer[]; - -#property indicator_label4 "XTS F" -#property indicator_type4 DRAW_LINE -#property indicator_color4 clrLightBlue -#property indicator_style4 STYLE_SOLID -#property indicator_width4 1 - -// -// END Buffers ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// - -// -ENUM_TIMEFRAMES mNearestPeriod = NULL; -ENUM_TIMEFRAMES mMediestPeriod = NULL; -ENUM_TIMEFRAMES mFarestPeriod = NULL; - -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Event Handlers ... -// - -// -// Initialization ... -int OnInit() -{ - // - // Validate Inputs ... - if (!ValidateInputs()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - logTag = ShortName; - drawPrefix = ShortName; - - // - // Define Index Buffers ... - DefineBuffers(); - - // - // Set Oscillator ShortName ... - SetOscillatorName(); - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - OnDeinitDrawLibrary(); - - // - Comment(""); -} - -// -// Calculations ... -// -// Calculating what we want ... -int OnCalculate( - // - // total Candles on chart ... - const int rates_total, - // - // total calculated Candles on charts ... - const int prev_calculated, - // - // history of Candles Open Time ... - const datetime &time[], - // - // history of Candles Open Price ... - const double &open[], - // - // history of Candles High Price ... - const double &high[], - // - // history of Candles Low Price ... - const double &low[], - // - // history of Candles Close Price ... - const double &close[], - // - // history of Tick Volumes on Candle ... - const long &tick_volume[], - // - // history of Trade Volumes ... - const long &volume[], - // - // history of Candles Spread Price ... - const int &spread[]) -{ - // - // Prepare Buffers ... - ArraySetAsSeries(time, true); - ArraySetAsSeries(open, true); - ArraySetAsSeries(high, true); - ArraySetAsSeries(low, true); - ArraySetAsSeries(close, true); - ArraySetAsSeries(tick_volume, true); - ArraySetAsSeries(volume, true); - ArraySetAsSeries(spread, true); - - // - // this counts Available Bars ... - int limit; - - // - // because in some cases we may have more than one input for - // calculation and we must prevent any calculation - // untill we pass the biggest input length, here we get max Input length - // and then wait until pass it ... - int maxLength = 30; - - // - limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; - - // - // Main Loop ... - for (int i = 0; i < limit && !IsStopped(); i++) - { - // - // Do Buffers Calculation ... - CalculateBuffers(i); - } - - // - return rates_total; -} - -// -// END Event Handlers ... -// - -// -// START Functions ... -// -// -// Validate Input Args for Initialization ... -bool ValidateInputs() -{ - // - bool result = true; - - // - return result; -} - -// -// Define Indexes and Styles ... -void DefineBuffers() -{ - // - int maxLength = 30; - - // - // Current ... - ArraySetAsSeries(currentBuffer, true); - SetIndexBuffer(currentBufferIndex, currentBuffer, INDICATOR_DATA); - PlotIndexSetInteger(currentBufferIndex, PLOT_DRAW_BEGIN, maxLength); - - // - // Nearest ... - ArraySetAsSeries(nearestBuffer, true); - SetIndexBuffer(nearestBufferIndex, nearestBuffer, INDICATOR_DATA); - PlotIndexSetInteger(nearestBufferIndex, PLOT_DRAW_BEGIN, maxLength); - - // - // Mediest ... - ArraySetAsSeries(mediestBuffer, true); - SetIndexBuffer(mediestBufferIndex, mediestBuffer, INDICATOR_DATA); - PlotIndexSetInteger(mediestBufferIndex, PLOT_DRAW_BEGIN, maxLength); - - // - // Farest ... - ArraySetAsSeries(farestBuffer, true); - SetIndexBuffer(farestBufferIndex, farestBuffer, INDICATOR_DATA); - PlotIndexSetInteger(farestBufferIndex, PLOT_DRAW_BEGIN, maxLength); -} - -// -// Set Oscillator Short Name and also we can define Buffers Labels ... -void SetOscillatorName() -{ - IndicatorSetString(INDICATOR_SHORTNAME, ShortName); -} - -// -// Calculate Buffers ... -void CalculateBuffers(int bar_index) -{ - // - // Current ... - CalculateCurrent(bar_index); - - // - // Nearest ... - CalculateNearest(bar_index); - - // - // Mediest ... - CalculateMediest(bar_index); - - // - // Farest ... - CalculateFarest(bar_index); - - // - // Commenting ... - string comment = GenerateDescriptionComment(); - Comment(comment); -} - -// -// Current ... -void CalculateCurrent(int bar_index) -{ - // - datetime barTime = iTime( - _Symbol, - _Period, - bar_index); - datetime startTime = GetPeriodStartTime( - _Symbol, - _Period, - barTime); - int startBarIndex = iBarShift( - _Symbol, - _Period, - startTime); - - // - XOHCL c = GetCandle( - _Symbol, - _Period, - startBarIndex); - - // - double value = GetAppliedPrice( - c, - currentAppliedTo); - - // - currentBuffer[bar_index] = value; -} - -// -// Nearest ... -void CalculateNearest(int bar_index) -{ - // - if (mNearestPeriod == NULL) - { - // - switch (nearestMethod) - { - // - case X_PERIOD_AUTO: - mNearestPeriod = GetNearestTimeFrame(_Period); - break; - - // - case X_PERIOD_NOTHING: - case X_PERIOD_MANUALLY: - mNearestPeriod = nearestPeriod; - break; - } - } - - // - datetime barTime = iTime( - _Symbol, - _Period, - bar_index); - datetime startTime = GetPeriodStartTime( - _Symbol, - mNearestPeriod, - barTime); - int startBarIndex = iBarShift( - _Symbol, - _Period, - startTime); - - // - XOHCL c = GetCandle( - _Symbol, - _Period, - startBarIndex); - - // - double value = GetAppliedPrice( - c, - nearestAppliedTo); - - // - nearestBuffer[bar_index] = value; -} - -// -// Mediest ... -void CalculateMediest(int bar_index) -{ - // - if (mMediestPeriod == NULL) - { - // - switch (mediestMethod) - { - // - case X_PERIOD_AUTO: - mMediestPeriod = GetMediestTimeFrame(_Period); - break; - - // - case X_PERIOD_NOTHING: - case X_PERIOD_MANUALLY: - mMediestPeriod = mediestPeriod; - break; - } - } - - // - datetime barTime = iTime( - _Symbol, - _Period, - bar_index); - datetime startTime = GetPeriodStartTime( - _Symbol, - mMediestPeriod, - barTime); - int startBarIndex = iBarShift( - _Symbol, - _Period, - startTime); - - // - XOHCL c = GetCandle( - _Symbol, - _Period, - startBarIndex); - - // - double value = GetAppliedPrice( - c, - mediestAppliedTo); - - // - mediestBuffer[bar_index] = value; -} - -// -// Farest ... -void CalculateFarest(int bar_index) -{ - // - if (mFarestPeriod == NULL) - { - // - switch (farestMethod) - { - // - case X_PERIOD_AUTO: - mFarestPeriod = GetFarestTimeFrame(_Period); - break; - - // - case X_PERIOD_NOTHING: - case X_PERIOD_MANUALLY: - mFarestPeriod = farestPeriod; - break; - } - } - - // - datetime barTime = iTime( - _Symbol, - _Period, - bar_index); - datetime startTime = GetPeriodStartTime( - _Symbol, - mFarestPeriod, - barTime); - int startBarIndex = iBarShift( - _Symbol, - _Period, - startTime); - - // - XOHCL c = GetCandle( - _Symbol, - _Period, - startBarIndex); - - // - double value = GetAppliedPrice( - c, - farestAppliedTo); - - // - farestBuffer[bar_index] = value; -} - -// -// Generate Comment ... -string GenerateDescriptionComment() -{ - // - string result = ""; - - // - result += "Nearest : " + EnumToString(mNearestPeriod) + "\n"; - result += "Mediest : " + EnumToString(mMediestPeriod) + "\n"; - result += "Farest : " + EnumToString(mFarestPeriod) + "\n"; - - // - return result; -} -// -// END Functions ... -// diff --git a/BKP/XAU5-0.43/Libraries/x-saherelm.alert.lib.mq5 b/BKP/XAU5-0.43/Libraries/x-saherelm.alert.lib.mq5 deleted file mode 100644 index 10790632..00000000 --- a/BKP/XAU5-0.43/Libraries/x-saherelm.alert.lib.mq5 +++ /dev/null @@ -1,200 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Alert Library -// -------------------------------------- -// Name: XAlert -// Description: provides Alerts abilities ... -// -// -// 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 - -// -// START Inputs ... -// -input group "Alerts"; -input bool enableAlerts = true; // Enable Alerts -input bool logAlerts = true; // Log Alerts -input bool terminalAlerts = false; // Terminal Alerts -input bool mailAlerts = false; // Mail Alerts -input bool pushAlerts = false; // Push Alerts -// -// END Inputs ... -// - -// -#include "x-saherelm.log.lib.mq5" - -// -// START Global Definitions: Variables, Properties and etc ... -// -string alertPrefix = "X-Alert"; -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Provided Functions ... -// -// -// Initial Library if required ... -bool OnInInitAlertLibrary() -{ - return false; -} - -// -// DeInitial Library if required ... -void OnDeinitAlertLibrary() -{ -} - -// -// Attach Alert Prefix to Message ... -string PrepareAlertMessage(string message) -{ - // - StringReplace(message, "\n", " | "); - - // - StringConcatenate(message, alertPrefix, " > ", message); - - // - return message; -} - -// -// Logging an Alert ... -void LogAlert(string message) -{ - // - // Validate Args ... - if (!enableAlerts || !logAlerts) - { - return; - } - - // - LogMessage(alertPrefix, message); -} - -// -// Terminal Alert ... -void TerminalAlert(string message) -{ - // - // Validate Args ... - if (!enableAlerts || !terminalAlerts) - { - return; - } - - // - // Prepare Message ... - message = PrepareAlertMessage(message); - - // Send Terminal Alert ... - Alert(message); -} - -// -// Mail Alert ... -void MailAlert(string message) -{ - // - // Validate Args ... - if (!enableAlerts || !mailAlerts) - { - return; - } - - // - // Send Mail Alert ... - SendMail(alertPrefix, message); -} - -// -// Send Push Notification ... -void PushAlert(string message) -{ - // - // Validate Args ... - if (!enableAlerts || !pushAlerts) - { - return; - } - - // - // Prepare Message ... - message = PrepareAlertMessage(message); - - // - // Send Push Notification Alert ... - SendNotification(message); -} - -// -// Alert Sending ... -void SendAlert(string message) -{ - // - // Validate Args ... - if (!enableAlerts) - { - return; - } - - // - // Log ... - if (logAlerts) - { - LogAlert(message); - } - - // - // Terminal ... - if (terminalAlerts) - { - TerminalAlert(message); - } - - // - // Mail ... - if (mailAlerts) - { - MailAlert(message); - } - - // - // Push ... - if (pushAlerts) - { - PushAlert(message); - } -} -void SendAlert( - XSignal &signal, // the Signal Object which requred to Alert - bool asExecuted = true // determines Alert Signal as Executed Signal or not -) -{ - // - // Prepare Message ... - string message = asExecuted ? ExecutedSignalToString(signal) : SignalToString(signal); - - // - // Do Alerting ... - SendAlert(message); -} -// -// END Provided Functions ... -// diff --git a/BKP/XAU5-0.43/Libraries/x-saherelm.common.lib.mq5 b/BKP/XAU5-0.43/Libraries/x-saherelm.common.lib.mq5 deleted file mode 100644 index 290dde9b..00000000 --- a/BKP/XAU5-0.43/Libraries/x-saherelm.common.lib.mq5 +++ /dev/null @@ -1,4429 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Common Library -// -------------------------------------- -// Name: XCommon -// Description: provide all commonly used functions ... -// -// -// 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 - -// -// START Inputs ... -// - -// -// END Inputs ... -// - -// -// Include Models Library ... -#include "x-saherelm.models.lib.mq5" - -// -// START Global Definitions: Variables, Properties and etc ... -// -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Provided Functions ... -// - -// -// Detect is new Candle or not ... -bool IsNewCandle() -{ - // - bool result = false; - - // - static int barsOnChart = 0; - int currentBarsOnChart = Bars(_Symbol, _Period); - result = currentBarsOnChart > barsOnChart; - if (!result) - { - return result; - } - - // - barsOnChart = currentBarsOnChart; - result = true; - - // - return result; -} - -// -// Retrive Ask Price ... -double GetAsk() -{ - return SymbolInfoDouble(_Symbol, SYMBOL_ASK); -} -double GetAsk( - string symbol // selected symbol for calculations -) -{ - // - double result = SymbolInfoDouble(symbol, SYMBOL_ASK); - - // - return result; -} - -// -// Retrieve Bid Price ... -double GetBid() -{ - return SymbolInfoDouble(_Symbol, SYMBOL_BID); -} -double GetBid( - string symbol // selected symbol for calculations -) -{ - // - double result = SymbolInfoDouble(symbol, SYMBOL_BID); - - // - return result; -} - -// -// Calculate and Retrieve Spread Price ... -double GetSpread() -{ - // - double ask = GetAsk(); - double bid = GetBid(); - double result = MathAbs(ask - bid); - - // - return result; -} -double GetSpread( - string symbol // selected symbol for calculations -) -{ - // - double ask = GetAsk(symbol); - double bid = GetBid(symbol); - double result = MathAbs(ask - bid); - - // - return result; -} - -// -// Get Points ... -double GetPoints() -{ - return _Point; -} -double GetPoints( - string symbol // selected symbol for calculations -) -{ - // - double result = SymbolInfoDouble(symbol, SYMBOL_POINT); - - // - return result; -} - -// -// Get Digits ... -int GetDigits() -{ - return _Digits; -} -int GetDigits( - string symbol // selected symbol for calculations -) -{ - // - int result = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS); - - // - return result; -} - -// -// Get Signal Entry ... -double GetEntry( - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... -) -{ - // - double result = 0; - - // - // Validate Arg ... - if (type == X_SIGNAL_UNKNOWN) - { - return result; - } - - // - bool isLong = type == X_SIGNAL_LONG; - result = isLong ? GetAsk() : GetBid(); - result = NormalizePrice(result); - - // - return result; -} -double GetEntry( - string symbol, // Specified Symbol - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... -) -{ - // - double result = 0; - - // - // Validate Arg ... - if (type == X_SIGNAL_UNKNOWN) - { - return result; - } - - // - bool isLong = type == X_SIGNAL_LONG; - result = isLong ? GetAsk(symbol) : GetBid(symbol); - result = NormalizePrice(result, symbol); - - // - return result; -} - -// -// Get Signal Exit ... -double GetExit( - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... -) -{ - // - double result = 0; - - // - // Validate Arg ... - if (type == X_SIGNAL_UNKNOWN) - { - return result; - } - - // - bool isLong = type == X_SIGNAL_LONG; - result = isLong ? GetBid() : GetAsk(); - result = NormalizePrice(result); - - // - return result; -} -double GetExit( - string symbol, // Specified Symbol - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_UNKNOWN // Get entry price for Which direction trade ... -) -{ - // - double result = 0; - - // - // Validate Arg ... - if (type == X_SIGNAL_UNKNOWN) - { - return result; - } - - // - bool isLong = type == X_SIGNAL_LONG; - result = isLong ? GetBid(symbol) : GetAsk(symbol); - result = NormalizePrice(result, symbol); - - // - return result; -} - -// -// Get 1 Pip in Price Value ... -double GetPipPrice() -{ - // - double result = _Point; - if (_Digits == 3 || _Digits == 5) - { - result *= 10; - } - - // - return result; -} -double GetPipPrice( - string symbol // selected symbol for calculations -) -{ - // - double symbolPoint = GetPoints(symbol); - int symbolDigits = GetDigits(symbol); - - // - double result = symbolPoint; - if (symbolDigits == 3 || symbolDigits == 5) - { - result *= 10; - } - - // - return result; -} - -// -// Converts Pips To Price ... -double PipsToPrice( - int pips // pips amount -) -{ - // - int digits = GetDigits(); - double pipValue = GetPipPrice(); - double result = pips * pipValue; - - // - result = NormalizeDouble(result, digits); - - // - return result; -} -double PipsToPrice( - double pips // pips amount -) -{ - // - int digits = GetDigits(); - double pipValue = GetPipPrice(); - double result = pips * pipValue; - - // - result = NormalizeDouble(result, digits); - - // - return result; -} -double PipsToPrice( - string symbol, // selected symbol for calculation - int pips // pips amount -) -{ - // - int digits = GetDigits(symbol); - double pipValue = GetPipPrice(symbol); - double result = pips * pipValue; - - // - result = NormalizeDouble(result, digits); - - // - return result; -} -double PipsToPrice( - string symbol, // selected symbol for calculation - double pips // pips amount -) -{ - // - int digits = GetDigits(symbol); - double pipValue = GetPipPrice(symbol); - double result = pips * pipValue; - - // - result = NormalizeDouble(result, digits); - - // - return result; -} - -// -// Converts Price to Pips ... -double PriceToPips( - double price // the price amount which required to calculate -) -{ - // - int digits = GetDigits(); - double pipPrice = GetPipPrice(); - - // - double result = price / pipPrice; - - // - result = NormalizeDouble(result, digits); - - // - return result; -} -double PriceToPips( - string symbol, // Selected Symbol - double price // the price amount which required to calculate -) -{ - // - int digits = GetDigits(symbol); - double pipPrice = GetPipPrice(symbol); - - // - double result = price / pipPrice; - - // - result = NormalizeDouble(result, digits); - - // - return result; -} - -// -// Get a Candle Body ... -double GetCandleBody( - XOHCL &candle // specified candle -) -{ - // - double result = MathAbs(candle.open - candle.close); - - // - return result; -} - -// -// Get a Candle Range ... -double GetCandleRange( - XOHCL &candle // specified candle -) -{ - // - double result = MathAbs(candle.high - candle.low); - - // - return result; -} - -// -// Get a Candle Shadow ... -double GetCandleShadow( - XOHCL &candle // specified candle -) -{ - // - double range = GetCandleRange(candle); - double body = GetCandleBody(candle); - - // - double result = MathAbs(range - body); - - // - return result; -} - -// -// Retrieve Applied Price at Specific Candle ... -double GetAppliedPrice( - XOHCL &candle, // specified candle - ENUM_APPLIED_PRICE source = PRICE_CLOSE // specified Applied To -) -{ - // - double result = EMPTY_VALUE; - - // - switch (source) - { - // - // Open ... - case PRICE_OPEN: - result = candle.open; - break; - - // - // High ... - case PRICE_HIGH: - result = candle.high; - break; - - // - // Low ... - case PRICE_LOW: - result = candle.low; - break; - - // - // Median ((High + Low) / 2) ... - case PRICE_MEDIAN: - result = (candle.high + candle.low) / 2; - break; - - // - // Typical ((High + Low + Close)/3) ... - case PRICE_TYPICAL: - result = (candle.high + candle.low + candle.close) / 3; - break; - - // - // Weighted ((High + Low + Close + Close)/4) ... - case PRICE_WEIGHTED: - result = (candle.high + candle.low + (candle.close * 2)) / 4; - break; - - // - // Close ... - default: - case PRICE_CLOSE: - result = candle.close; - break; - } - - // - return result; -} -double GetAppliedPrice( - int bar_index, // specify candle index - ENUM_APPLIED_PRICE source = PRICE_CLOSE // specified Applied To -) -{ - // - double result = EMPTY_VALUE; - - // - XOHCL candle = GetCandle(bar_index); - result = GetAppliedPrice(candle, source); - - // - return result; -} -double GetAppliedPrice( - int bar_index, // specify candle index - ENUM_SERIESMODE mode // converts Series Mode to Applied Price ... -) -{ - // - double result = 0; - - // - ENUM_APPLIED_PRICE mAppliedTo = To(mode); - result = GetAppliedPrice( - bar_index, - mAppliedTo); - - // - return result; -} - -// -// Converts ... -ENUM_APPLIED_PRICE To( - ENUM_SERIESMODE mode // converts Series Mode to Applied Price ... -) -{ - // - ENUM_APPLIED_PRICE result = PRICE_CLOSE; - - // - switch (mode) - { - // - // High ... - case MODE_HIGH: - result = PRICE_HIGH; - break; - - // - // Open ... - case MODE_OPEN: - result = PRICE_OPEN; - break; - - // - // Low ... - case MODE_LOW: - result = PRICE_LOW; - break; - - // - // Close ... - // Default ... - case MODE_CLOSE: - default: - result = PRICE_CLOSE; - break; - } - - // - return result; -} - -// -// Retrieve a Candel Data ... -XOHCL GetCandle(int bar_index) -{ - // - XOHCL result = {}; - - // - double open = iOpen(_Symbol, _Period, bar_index); - double high = iHigh(_Symbol, _Period, bar_index); - double close = iClose(_Symbol, _Period, bar_index); - double low = iLow(_Symbol, _Period, bar_index); - - // - result.low = low; - result.open = open; - result.high = high; - result.close = close; - - // - return result; -} -XOHCL GetCandle( - ENUM_TIMEFRAMES mPeriod, // specify timeframe - int bar_index // specify candle index -) -{ - // - XOHCL result = {}; - - // - double open = iOpen(_Symbol, mPeriod, bar_index); - double high = iHigh(_Symbol, mPeriod, bar_index); - double close = iClose(_Symbol, mPeriod, bar_index); - double low = iLow(_Symbol, mPeriod, bar_index); - - // - result.low = low; - result.open = open; - result.high = high; - result.close = close; - - // - return result; -} -XOHCL GetCandle( - string symbol, // specify symbol - ENUM_TIMEFRAMES mPeriod, // specify timeframe - int bar_index // specify candle index -) -{ - // - XOHCL result = {}; - - // - double open = iOpen(symbol, mPeriod, bar_index); - double high = iHigh(symbol, mPeriod, bar_index); - double close = iClose(symbol, mPeriod, bar_index); - double low = iLow(symbol, mPeriod, bar_index); - - // - result.low = low; - result.open = open; - result.high = high; - result.close = close; - - // - return result; -} - -// -// Retrieve a candle index in current timeframe inside another timeframe ... -int GetCandleBarIndex( - int bar_index, // Specify Candle index in current timeframe - ENUM_TIMEFRAMES destPeriod // Specify destination timeframe -) -{ - // - int result = -1; - - // - datetime barTime = iTime(_Symbol, _Period, bar_index); - result = iBarShift(_Symbol, destPeriod, barTime); - - // - return result; -} - -// -// Retrieve a symbol candle index in source time frame inside dest timeframe ... -int GetCandleBarIndex( - int bar_index, // Specify Candle index in current timeframe - string symbol, // Specify desired Symbol - ENUM_TIMEFRAMES sourcePeriod, // Specify bar_index timeframe - ENUM_TIMEFRAMES destPeriod // Specify destination timeframe -) -{ - // - int result = -1; - - // - datetime barTime = iTime(symbol, sourcePeriod, bar_index); - result = iBarShift(symbol, destPeriod, barTime); - - // - return result; -} - -// -// Check a Candle is Bullish or not ... -bool IsBullishCandle( - XOHCL &candle // specified candle -) -{ - // - bool result = false; - - // - result = candle.open < candle.close; - - // - return result; -} -bool IsBullishCandle( - int bar_index // candle index -) -{ - // - bool result = false; - - // - XOHCL candle = GetCandle(bar_index); - - // - result = IsBullishCandle(candle); - - // - return result; -} -bool IsBullishCandle( - string symbol, // specify symbol - ENUM_TIMEFRAMES mPeriod, // specify timeframe - int bar_index // candle index -) -{ - // - bool result = false; - - // - XOHCL candle = GetCandle( - symbol, - mPeriod, - bar_index); - - // - result = IsBullishCandle(candle); - - // - return result; -} - -// -// Check a Candle is Bullish or not ... -bool IsBearishCandle( - XOHCL &candle // specified candle -) -{ - // - bool result = false; - - // - result = candle.open > candle.close; - - // - return result; -} -bool IsBearishCandle( - int bar_index // candle index -) -{ - // - bool result = false; - - // - XOHCL candle = GetCandle(bar_index); - - // - result = IsBearishCandle(candle); - - // - return result; -} -bool IsBearishCandle( - string symbol, // specify symbol - ENUM_TIMEFRAMES mPeriod, // specify timeframe - int bar_index // candle index -) -{ - // - bool result = false; - - // - XOHCL candle = GetCandle( - symbol, - mPeriod, - bar_index); - - // - result = IsBearishCandle(candle); - - // - return result; -} - -// -// Check Candle Body Bigger Than it's Shadow ... -bool HasStrongBody(XOHCL &candle) -{ - // - double bodySize = MathAbs(candle.open - candle.close); - double shadowSize = MathAbs(candle.high - candle.low) - bodySize; - - // - bool result = bodySize > (shadowSize * 1.5); - - // - return result; -} - -// -// Determines a cnadle is Swing High -// or Swing Low order block ... -ENUM_X_SWING_TYPE GetCandleSwing(int bar_index) -{ - // - ENUM_X_SWING_TYPE result = X_NO_SWING; - - // - // Reading Candle Models ... - XOHCL candles[3]; - candles[0] = GetCandle(bar_index + 1); - candles[1] = GetCandle(bar_index + 2); - candles[2] = GetCandle(bar_index + 3); - - // - // Check Swing Start Candle has Strong Body ... - bool isStrongBodyCandle = HasStrongBody(candles[2]); - if (!isStrongBodyCandle) - { - return result; - } - - // - // Check Swing Low Conditions ... - bool isSwingLowOrderBlock = - candles[2].low < candles[1].low && - candles[1].low < candles[0].low && - candles[2].low < candles[0].low; - if (isSwingLowOrderBlock) - { - result = X_SWING_LOW; - } - - // - // Check Swing High Conditions ... - bool isSwingHighOrderBlock = - candles[2].high > candles[1].high && - candles[1].high > candles[0].high && - candles[2].high > candles[0].high; - if (isSwingHighOrderBlock) - { - result = X_SWING_HIGH; - } - - // - return result; -} -ENUM_X_SWING_TYPE GetCandleSwing( - ENUM_TIMEFRAMES mPeriod, // specify timeframe - int bar_index // specify candle index -) -{ - // - ENUM_X_SWING_TYPE result = X_NO_SWING; - - // - // Reading Candle Models ... - XOHCL candles[3]; - candles[0] = GetCandle(mPeriod, bar_index + 1); - candles[1] = GetCandle(mPeriod, bar_index + 2); - candles[2] = GetCandle(mPeriod, bar_index + 3); - - // - // Check Swing Start Candle has Strong Body ... - bool isStrongBodyCandle = HasStrongBody(candles[2]); - if (!isStrongBodyCandle) - { - return result; - } - - // - // Check Swing Low Conditions ... - bool isSwingLowOrderBlock = - candles[2].low < candles[1].low && - candles[1].low < candles[0].low && - candles[2].low < candles[0].low; - if (isSwingLowOrderBlock) - { - result = X_SWING_LOW; - } - - // - // Check Swing High Conditions ... - bool isSwingHighOrderBlock = - candles[2].high > candles[1].high && - candles[1].high > candles[0].high && - candles[2].high > candles[0].high; - if (isSwingHighOrderBlock) - { - result = X_SWING_HIGH; - } - - // - return result; -} -ENUM_X_SWING_TYPE GetCandleSwing( - string symbol, // specify symbol - ENUM_TIMEFRAMES mPeriod, // specify timeframe - int bar_index // specify candle index -) -{ - // - ENUM_X_SWING_TYPE result = X_NO_SWING; - - // - // Reading Candle Models ... - XOHCL candles[3]; - candles[0] = GetCandle(symbol, mPeriod, bar_index + 1); - candles[1] = GetCandle(symbol, mPeriod, bar_index + 2); - candles[2] = GetCandle(symbol, mPeriod, bar_index + 3); - - // - // Check Swing Start Candle has Strong Body ... - bool isStrongBodyCandle = HasStrongBody(candles[2]); - if (!isStrongBodyCandle) - { - return result; - } - - // - // Check Swing Low Conditions ... - bool isSwingLowOrderBlock = - candles[2].low < candles[1].low && - candles[1].low < candles[0].low && - candles[2].low < candles[0].low; - if (isSwingLowOrderBlock) - { - result = X_SWING_LOW; - } - - // - // Check Swing High Conditions ... - bool isSwingHighOrderBlock = - candles[2].high > candles[1].high && - candles[1].high > candles[0].high && - candles[2].high > candles[0].high; - if (isSwingHighOrderBlock) - { - result = X_SWING_HIGH; - } - - // - return result; -} - -// -// Retrieve Market Highest High ... -double GetHighestHigh( - int mLength, // Which market Length use - int bar_index // bar index -) -{ - // - double result = -1; - - // - int rIdx = iHighest( - _Symbol, - _Period, - MODE_HIGH, - mLength, - bar_index); - - // - result = iHigh( - _Symbol, - _Period, - rIdx); - - // - return result; -} -double GetHighestHigh( - int mLength, // Which market Length use - int bar_index, // bar index - ENUM_SERIESMODE mode // Calculation mode -) -{ - // - double result = -1; - - // - int rIdx = iHighest( - _Symbol, - _Period, - mode, - mLength, - bar_index); - - // - result = iHigh( - _Symbol, - _Period, - rIdx); - - // - return result; -} -double GetHighestHigh( - string symbol, // Specified Symbol - ENUM_TIMEFRAMES mPeriod, // Specified Period - int mLength, // Which market Length use - int bar_index // bar index -) -{ - // - double result = -1; - - // - int rIdx = iHighest( - symbol, - mPeriod, - MODE_HIGH, - mLength, - bar_index); - - // - result = iHigh( - symbol, - mPeriod, - rIdx); - - // - return result; -} -double GetHighestHigh( - string symbol, // Specified Symbol - ENUM_TIMEFRAMES mPeriod, // Specified Period - ENUM_SERIESMODE mode, // Calculation mode - int mLength, // Which market Length use - int bar_index // bar index -) -{ - // - double result = -1; - - // - int rIdx = iHighest( - symbol, - mPeriod, - mode, - mLength, - bar_index); - - // - result = iHigh( - symbol, - mPeriod, - rIdx); - - // - return result; -} - -// -// Retrieve Market Lowest Low ... -double GetLowestLow( - int mLength, // Which market Length use - int bar_index // bar index -) -{ - // - double result = -1; - - // - int rIdx = iLowest( - _Symbol, - _Period, - MODE_LOW, - mLength, - bar_index); - - // - result = iLow( - _Symbol, - _Period, - rIdx); - - // - return result; -} -double GetLowestLow( - int mLength, // Which market Length use - int bar_index, // bar index - ENUM_SERIESMODE mode // Calculation mode -) -{ - // - double result = -1; - - // - int rIdx = iLowest( - _Symbol, - _Period, - mode, - mLength, - bar_index); - - // - result = iLow( - _Symbol, - _Period, - rIdx); - - // - return result; -} -double GetLowestLow( - string symbol, // Specified Symbol - ENUM_TIMEFRAMES mPeriod, // Specified Period - int mLength, // Which market Length use - int bar_index // bar index -) -{ - // - double result = -1; - - // - int rIdx = iLowest( - symbol, - mPeriod, - MODE_LOW, - mLength, - bar_index); - - // - result = iLow( - symbol, - mPeriod, - rIdx); - - // - return result; -} -double GetLowestLow( - string symbol, // Specified Symbol - ENUM_TIMEFRAMES mPeriod, // Specified Period - ENUM_SERIESMODE mode, // Calculation mode - int mLength, // Which market Length use - int bar_index // bar index -) -{ - // - double result = -1; - - // - int rIdx = iLowest( - symbol, - mPeriod, - mode, - mLength, - bar_index); - - // - result = iLow( - symbol, - mPeriod, - rIdx); - - // - return result; -} - -// -// Calculate Fib Level ... -double GetFibonacciLevel( - double upPrice, - double downPrice, - double level, - int direction) -{ - // - double ling = upPrice - downPrice; - double pLevel = (ling / 100) * (level * 100); - - // - double result = direction > 0 ? upPrice - pLevel : downPrice + pLevel; - result = NormalizeDouble(result, _Digits); - - // - return result; -} - -// -// Check first Cross Over second at bar_index ... -bool IsCrossOver( - const double &first[], // the buffer which check crossing over second buffer - const double &second[], // first buffer checks based on this buffer - const int bar_index // check crosses in specific index -) -{ - // - bool result = false; - - // - ArraySetAsSeries(first, true); - ArraySetAsSeries(second, true); - - // - // Validate Args ... - if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) - { - return result; - } - - // - result = first[bar_index] > second[bar_index] && - !(first[bar_index + 1] > second[bar_index + 1]); - - // - return result; -} - -// -// Check first is Over second at bar_index ... -bool IsOver( - const double &first[], // the buffer which check over second buffer - const double &second[], // first buffer checks based on this buffer - const int bar_index // check crosses in specific index -) -{ - // - bool result = false; - - // - ArraySetAsSeries(first, true); - ArraySetAsSeries(second, true); - - // - // Validate Args ... - if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) - { - return result; - } - - // - result = first[bar_index] > second[bar_index] && - first[bar_index + 1] > second[bar_index + 1]; - - // - return result; -} - -// -// Check first Cross Under second at bar_index ... -bool IsCrossUnder( - const double &first[], // the buffer which check crossing under second buffer - const double &second[], // first buffer checks based on this buffer - const int bar_index // check crosses in specific index -) -{ - // - bool result = false; - - // - ArraySetAsSeries(first, true); - ArraySetAsSeries(second, true); - - // - // Validate Args ... - if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) - { - return result; - } - - // - result = first[bar_index] < second[bar_index] && - !(first[bar_index + 1] < second[bar_index + 1]); - - // - return result; -} - -// -// Check first is Under second at bar_index ... -bool IsUnder( - const double &first[], // the buffer which check under second buffer - const double &second[], // first buffer checks based on this buffer - const int bar_index // check crosses in specific index -) -{ - // - bool result = false; - - // - ArraySetAsSeries(first, true); - ArraySetAsSeries(second, true); - - // - // Validate Args ... - if (ArraySize(first) < bar_index + 1 || ArraySize(second) < bar_index + 1) - { - return result; - } - - // - result = first[bar_index] < second[bar_index] && - first[bar_index + 1] < second[bar_index + 1]; - - // - return result; -} - -// -// Calculate Slope of Specified Buffer at Specified Index ... -double GetSlope( - int from, // In Past Index ... - int to, // In Past Index ... - double &buffer[]) -{ - // - double result = 0; - - // - double toValue = buffer[to]; - double fromValue = buffer[from]; - double deltaValue = toValue - fromValue; - double deltaTime = from - to; - - // - result = deltaValue / deltaTime; - - // - return result; -} - -// -// Check if a Value Increasing in Loopback ... -bool IsIncreasing( - int from, // Last Time Index - int to, // Fisr Tima Index - double &buffer[] // the Buffer which required to search -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - from <= to || - ArraySize(buffer) < from + 1) - { - return result; - } - - // - // Loop through Items ... - double toValue = buffer[to]; - double fromValue = buffer[from]; - result = toValue > fromValue; - for (int i = to + 1; i <= from - 1; i++) - { - // - double iValue = buffer[i]; - bool isPassed = toValue >= iValue; - - // - bool isIIncreasing = IsIncreasing( - from, - i, - buffer); - - // - // Check Result ... - result = result && isPassed && isIIncreasing; - if (!result) - { - break; - } - } - - // - return result; -} - -// -// Check if a Value Decreasing in Loopback ... -bool IsDecreasing( - int from, // Last Time Index - int to, // Fisr Tima Index - double &buffer[] // the Buffer which required to search -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - from <= to || - ArraySize(buffer) < from + 1) - { - return result; - } - - // - // Loop through Items ... - double toValue = buffer[to]; - double fromValue = buffer[from]; - result = toValue < fromValue; - for (int i = to + 1; i <= from - 1; i++) - { - // - double iValue = buffer[i]; - bool isPassed = toValue <= iValue; - - // - bool isIDecreasing = IsDecreasing( - from, - i, - buffer); - - // - // Check Result ... - result = result && isPassed && isIDecreasing; - if (!result) - { - break; - } - } - - // - return result; -} - -// -// Get Max Value of Specific Loopback of a Buffer ... -double GetMaxValue( - int mLoopback, // loopback length - double &buffer[] // the Buffer which required to search -) -{ - // - double result = 0; - - // - // Validate Args ... - if ( - mLoopback < 2 || - ArraySize(buffer) < mLoopback) - { - return result; - } - - // - // Loop Through LoopBack ... - for (int i = 0; i < mLoopback; i++) - { - // - double iValue = buffer[i]; - - // - result = - // - result == 0 || result < iValue - // - ? iValue - // - : result - // - ; - } - - // - return result; -} - -// -// Get Min Value of Specific Loopback of a Buffer ... -double GetMinValue( - int mLoopback, // loopback length - double &buffer[] // the Buffer which required to search -) -{ - // - double result = 0; - - // - // Validate Args ... - if ( - mLoopback < 2 || - ArraySize(buffer) < mLoopback) - { - return result; - } - - // - // Loop Through LoopBack ... - for (int i = 0; i < mLoopback; i++) - { - // - double iValue = buffer[i]; - - // - result = - // - result == 0 || result > iValue - // - ? iValue - // - : result - // - ; - } - - // - return result; -} - -// -bool IsInPeak( - int mLoopback, // loopback length - double &buffer[] // the Buffer which required to search -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - mLoopback < 2 || - ArraySize(buffer) < mLoopback + 1) - { - return result; - } - - // - int q1Length = mLoopback / 4; - int halfLength = mLoopback / 2; - int q2Length = halfLength + q1Length; - - // - double firstValue = buffer[1]; - double q1Value = buffer[q1Length]; - double q2Value = buffer[q2Length]; - double halfValue = buffer[halfLength]; - double lastValue = buffer[ArraySize(buffer) - 1]; - - // - // Peak ... - result = - // - firstValue > lastValue - // - && - // - ( - firstValue > q1Value && - firstValue > halfValue) - // - ; - - // - return result; -} - -// -bool IsInVale( - int mLoopback, // loopback length - double &buffer[] // the Buffer which required to search -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - mLoopback < 2 || - ArraySize(buffer) < mLoopback + 1) - { - return result; - } - - // - int q1Length = mLoopback / 4; - int halfLength = mLoopback / 2; - int q2Length = halfLength + q1Length; - - // - double firstValue = buffer[1]; - double q1Value = buffer[q1Length]; - double q2Value = buffer[q2Length]; - double halfValue = buffer[halfLength]; - double lastValue = buffer[ArraySize(buffer) - 1]; - - // - // Peak ... - result = - // - firstValue < lastValue - // - && - // - ( - firstValue < q1Value && - firstValue < halfValue) - // - ; - - // - return result; -} - -// -// Check Sharp Happens or not ... -bool IsSharpChanged( - double fromValue, // Past Value - double toValue, // Present Value - double maxValue, // Max in Range Value - double minValue // Min in Range Value -) -{ - // - bool result = false; - - // - // This Used In Increased or Decreased Sharp Detection ... - bool isIncreased = toValue > fromValue; - - // - double toFromDelta = MathAbs(toValue - fromValue); - double minMaxDelta = maxValue - minValue; - - // - result = toFromDelta >= (minMaxDelta / 3); - - // - return result; -} -bool IsSharpChanged( - int from, // Past Index in Series - int to, // Present Index in Series - double &buffer[] // the Buffer which required to search -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - from <= to || - ArraySize(buffer) < from + 1) - { - return result; - } - - // - // Loop through Items ... - double toValue = buffer[to]; - double fromValue = buffer[from]; - - // - // This Used In Increased or Decreased Sharp Detection ... - bool isIncreased = toValue > fromValue; - - // - double minValue = GetMinValue( - ArraySize(buffer) - 1, - buffer); - double maxValue = GetMaxValue( - ArraySize(buffer) - 1, - buffer); - double minMaxDelta = maxValue - minValue; - - // - // Sharp Detection ... - result = IsSharpChanged( - fromValue, - toValue, - maxValue, - minValue); - - // - return result; -} -bool IsSharpChanged( - int from, // Past Bar Index - int to, // Present Bar Index - ENUM_APPLIED_PRICE appliedPrice // Which Price Choose in From or To -) -{ - // - bool result = false; - - // - double toValue = GetAppliedPrice( - to, - appliedPrice); - double fromValue = GetAppliedPrice( - from, - appliedPrice); - - // - int hIdx = iHighest( - _Symbol, - _Period, - MODE_HIGH, - from, - to); - double maxValue = iHigh( - _Symbol, - _Period, - hIdx); - - // - int lIdx = iLowest( - _Symbol, - _Period, - MODE_LOW, - from, - to); - double minValue = iLow( - _Symbol, - _Period, - lIdx); - - // - result = IsSharpChanged( - fromValue, - toValue, - maxValue, - minValue); - - // - return result; -} - -// -// Check InCreased Sharp Happens or not ... -bool IsSharpIncreasedChanged( - double fromValue, // Past Value - double toValue, // Present Value - double maxValue, // Max in Range Value - double minValue // Min in Range Value -) -{ - // - bool result = false; - - // - // This Used In Increased or Decreased Sharp Detection ... - bool isIncreased = toValue > fromValue; - - // - double toFromDelta = MathAbs(toValue - fromValue); - double minMaxDelta = maxValue - minValue; - - // - result = - isIncreased && - toFromDelta >= (minMaxDelta / 3); - - // - return result; -} -bool IsSharpIncreasedChanged( - int from, // Past Index in Series - int to, // Present Index in Series - double &buffer[] // the Buffer which required to search -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - from <= to || - ArraySize(buffer) < from + 1) - { - return result; - } - - // - // Loop through Items ... - double toValue = buffer[to]; - double fromValue = buffer[from]; - - // - double minValue = GetMinValue( - ArraySize(buffer) - 1, - buffer); - double maxValue = GetMaxValue( - ArraySize(buffer) - 1, - buffer); - double minMaxDelta = maxValue - minValue; - - // - // Sharp Detection ... - result = IsSharpIncreasedChanged( - fromValue, - toValue, - maxValue, - minValue); - - // - return result; -} -bool IsSharpIncreasedChanged( - int from, // Past Bar Index - int to, // Present Bar Index - ENUM_APPLIED_PRICE appliedPrice // Which Price Choose in From or To -) -{ - // - bool result = false; - - // - double toValue = GetAppliedPrice( - to, - appliedPrice); - double fromValue = GetAppliedPrice( - from, - appliedPrice); - - // - int hIdx = iHighest( - _Symbol, - _Period, - MODE_HIGH, - from, - to); - double maxValue = iHigh( - _Symbol, - _Period, - hIdx); - - // - int lIdx = iLowest( - _Symbol, - _Period, - MODE_LOW, - from, - to); - double minValue = iLow( - _Symbol, - _Period, - lIdx); - - // - result = IsSharpIncreasedChanged( - fromValue, - toValue, - maxValue, - minValue); - - // - return result; -} - -// -// Check Decreased Sharp Happens or not ... -bool IsSharpDecreasedChanged( - double fromValue, // Past Value - double toValue, // Present Value - double maxValue, // Max in Range Value - double minValue // Min in Range Value -) -{ - // - bool result = false; - - // - // This Used In Increased or Decreased Sharp Detection ... - bool isIncreased = toValue > fromValue; - - // - double toFromDelta = MathAbs(toValue - fromValue); - double minMaxDelta = maxValue - minValue; - - // - result = - !isIncreased && - toFromDelta >= (minMaxDelta / 3); - - // - return result; -} -bool IsSharpDecreasedChanged( - int from, // Past Index in Series - int to, // Present Index in Series - double &buffer[] // the Buffer which required to search -) -{ - // - bool result = false; - - // - // Validate Args ... - if ( - from <= to || - ArraySize(buffer) < from + 1) - { - return result; - } - - // - // Loop through Items ... - double toValue = buffer[to]; - double fromValue = buffer[from]; - - // - double minValue = GetMinValue( - ArraySize(buffer) - 1, - buffer); - double maxValue = GetMaxValue( - ArraySize(buffer) - 1, - buffer); - double minMaxDelta = maxValue - minValue; - - // - // Sharp Detection ... - result = IsSharpDecreasedChanged( - fromValue, - toValue, - maxValue, - minValue); - - // - return result; -} -bool IsSharpDecreasedChanged( - int from, // Past Bar Index - int to, // Present Bar Index - ENUM_APPLIED_PRICE appliedPrice // Which Price Choose in From or To -) -{ - // - bool result = false; - - // - double toValue = GetAppliedPrice( - to, - appliedPrice); - double fromValue = GetAppliedPrice( - from, - appliedPrice); - - // - int hIdx = iHighest( - _Symbol, - _Period, - MODE_HIGH, - from, - to); - double maxValue = iHigh( - _Symbol, - _Period, - hIdx); - - // - int lIdx = iLowest( - _Symbol, - _Period, - MODE_LOW, - from, - to); - double minValue = iLow( - _Symbol, - _Period, - lIdx); - - // - result = IsSharpDecreasedChanged( - fromValue, - toValue, - maxValue, - minValue); - - // - return result; -} - -// -// Validate Struct ... -bool IsValid(XSignal &model, ulong magicNumber) -{ - // - bool result = false; - - // - // Validate Signal Type ... - result = model.type != X_SIGNAL_UNKNOWN; - if (!result) - { - return result; - } - - // - // Check Symbol ... - result = StringLen(model.symbol) == 0 ? true : model.symbol == _Symbol; - if (!result) - { - return result; - } - - // - // Check magic number ... - result = model.magicNumber <= 0 ? true : model.magicNumber == magicNumber; - if (!result) - { - return result; - } - - // - // Check Entry ... - result = model.entry > 0; - if (!result) - { - return result; - } - - // - // Check SL ... - result = model.sl == 0 ? true : model.type == X_SIGNAL_LONG ? model.sl < model.entry - : model.sl > model.entry; - if (!result) - { - return result; - } - - // - // Check TP ... - result = model.tp == 0 ? true : model.type == X_SIGNAL_LONG ? model.tp > model.entry - : model.tp < model.entry; - if (!result) - { - return result; - } - - // - // Check Volume ... - result = model.volume > 0; - if (!result) - { - return result; - } - - // - // Check Time ... - result = model.time > 0; - if (!result) - { - return result; - } - - // - return result; -} - -// -void CleanBuffer(int &buffer[]) -{ - // - ArrayFree(buffer); - ArrayResize(buffer, 0); -} -void CleanBuffer(ulong &buffer[]) -{ - // - ArrayFree(buffer); - ArrayResize(buffer, 0); -} -void CleanBuffer(double &buffer[]) -{ - // - ArrayFree(buffer); - ArrayResize(buffer, 0); -} -void CleanBuffer(XSignal &buffer[]) -{ - // - ArrayFree(buffer); - ArrayResize(buffer, 0); -} -void CleanBuffer(XDeal &buffer[]) -{ - // - ArrayFree(buffer); - ArrayResize(buffer, 0); -} -void CleanBuffer(XOrder &buffer[]) -{ - // - ArrayFree(buffer); - ArrayResize(buffer, 0); -} - -// -bool GetLastItem( - double &item, // Holds Result - double &buffer[] // Specified Buffer -) -{ - // - bool result = false; - - // - int bufferSize = ArraySize(buffer); - if (bufferSize <= 0) - { - return result; - } - - // - item = buffer[bufferSize - 1]; - - // - result = true; - return result; -} -bool GetLastItem( - datetime &item, // Holds Result - datetime &buffer[] // Specified Buffer -) -{ - // - bool result = false; - - // - int bufferSize = ArraySize(buffer); - if (bufferSize <= 0) - { - return result; - } - - // - item = buffer[bufferSize - 1]; - - // - result = true; - return result; -} - -// -void Add( - int item, // item want to add - int &buffer[] // Destination buffer -) -{ - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; -} -void Add( - ulong item, // item want to add - ulong &buffer[] // Destination buffer -) -{ - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; -} -void Add( - string item, // item want to add - string &buffer[] // Destination buffer -) -{ - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; -} -void Add( - double item, // item want to add - double &buffer[] // Destination buffer -) -{ - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; -} -void Add( - XOHCL &item, // item want to add - XOHCL &buffer[] // Destination buffer -) -{ - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; -} -void Add( - datetime &item, // item want to add - datetime &buffer[] // Destination buffer -) -{ - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; -} -void Add( - XSignal &item, // item want to add - XSignal &buffer[] // Destination buffer -) -{ - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; -} -void Add( - XDeal &item, // item want to add - XDeal &buffer[] // Destination buffer -) -{ - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; -} -void Add( - XOrder &item, // item want to add - XOrder &buffer[] // Destination buffer -) -{ - // - ArrayResize( - buffer, - ArraySize(buffer) + 1); - - // - buffer[ArraySize(buffer) - 1] = item; -} - -// -// Converts a Buffer to String Representation ... -string ToString( - const int &buffer[], // Specified Buffer - string separator = ",", // Specified Separator - bool addIndex = false, // Specified Add Items Indexes or Not - string indexLabel = "i:", // Specified Index Label - string indexSeparator = ">" // Specified Index Separator - -) -{ - // - string result = ""; - - // - int bufferSize = ArraySize(buffer); - if (bufferSize <= 0) - { - return result; - } - - // - for (int i = 0; i < bufferSize; i++) - { - // - if (addIndex) - { - // - if (StringLen(indexLabel) > 0) - { - result += indexLabel + " "; - } - - // - result += (string)i + " "; - - // - if (StringLen(indexSeparator) > 0) - { - result += indexSeparator + " "; - } - } - - // - string iItemString = (string)buffer[i]; - - // - result += iItemString; - - // - if (i < bufferSize - 1) - { - result += separator; - } - } - - // - return result; -} -string ToString( - const double &buffer[], // Specified Buffer - string separator = ",", // Specified Separator - bool addIndex = false, // Specified Add Items Indexes or Not - string indexLabel = "i:", // Specified Index Label - string indexSeparator = ">" // Specified Index Separator - -) -{ - // - string result = ""; - - // - int bufferSize = ArraySize(buffer); - if (bufferSize <= 0) - { - return result; - } - - // - for (int i = 0; i < bufferSize; i++) - { - // - if (addIndex) - { - // - if (StringLen(indexLabel) > 0) - { - result += indexLabel + " "; - } - - // - result += (string)i + " "; - - // - if (StringLen(indexSeparator) > 0) - { - result += indexSeparator + " "; - } - } - - // - string iItemString = (string)buffer[i]; - - // - result += iItemString; - - // - if (i < bufferSize - 1) - { - result += separator; - } - } - - // - return result; -} -string ToString( - const string &buffer[], // Specified Buffer - string separator = ",", // Specified Separator - bool addIndex = false, // Specified Add Items Indexes or Not - string indexLabel = "i:", // Specified Index Label - string indexSeparator = ">" // Specified Index Separator - -) -{ - // - string result = ""; - - // - int bufferSize = ArraySize(buffer); - if (bufferSize <= 0) - { - return result; - } - - // - for (int i = 0; i < bufferSize; i++) - { - // - if (addIndex) - { - // - if (StringLen(indexLabel) > 0) - { - result += indexLabel + " "; - } - - // - result += (string)i + " "; - - // - if (StringLen(indexSeparator) > 0) - { - result += indexSeparator + " "; - } - } - - // - string iItemString = (string)buffer[i]; - - // - result += iItemString; - - // - if (i < bufferSize - 1) - { - result += separator; - } - } - - // - return result; -} -string ToString( - const datetime &buffer[], // Specified Buffer - string separator = ",", // Specified Separator - bool addIndex = false, // Specified Add Items Indexes or Not - string indexLabel = "i:", // Specified Index Label - string indexSeparator = ">" // Specified Index Separator - -) -{ - // - string result = ""; - - // - int bufferSize = ArraySize(buffer); - if (bufferSize <= 0) - { - return result; - } - - // - for (int i = 0; i < bufferSize; i++) - { - // - if (addIndex) - { - // - if (StringLen(indexLabel) > 0) - { - result += indexLabel + " "; - } - - // - result += (string)i + " "; - - // - if (StringLen(indexSeparator) > 0) - { - result += indexSeparator + " "; - } - } - - // - string iItemString = (string)buffer[i]; - - // - result += iItemString; - - // - if (i < bufferSize - 1) - { - result += separator; - } - } - - // - return result; -} - -// -// Check a Signal is Long or not ... -bool IsLong(ENUM_X_SIGNAL_TYPE type) -{ - return type == X_SIGNAL_LONG; -} -bool IsLong(XSignal &signal) -{ - // - bool result = IsLong(signal.type); - - // - return result; -} - -// -// Check a Signal is Short or not ... -bool IsShort(ENUM_X_SIGNAL_TYPE type) -{ - return type == X_SIGNAL_SHORT; -} -bool IsShort(XSignal &signal) -{ - // - bool result = IsShort(signal.type); - - // - return result; -} - -// -// Retrieve a Signal Type String Value ... -string GetSignalType(ENUM_X_SIGNAL_TYPE type) -{ - // - string result = ""; - - // - if (type == X_SIGNAL_UNKNOWN) - { - return result; - } - - // - result = type == X_SIGNAL_LONG ? "Long" : "Short"; - - // - return result; -} -string GetSignalType(XSignal &signal) -{ - // - string result = ""; - - // - result = GetSignalType(signal.type); - - // - return result; -} -ENUM_X_SIGNAL_TYPE GetSignalType(string typeStr) -{ - // - ENUM_X_SIGNAL_TYPE result = X_SIGNAL_UNKNOWN; - - // - if (typeStr == GetSignalType(X_SIGNAL_LONG)) - { - result = X_SIGNAL_LONG; - } - else if (typeStr == GetSignalType(X_SIGNAL_SHORT)) - { - result = X_SIGNAL_SHORT; - } - - // - return result; -} - -// -// Retrieve Signal Execution String ... -string GetSignalExecutionError(int error) -{ - // - string result = ""; - - // - switch (error) - { - // - case X_TRADER_INVALID_SIGNAL_ERROR: - result = "Invalid Signal ..."; - break; - - // - case X_TRADER_NOT_ENOUGH_EQUITY_ERROR: - result = "Not Enough Equity for Trade ..."; - break; - - // - case X_TRADER_NOT_ENOUGH_BALANCE_ERROR: - result = "Not Enough Balance for Trade ..."; - break; - - // - case X_TRADER_NOT_ENOUGH_MARIGIN_ERROR: - result = "Not Enough Marigin For Trade ..."; - break; - - // - case X_TRADER_MAX_TRADES_REACHED_ERROR: - result = "Max Allowed Trade Reached ..."; - break; - - // - case X_TRADER_UNKNOWN_ERROR: - default: - result = "Unknown Issue ..."; - break; - } - - // - return result; -} - -// -// Extract Data from String ... -string ExtractString( - const string source, // Source String used for Extracting - const string startString, // Expression Start String must be Unique - const string endString // Where to End Extraction, usually a Sign -) -{ - // - string result = ""; - - // - // Validate String ... - if ( - StringLen(source) == 0 || - StringLen(endString) == 0 || - StringLen(startString) == 0) - { - return result; - } - - // - // Find Start String Position ... - int sPos = StringFind( - source, - startString); - if (sPos < 0) - { - return result; - } - - // - // Find End String Position after Start String ... - int searchEndFromPos = sPos + StringLen(startString); - int ePos = StringFind( - source, - endString, - searchEndFromPos); - if (ePos < 0) - { - return result; - } - - // - // Extract Data from Source ... - int dLength = ePos - searchEndFromPos; - result = StringSubstr( - source, - searchEndFromPos, - dLength); - - // - return result; -} - -// -// Normalize a give Volume ... -double NormalizeVolume( - double volume, // desired volume to normalize - string symbol = NULL, // Specified Symbol for Normalization - int mLength = 2 // Length of Digits -) -{ - // - double result = volume; - - // - // Normalize Symbol ... - if (StringLen(symbol) == 0) - { - symbol = _Symbol; - } - - // - // Normalize Digits ... - int digits = GetDigits(symbol); - mLength = - mLength == 0 || mLength > digits - ? digits - : MathMin(mLength, digits); - - // - // Normalize Volume ... - result = NormalizeDouble(result, mLength); - - // - double maxAvailableVolume = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX); - double minAvailableVolume = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN); - - // - // Validate Result ... - if (result > maxAvailableVolume) - { - result = maxAvailableVolume; - } - else if (result < minAvailableVolume) - { - result = minAvailableVolume; - } - - // - return result; -} - -// -// Normallize Price ... -double NormalizePrice( - double price, // desired Price for normalization - string symbol = NULL // Specified Symbol for Normalization -) -{ - // - double result = 0; - - // - // Mormalize Symbol ... - if (StringLen(symbol) == 0) - { - symbol = _Symbol; - } - - // - int digits = GetDigits(symbol); - result = NormalizeDouble(price, digits); - - // - return result; -} - -// -// Error Descriptions Functions ... -// - -// -// Retrieve Specified Error Code Description ... -string GetErrorDescription(int err_code) -{ - // - string result = ""; - - // - switch (err_code) - { - // - //--- Constant Description - - // - case ERR_SUCCESS: - result = "The operation completed successfully"; - break; - - // - case ERR_INTERNAL_ERROR: - result = "Unexpected internal error"; - break; - - // - case ERR_WRONG_INTERNAL_PARAMETER: - result = "Wrong parameter in the inner call of the client terminal function"; - break; - - // - case ERR_INVALID_PARAMETER: - result = "Wrong parameter when calling the system function"; - break; - - // - case ERR_NOT_ENOUGH_MEMORY: - result = "Not enough memory to perform the system function"; - break; - - // - case ERR_STRUCT_WITHOBJECTS_ORCLASS: - result = "The structure contains objects of strings and/or dynamic arrays and/or structure of such objects and/or classes"; - break; - - // - case ERR_INVALID_ARRAY: - result = "Array of a wrong type, wrong size, or a damaged object of a dynamic array"; - break; - - // - case ERR_ARRAY_RESIZE_ERROR: - result = "Not enough memory for the relocation of an array, or an attempt to change the size of a static array"; - break; - - // - case ERR_STRING_RESIZE_ERROR: - result = "Not enough memory for the relocation of string"; - break; - - // - case ERR_NOTINITIALIZED_STRING: - result = "Not initialized string"; - break; - - // - case ERR_INVALID_DATETIME: - result = "Invalid date and/or time"; - break; - - // - case ERR_ARRAY_BAD_SIZE: - result = "Requested array size exceeds 2 GB"; - break; - - // - case ERR_INVALID_POINTER: - result = "Wrong pointer"; - break; - - // - case ERR_INVALID_POINTER_TYPE: - result = "Wrong type of pointer"; - break; - - // - case ERR_FUNCTION_NOT_ALLOWED: - result = "System function is not allowed to call"; - break; - - // - //--- Charts - - // - case ERR_CHART_WRONG_ID: - result = "Wrong chart ID"; - break; - - // - case ERR_CHART_NO_REPLY: - result = "Chart does not respond"; - break; - - // - case ERR_CHART_NOT_FOUND: - result = "Chart not found"; - break; - - // - case ERR_CHART_NO_EXPERT: - result = "No Expert Advisor in the chart that could handle the event"; - break; - - // - case ERR_CHART_CANNOT_OPEN: - result = "Chart opening error"; - break; - - // - case ERR_CHART_CANNOT_CHANGE: - result = "Failed to change chart symbol and period"; - break; - - // - case ERR_CHART_CANNOT_CREATE_TIMER: - result = "Failed to create timer"; - break; - - // - case ERR_CHART_WRONG_PROPERTY: - result = "Wrong chart property ID"; - break; - - // - case ERR_CHART_SCREENSHOT_FAILED: - result = "Error creating screenshots"; - break; - - // - case ERR_CHART_NAVIGATE_FAILED: - result = "Error navigating through chart"; - break; - - // - case ERR_CHART_TEMPLATE_FAILED: - result = "Error applying template"; - break; - - // - case ERR_CHART_WINDOW_NOT_FOUND: - result = "Subwindow containing the indicator was not found"; - break; - - // - case ERR_CHART_INDICATOR_CANNOT_ADD: - result = "Error adding an indicator to chart"; - break; - - // - case ERR_CHART_INDICATOR_CANNOT_DEL: - result = "Error deleting an indicator from the chart"; - break; - - // - case ERR_CHART_INDICATOR_NOT_FOUND: - result = "Indicator not found on the specified chart"; - break; - - // - //--- Graphical Objects - case ERR_OBJECT_ERROR: - result = "Error working with a graphical object"; - break; - - // - case ERR_OBJECT_NOT_FOUND: - result = "Graphical object was not found"; - break; - - // - case ERR_OBJECT_WRONG_PROPERTY: - result = "Wrong ID of a graphical object property"; - break; - - // - case ERR_OBJECT_GETDATE_FAILED: - result = "Unable to get date corresponding to the value"; - break; - - // - case ERR_OBJECT_GETVALUE_FAILED: - result = "Unable to get value corresponding to the date"; - break; - - // - //--- MarketInfo - - // - case ERR_MARKET_UNKNOWN_SYMBOL: - result = "Unknown symbol"; - break; - - // - case ERR_MARKET_NOT_SELECTED: - result = "Symbol is not selected in MarketWatch"; - break; - - // - case ERR_MARKET_WRONG_PROPERTY: - result = "Wrong identifier of a symbol property"; - break; - - // - case ERR_MARKET_LASTTIME_UNKNOWN: - result = "Time of the last tick is not known (no ticks)"; - break; - - // - case ERR_MARKET_SELECT_ERROR: - result = "Error adding or deleting a symbol in MarketWatch"; - break; - - // - //--- History Access - - // - case ERR_HISTORY_NOT_FOUND: - result = "Requested history not found"; - break; - - // - case ERR_HISTORY_WRONG_PROPERTY: - result = "Wrong ID of the history property"; - break; - - // - //--- Global_Variables - - // - case ERR_GLOBALVARIABLE_NOT_FOUND: - result = "Global variable of the client terminal is not found"; - break; - - // - case ERR_GLOBALVARIABLE_EXISTS: - result = "Global variable of the client terminal with the same name already exists"; - break; - - // - case ERR_MAIL_SEND_FAILED: - result = "Email sending failed"; - break; - - // - case ERR_PLAY_SOUND_FAILED: - result = "Sound playing failed"; - break; - - // - case ERR_MQL5_WRONG_PROPERTY: - result = "Wrong identifier of the program property"; - break; - - // - case ERR_TERMINAL_WRONG_PROPERTY: - result = "Wrong identifier of the terminal property"; - break; - - // - case ERR_FTP_SEND_FAILED: - result = "File sending via ftp failed"; - break; - - // - case ERR_NOTIFICATION_SEND_FAILED: - result = "Error in sending notification"; - break; - - // - //--- Custom Indicator Buffers - - // - case ERR_BUFFERS_NO_MEMORY: - result = "Not enough memory for the distribution of indicator buffers"; - break; - - // - case ERR_BUFFERS_WRONG_INDEX: - result = "Wrong indicator buffer index"; - break; - - // - //--- Custom Indicator Properties - - // - case ERR_CUSTOM_WRONG_PROPERTY: - result = "Wrong ID of the custom indicator property"; - break; - - // - //--- Account - - // - case ERR_ACCOUNT_WRONG_PROPERTY: - result = "Wrong account property ID"; - break; - - // - case ERR_TRADE_WRONG_PROPERTY: - result = "Wrong trade property ID"; - break; - - // - case ERR_TRADE_DISABLED: - result = "Trading by Expert Advisors prohibited"; - break; - - // - case ERR_TRADE_POSITION_NOT_FOUND: - result = "Position not found"; - break; - - // - case ERR_TRADE_ORDER_NOT_FOUND: - result = "Order not found"; - break; - - // - case ERR_TRADE_DEAL_NOT_FOUND: - result = "Deal not found"; - break; - - // - case ERR_TRADE_SEND_FAILED: - result = "Trade request sending failed"; - break; - - // - //--- Indicators - - // - case ERR_INDICATOR_UNKNOWN_SYMBOL: - result = "Unknown symbol"; - break; - - // - case ERR_INDICATOR_CANNOT_CREATE: - result = "Indicator cannot be created"; - break; - - // - case ERR_INDICATOR_NO_MEMORY: - result = "Not enough memory to add the indicator"; - break; - - // - case ERR_INDICATOR_CANNOT_APPLY: - result = "The indicator cannot be applied to another indicator"; - break; - - // - case ERR_INDICATOR_CANNOT_ADD: - result = "Error applying an indicator to chart"; - break; - - // - case ERR_INDICATOR_DATA_NOT_FOUND: - result = "Requested data not found"; - break; - - // - case ERR_INDICATOR_WRONG_HANDLE: - result = "Wrong indicator handle"; - break; - - // - case ERR_INDICATOR_WRONG_PARAMETERS: - result = "Wrong number of parameters when creating an indicator"; - break; - - // - case ERR_INDICATOR_PARAMETERS_MISSING: - result = "No parameters when creating an indicator"; - break; - - // - case ERR_INDICATOR_CUSTOM_NAME: - result = "The first parameter in the array must be the name of the custom indicator"; - break; - - // - case ERR_INDICATOR_PARAMETER_TYPE: - result = "Invalid parameter type in the array when creating an indicator"; - break; - - // - case ERR_INDICATOR_WRONG_INDEX: - result = "Wrong index of the requested indicator buffer"; - break; - - // - //--- Depth of Market - - // - case ERR_BOOKS_CANNOT_ADD: - result = "Depth Of Market can not be added"; - break; - - // - case ERR_BOOKS_CANNOT_DELETE: - result = "Depth Of Market can not be removed"; - break; - - // - case ERR_BOOKS_CANNOT_GET: - result = "The data from Depth Of Market can not be obtained"; - break; - - // - case ERR_BOOKS_CANNOT_SUBSCRIBE: - result = "Error in subscribing to receive new data from Depth Of Market"; - break; - - // - //--- File Operations - - // - case ERR_TOO_MANY_FILES: - result = "More than 64 files cannot be opened at the same time"; - break; - - // - case ERR_WRONG_FILENAME: - result = "Invalid file name"; - break; - - // - case ERR_TOO_LONG_FILENAME: - result = "Too long file name"; - break; - - // - case ERR_CANNOT_OPEN_FILE: - result = "File opening error"; - break; - - // - case ERR_FILE_CACHEBUFFER_ERROR: - result = "Not enough memory for cache to read"; - break; - - // - case ERR_CANNOT_DELETE_FILE: - result = "File deleting error"; - break; - - // - case ERR_INVALID_FILEHANDLE: - result = "A file with this handle was closed, or was not opening at all"; - break; - - // - case ERR_WRONG_FILEHANDLE: - result = "Wrong file handle"; - break; - - // - case ERR_FILE_NOTTOWRITE: - result = "The file must be opened for writing"; - break; - - // - case ERR_FILE_NOTTOREAD: - result = "The file must be opened for reading"; - break; - - // - case ERR_FILE_NOTBIN: - result = "The file must be opened as a binary one"; - break; - - // - case ERR_FILE_NOTTXT: - result = "The file must be opened as a text"; - break; - - // - case ERR_FILE_NOTTXTORCSV: - result = "The file must be opened as a text or CSV"; - break; - - // - case ERR_FILE_NOTCSV: - result = "The file must be opened as CSV"; - break; - - // - case ERR_FILE_READERROR: - result = "File reading error"; - break; - - // - case ERR_FILE_BINSTRINGSIZE: - result = "String size must be specified, because the file is opened as binary"; - break; - - // - case ERR_INCOMPATIBLE_FILE: - result = "A text file must be for string arrays, for other arrays - binary"; - break; - - // - case ERR_FILE_IS_DIRECTORY: - result = "This is not a file, this is a directory"; - break; - - // - case ERR_FILE_NOT_EXIST: - result = "File does not exist"; - break; - - // - case ERR_FILE_CANNOT_REWRITE: - result = "File can not be rewritten"; - break; - - // - case ERR_WRONG_DIRECTORYNAME: - result = "Wrong directory name"; - break; - - // - case ERR_DIRECTORY_NOT_EXIST: - result = "Directory does not exist"; - break; - - // - case ERR_FILE_ISNOT_DIRECTORY: - result = "This is a file, not a directory"; - break; - - // - case ERR_CANNOT_DELETE_DIRECTORY: - result = "The directory cannot be removed"; - break; - - // - case ERR_CANNOT_CLEAN_DIRECTORY: - result = "Failed to clear the directory (probably one or more files are blocked and removal operation failed)"; - break; - - // - case ERR_FILE_WRITEERROR: - result = "Failed to write a resource to a file"; - break; - - // - //--- String Casting - - // - case ERR_NO_STRING_DATE: - result = "No date in the string"; - break; - - // - case ERR_WRONG_STRING_DATE: - result = "Wrong date in the string"; - break; - - // - case ERR_WRONG_STRING_TIME: - result = "Wrong time in the string"; - break; - - // - case ERR_STRING_TIME_ERROR: - result = "Error converting string to date"; - break; - - // - case ERR_STRING_OUT_OF_MEMORY: - result = "Not enough memory for the string"; - break; - - // - case ERR_STRING_SMALL_LEN: - result = "The string length is less than expected"; - break; - - // - case ERR_STRING_TOO_BIGNUMBER: - result = "Too large number, more than ULONG_MAX"; - break; - - // - case ERR_WRONG_FORMATSTRING: - result = "Invalid format string"; - break; - - // - case ERR_TOO_MANY_FORMATTERS: - result = "Amount of format specifiers more than the parameters"; - break; - - // - case ERR_TOO_MANY_PARAMETERS: - result = "Amount of parameters more than the format specifiers"; - break; - - // - case ERR_WRONG_STRING_PARAMETER: - result = "Damaged parameter of string type"; - break; - - // - case ERR_STRINGPOS_OUTOFRANGE: - result = "Position outside the string"; - break; - - // - case ERR_STRING_ZEROADDED: - result = "0 added to the string end, a useless operation"; - break; - - // - case ERR_STRING_UNKNOWNTYPE: - result = "Unknown data type when converting to a string"; - break; - - // - case ERR_WRONG_STRING_OBJECT: - result = "Damaged string object"; - break; - - // - //--- Operations with Arrays - - // - case ERR_INCOMPATIBLE_ARRAYS: - result = "Copying incompatible arrays. String array can be copied only to a string array, and a numeric array - in numeric array only"; - break; - - // - case ERR_SMALL_ASSERIES_ARRAY: - result = "The receiving array is declared as AS_SERIES, and it is of insufficient size"; - break; - - // - case ERR_SMALL_ARRAY: - result = "Too small array, the starting position is outside the array"; - break; - - // - case ERR_ZEROSIZE_ARRAY: - result = "An array of zero length"; - break; - - // - case ERR_NUMBER_ARRAYS_ONLY: - result = "Must be a numeric array"; - break; - - // - case ERR_ONEDIM_ARRAYS_ONLY: - result = "Must be a one-dimensional array"; - break; - - // - case ERR_SERIES_ARRAY: - result = "Timeseries cannot be used"; - break; - - // - case ERR_DOUBLE_ARRAY_ONLY: - result = "Must be an array of type double"; - break; - - // - case ERR_FLOAT_ARRAY_ONLY: - result = "Must be an array of type float"; - break; - - // - case ERR_LONG_ARRAY_ONLY: - result = "Must be an array of type long"; - break; - - // - case ERR_INT_ARRAY_ONLY: - result = "Must be an array of type int"; - break; - - // - case ERR_SHORT_ARRAY_ONLY: - result = "Must be an array of type short"; - break; - - // - case ERR_CHAR_ARRAY_ONLY: - result = "Must be an array of type char"; - break; - - // - //--- Operations with OpenCL - - // - case ERR_OPENCL_NOT_SUPPORTED: - result = "OpenCL functions are not supported on this computer"; - break; - - // - case ERR_OPENCL_INTERNAL: - result = "Internal error occurred when running OpenCL"; - break; - - // - case ERR_OPENCL_INVALID_HANDLE: - result = "Invalid OpenCL handle"; - break; - - // - case ERR_OPENCL_CONTEXT_CREATE: - result = "Error creating the OpenCL context"; - break; - - // - case ERR_OPENCL_QUEUE_CREATE: - result = "Failed to create a run queue in OpenCL"; - break; - - // - case ERR_OPENCL_PROGRAM_CREATE: - result = "Error occurred when compiling an OpenCL program"; - break; - - // - case ERR_OPENCL_TOO_LONG_KERNEL_NAME: - result = "Too long kernel name (OpenCL kernel)"; - break; - - // - case ERR_OPENCL_KERNEL_CREATE: - result = "Error creating an OpenCL kernel"; - break; - - // - case ERR_OPENCL_SET_KERNEL_PARAMETER: - result = "Error occurred when setting parameters for the OpenCL kernel"; - break; - - // - case ERR_OPENCL_EXECUTE: - result = "OpenCL program runtime error"; - break; - - // - case ERR_OPENCL_WRONG_BUFFER_SIZE: - result = "Invalid size of the OpenCL buffer"; - break; - - // - case ERR_OPENCL_WRONG_BUFFER_OFFSET: - result = "Invalid offset in the OpenCL buffer"; - break; - - // - case ERR_OPENCL_BUFFER_CREATE: - result = "Failed to create and OpenCL buffer"; - break; - - // - //--- User-Defined Errors - default: - result = "UNKNOWN Erro ..."; - break; - } - - // - return result; -} - -// -// Retrieve Specified Error Code Description ... -string GetTradeServerReturnCodeDescription(int return_code) -{ - // - string result = ""; - - // - switch (return_code) - { - // - case TRADE_RETCODE_REQUOTE: - result = "Requote"; - break; - - // - case TRADE_RETCODE_REJECT: - result = "Request rejected"; - break; - - // - case TRADE_RETCODE_CANCEL: - result = "Request canceled by trader"; - break; - - // - case TRADE_RETCODE_PLACED: - result = "Order placed"; - break; - - // - case TRADE_RETCODE_DONE: - result = "Request completed"; - break; - - // - case TRADE_RETCODE_DONE_PARTIAL: - result = "Only part of the request was completed"; - break; - - // - case TRADE_RETCODE_ERROR: - result = "Request processing error"; - break; - - // - case TRADE_RETCODE_TIMEOUT: - result = "Request canceled by timeout"; - break; - - // - case TRADE_RETCODE_INVALID: - result = "Invalid request"; - break; - - // - case TRADE_RETCODE_INVALID_VOLUME: - result = "Invalid volume in the request"; - break; - - // - case TRADE_RETCODE_INVALID_PRICE: - result = "Invalid price in the request"; - break; - - // - case TRADE_RETCODE_INVALID_STOPS: - result = "Invalid stops in the request"; - break; - - // - case TRADE_RETCODE_TRADE_DISABLED: - result = "Trade is disabled"; - break; - - // - case TRADE_RETCODE_MARKET_CLOSED: - result = "Market is closed"; - break; - - // - case TRADE_RETCODE_NO_MONEY: - result = "There is not enough money to complete the request"; - break; - - // - case TRADE_RETCODE_PRICE_CHANGED: - result = "Prices changed"; - break; - - // - case TRADE_RETCODE_PRICE_OFF: - result = "There are no quotes to process the request"; - break; - - // - case TRADE_RETCODE_INVALID_EXPIRATION: - result = "Invalid order expiration date in the request"; - break; - - // - case TRADE_RETCODE_ORDER_CHANGED: - result = "Order state changed"; - break; - - // - case TRADE_RETCODE_TOO_MANY_REQUESTS: - result = "Too frequent requests"; - break; - - // - case TRADE_RETCODE_NO_CHANGES: - result = "No changes in request"; - break; - - // - case TRADE_RETCODE_SERVER_DISABLES_AT: - result = "Autotrading disabled by server"; - break; - - // - case TRADE_RETCODE_CLIENT_DISABLES_AT: - result = "Autotrading disabled by client terminal"; - break; - - // - case TRADE_RETCODE_LOCKED: - result = "Request locked for processing"; - break; - - // - case TRADE_RETCODE_FROZEN: - result = "Order or position frozen"; - break; - - // - case TRADE_RETCODE_INVALID_FILL: - result = "Invalid order filling type"; - break; - - // - case TRADE_RETCODE_CONNECTION: - result = "No connection with the trade server"; - break; - - // - case TRADE_RETCODE_ONLY_REAL: - result = "Operation is allowed only for live accounts"; - break; - - // - case TRADE_RETCODE_LIMIT_ORDERS: - result = "The number of pending orders has reached the limit"; - break; - - // - case TRADE_RETCODE_LIMIT_VOLUME: - result = "The volume of orders and positions for the symbol has reached the limit"; - break; - - // - default: - result = "Invalid return code of the trade server"; - break; - } - - // - return result; -} - -// -// Check Expert Running in Testing Mode or not ... -bool IsRunningOnTestMode() -{ - // - bool result = false; - - // - // check programm mode ... - result = MQL5InfoInteger(MQL5_TESTING); - - // - return result; -} - -// -// Date Time Manipulation Functions ... -// - -// -// Representation of Time Struct ... -// struct MqlDateTime -// { -// int year; // Year -// int mon; // Month -// int day; // Day -// int hour; // Hour -// int min; // Minutes -// int sec; // Seconds -// int day_of_week; // Day of week (0-Sunday, 1-Monday, ... ,6-Saturday) -// int day_of_year; // Day number of the year (January 1st is assigned the number value of zero) -// }; - -// -// Converts Time to Seconds ... -ulong TimeToSeconds( - datetime time // Specify time to Convert ... -) -{ - // - ulong result = (ulong)time; - - // - return result; -} -ulong TimeToSeconds( - MqlDateTime &time // Specify time to Convert ... -) -{ - // - datetime dTime = StructToTime(time); - - // - ulong result = TimeToSeconds(dTime); - - // - return result; -} - -// -// Converts Seconds To Time ... -datetime SecondsToTime( - ulong seconds // Specify Seconds to Convert ... -) -{ - // - datetime result = (datetime)seconds; - - // - return result; -} -MqlDateTime SecondsToStruct( - ulong seconds // Specify Seconds to Convert ... -) -{ - // - datetime dTime = SecondsToTime(seconds); - - // - MqlDateTime result = {}; - TimeToStruct( - dTime, - result); - - // - return result; -} - -// -// Converts Time to MilliSeconds ... -ulong TimeToMilliSeconds( - datetime time // Specify time to Convert ... -) -{ - // - ulong result = TimeToSeconds(time) * 1000; - - // - return result; -} -ulong TimeToMilliSeconds( - MqlDateTime &time // Specify time to Convert ... -) -{ - // - datetime dTime = StructToTime(time); - - // - ulong result = TimeToMilliSeconds(dTime); - - // - return result; -} - -// -// Converts MillisSeconds to Time ... -datetime MilliSecondsToTiem( - ulong milliSeconds // Specify MilliSeconds to Convert ... -) -{ - // - ulong seconds = milliSeconds / 1000; - - // - datetime result = SecondsToTime(seconds); - - // - return result; -} -MqlDateTime MilliSecondsToStruct( - ulong milliSeconds // Specify MilliSeconds to Convert ... -) -{ - // - datetime dTime = MilliSecondsToTiem(milliSeconds); - - // - MqlDateTime result = {}; - TimeToStruct( - dTime, - result); - - // - return result; -} - -// -// Retrieve DateTime Structure ... -MqlDateTime GetCurrentTime() -{ - // - MqlDateTime result = {}; - - // - TimeCurrent(result); - - // - return result; -} - -// -// Retrieve Current Time as Seconds ... -ulong GetCurrentTimeAsSeconds() -{ - // - datetime time = TimeCurrent(); - - // - ulong result = TimeToSeconds(time); - - // - return result; -} - -// -// Retrieve Current Time as MilliSeconds ... -ulong GetCurrentTimeAsMilliSeconds() -{ - // - datetime time = TimeCurrent(); - - // - ulong result = TimeToMilliSeconds(time); - - // - return result; -} - -// -// Retrieve Specified Candle Time ... -datetime GetCandleTime( - string symbol = "", // Specify Symbol - ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame - int bar_index = 0 // Specify Bar Index -) -{ - // - // Validate and Normalize Args ... - - // - // Normalize Symbol ... - symbol = StringLen(symbol) == 0 - ? _Symbol - : symbol; - - // - // Normalize Period ... - period = period == NULL - ? _Period - : period; - - // - // Retrieve Bar Time ... - datetime result = iTime( - symbol, - period, - bar_index); - - // - return result; -} - -// -// Retrieve Specified Candle Time ... -ulong GetCandleTimeAsSeconds( - string symbol = "", // Specify Symbol - ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame - int bar_index = 0 // Specify Bar Index -) -{ - // - // Retrieve Bar Time ... - datetime time = GetCandleTime( - symbol, - period, - bar_index); - - // - ulong result = TimeToSeconds(time); - - // - return result; -} - -// -// Retrieve Specified Candle Time ... -ulong GetCandleTimeAsMilliSeconds( - string symbol = "", // Specify Symbol - ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame - int bar_index = 0 // Specify Bar Index -) -{ - // - // Retrieve Bar Time ... - datetime time = GetCandleTime( - symbol, - period, - bar_index); - - // - ulong result = TimeToMilliSeconds(time); - - // - return result; -} - -// -// Retrieve a Candle Time Structure ... -MqlDateTime GetCandleTimeStruct( - string symbol = "", // Specify Symbol - ENUM_TIMEFRAMES period = NULL, // Specify TimeFrame - int bar_index = 0 // Specify Bar Index -) -{ - // - MqlDateTime result = {}; - - // - // Retrieve Bar Time ... - datetime barTime = GetCandleTime( - symbol, - period, - bar_index); - - // - // Convert to Structure ... - TimeToStruct(barTime, result); - - // - return result; -} - -// -// -// - -// -// Holds Month ... -static int xMonth = -1; - -// -// Holds Day Of Week ... -static int xDayOfWeek = -1; -static int xForWeekDay = -1; - -// -// Holds Day ... -static int xDay = -1; - -// -// Holds Hour ... -static int xHour = -1; - -// -// Reset Timing Variables ... -void ResetTiming() -{ - // - xHour = -1; - xDay = -1; - xDayOfWeek = -1; - xMonth = -1; -} - -// -// Detecting New Houre ... -bool IsNewHour() -{ - // - bool result = false; - - // - // Retrieve Current Time as Struct ... - MqlDateTime timeStruct = GetCurrentTime(); - - // - // Check Houre ... - result = timeStruct.hour != xHour; - if (result) - { - xHour = timeStruct.hour; - } - - // - return result; -} - -// -// Detecting New Day ... -bool IsNewDay() -{ - // - bool result = false; - - // - // Retrieve Current Time as Struct ... - MqlDateTime timeStruct = GetCurrentTime(); - - // - // Check Houre ... - result = timeStruct.day_of_year != xDay; - if (result) - { - xDay = timeStruct.day_of_year; - } - - // - return result; -} - -// -// Detecting New Week ... -bool IsNewWeek() -{ - // - bool result = false; - - // - // Retrieve Current Time as Struct ... - MqlDateTime timeStruct = GetCurrentTime(); - - // - // Check Week ... - // Since Week Starts From Monday in Forex World ... - // we Calculate Start of Week by 1-Monday ... - result = - xDayOfWeek == -1 && - xForWeekDay == -1 - ? true - : timeStruct.day_of_week == 1 && - timeStruct.day_of_year > xForWeekDay; - - // - xForWeekDay = timeStruct.day_of_year; - xDayOfWeek = timeStruct.day_of_week; - - // - return result; -} - -// -// Detecting End Of Week ... -bool IsWeekEnd() -{ - // - bool result = false; - - // - // Retrieve Current Time as Struct ... - MqlDateTime timeStruct = GetCurrentTime(); - - // - // Check WeekEnd ... - // Since Week Starts From Monday in Forex World ... - // we Calculate End of Week by 5-Friday ... - result = - xDayOfWeek != -1 && - timeStruct.day_of_week == 5 && - timeStruct.hour == 23 && - timeStruct.min == 59 && - timeStruct.sec == 59; - - // - return result; -} - -// -// Detecting New Month ... -bool IsNewMonth() -{ - // - bool result = false; - - // - // Retrieve Current Time as Struct ... - MqlDateTime timeStruct = GetCurrentTime(); - - // - // Check Houre ... - result = timeStruct.mon != xMonth; - if (result) - { - xMonth = timeStruct.mon; - } - - // - return result; -} - -// -// Find Farest Time Frame ... -ENUM_TIMEFRAMES GetFarestTimeFrame( - ENUM_TIMEFRAMES mPeriod // Specified Period -) -{ - // - ENUM_TIMEFRAMES result = NULL; - - // - // Normalize Period ... - if ( - mPeriod < 0 || - mPeriod == NULL) - { - mPeriod = _Period; - } - - // - switch (mPeriod) - { - // - case PERIOD_M1: - case PERIOD_M2: - case PERIOD_M3: - case PERIOD_M4: - case PERIOD_M5: - case PERIOD_M6: - case PERIOD_M10: - case PERIOD_M12: - case PERIOD_M15: - case PERIOD_M20: - case PERIOD_M30: - result = PERIOD_H4; - break; - - // - case PERIOD_H1: - case PERIOD_H2: - case PERIOD_H3: - case PERIOD_H4: - result = PERIOD_H12; - break; - - // - case PERIOD_H6: - case PERIOD_H8: - case PERIOD_H12: - case PERIOD_D1: - result = PERIOD_W1; - break; - - // - default: - result = PERIOD_MN1; - break; - } - - // - return result; -} - -// -// Find Medium Time Frame ... -ENUM_TIMEFRAMES GetMediestTimeFrame( - ENUM_TIMEFRAMES mPeriod // Specified Period -) -{ - // - ENUM_TIMEFRAMES result = NULL; - - // - // Normalize Period ... - if ( - mPeriod < 0 || - mPeriod == NULL) - { - mPeriod = _Period; - } - - // - switch (mPeriod) - { - // - case PERIOD_M1: - case PERIOD_M2: - case PERIOD_M3: - case PERIOD_M4: - case PERIOD_M5: - case PERIOD_M6: - case PERIOD_M10: - case PERIOD_M12: - case PERIOD_M15: - case PERIOD_M20: - result = PERIOD_H1; - break; - - // - case PERIOD_M30: - result = PERIOD_H2; - break; - - // - case PERIOD_H1: - case PERIOD_H2: - case PERIOD_H3: - result = PERIOD_H4; - break; - - // - case PERIOD_H4: - case PERIOD_H6: - case PERIOD_H8: - result = PERIOD_H12; - break; - - // - case PERIOD_H12: - result = PERIOD_D1; - break; - - // - case PERIOD_D1: - result = PERIOD_W1; - break; - - // - case PERIOD_W1: - result = PERIOD_MN1; - break; - - // - default: - result = PERIOD_MN1; - break; - } - - // - return result; -} - -// -// Find Nearest Time Frame ... -ENUM_TIMEFRAMES GetNearestTimeFrame( - ENUM_TIMEFRAMES mPeriod // Specified Period -) -{ - // - ENUM_TIMEFRAMES result = NULL; - - // - // Normalize Period ... - if ( - mPeriod < 0 || - mPeriod == NULL) - { - mPeriod = _Period; - } - - // - switch (mPeriod) - { - // - case PERIOD_M1: - case PERIOD_M2: - case PERIOD_M3: - case PERIOD_M4: - result = PERIOD_M5; - break; - - // - case PERIOD_M5: - case PERIOD_M6: - case PERIOD_M10: - case PERIOD_M12: - result = PERIOD_M15; - break; - - // - case PERIOD_M15: - case PERIOD_M20: - result = PERIOD_M30; - break; - - // - case PERIOD_M30: - result = PERIOD_H1; - break; - - // - case PERIOD_H1: - case PERIOD_H2: - case PERIOD_H3: - result = PERIOD_H4; - break; - - // - case PERIOD_H4: - case PERIOD_H6: - case PERIOD_H8: - result = PERIOD_H12; - break; - - // - case PERIOD_H12: - result = PERIOD_D1; - break; - - // - case PERIOD_D1: - result = PERIOD_W1; - break; - - // - case PERIOD_W1: - result = PERIOD_MN1; - break; - - // - default: - result = PERIOD_MN1; - break; - } - - // - return result; -} - -// -// Get Specific Time Frame Start Candle Time ... -datetime GetPeriodStartTime( - string mSymbol = NULL, // Specified Symbol ... - ENUM_TIMEFRAMES mPeriod = NULL, // Specified Period ... - datetime mTime = NULL // Specified Bar Time ... -) -{ - // - // Normalize Arg ... - - // - if ( - mSymbol == NULL || - StringLen(mSymbol) == 0) - { - mSymbol = _Symbol; - } - - // - if ( - mPeriod < 0 || - mPeriod == NULL) - { - mPeriod = _Period; - } - - // - if ( - mTime < 0 || - mTime == NULL) - { - mTime = TimeCurrent(); - } - - // - int barIndex = iBarShift( - mSymbol, - mPeriod, - mTime, - false); - - // - datetime result = iTime( - mSymbol, - mPeriod, - barIndex); - - // - return result; -} - -// -// END Provided Functions ... -// diff --git a/BKP/XAU5-0.43/Libraries/x-saherelm.draw.lib.mq5 b/BKP/XAU5-0.43/Libraries/x-saherelm.draw.lib.mq5 deleted file mode 100644 index ece98c83..00000000 --- a/BKP/XAU5-0.43/Libraries/x-saherelm.draw.lib.mq5 +++ /dev/null @@ -1,2345 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Draw Library -// -------------------------------------- -// Name: XDraw -// Description: provides Draw abilities ... -// -// -// 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 - -// -// START Inputs ... -// -// -// END Inputs ... -// - -// -// Include Logger Library ... -#include "x-saherelm.log.lib.mq5" -#include "x-saherelm.common.lib.mq5" - -// -// START Global Definitions: Variables, Properties and etc ... -// -string drawPrefix = "X-OBJ"; -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Provided Functions ... -// -// -// DeInitial Library if required ... -void OnDeinitDrawLibrary() -{ - RemoveDraws(); -} - -// -void DrawSignalShape( - XSignal &signal, // Specify Signal to Draw - color longColor = clrAqua, // Long Signals Color - color shortColor = clrFuchsia, // Short Signal Color - color entryColor = clrGold // Signal Entry Price Color -) -{ - // - // Draw Signal Info : - // - Draw Entry Price Line; - // - Draw SL; - // - Draw TP; - // - Risk Free; - - // - bool isLong = signal.type == X_SIGNAL_LONG; - - // - color tpColor = longColor; - color slColor = shortColor; - - // - string name = "T(" + (string)signal.ticket + ")" + "_" + "TY(" + EnumToString(signal.type) + ")"; - - // - string tpName = "TP_" + name; - if (IsDrawExists(tpName)) - { - RemoveDraw(tpName); - } - - // - string slName = "SL_" + name; - if (IsDrawExists(slName)) - { - RemoveDraw(slName); - } - - // - string riskFreeName = "RF_" + name; - if (IsDrawExists(riskFreeName)) - { - RemoveDraw(riskFreeName); - } - - // - string entryName = "Entry_" + name; - if (IsDrawExists(entryName)) - { - RemoveDraw(entryName); - } - - // - string vlName = "Time_" + name; - if (IsDrawExists(vlName)) - { - RemoveDraw(vlName); - } - - // - int signalBarIndex = iBarShift( - signal.symbol, - _Period, - signal.time); - - // - datetime time1 = iTime( - signal.symbol, - _Period, - signalBarIndex + 1); - datetime time2 = iTime( - signal.symbol, - _Period, - signalBarIndex - 1); - - // - // Entry ... - bool isTrendLineDrawn = DrawTrendLine( - 0, - entryName, - 0, - time1, - signal.entry, - time2, - signal.entry, - entryColor); - - // - // TP ... - bool isTPDrawn = false; - if (signal.tp > 0) - { - // - isTPDrawn = DrawTrendLine( - 0, - tpName, - 0, - time1, - signal.tp, - time2, - signal.tp, - tpColor, - STYLE_SOLID, - 1, - false, - true); - } - - // - // RISKFREE ... - bool isRFDrawn = false; - if (signal.riskFreeStep > 0) - { - // - double firstStepPrice = isLong ? signal.entry + PipsToPrice(signal.riskFreeStep) - : signal.entry - PipsToPrice(signal.riskFreeStep); - - // - isRFDrawn = DrawTrendLine( - 0, - riskFreeName, - 0, - time1, - firstStepPrice, - time2, - firstStepPrice, - tpColor, - STYLE_DOT, - 1, - false, - true); - } - - // - // SL ... - bool isSLDrawn = false; - if (signal.sl > 0) - { - // - isSLDrawn = DrawTrendLine( - 0, - slName, - 0, - time1, - signal.sl, - time2, - signal.sl, - slColor, - STYLE_SOLID, - 1, - false, - true); - } - - // - // Draw a Vertical Line ... - bool isVerticalLineDrawn = DrawVerticalLine( - 0, - vlName, - 0, - signal.time, - slColor); -} - -// -// remove drawn objects ... -void RemoveDraws( - string tag = NULL, - int chartId = -1, - int subWindow = -1) -{ - // - // Normalize Args ... - // - if (tag == NULL) - { - tag = drawPrefix; - } - - // - if (chartId == -1) - { - chartId = 0; - } - - // - if (subWindow == -1) - { - subWindow = 0; - } - - // - for (int iObj = ObjectsTotal(chartId, subWindow) - 1; iObj >= 0; iObj--) - { - // - string on = ObjectName(chartId, iObj, subWindow); - if (StringFind(on, tag) >= 0) - { - ObjectDelete(chartId, on); - } - } - - // - // Redraw Chart ... - ChartRedraw(); -} - -// -bool RemoveDraw( - string name, - int chartId = -1, - int subWindow = -1) -{ - // - bool result = false; - - // - if (chartId == -1) - { - chartId = 0; - } - - // - if (subWindow == -1) - { - subWindow = 0; - } - - // - string objName = ""; - for (int iObj = ObjectsTotal(chartId, subWindow) - 1; iObj >= 0; iObj--) - { - // - string on = ObjectName(chartId, iObj, subWindow); - if (StringFind(on, name) >= 0) - { - // - objName = on; - break; - } - } - - // - if (StringLen(objName) > 0) - { - result = ObjectDelete(chartId, objName); - } - - // - return result; -} - -// -// Check Object Exists ... -bool IsDrawExists( - string name, - int chartId = -1, - int subWindow = -1) -{ - // - bool result = false; - - // - if (chartId == -1) - { - chartId = 0; - } - - // - if (subWindow == -1) - { - subWindow = 0; - } - - // - for (int iObj = ObjectsTotal(chartId, subWindow) - 1; iObj >= 0; iObj--) - { - // - string on = ObjectName(chartId, iObj, subWindow); - result = StringFind(on, name) >= 0; - if (result) - { - break; - } - } - - // - return result; -} -// -// END Provided Functions ... -// - -// -// START Regular Draws ... -// - -// -// START Arrow Functions ... -// -// -// Draw an Arrow Object on Chart ... -bool DrawArrow( - const long chartID = 0, // chart's ID - const string name = "Arrow", // arrow name - const int subWindow = 0, // subwindow index - datetime time = 0, // anchor point time - double price = 0, // anchor point price - const uchar arrowCode = 252, // arrow code - const ENUM_ARROW_ANCHOR anchor = ANCHOR_BOTTOM, // anchor point position - const color clr = clrAqua, // arrow color - const ENUM_LINE_STYLE style = STYLE_SOLID, // border line style - const int width = 3, // arrow size - const bool back = false, // in the background - const bool selection = false, // highlight to move - const bool hidden = false, // hidden in the object list - const long zOrder = 0 // Order Object ... -) -{ - // - // set anchor point coordinates if they are not set ... - ChangeArrowEmptyPoint(time, price); - - // - // reset the error value ... - ResetLastError(); - - // - // Normalize Name ... - string objName = drawPrefix + "_" + name; - - // - // create an arrow ... - if (!ObjectCreate(chartID, objName, OBJ_ARROW, subWindow, time, price)) - { - // - string message = - __FUNCTION__ + - ": failed to create an arrow! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // set the arrow code ... - ObjectSetInteger(chartID, objName, OBJPROP_ARROWCODE, arrowCode); - - // - // set anchor type ... - ObjectSetInteger(chartID, objName, OBJPROP_ANCHOR, anchor); - - // - // set the arrow color ... - ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); - - // - // set the border line style ... - ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); - - // - // set the arrow's size ... - ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); - - // - // display in the foreground (false) or background (true) ... - ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); - - // - // enable (true) or disable (false) the mode of moving the arrow by mouse - // when creating a graphical object using ObjectCreate function, the object cannot be - // highlighted and moved by default. Inside this method, selection parameter - // is false by default, if you want making it possible to highlight and move the object - // change it to true ... - ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); - ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); - - // - // hide (true) or display (false) graphical object name in the object list ... - ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); - - // - // set the priority for receiving the event of a mouse click in the chart ... - ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); - - // - // successful execution ... - return (true); -} - -// -// Move the anchor point of Arrow ... -bool MoveArrow( - const long chartID = 0, // chart's ID - const string name = "Arrow", // object name - datetime time = 0, // anchor point time coordinate - double price = 0 // anchor point price coordinate -) -{ - // - // if point position is not set, move it to the current bar having Bid price ... - if (!time) - { - time = TimeCurrent(); - } - - // - if (!price) - { - price = SymbolInfoDouble(_Symbol, SYMBOL_BID); - } - - // - // reset the error value - ResetLastError(); - - // - // move the anchor point ... - if (!ObjectMove(chartID, name, 0, time, price)) - { - // - string message = - __FUNCTION__ + - ": failed to move the anchor point! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Delete an arrow ... -bool DeleteArrow( - const long chartID = 0, // chart's ID - const string name = "Arrow" // arrow name -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // delete an arrow ... - if (!ObjectDelete(chartID, name)) - { - // - string message = - __FUNCTION__ + - ": failed to delete an arrow! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Change the arrow code ... -bool ArrowCodeChange( - const long chartID = 0, // chart's ID - const string name = "Arrow", // object name - const uchar code = 252 // arrow code -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // change the arrow code ... - if (!ObjectSetInteger(chartID, name, OBJPROP_ARROWCODE, code)) - { - // - string message = - __FUNCTION__ + - ": failed to change the arrow code! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Change anchor type ... -bool ArrowAnchorChange( - const long chartID = 0, // chart's ID - const string name = "Arrow", // object name - const ENUM_ARROW_ANCHOR anchor = ANCHOR_TOP // anchor type -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // change anchor type ... - if (!ObjectSetInteger(chartID, name, OBJPROP_ANCHOR, anchor)) - { - // - string message = - __FUNCTION__ + - ": failed to change anchor type! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Check anchor point values and set default values -// for empty ones ... -void ChangeArrowEmptyPoint( - datetime &time, - double &price) -{ - // - // if the point's time is not set, it will be on the current bar ... - if (!time) - { - time = TimeCurrent(); - } - - // - // if the point's price is not set, it will have Bid value ... - if (!price) - { - price = SymbolInfoDouble(_Symbol, SYMBOL_BID); - } -} -// -// END Arrow Functions ... -// - -// -// START Horizontal Line Functions ... -// -// -// Create, Draw the horizontal line ... -bool DrawHorizontalLine( - const long chartID = 0, // chart's ID - const string name = "HLine", // line name - const int subWindow = 0, // subwindow index - double price = 0, // line price - const color clr = clrRed, // line color - const ENUM_LINE_STYLE style = STYLE_SOLID, // line style - const int width = 1, // line width - const bool back = false, // in the background - const bool selection = false, // highlight to move - const bool hidden = false, // hidden in the object list - const long zOrder = 0 // priority for mouse click -) -{ - // - // if the price is not set, set it at the current Bid price level ... - if (!price) - { - price = SymbolInfoDouble(Symbol(), SYMBOL_BID); - } - - // - // reset the error value ... - ResetLastError(); - - // - // Normalize Name ... - string objName = drawPrefix + "_" + name; - - // - // create a horizontal line ... - if (!ObjectCreate(chartID, objName, OBJ_HLINE, subWindow, 0, price)) - { - // - string message = - __FUNCTION__ + - ": failed to create a horizontal line! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // set line color ... - ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); - - // - // set line display style ... - ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); - - // - // set line width ... - ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); - - // - // display in the foreground (false) or background (true) ... - ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); - - // - // enable (true) or disable (false) the mode of moving the line by mouse - // when creating a graphical object using ObjectCreate function, the object cannot be - // highlighted and moved by default. Inside this method, selection parameter - // is true by default making it possible to highlight and move the object - ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, selection); - ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); - - // - // hide (true) or display (false) graphical object name in the object list ... - ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); - - // - // set the priority for receiving the event of a mouse click in the chart ... - ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); - - // - // successful execution ... - return (true); -} - -// -// Move horizontal line ... -bool MoveHorizontalLine( - const long chartID = 0, // chart's ID - const string name = "HLine", // line name - double price = 0 // line price -) -{ - // - // if the line price is not set, move it to the current Bid price level ... - if (!price) - { - price = SymbolInfoDouble(Symbol(), SYMBOL_BID); - } - - // - // reset the error value ... - ResetLastError(); - - // - // move a horizontal line ... - if (!ObjectMove(chartID, name, 0, 0, price)) - { - // - string message = - __FUNCTION__ + - ": failed to move the horizontal line! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Delete a horizontal line ... -bool DeleteHorizontalLine( - const long chartID = 0, // chart's ID - const string name = "HLine" // line name -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // delete a horizontal line ... - if (!ObjectDelete(chartID, name)) - { - // - string message = - __FUNCTION__ + - ": failed to delete a horizontal line! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} -// -// END Horizontal Line Functions ... -// - -// -// START Vertical Line Functions ... -// -// -// Create the vertical line ... -bool DrawVerticalLine( - const long chartID = 0, // chart's ID - const string name = "VLine", // line name - const int sub_window = 0, // subwindow index - datetime time = 0, // line time - const color clr = clrRed, // line color - const ENUM_LINE_STYLE style = STYLE_SOLID, // line style - const int width = 1, // line width - const bool back = false, // in the background - const bool selection = false, // highlight to move - const bool hidden = false, // hidden in the object list - const long zOrder = 0 // priority for mouse click -) -{ - // - // if the line time is not set, draw it via the last bar ... - if (!time) - { - time = TimeCurrent(); - } - - // - // reset the error value - ResetLastError(); - - // - // Normalize Name ... - string objName = drawPrefix + "_" + name; - - // - // create a vertical line ... - if (!ObjectCreate(chartID, objName, OBJ_VLINE, sub_window, time, 0)) - { - // - string message = - __FUNCTION__ + - ": failed to create a vertical line! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return false; - } - - // - // set line color ... - ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); - - // - // set line display style ... - ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); - - // - // set line width ... - ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); - - // - // display in the foreground (false) or background (true) ... - ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); - - // - // enable (true) or disable (false) the mode of moving the line by mouse - // when creating a graphical object using ObjectCreate function, the object cannot be - // highlighted and moved by default. Inside this method, selection parameter - // is true by default making it possible to highlight and move the object ... - ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); - ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); - - // - // hide (true) or display (false) graphical object name in the object list ... - ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); - - // - // set the priority for receiving the event of a mouse click in the chart - ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); - - // - // successful execution ... - return true; -} - -// -// Move the vertical line ... -bool MoveVerticalLine( - const long chartID = 0, // chart's ID - const string name = "VLine", // line name - datetime time = 0 // line time -) -{ - // - // if line time is not set, move the line to the last bar ... - if (!time) - { - time = TimeCurrent(); - } - - // - // reset the error value ... - ResetLastError(); - - // - // move the vertical line ... - if (!ObjectMove(chartID, name, 0, time, 0)) - { - // - string message = - __FUNCTION__ + - ": failed to move the vertical line! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Delete the vertical line ... -bool DeleteVerticalLine( - const long chartID = 0, // chart's ID - const string name = "VLine" // line name -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // delete the vertical line ... - if (!ObjectDelete(chartID, name)) - { - // - string message = - __FUNCTION__ + - ": failed to delete the vertical line! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return false; - } - - // - // successful execution ... - return true; -} -// -// END Vertical Line Functions ... -// - -// -// START RectangleLabel Functions ... -// -// -// Create Rectangle Label Object ... -bool DrawRectangleLabel( - const long chartID = 0, // chart's ID - const string name = "RectLabel", // label name - const int subWindow = 0, // subwindow index - const int x = 0, // X coordinate - const int y = 0, // Y coordinate - const int width = 50, // width - const int height = 18, // height - const color back_clr = clrWhiteSmoke, // background color - const ENUM_BORDER_TYPE border = BORDER_SUNKEN, // border type - const ENUM_BASE_CORNER corner = CORNER_LEFT_UPPER, // chart corner for anchoring - const color clr = clrRed, // flat border color (Flat) - const ENUM_LINE_STYLE style = STYLE_SOLID, // flat border style - const int lineWidth = 1, // flat border width - const bool back = false, // in the background - const bool selection = false, // highlight to move - const bool hidden = false, // hidden in the object list - const long zOrder = 0 // priority for mouse click -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // Normalize Name ... - string objName = drawPrefix + "_" + name; - - // - //--- create a rectangle label - if (!ObjectCreate(chartID, objName, OBJ_RECTANGLE_LABEL, subWindow, 0, 0)) - { - // - string message = - __FUNCTION__ + - ": failed to create a rectangle label! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // set label coordinates ... - ObjectSetInteger(chartID, objName, OBJPROP_XDISTANCE, x); - ObjectSetInteger(chartID, objName, OBJPROP_YDISTANCE, y); - - // - // set label size ... - ObjectSetInteger(chartID, objName, OBJPROP_XSIZE, width); - ObjectSetInteger(chartID, objName, OBJPROP_YSIZE, height); - - // - // set background color ... - ObjectSetInteger(chartID, objName, OBJPROP_BGCOLOR, back_clr); - - // - // set border type ... - ObjectSetInteger(chartID, objName, OBJPROP_BORDER_TYPE, border); - - // - // set the chart's corner, relative to which point coordinates are defined ... - ObjectSetInteger(chartID, objName, OBJPROP_CORNER, corner); - - // - // set flat border color (in Flat mode) ... - ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); - - // - // set flat border line style ... - ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); - - // - // set flat border width ... - ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, lineWidth); - - // - // display in the foreground (false) or background (true) ... - ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); - - // - // enable (true) or disable (false) the mode of moving the label by mouse ... - ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, selection); - ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); - - // - // hide (true) or display (false) graphical object name in the object list ... - ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); - - // - // set the priority for receiving the event of a mouse click in the chart ... - ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); - - // - // successful execution ... - return (true); -} - -// -// Move Rectangle Label .. -bool MoveRectangleLabel( - const long chartID = 0, // chart's ID - const string name = "RectLabel", // label name - const int x = 0, // X coordinate - const int y = 0 // Y coordinate -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // move the rectangle label ... - if (!ObjectSetInteger(chartID, name, OBJPROP_XDISTANCE, x)) - { - // - string message = - __FUNCTION__ + - ": failed to move X coordinate of the label! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - if (!ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y)) - { - // - string message = - __FUNCTION__ + - ": failed to move Y coordinate of the label! Error code = " + - (string)GetLastError(); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Delete the rectangle label ... -bool DeleteRectangleLabel( - const long chartID = 0, // chart's ID - const string name = "RectLabel" // label name -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // delete the label ... - if (!ObjectDelete(chartID, name)) - { - // - string message = - __FUNCTION__ + - ": failed to delete a rectangle label! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Change Rectangle Label Size ... -bool ChangeSizeRectangleLabel( - const long chartID = 0, // chart's ID - const string name = "RectLabel", // label name - const int width = 50, // label width - const int height = 18 // label height -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // change label size ... - if (!ObjectSetInteger(chartID, name, OBJPROP_XSIZE, width)) - { - // - string message = - __FUNCTION__ + - ": failed to change the label's width! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - if (!ObjectSetInteger(chartID, name, OBJPROP_YSIZE, height)) - { - // - string message = - __FUNCTION__ + - ": failed to change the label's height! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Change rectangle label border type ... -bool RectLabelChangeBorderType( - const long chartID = 0, // chart's ID - const string name = "RectLabel", // label name - const ENUM_BORDER_TYPE border = BORDER_SUNKEN // border type -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // change border type ... - if (!ObjectSetInteger(chartID, name, OBJPROP_BORDER_TYPE, border)) - { - // - string message = - __FUNCTION__ + - ": failed to change the border type! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} -// -// END RectangleLabel Functions ... -// - -// -// START TrendLine Funcions ... -// -// Create a trend line by the given coordinates ... -bool DrawTrendLine( - const long chartID = 0, // chart's ID - const string name = "TrendLine", // line name - const int subWindow = 0, // subwindow index - datetime time1 = 0, // first point time - double price1 = 0, // first point price - datetime time2 = 0, // second point time - double price2 = 0, // second point price - const color clr = clrYellow, // line color - const ENUM_LINE_STYLE style = STYLE_SOLID, // line style - const int width = 1, // line width - const bool back = false, // in the background - const bool selection = false, // highlight to move - const bool rayRight = false, // line's continuation to the right - const bool hidden = false, // hidden in the object list - const long zOrder = 0 // priority for mouse click -) -{ - // - // set anchor points' coordinates if they are not set ... - ChangeTrendLineEmptyPoints( - time1, - price1, - time2, - price2); - - // - // reset the error value ... - ResetLastError(); - - // - // Normalize Name ... - string objName = drawPrefix + "_" + name; - - // - // create a trend line by the given coordinates ... - if (!ObjectCreate(chartID, objName, OBJ_TREND, subWindow, time1, price1, time2, price2)) - { - // - string message = - __FUNCTION__ + - ": failed to create a trend line! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // set line color ... - ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); - - // - // set line display style ... - ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); - - // - // set line width ... - ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); - - // - // display in the foreground (false) or background (true) ... - ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); - - // - // enable (true) or disable (false) the mode of moving the line by mouse - // when creating a graphical object using ObjectCreate function, the object cannot be - // highlighted and moved by default. Inside this method, selection parameter - // is true by default making it possible to highlight and move the object ... - ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); - ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); - - // - // enable (true) or disable (false) the mode of continuation of the line's display to the right ... - ObjectSetInteger(chartID, objName, OBJPROP_RAY_RIGHT, rayRight); - - // - // hide (true) or display (false) graphical object name in the object list ... - ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); - - // - // set the priority for receiving the event of a mouse click in the chart ... - ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); - - // - // successful execution ... - return (true); -} - -// -// Move trend line anchor point ... | -bool ChangeTrendLinePoint( - const long chartID = 0, // chart's ID - const string name = "TrendLine", // line name - const int pointindex = 0, // anchor point index - datetime time = 0, // anchor point time coordinate - double price = 0 // anchor point price coordinate -) -{ - // - // if point position is not set, move it to the current bar having Bid price ... - if (!time) - { - time = TimeCurrent(); - } - - // - if (!price) - { - price = SymbolInfoDouble(Symbol(), SYMBOL_BID); - } - - // - // reset the error value ... - ResetLastError(); - - // - // move trend line's anchor point ... - if (!ObjectMove(chartID, name, pointindex, time, price)) - { - // - string message = - __FUNCTION__ + - ": failed to move the anchor point! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// The function deletes the trend line from the chart ... -bool DeleteTrendLine( - const long chartID = 0, // chart's ID - const string name = "TrendLine" // line name -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // delete a trend line ... - if (!ObjectDelete(chartID, name)) - { - // - string message = - __FUNCTION__ + - ": failed to delete a trend line! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Check the values of trend line's anchor points and set default ... -// values for empty ones ... -void ChangeTrendLineEmptyPoints( - datetime &time1, - double &price1, - datetime &time2, - double &price2) -{ - // - // if the first point's time is not set, it will be on the current bar ... - if (!time1) - { - time1 = TimeCurrent(); - } - - // - // if the first point's price is not set, it will have Bid value ... - if (!price1) - { - price1 = SymbolInfoDouble(Symbol(), SYMBOL_BID); - } - - // - // if the second point's time is not set, it is located 9 bars left from the second one ... - if (!time2) - { - // - // array for receiving the open time of the last 10 bars ... - datetime temp[10]; - CopyTime(Symbol(), Period(), time1, 10, temp); - - // - // set the second point 9 bars left from the first one ... - time2 = temp[0]; - } - - // - // if the second point's price is not set, it is equal to the first point's one ... - if (!price2) - { - price2 = price1; - } -} -// -// END TrendLine Functions ... -// - -// -// START Text Functions ... -// -// Create and Draw a Text Object ... -bool DrawText( - const long chartID = 0, // chart's ID - const string name = "Text", // object name - const int subWindow = 0, // subwindow index - datetime time = 0, // anchor point time - double price = 0, // anchor point price - const string text = "Text", // the text itself - const string font = "Arial", // font - const int fontSize = 10, // font size - const color clr = clrRed, // color - const double angle = 0.0, // text slope - const ENUM_ANCHOR_POINT anchor = ANCHOR_CENTER, // anchor type - const bool back = false, // in the background - const bool selection = false, // highlight to move - const bool hidden = true, // hidden in the object list - const long zOrder = 0 // priority for mouse click -) -{ - // - // set anchor point coordinates if they are not set ... - ChangeTextEmptyPoint(time, price); - - // - // reset the error value ... - ResetLastError(); - - // - // Normalize Name ... - string objName = drawPrefix + "_" + name; - - // - //--- create Text object - if (!ObjectCreate(chartID, objName, OBJ_TEXT, subWindow, time, price)) - { - // - string message = - __FUNCTION__ + - ": failed to create \"Text\" object! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // set the text ... - ObjectSetString(chartID, objName, OBJPROP_TEXT, text); - - // - // set text font ... - ObjectSetString(chartID, objName, OBJPROP_FONT, font); - - // - // set font size ... - ObjectSetInteger(chartID, objName, OBJPROP_FONTSIZE, fontSize); - - // - // set the slope angle of the text ... - ObjectSetDouble(chartID, objName, OBJPROP_ANGLE, angle); - - // - // set anchor type ... - ObjectSetInteger(chartID, objName, OBJPROP_ANCHOR, anchor); - - // - // set color ... - ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); - - // - // display in the foreground (false) or background (true) ... - ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); - - // - // enable (true) or disable (false) the mode of moving the object by mouse ... - ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); - ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); - - // - // hide (true) or display (false) graphical object name in the object list ... - ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); - - // - // set the priority for receiving the event of a mouse click in the chart ... - ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); - - // - // successful execution ... - return (true); -} - -// -// Move the anchor point ... -bool MoveText( - const long chartID = 0, // chart's ID - const string name = "Text", // object name - datetime time = 0, // anchor point time coordinate - double price = 0 // anchor point price coordinate -) -{ - // - //--- if point position is not set, move it to the current bar having Bid price - if (!time) - { - time = TimeCurrent(); - } - - // - if (!price) - { - price = SymbolInfoDouble(_Symbol, SYMBOL_BID); - } - - // - // reset the error value ... - ResetLastError(); - - // - // move the anchor point .. - if (!ObjectMove(chartID, name, 0, time, price)) - { - // - string message = - __FUNCTION__ + - ": failed to move the anchor point! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Change the object text ... -bool ChangeText( - const long chartID = 0, // chart's ID - const string name = "Text", // object name - const string text = "Text" // text -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // change object text ... - if (!ObjectSetString(chartID, name, OBJPROP_TEXT, text)) - { - // - string message = - __FUNCTION__ + - ": failed to change the text! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Delete Text object ... -bool DeleteText( - const long chartID = 0, // chart's ID - const string name = "Text" // object name -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // delete the object ... - if (!ObjectDelete(chartID, name)) - { - // - string message = - __FUNCTION__ + - ": failed to delete \"Text\" object! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution - return (true); -} - -// -// Check anchor point values and set default values -// for empty ones ... -void ChangeTextEmptyPoint( - datetime &time, - double &price) -{ - // - // if the point's time is not set, it will be on the current bar ... - if (!time) - { - time = TimeCurrent(); - } - - // - // if the point's price is not set, it will have Bid value ... - if (!price) - { - price = SymbolInfoDouble(_Symbol, SYMBOL_BID); - } -} -// -// END Text Functions ... -// - -// -// START Fibonacchi Functions ... -// -// -// Create Fibonacci Retracement by the given coordinates ... -bool DrawFibonacci( - const long chartID = 0, // chart's ID - const string name = "Fibonacci", // object name - const int subWindow = 0, // subwindow index - datetime time1 = 0, // first point time - double price1 = 0, // first point price - datetime time2 = 0, // second point time - double price2 = 0, // second point price - const color clr = clrRed, // object color - const ENUM_LINE_STYLE style = STYLE_SOLID, // object line style - const int width = 1, // object line width - const bool back = false, // in the background - const bool selection = true, // highlight to move - const bool rayRight = false, // object's continuation to the right - const bool hidden = true, // hidden in the object list - const long zOrder = 0 // priority for mouse click -) -{ - // - // set anchor points' coordinates if they are not set ... - ChangeFibonacciEmptyPoints(time1, price1, time2, price2); - - // - // reset the error value ... - ResetLastError(); - - // - // Normalize Name ... - string objName = drawPrefix + "_" + name; - - // - // Create Fibonacci Retracement by the given coordinates ... - if (!ObjectCreate(chartID, objName, OBJ_FIBO, subWindow, time1, price1, time2, price2)) - { - // - string message = - __FUNCTION__ + - ": failed to create \"Fibonacci Retracement\"! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // set color ... - ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); - - // - // set line style ... - ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); - - // - // set line width ... - ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); - - // - // display in the foreground (false) or background (true) ... - ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); - - // - // enable (true) or disable (false) the mode of highlighting the channel for moving - // when creating a graphical object using ObjectCreate function, the object cannot be - // highlighted and moved by default. Inside this method, selection parameter - // is true by default making it possible to highlight and move the object ... - ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); - ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); - - // - // enable (true) or disable (false) the mode of continuation of the object's display to the right ... - ObjectSetInteger(chartID, objName, OBJPROP_RAY_RIGHT, rayRight); - - // - // hide (true) or display (false) graphical object name in the object list ... - ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); - - // - // set the priority for receiving the event of a mouse click in the chart ... - ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); - - // - // successful execution ... - return (true); -} - -// -// Create Fibonacci Retracement by the given coordinates ... -bool DrawCustomFibonacci( - // - int levels, // number of level lines - double &values[], // values of level lines - color &colors[], // color of level lines - ENUM_LINE_STYLE &styles[], // style of level lines - int &widths[], // width of level lines - string &descriptions[], // level Descriptions - // - const long chartID = 0, // chart's ID - const string name = "Fibonacci", // object name - const int subWindow = 0, // subwindow index - datetime time1 = 0, // first point time - double price1 = 0, // first point price - datetime time2 = 0, // second point time - double price2 = 0, // second point price - const color clr = clrAqua, // object color - const ENUM_LINE_STYLE style = STYLE_DOT, // object line style - const int width = 1, // object line width - const bool back = false, // in the background - const bool selection = true, // highlight to move - const bool rayRight = false, // object's continuation to the right - const bool hidden = true, // hidden in the object list - const long zOrder = 0 // priority for mouse click -) -{ - // - // set anchor points' coordinates if they are not set ... - ChangeFibonacciEmptyPoints(time1, price1, time2, price2); - - // - // reset the error value ... - ResetLastError(); - - // - // Normalize Name ... - string objName = drawPrefix + "_" + name; - - // - // Create Fibonacci Retracement by the given coordinates ... - if (!ObjectCreate(chartID, name, OBJ_FIBO, subWindow, time1, price1, time2, price2)) - { - // - string message = - __FUNCTION__ + - ": failed to create \"Fibonacci Retracement\"! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // set color ... - ObjectSetInteger(chartID, objName, OBJPROP_COLOR, clr); - - // - // set line style ... - ObjectSetInteger(chartID, objName, OBJPROP_STYLE, style); - - // - // set line width ... - ObjectSetInteger(chartID, objName, OBJPROP_WIDTH, width); - - // - // display in the foreground (false) or background (true) ... - ObjectSetInteger(chartID, objName, OBJPROP_BACK, back); - - // - // enable (true) or disable (false) the mode of highlighting the channel for moving - // when creating a graphical object using ObjectCreate function, the object cannot be - // highlighted and moved by default. Inside this method, selection parameter - // is true by default making it possible to highlight and move the object ... - ObjectSetInteger(chartID, objName, OBJPROP_SELECTABLE, true); - ObjectSetInteger(chartID, objName, OBJPROP_SELECTED, selection); - - // - // enable (true) or disable (false) the mode of continuation of the object's display to the right ... - ObjectSetInteger(chartID, objName, OBJPROP_RAY_RIGHT, rayRight); - - // - // hide (true) or display (false) graphical object name in the object list ... - ObjectSetInteger(chartID, objName, OBJPROP_HIDDEN, hidden); - - // - // set the priority for receiving the event of a mouse click in the chart ... - ObjectSetInteger(chartID, objName, OBJPROP_ZORDER, zOrder); - - // - // Change Levels Of Fibonacci ... - bool result = FibonacciLevelsSet( - levels, - values, - colors, - styles, - widths, - descriptions, - chartID, - objName); - - // - // successful execution ... - return result; -} - -// -// Set number of levels and their parameters ... -bool FibonacciLevelsSet( - int levels, // number of level lines - double &values[], // values of level lines - color &colors[], // color of level lines - ENUM_LINE_STYLE &styles[], // style of level lines - int &widths[], // width of level lines - string &descriptions[], // level Descriptions - const long chartID = 0, // chart's ID - const string name = "Fibonacci" // object name -) -{ - // - // check array sizes ... - if ( - levels != ArraySize(colors) || - levels != ArraySize(styles) || - levels != ArraySize(widths) || - levels != ArraySize(widths)) - { - // - string message = - __FUNCTION__ + - ": array length does not correspond to the number of levels, error!"; - - // - LogMessage(message); - - // - return (false); - } - - // - // set the number of levels ... - ObjectSetInteger(chartID, name, OBJPROP_LEVELS, levels); - - // - // set the properties of levels in the loop ... - for (int i = 0; i < levels; i++) - { - // - // level value ... - ObjectSetDouble(chartID, name, OBJPROP_LEVELVALUE, i, values[i]); - - // - // level color ... - ObjectSetInteger(chartID, name, OBJPROP_LEVELCOLOR, i, colors[i]); - - // - // level style ... - ObjectSetInteger(chartID, name, OBJPROP_LEVELSTYLE, i, styles[i]); - - // - // level width ... - ObjectSetInteger(chartID, name, OBJPROP_LEVELWIDTH, i, widths[i]); - - // - // level description ... - // ObjectSetString(chartID, name, OBJPROP_LEVELTEXT, i, DoubleToString(100 * values[i], 1)); - ObjectSetString(chartID, name, OBJPROP_LEVELTEXT, i, descriptions[i]); - } - - // - // successful execution ... - return (true); -} - -// -// Move Fibonacci Retracement anchor point ... -bool FibonacciPointChange( - const long chartID = 0, // chart's ID - const string name = "Fibonacci", // object name - const int pointIndex = 0, // anchor point index - datetime time = 0, // anchor point time coordinate - double price = 0 // anchor point price coordinate -) -{ - // - // if point position is not set, move it to the current bar having Bid price ... - if (!time) - { - time = TimeCurrent(); - } - - // - if (!price) - { - price = SymbolInfoDouble(_Symbol, SYMBOL_BID); - } - - // - // reset the error value ... - ResetLastError(); - - // - // move the anchor point ... - if (!ObjectMove(chartID, name, pointIndex, time, price)) - { - // - string message = - __FUNCTION__ + - ": failed to move the anchor point! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Delete Fibonacci Retracement ... -bool DeleteFibonachi( - const long chartID = 0, // chart's ID - const string name = "Fibonacci" // object name -) -{ - // - // reset the error value ... - ResetLastError(); - - // - // delete the object ... - if (!ObjectDelete(chartID, name)) - { - // - string message = - __FUNCTION__ + - ": failed to delete \"Fibonacci Retracement\"! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution ... - return (true); -} - -// -// Check the values of Fibonacci Retracement anchor points and set -// default values for empty ones ... -void ChangeFibonacciEmptyPoints( - datetime &time1, - double &price1, - datetime &time2, - double &price2) -{ - // - // if the second point's time is not set, it will be on the current bar ... - if (!time2) - { - time2 = TimeCurrent(); - } - - // - // if the second point's price is not set, it will have Bid value ... - if (!price2) - { - price2 = SymbolInfoDouble(_Symbol, SYMBOL_BID); - } - - // - // if the first point's time is not set, it is located 9 bars left from the second one ... - if (!time1) - { - // - // array for receiving the open time of the last 10 bars ... - datetime temp[10]; - CopyTime(Symbol(), Period(), time2, 10, temp); - - // - // set the first point 9 bars left from the second one ... - time1 = temp[0]; - } - - // - // if the first point's price is not set, move it 200 points below the second one ... - if (!price1) - { - price1 = price2 - 200 * SymbolInfoDouble(_Symbol, SYMBOL_POINT); - } -} -// -// END Fibonacci Functions ... -// - -// -// START Event Functions ... -// - -// -// Create an Event ... -bool EventCreate( - const long chartID = 0, // chart's ID - const string name = "Event", // object name - const int subWindow = 0, // subwindow index - const string text = "Content", // event text - datetime time = 0, // anchor point time - const color clr = clrRed, // color - const int width = 1, // point width when highlighted - const bool back = false, // in the background - const bool selection = false, // highlight to move - const bool hidden = true, // hidden in the object list - const long zOrder = 0 // priority for mouse click -) -{ - // - if (!time) - { - time = TimeCurrent(); - } - - // - ResetLastError(); - - // - if (!ObjectCreate(chartID, name, OBJ_EVENT, subWindow, time, 0)) - { - // - string message = - __FUNCTION__ + - ": failed to create \"Event\" object! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // set event text - ObjectSetString(chartID, name, OBJPROP_TEXT, text); - - // - // set color - ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr); - - // - // set anchor point width if the object is highlighted - ObjectSetInteger(chartID, name, OBJPROP_WIDTH, width); - - // - // display in the foreground (false) or background (true) - ObjectSetInteger(chartID, name, OBJPROP_BACK, back); - - // - // enable (true) or disable (false) the mode of moving event by mouse - ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, selection); - ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection); - - // - // hide (true) or display (false) graphical object name in the object list - ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden); - - // - // set the priority for receiving the event of a mouse click in the chart - ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder); - - // - // successful execution - return (true); -} - -// -// Change Event object text -bool EventTextChange( - const long chartID = 0, // chart's ID - const string name = "Event", // event name - const string text = "Content" // text -) -{ - // - // reset the error value - ResetLastError(); - - // - // change object text - if (!ObjectSetString(chartID, name, OBJPROP_TEXT, text)) - { - // - string message = - __FUNCTION__ + - ": failed to change the text! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution - return (true); -} - -// -// Move Event object -bool EventMove( - const long chartID = 0, // chart's ID - const string name = "Event", // event name - datetime time = 0 // time -) -{ - // - // if time is not set, move event to the last bar - if (!time) - { - time = TimeCurrent(); - } - - // - // reset the error value - ResetLastError(); - - // - // move the object - if (!ObjectMove(chartID, name, 0, time, 0)) - { - // - string message = - __FUNCTION__ + - ": failed to move \"Event\" object! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution - return (true); -} - -// -// Delete Event object -bool EventDelete( - const long chartID = 0, // chart's ID - const string name = "Event" // event name -) -{ - // - // reset the error value - ResetLastError(); - - // - // delete the object - if (!ObjectDelete(chartID, name)) - { - // - string message = - __FUNCTION__ + - ": failed to delete \"Event\" object! Error code = " + - (string)GetLastError(); - - // - LogMessage(message); - - // - return (false); - } - - // - // successful execution - return (true); -} - -// -// END Event Functions ... -// - -// -// END Regular Draws ... -// - -// -// START Chart Style Drawers ... -// -// -// Apply Styles On Chart ... -void ApplyChartStyle( - int chartId = -1, // chart's ID - ENUM_CHART_MODE mode = CHART_CANDLES, // chart's mode - bool showBidLine = true, // show bid line - bool showAskLine = true, // show ask line - bool showGrid = false, // show grids on chart - bool showVolumes = false, // show volumes - bool showTradeLevels = true, // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders) - bool autoScroll = true, // chart autoscroll - bool quickNavigation = true, // chart quick navigation state - color foreGroundColor = clrWhite, // chart's foreground color - color backGroundColor = clrBlack, // chart's background color - color upColor = clrGreen, // Up Color - color downColor = clrRed, // Down Color - color bullishColor = clrGreen, // Bullish color - color bearishColor = clrRed, // Bearish color - color gridColor = clrGray, // grid color - color bidLineColor = clrGray, // bid line color - color askLineColor = clrRed, // ask line color - color lineColor = clrLime, // line mode and doji candlestick color - color stopColor = clrGold, // Color of stop order levels (Stop Loss and Take Profit) - color volumesColor = clrGreen // volumes color -) -{ - // - // Validate Args ... - if (chartId == -1) - { - chartId = 0; - } - - // - ChartSetInteger(chartId, CHART_MODE, mode); - ChartSetInteger(chartId, CHART_SHOW_BID_LINE, showBidLine); - ChartSetInteger(chartId, CHART_SHOW_ASK_LINE, showAskLine); - ChartSetInteger(chartId, CHART_SHOW_GRID, showGrid); - ChartSetInteger(chartId, CHART_SHOW_VOLUMES, showVolumes); - ChartSetInteger(chartId, CHART_SHOW_TRADE_LEVELS, showTradeLevels); - ChartSetInteger(chartId, CHART_AUTOSCROLL, autoScroll); - ChartSetInteger(chartId, CHART_QUICK_NAVIGATION, quickNavigation); - ChartSetInteger(chartId, CHART_COLOR_FOREGROUND, foreGroundColor); - ChartSetInteger(chartId, CHART_COLOR_BACKGROUND, backGroundColor); - ChartSetInteger(chartId, CHART_COLOR_CHART_UP, upColor); - ChartSetInteger(chartId, CHART_COLOR_CHART_DOWN, downColor); - ChartSetInteger(chartId, CHART_COLOR_CANDLE_BULL, bullishColor); - ChartSetInteger(chartId, CHART_COLOR_CANDLE_BEAR, bearishColor); - ChartSetInteger(chartId, CHART_COLOR_GRID, gridColor); - ChartSetInteger(chartId, CHART_COLOR_BID, bidLineColor); - ChartSetInteger(chartId, CHART_COLOR_ASK, askLineColor); - ChartSetInteger(chartId, CHART_COLOR_STOP_LEVEL, stopColor); - ChartSetInteger(chartId, CHART_COLOR_CHART_LINE, lineColor); - ChartSetInteger(chartId, CHART_COLOR_VOLUME, volumesColor); -} -// -// END Chart Style Drawers ... -// \ No newline at end of file diff --git a/BKP/XAU5-0.43/Libraries/x-saherelm.http.lib.mq5 b/BKP/XAU5-0.43/Libraries/x-saherelm.http.lib.mq5 deleted file mode 100644 index 97f7ac0a..00000000 --- a/BKP/XAU5-0.43/Libraries/x-saherelm.http.lib.mq5 +++ /dev/null @@ -1,177 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Http Library -// ------------------------------------------ -// Name: XHttp -// Description: provide http communication -// abilities ... -// -// -// 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 - -// -// START Model Definition ... -// -enum X_HTTP_METHOD -{ - X_HTTP_GET, - X_HTTP_POST -}; -// -// END Model Definition ... -// - -// -// START Inputs ... -// -// -// END Inputs ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Provided Functions ... -// -// -// Initial Library if required ... -bool OnInInitHttpLibrary() -{ - return false; -} - -// -// DeInitial Library if required ... -void OnDeinitHttpLibrary() -{ -} - -// -// Convert enum to String ... -string ToString(X_HTTP_METHOD method) -{ - // - string result = ""; - - // - switch (method) - { - // - case X_HTTP_GET: - result = "GET"; - break; - - // - case X_HTTP_POST: - result = "POST"; - break; - } - - // - return result; -} - -// -// Send Global Request ... -int SendRequest( - X_HTTP_METHOD method, // Httm Request Method - const string url, // Server Address - const string headers, // Headers providing - const char &payload[], // the Data which needs to Send - char &response[], // Response of request - string responseHeaders, // Response Headers - int timeout = 500 // Timeout for response default is 500 -) -{ - // - int result = -1; - - // - string strMethod = ToString(method); - if (StringLen(strMethod) == 0) { - return result; - } - - // - result = WebRequest( - strMethod, - url, - headers, - timeout, - payload, - response, - responseHeaders - ); - - // - return result; -} - -// -// Get Request ... -int GetRequest( - const string url, // Server Address - const string headers, // Headers providing - const char &payload[], // the Data which needs to Send - char &response[], // Response of request - string responseHeaders, // Response Headers - int timeout = 500 // Timeout for response default is 500 -) { - // - int result = SendRequest( - X_HTTP_GET, - url, - headers, - payload, - response, - responseHeaders, - timeout - ); - - // - return result; -} - -// -// Post Request ... -int PostRequest( - const string url, // Server Address - const string headers, // Headers providing - const char &payload[], // the Data which needs to Send - char &response[], // Response of request - string responseHeaders, // Response Headers - int timeout = 500 // Timeout for response default is 500 -) { - // - int result = SendRequest( - X_HTTP_POST, - url, - headers, - payload, - response, - responseHeaders, - timeout - ); - - // - return result; -} -// -// END Provided Functions ... -// diff --git a/BKP/XAU5-0.43/Libraries/x-saherelm.log.lib.mq5 b/BKP/XAU5-0.43/Libraries/x-saherelm.log.lib.mq5 deleted file mode 100644 index 70f1bda4..00000000 --- a/BKP/XAU5-0.43/Libraries/x-saherelm.log.lib.mq5 +++ /dev/null @@ -1,261 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Logger Library -// --------------------------------------- -// Name: XLogger -// Description: provides Logging abilities ... -// -// -// 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 - -// -// START Inputs ... -// -input group "Logging"; -input bool enableLogging = true; // Enable Logging -// -// END Inputs ... -// - -// -// Including Models ... -#include "x-saherelm.models.lib.mq5" - -// -// START Global Definitions: Variables, Properties and etc ... -// -string logTag = "X-Logger"; // LogTag -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Provided Functions ... -// -// -// Logging a Message ... -void LogMessage(string message) -{ - // - if (!enableLogging) - { - return; - } - - // - Print(logTag, " > ", message); -} -void LogMessage(string tag, string message) -{ - // - if (!enableLogging) - { - return; - } - - // - Print(tag, " > ", message); -} - -// -// Logging an Array ... -void LogArray(int &array[]) -{ - // - if (!enableLogging) - { - return; - } - - // - Print(logTag, ">"); - ArrayPrint(array); -} -void LogArray(double &array[]) -{ - // - if (!enableLogging) - { - return; - } - - // - Print(logTag, ">"); - ArrayPrint(array); -} -void LogArray(string &array[]) -{ - // - if (!enableLogging) - { - return; - } - - // - Print(logTag, ">"); - ArrayPrint(array); -} - -// -// Convert a Signal to String Message ... -string SignalToString(const XSignal &signal) -{ - // - string result = "\n"; - - // - result += "Signal: " + "\n"; - result += "id: " + (string)signal.id + "\n"; - result += "symbol: " + signal.symbol + "\n"; - result += "type: " + EnumToString(signal.type) + "\n"; - result += "magicNumber: " + (string)signal.magicNumber + "\n"; - result += "ticket: " + (string)signal.ticket + "\n"; - result += "entry: " + (string)signal.entry + "\n"; - result += "tp: " + (string)signal.tp + "\n"; - result += "sl: " + (string)signal.sl + "\n"; - result += "riskFreeStep: " + (string)signal.riskFreeStep + "\n"; - result += "riskFreeRate: " + (string)signal.riskFreeRate + "\n"; - result += "profit: " + (string)signal.profit + "\n"; - result += "time: " + (string)signal.time + "\n"; - result += "volume: " + (string)signal.volume + "\n"; - result += "comment: " + signal.comment + "\n"; - - // - return result; -} - -// -// Convert an Executed Signal to String Message ... -string ExecutedSignalToString(const XSignal &signal) -{ - // - string result = ""; - - // - result += (signal.type == X_SIGNAL_LONG ? "Buy" : "Sell") + " Signal Executed provided on (" + signal.symbol + " _ " + EnumToString(_Period) + ") by this comment: " + signal.comment; - - // - return result; -} - -// -// Logging Signal ... -void LogSignal(const XSignal &signal) -{ - // - string message = SignalToString(signal); - - // - LogMessage(message); -} - -// -// Log Signal Execution ... -void LogExecutedSignal(const XSignal &signal) -{ - // - string message = ExecutedSignalToString(signal); - - // - LogMessage(message); -} - -// -// Convert a Deal to String ... -string DealToString(const XDeal &deal) -{ - // - string result = "\n"; - - // - result += "Deal:" + "\n"; - result += " " + "\n"; - result += "time: " + (string)deal.time + "\n"; - result += "ticket: " + (string)deal.ticket + "\n"; - result += "order: " + (string)deal.order + "\n"; - result += "positionId: " + (string)deal.positionId + "\n"; - result += "type: " + EnumToString(deal.type) + "\n"; - result += "entry: " + EnumToString(deal.entry) + "\n"; - result += "reason: " + EnumToString(deal.reason) + "\n"; - result += "symbol: " + deal.symbol + "\n"; - result += "price: " + (string)deal.price + "\n"; - result += "profit: " + (string)deal.profit + "\n"; - result += "swap: " + (string)deal.swap + "\n"; - result += "commission: " + (string)deal.commission + "\n"; - result += "volume: " + (string)deal.volume + "\n"; - result += "comment: " + deal.comment + "\n"; - - // - return result; -} - -// -// Log Specific Deal ... -void LogDeal(const XDeal &deal) -{ - // - string message = DealToString(deal); - - // - LogMessage(message); -} - -// -// Convert an Order to String ... -string OrderToString(const XOrder &order) -{ - // - string result = "\n"; - - // - result += "Order: " + "\n"; - result += "magic: " + (string)order.magic + "\n"; - result += "positionId: " + (string)order.positionId + "\n"; - result += "symbol: " + (string)order.symbol + "\n"; - result += "ticket: " + (string)order.ticket + "\n"; - result += "timeSetup: " + (string)order.timeSetup + "\n"; - result += "timeDone: " + (string)order.timeDone + "\n"; - result += "timeExpiration: " + (string)order.timeExpiration + "\n"; - result += "priceOpen: " + (string)order.priceOpen + "\n"; - result += "priceCurrent: " + (string)order.priceCurrent + "\n"; - result += "priceStopLimit: " + (string)order.priceStopLimit + "\n"; - result += "stopLoss: " + (string)order.stopLoss + "\n"; - result += "takeProfit: " + (string)order.takeProfit + "\n"; - result += "volumeInitial: " + (string)order.volumeInitial + "\n"; - result += "volumeCurrent: " + (string)order.volumeCurrent + "\n"; - result += "comment: " + order.comment + "\n"; - result += "type: " + EnumToString(order.type) + "\n"; - result += "state: " + EnumToString(order.state) + "\n"; - result += "typeFilling: " + EnumToString(order.typeFilling) + "\n"; - result += "typeTime: " + EnumToString(order.typeTime) + "\n"; - result += "reason: " + EnumToString(order.reason) + "\n"; - - // - return result; -} - -// -// Log Specific Order ... -void LogOrder(const XOrder &order) -{ - // - string message = OrderToString(order); - - // - LogMessage(message); -} - -// -// END Provided Functions ... -// diff --git a/BKP/XAU5-0.43/Libraries/x-saherelm.models.lib.mq5 b/BKP/XAU5-0.43/Libraries/x-saherelm.models.lib.mq5 deleted file mode 100644 index b98ae3e8..00000000 --- a/BKP/XAU5-0.43/Libraries/x-saherelm.models.lib.mq5 +++ /dev/null @@ -1,438 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 Models Library -// --------------------------------------- -// Name: XModels -// Description: provides all required models ... -// -// -// 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 - -// -// START Inputs ... -// -// -// END Inputs ... -// - -// -// START Global Definitions: Variables, Properties and etc ... -// -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Provided Functions ... -// - -// -// How To Calculate Static Volume ... -enum ENUM_STATIC_VOLUME_METHODS -{ - // - // Based On Deposit ... - X_STATIC_VOLUME_BASED_ON_DEPOSIT, - // - // Based On Balance ... - X_STATIC_VOLUME_BASED_ON_BALANCE, -}; - -// -// START Model Definitions ... -// -// -// OHCL Candel Model ... -enum ENUM_X_PRICE -{ - X_PRICE_HIGH, - X_PRICE_OPEN, - X_PRICE_CLOSE, - X_PRICE_LOW -}; - -// -// Describe an Specific Candle ... -struct XOHCL -{ - double high; - double open; - double close; - double low; -}; - -// -// Swing Types Enum ... -enum ENUM_X_SWING_TYPE -{ - X_NO_SWING = 0, - X_SWING_HIGH = 1, - X_SWING_LOW = -1, -}; - -// -// XTrader Execution Signal Result ... -enum ENUM_EXECUTION_SIGNAL_RESULT -{ - // - X_TRADER_UNKNOWN_ERROR, - X_TRADER_SUCCEED_EXECUTION, - X_TRADER_INVALID_SIGNAL_ERROR, - X_TRADER_NOT_ENOUGH_EQUITY_ERROR, - X_TRADER_MAX_TRADES_REACHED_ERROR, - X_TRADER_NOT_ENOUGH_BALANCE_ERROR, - X_TRADER_NOT_ENOUGH_MARIGIN_ERROR - // -}; - -// -// Signal Types ... -enum ENUM_X_SIGNAL_TYPE -{ - X_SIGNAL_LONG, - X_SIGNAL_SHORT, - X_SIGNAL_UNKNOWN, -}; - -// -// Signal Structure ... -struct XSignal -{ - // - // Identifier ... - ulong id; - - // - // Which Symbol used for Signal ... - string symbol; - - // - // Which Type of operations ... - ENUM_X_SIGNAL_TYPE type; - - // - // Magic Number ... - ulong magicNumber; - - // - // Ticket ... - ulong ticket; - - // - // Entry/Open Price ... - double entry; - - // - // TP ... - double tp; - - // - // SL ... - double sl; - - // - // Make Risk Free Trade on this Value if provided ... - double riskFreeStep; - - // - // a Multiplier for determines how much trade volume exit on risk free time ... - double riskFreeRate; - - // - // Trade Profit ... - double profit; - - // - // Time of Operation ... - datetime time; - - // - // Volume ... - double volume; - - // - // Comment ... - string comment; -}; - -// -// Signal Additional Info ... -struct XProvidedSignal -{ - // - // Suggested TP ... - double tp; - - // - // Suggested SL ... - double sl; - - // - // Signallers ... - string signallers[]; -}; - -// -// Model Specific Deal ... -struct XDeal -{ - // - // the ID of the Expert Advisor, that executed the deal ... - ulong magic; - - // - // the ID of position, in which the deal was involved ... - ulong positionId; - - // - // Ticket ... - ulong ticket; - - // - // the name of the deal symbol ... - string symbol; - - // - // order by which the deal is executed ... - ulong order; - - // - // the time of deal execution ... - datetime time; - - // - // Deal price ... - double price; - - // - // the financial result of the deal (in deposit currency) ... - double profit; - - // - // the amount of swap when position is closed ... - double swap; - - // - // the amount of commission of the deal ... - double commission; - - // - // the volume of deal ... - double volume; - - // - // the deal comment ... - string comment; - - // - // the deal type ... - // ------------------------------------------------------------------ - // DEAL_TYPE_BUY => Buy ... - // DEAL_TYPE_SELL => Sell ... - // DEAL_TYPE_BUY_CANCELED => Canceled buy deal ... - // There can be a situation when a previously executed buy deal is canceled. In this case, - // the type of the previously executed deal (DEAL_TYPE_BUY) is changed to DEAL_TYPE_BUY_CANCELED, - // and its profit/loss is zeroized. Previously obtained profit/loss is charged/withdrawn using a separated balance operation ... - // - // DEAL_TYPE_SELL_CANCELED => Canceled sell deal ... - // There can be a situation when a previously executed sell deal is canceled. In this case, - // the type of the previously executed deal (DEAL_TYPE_SELL) is changed to DEAL_TYPE_SELL_CANCELED, - // and its profit/loss is zeroized. Previously obtained profit/loss is charged/withdrawn using a separated balance operation - // - // DEAL_TYPE_BALANCE => Balance ... - // DEAL_TYPE_CREDIT => Credit ... - // DEAL_TYPE_CHARGE => Additional charge ... - // DEAL_TYPE_CORRECTION => Correction ... - // DEAL_TAX => Tax charges ... - // DEAL_TYPE_BONUS => Bonus ... - // DEAL_TYPE_INTEREST => Interest rate ... - // DEAL_DIVIDEND => Dividend operations... - // DEAL_DIVIDEND_FRANKED => Franked (non-taxable) dividend operations ... - // DEAL_TYPE_COMMISSION => Additional commission ... - // DEAL_TYPE_COMMISSION_DAILY => Daily commission ... - // DEAL_TYPE_COMMISSION_MONTHLY => Monthly commission ... - // DEAL_TYPE_COMMISSION_AGENT_DAILY => Daily agent commission ... - // DEAL_TYPE_COMMISSION_AGENT_MONTHLY => Monthly agent commission - ENUM_DEAL_TYPE type; - - // - // the deal direction ... - // ---------------------------------- - // DEAL_ENTRY_IN => Entry in ... - // DEAL_ENTRY_OUT => Entry out ... - // DEAL_ENTRY_INOUT => Reverse ... - // DEAL_ENTRY_OUT_BY => Close a position by an opposite one ... - ENUM_DEAL_ENTRY entry; - - // - // deal reson ... - // --------------------- - // DEAL_REASON_SL => The deal was executed as a result of Stop Loss activation ... - // DEAL_REASON_TP => The deal was executed as a result of Take Profit activation ... - // DEAL_REASON_SO => The deal was executed as a result of the Stop Out event ... - // DEAL_REASON_WEB => The deal was executed as a result of activation of an order placed from the web platform ... - // DEAL_REASON_SPLIT => The deal was executed after the split (price reduction) of an instrument, which had an open position during split announcement ... - // DEAL_REASON_CLIENT => The deal was executed as a result of activation of an order placed from a desktop terminal ... - // DEAL_REASON_MOBILE => The deal was executed as a result of activation of an order placed from a mobile application ... - // DEAL_REASON_EXPERT => The deal was executed as a result of activation of an order placed from an MQL5 program, i.e. an Expert Advisor or a script ... - // DEAL_REASON_VMARGIN => The deal was executed after charging the variation margin ... - // DEAL_REASON_ROLLOVER => The deal was executed due to a rollover ... - ENUM_DEAL_REASON reason; -}; - -// -// Model Specific Order ... -struct XOrder -{ - // - // the ID of expert that placed the order ... - ulong magic; - - // - // the ID of position ... - ulong positionId; - - // - // the name of order symbol ... - string symbol; - - // - // the ticket of an order, previously selected for access ... - ulong ticket; - - // - // the time of order placement ... - datetime timeSetup; - - // - // the time of order execution or cancellation ... - datetime timeDone; - - // - // the order expiration time ... - datetime timeExpiration; - - // - // the order price ... - double priceOpen; - - // - // the current price by order symbol ... - double priceCurrent; - - // - // the price of a pending order ... - double priceStopLimit; - - // - // the order's Stop Loss ... - double stopLoss; - - // - // the order's Take Profit ... - double takeProfit; - - // - // the initial volume of order ... - double volumeInitial; - - // - // the unfilled volume of order ... - double volumeCurrent; - - // - // the order comment ... - string comment; - - // - // the order type ... - // -------------------- - // ORDER_TYPE_BUY => Market Buy order ... - // ORDER_TYPE_SELL => Market Sell order ... - // ORDER_TYPE_BUY_LIMIT => Buy Limit pending order ... - // ORDER_TYPE_SELL_LIMIT => Sell Limit pending order ... - // ORDER_TYPE_BUY_STOP => Buy Stop pending order ... - // ORDER_TYPE_SELL_STOP => Sell Stop pending order ... - // ORDER_TYPE_BUY_STOP_LIMIT => Upon reaching the order price, a pending Buy Limit order is placed at the StopLimit price ... - // ORDER_TYPE_SELL_STOP_LIMIT => Upon reaching the order price, a pending Sell Limit order is placed at the StopLimit price ... - // ORDER_TYPE_CLOSE_BY => Order to close a position by an opposite one ... - ENUM_ORDER_TYPE type; - - // - // the order state ... - // -------------------------- - // ORDER_STATE_STARTED => Order checked, but not yet accepted by broker ... - // ORDER_STATE_PLACED => Order accepted ... - // ORDER_STATE_CANCELED => Order canceled by client ... - // ORDER_STATE_PARTIAL => Order partially executed ... - // ORDER_STATE_FILLED => Order fully executed ... - // ORDER_STATE_REJECTED => Order rejected ... - // ORDER_STATE_EXPIRED => Order expired ... - // ORDER_STATE_REQUEST_ADD => Order is being registered (placing to the trading system) - // ORDER_STATE_REQUEST_MODIFY => Order is being modified (changing its parameters) ... - // ORDER_STATE_REQUEST_CANCEL => Order is being deleted (deleting from the trading system) ... - ENUM_ORDER_STATE state; - - // - // the order filling type ... - // ---------------------------- - // ORDER_FILLING_FOK => Fill or Kill - // An order can be executed in the specified volume only. - // If the necessary amount of a financial instrument is currently unavailable in the market, - // the order will not be executed. - // The desired volume can be made up of several available offers. - // The possibility of using FOK orders is determined at the trade server. - // ORDER_FILLING_IOC => Immediate or Cancel - // A trader agrees to execute a deal with the volume maximally available in the market within that indicated in the order. - // If the request cannot be filled completely, an order with the available volume will be executed, - // and the remaining volume will be canceled. - // The possibility of using IOC orders is determined at the trade server. - // ORDER_FILLING_BOC => Passive (Book or Cancel) - // The BoC order assumes that the order can only be placed in the Depth of Market and cannot be immediately executed. - // If the order can be executed immediately when placed, then it is canceled. - // In fact, the BOC policy guarantees that the price of the placed order will be worse than - // the current market. BoC orders are used to implement passive trading, - // so that the order is not executed immediately when placed and does not affect current liquidity. - // Only limit and stop limit orders are supported (ORDER_TYPE_BUY_LIMIT, ORDER_TYPE_SELL_LIMIT, ORDER_TYPE_BUY_STOP_LIMIT, ORDER_TYPE_SELL_STOP_LIMIT). - // ORDER_FILLING_RETURN => Return - // In case of partial filling, an order with remaining volume is not canceled but processed further. - // Return orders are not allowed in the Market Execution - // mode (market execution — SYMBOL_TRADE_EXECUTION_MARKET). - ENUM_ORDER_TYPE_FILLING typeFilling; - - // - // the type of order at the time of the expiration ... - // -------------------------------------------------------- - // ORDER_TIME_GTC => Good till cancel order ... - // ORDER_TIME_DAY => Good till current trade day order ... - // ORDER_TIME_SPECIFIED => Good till expired order ... - // ORDER_TIME_SPECIFIED_DAY => The order will be effective till 23:59:59 of the specified day. - // If this time is outside a trading session, the order expires in the nearest trading time ... - ENUM_ORDER_TYPE_TIME typeTime; - - // - // The reason for order placing ... - // -------------------------------------- - // ORDER_REASON_SL => The order was placed as a result of Stop Loss activation ... - // ORDER_REASON_TP => The order was placed as a result of Take Profit activation ... - // ORDER_REASON_SO => The order was placed as a result of the Stop Out event ... - // ORDER_REASON_WEB => The order was placed from a web platform ... - // ORDER_REASON_CLIENT => The order was placed from a desktop terminal ... - // ORDER_REASON_MOBILE => The order was placed from a mobile application ... - // ORDER_REASON_EXPERT => The order was placed from an MQL5-program, i.e. by an Expert Advisor or a script ... - ENUM_ORDER_REASON reason; -}; -// -// END Provided Functions ... -// diff --git a/BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 b/BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 deleted file mode 100644 index c077b65f..00000000 --- a/BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.indicators.lib.mq5 +++ /dev/null @@ -1,13599 +0,0 @@ -/////////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XEU5 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.xeu5.provider.inputs.lib.mq5" - -// -// Include Provider Class ... -#include "../Classes/x-saherelm.provider.lib.mq5" - -// -// Signallers ... -input group "XEU5 Signallers"; - -// -// XTD ... -input group "XEU5 XTD Signaller"; -input bool xEU5XTDEnableSignaller = true; // Enable Signaller -input bool xEU5XTDAllowLongSignals = true; // Enable Long Signals -input bool xEU5XTDAllowShortSignals = true; // Enable Short Signals - -// -// XTAM ... -input group "XEU5 XTAM Signaller"; -input bool xEU5XTAMEnableSignaller = true; // Enable Signaller -input bool xEU5XTAMAllowLongSignals = true; // Enable Long Signals -input bool xEU5XTAMAllowShortSignals = true; // Enable Short Signals - -// -// XSI ... -input group "XEU5 XSI Signaller"; -input bool xEU5XSIEnableSignaller = true; // Enable Signaller -input bool xEU5XSIAllowLongSignals = true; // Enable Long Signals -input bool xEU5XSIAllowShortSignals = true; // Enable Short Signals - -// -// XTSFI ... -input group "XEU5 XTSFI Signaller"; -input bool xEU5XTSFIEnableSignaller = true; // Enable Signaller -input bool xEU5XTSFIAllowLongSignals = true; // Enable Long Signals -input bool xEU5XTSFIAllowShortSignals = true; // Enable Short Signals - -// -// XOBDLH ... -input group "XEU5 XOBDLH Signaller"; -input bool xEU5XOBDLHEnableSignaller = true; // Enable Signaller -input bool xEU5XOBDLHAllowLongSignals = true; // Enable Long Signals -input bool xEU5XOBDLHAllowShortSignals = true; // Enable Short Signals - -// -// XCHMACC ... -input group "XEU5 XCHMACC Signaller"; -input bool xEU5XCHMACCEnableSignaller = true; // Enable Signaller -input bool xEU5XCHMACCAllowLongSignals = true; // Enable Long Signals -input bool xEU5XCHMACCAllowShortSignals = true; // Enable Short Signals - -// -// XCHMAMX ... -input group "XEU5 XCHMAMX Signaller"; -input bool xEU5XCHMAMXEnableSignaller = true; // Enable Signaller -input bool xEU5XCHMAMXAllowLongSignals = true; // Enable Long Signals -input bool xEU5XCHMAMXAllowShortSignals = true; // Enable Short Signals - -// -// XCHMAMN ... -input group "XEU5 XCHMAMN Signaller"; -input bool xEU5XCHMAMNEnableSignaller = true; // Enable Signaller -input bool xEU5XCHMAMNAllowLongSignals = true; // Enable Long Signals -input bool xEU5XCHMAMNAllowShortSignals = true; // Enable Short Signals - -// -bool xEU5IsTestMode = true; -int xEU5MaxLengthOfInputs = 0; -int xEU5CalculatedBars = 0; - -// -// Signaller Variables ... -// -// XTD ... -bool xEU5MXTDEnableSignaller = xEU5XTDEnableSignaller; -bool xEU5MXTDAllowLongSignals = xEU5XTDAllowLongSignals; -bool xEU5MXTDAllowShortSignals = xEU5XTDAllowShortSignals; - -// -// XTAM ... -bool xEU5MXTAMEnableSignaller = xEU5XTAMEnableSignaller; -bool xEU5MXTAMAllowLongSignals = xEU5XTAMAllowLongSignals; -bool xEU5MXTAMAllowShortSignals = xEU5XTAMAllowShortSignals; - -// -// XSI ... -bool xEU5MXSIEnableSignaller = xEU5XSIEnableSignaller; -bool xEU5MXSIAllowLongSignals = xEU5XSIAllowLongSignals; -bool xEU5MXSIAllowShortSignals = xEU5XSIAllowShortSignals; - -// -// XTSFI ... -bool xEU5MXTSFIEnableSignaller = xEU5XTSFIEnableSignaller; -bool xEU5MXTSFIAllowLongSignals = xEU5XTSFIAllowLongSignals; -bool xEU5MXTSFIAllowShortSignals = xEU5XTSFIAllowShortSignals; - -// -// XOBDLH ... -bool xEU5MXOBDLHEnableSignaller = xEU5XOBDLHEnableSignaller; -bool xEU5MXOBDLHAllowLongSignals = xEU5XOBDLHAllowLongSignals; -bool xEU5MXOBDLHAllowShortSignals = xEU5XOBDLHAllowShortSignals; - -// -// XCHMACC ... -bool xEU5MXCHMACCEnableSignaller = xEU5XCHMACCEnableSignaller; -bool xEU5MXCHMACCAllowLongSignals = xEU5XCHMACCAllowLongSignals; -bool xEU5MXCHMACCAllowShortSignals = xEU5XCHMACCAllowShortSignals; - -// -// XCHMAMX ... -bool xEU5MXCHMAMXEnableSignaller = xEU5XCHMAMXEnableSignaller; -bool xEU5MXCHMAMXAllowLongSignals = xEU5XCHMAMXAllowLongSignals; -bool xEU5MXCHMAMXAllowShortSignals = xEU5XCHMAMXAllowShortSignals; - -// -// XCHMAMN ... -bool xEU5MXCHMAMNEnableSignaller = xEU5XCHMAMNEnableSignaller; -bool xEU5MXCHMAMNAllowLongSignals = xEU5XCHMAMNAllowLongSignals; -bool xEU5MXCHMAMNAllowShortSignals = xEU5XCHMAMNAllowShortSignals; - -// -XCProvider *xEU5Provider; - -// -// Validate Indicators Inputs ... -bool XEU5ValidateIndicatorsInputs() -{ - // - bool result = false; - - // - // XTM ... - result = XTMValidateInputs(); - if (!result) - { - return result; - } - - // - // XAMA ... - result = XAMAValidateInputs(); - if (!result) - { - return result; - } - - // - // XTD ... - result = XTDValidateInputs(); - if (!result) - { - return result; - } - - // - // XFI ... - result = XFIValidateInputs(); - if (!result) - { - return result; - } - - // - // XTS ... - result = XTSValidateInputs(); - if (!result) - { - return result; - } - - // - // XOBD ... - result = XOBDValidateInputs(); - if (!result) - { - return result; - } - - // - // XLH ... - result = XLHValidateInputs(); - if (!result) - { - return result; - } - - // - // XRSI ... - result = XRSIValidateInputs(); - if (!result) - { - return result; - } - - // - // XCHLH ... - result = XCHLHValidateInputs(); - if (!result) - { - return result; - } - - // - // XCHMA ... - result = XCHMAValidateInputs(); - if (!result) - { - return result; - } - - // - // Make an Instance Of XCProvider Class for Use ... - xEU5Provider = new XCProvider( - // - // Commons ... - _Symbol, - _Period, - // - // Signallers ... - // - // XTD ... - xEU5MXTDEnableSignaller, - xEU5MXTDAllowLongSignals, - xEU5MXTDAllowShortSignals, - // - // XTAM ... - xEU5MXTAMEnableSignaller, - xEU5MXTAMAllowLongSignals, - xEU5MXTAMAllowShortSignals, - // - // XSI ... - xEU5MXSIEnableSignaller, - xEU5MXSIAllowLongSignals, - xEU5MXSIAllowShortSignals, - // - // XTSFI ... - xEU5MXTSFIEnableSignaller, - xEU5MXTSFIAllowLongSignals, - xEU5MXTSFIAllowShortSignals, - // - // XOBDLH ... - xEU5MXOBDLHEnableSignaller, - xEU5MXOBDLHAllowLongSignals, - xEU5MXOBDLHAllowShortSignals, - // - // XCHMACC ... - xEU5MXCHMACCEnableSignaller, - xEU5MXCHMACCAllowLongSignals, - xEU5MXCHMACCAllowShortSignals, - // - // XCHMAMX ... - xEU5MXCHMAMXEnableSignaller, - xEU5MXCHMAMXAllowLongSignals, - xEU5MXCHMAMXAllowShortSignals, - // - // XCHMAMN ... - xEU5MXCHMAMNEnableSignaller, - xEU5MXCHMAMNAllowLongSignals, - xEU5MXCHMAMNAllowShortSignals - // - ); - - // - result = true; - - // - return result; -} - -// -// Init Indicators ... -bool XEU5InitIndicators() -{ - // - bool result = false; - - // - // Make it Enable when we need to Log Market Conditions ... - // xEU5IsTestMode = false; // IsRunningOnTestMode(); - - // - // Check and Calculate Max Length in Inputs ... - // - - // - // XTM ... - xEU5MaxLengthOfInputs = MathMax( - xTMMaPeriod, - xEU5NumberOfItemsPerTick); - - // - // XAMA ... - xEU5MaxLengthOfInputs = MathMax( - xAMALength, - xEU5NumberOfItemsPerTick); - xEU5MaxLengthOfInputs = MathMax( - xAMAFastEMA, - xEU5NumberOfItemsPerTick); - xEU5MaxLengthOfInputs = MathMax( - xAMASlowEMA, - xEU5NumberOfItemsPerTick); - - // - // XLH ... - xEU5MaxLengthOfInputs = MathMax( - xLHLength, - xEU5NumberOfItemsPerTick); - - // - // XTD ... - xEU5MaxLengthOfInputs = MathMax( - xTDLength, - xEU5MaxLengthOfInputs); - - // - // XFI ... - xEU5MaxLengthOfInputs = MathMax( - xFILength, - xEU5MaxLengthOfInputs); - - // - // XRSI ... - xEU5MaxLengthOfInputs = MathMax( - xRSILength, - xEU5MaxLengthOfInputs); - - // - // XOBD ... - xEU5MaxLengthOfInputs = MathMax( - xOBDLength, - xEU5MaxLengthOfInputs); - - // - // XCHLH ... - xEU5MaxLengthOfInputs = MathMax( - xCHLHLcLength, - xEU5MaxLengthOfInputs); - xEU5MaxLengthOfInputs = MathMax( - xCHLHMcLength, - xEU5MaxLengthOfInputs); - xEU5MaxLengthOfInputs = MathMax( - xCHLHScLength, - xEU5MaxLengthOfInputs); - - // - // XCHMA ... - xEU5MaxLengthOfInputs = MathMax( - xCHMAScFastLength, - xEU5MaxLengthOfInputs); - xEU5MaxLengthOfInputs = MathMax( - xCHMAScSlowLength, - xEU5MaxLengthOfInputs); - xEU5MaxLengthOfInputs = MathMax( - xCHMAMcFastLength, - xEU5MaxLengthOfInputs); - xEU5MaxLengthOfInputs = MathMax( - xCHMAMcSlowLength, - xEU5MaxLengthOfInputs); - xEU5MaxLengthOfInputs = MathMax( - xCHMALcFastLength, - xEU5MaxLengthOfInputs); - xEU5MaxLengthOfInputs = MathMax( - xCHMALcSlowLength, - xEU5MaxLengthOfInputs); - - // - // Validate Indicators Inputs before Initialization ... - result = XEU5ValidateIndicatorsInputs(); - if (!result) - { - return result; - } - - // - // Validate Signallers ... - - // - // XTD ... - bool isXTDEnable = - xEU5XTDEnableSignaller && - (xEU5XTDAllowLongSignals || - xEU5XTDAllowShortSignals); - - // - // XTAM ... - bool isXTAMEnable = - xEU5XTAMEnableSignaller && - (xEU5XTAMAllowLongSignals || - xEU5XTAMAllowShortSignals); - - // - // XSI ... - bool isXSIEnable = - xEU5XSIEnableSignaller && - (xEU5XSIAllowLongSignals || - xEU5XSIAllowShortSignals); - - // - // XTSFI ... - bool isXTSFIEnable = - xEU5XTSFIEnableSignaller && - (xEU5XTSFIAllowLongSignals || - xEU5XTSFIAllowShortSignals); - - // - // XOBDLH ... - bool isXOBDLHEnable = - xEU5XOBDLHEnableSignaller && - (xEU5XOBDLHAllowLongSignals || - xEU5XOBDLHAllowShortSignals); - - // - // XCHMACC ... - bool isXCHMACCEnable = - xEU5XCHMACCEnableSignaller && - (xEU5XCHMACCAllowLongSignals || - xEU5XCHMACCAllowShortSignals); - - // - // XCHMAMX ... - bool isXCHMAMXEnable = - xEU5XCHMAMXEnableSignaller && - (xEU5XCHMAMXAllowLongSignals || - xEU5XCHMAMXAllowShortSignals); - - // - // XCHMAMN ... - bool isXCHMAMNEnable = - xEU5XCHMAMNEnableSignaller && - (xEU5XCHMAMNAllowLongSignals || - xEU5XCHMAMNAllowShortSignals); - - // - bool hasSignaller = - // - isXTDEnable || - isXTAMEnable || - isXSIEnable || - isXTSFIEnable || - isXOBDLHEnable || - isXCHMACCEnable || - isXCHMAMXEnable || - isXCHMAMNEnable - // - ; - result = hasSignaller; - if (!result) - { - // - LogMessage("XEU5 doesn't enable any Signaller ..."); - - // - return result; - } - - // - // Initialize Indicator/Oscillator Handlers ... - ResetLastError(); - - // - // XTM Init ... - result = XTMInitHandlers(); - if (!result) - { - return result; - } - - // - // XAMA Init ... - result = XAMAInitHandlers(); - if (!result) - { - return result; - } - - // - // XLH Init ... - result = XLHInitHandlers(); - if (!result) - { - return result; - } - - // - // XTD Init ... - result = XTDInitHandlers(); - if (!result) - { - return result; - } - - // - // XFI Init ... - result = XFIInitHandlers(); - if (!result) - { - return result; - } - - // - // XTS Init ... - result = XTSInitHandlers(); - 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 XEU5ReleaseIndicators() -{ - // - // Release Handlers ... - XTMReleaseHandlers(); - XAMAReleaseHandlers(); - XLHReleaseHandlers(); - XTDReleaseHandlers(); - XFIReleaseHandlers(); - XTSReleaseHandlers(); - XRSIReleaseHandlers(); - XOBDReleaseHandlers(); - XCHMAReleaseHandlers(); - XCHLHReleaseHandlers(); -} - -// -// Handle Reading Buffers ... -void XEU5HandleReadingBuffers() -{ - // - // Reading Calculated Bars for a Simple Handler ... - xEU5CalculatedBars = BarsCalculated(xTMHandler); - - // - // Read Indicators Buffers ... - XTMReadBuffers(xEU5NumberOfItemsPerTick); - XAMAReadBuffers(xEU5NumberOfItemsPerTick); - XLHReadBuffers(xEU5NumberOfItemsPerTick); - XTDReadBuffers(xEU5NumberOfItemsPerTick); - XFIReadBuffers(xEU5NumberOfItemsPerTick); - XTSReadBuffers(xEU5NumberOfItemsPerTick); - XRSIReadBuffers(xEU5NumberOfItemsPerTick); - XOBDReadBuffers(xEU5NumberOfItemsPerTick); - XCHMAReadBuffers(xEU5NumberOfItemsPerTick); - XCHLHReadBuffers(xEU5NumberOfItemsPerTick); - - // - xEU5Provider.ReadConditions(); -} - -// -// -// 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 XEU5CanOpenLongTrade( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - info.tp = 0; - info.sl = 0; - ArrayResize( - info.signallers, - 0); - - // - bool hasSignal = XEU5HasLongSignal(info); - - // - result = - // - hasSignal - // - ; - - // - if (result) - { - xEU5Provider.ClearConditions(); - } - - // - 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 XEU5CanCloseLongTrade() -{ - // - bool result = false; - - // - 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 XEU5CanOpenShortTrade( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - info.tp = 0; - info.sl = 0; - ArrayResize( - info.signallers, - 0); - - // - bool hasSignal = XEU5HasShortSignal(info); - - // - result = - // - hasSignal - // - ; - - // - if (result) - { - xEU5Provider.ClearConditions(); - } - - // - 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 XEU5CanCloseShortTrade() -{ - // - bool result = false; - - // - return result; -} - -// -// -// END Combination Functions ... -// -// - -// -// -// START Combination Signaling ... -// -// - -// -// Check Market Conditions by Combination of Power of All tools for LONGs ... -bool XEU5HasLongSignal( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - // XTD ... - bool isXTDHasSignal = XEU5XTDHasLongSignal(); - if (isXTDHasSignal) - { - // - Add( - EnumToString(XTD), - info.signallers); - } - - // - // XTAM ... - bool isXTAMHasSignal = XEU5XTAMHasLongSignal(); - if (isXTAMHasSignal) - { - // - Add( - EnumToString(XTAM), - info.signallers); - } - - // - // XSI ... - bool isXSIHasSignal = XEU5XSIHasLongSignal(); - if (isXSIHasSignal) - { - // - Add( - EnumToString(XSI), - info.signallers); - } - - // - // XTSFI ... - bool isXTSFIHasSignal = XEU5XTSFIHasLongSignal(); - if (isXTSFIHasSignal) - { - // - Add( - EnumToString(XTSFI), - info.signallers); - } - - // - // XOBD XLH ... - bool isXOBDLHHasSignal = XEU5XOBDLHHasLongSignal(); - if (isXOBDLHHasSignal) - { - // - Add( - EnumToString(XOBDLH), - info.signallers); - } - - // - // XCHMA Cycles Cross ... - bool isXCHMACCHasSignal = XEU5XCHMACCHasLongSignal(); - if (isXCHMACCHasSignal) - { - // - Add( - EnumToString(XCHMACC), - info.signallers); - } - - // - // XCHMA Cycles Min ... - bool isXCHMAMNHasSignal = XEU5XCHMAMNHasLongSignal(); - if (isXCHMAMNHasSignal) - { - // - Add( - EnumToString(XCHMAMN), - info.signallers); - } - - // - // XCHMA Cycles Max - bool isXCHMAMXHasSignal = XEU5XCHMAMXHasLongSignal(); - if (isXCHMAMXHasSignal) - { - // - Add( - EnumToString(XCHMAMX), - info.signallers); - } - - // - result = - // - isXTDHasSignal - // - || - // - isXTAMHasSignal - // - || - // - isXSIHasSignal - // - || - // - isXTSFIHasSignal - // - || - // - isXOBDLHHasSignal - // - || - // - isXCHMACCHasSignal - // - || - // - isXCHMAMNHasSignal - // - || - // - isXCHMAMXHasSignal - // - ; - - // - if (result) - { - // - // Only Log Signals Time Market Conditions if is in Testing Mode ... - if (xEU5IsTestMode) - { - // - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - string message = xEU5Provider.GenerateConditionsString(mConditions); - - // - LogMessage( - "Long Signal Provided by: \n" + - info.signallers[ArraySize(info.signallers) - 1] + "\n" + - "Pusher: " + (string)ArraySize(info.signallers) + "\n" + - "Market Conditions: " + message); - } - } - - // - return result; -} - -// -// Check Market Conditions by Combination of Power of All tools for SHORTs ... -bool XEU5HasShortSignal( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - // XTD ... - bool isXTDHasSignal = XEU5XTDHasShortSignal(); - if (isXTDHasSignal) - { - // - Add( - EnumToString(XTD), - info.signallers); - } - - // - // XTAM ... - bool isXTAMHasSignal = XEU5XTAMHasShortSignal(); - if (isXTAMHasSignal) - { - // - Add( - EnumToString(XTAM), - info.signallers); - } - - // - // XSI ... - bool isXSIHasSignal = XEU5XSIHasShortSignal(); - if (isXSIHasSignal) - { - // - Add( - EnumToString(XSI), - info.signallers); - } - - // - // XTSFI ... - bool isXTSFIHasSignal = XEU5XTSFIHasShortSignal(); - if (isXTSFIHasSignal) - { - // - Add( - EnumToString(XTSFI), - info.signallers); - } - - // - // XOBD XLH ... - bool isXOBDLHHasSignal = XEU5XOBDLHHasShortSignal(); - if (isXOBDLHHasSignal) - { - // - Add( - EnumToString(XOBDLH), - info.signallers); - } - - // - // XCHMA Cycles Cross ... - bool isXCHMACCHasSignal = XEU5XCHMACCHasShortSignal(); - if (isXCHMACCHasSignal) - { - // - Add( - EnumToString(XCHMACC), - info.signallers); - } - - // - // XCHMA Cycles Min ... - bool isXCHMAMNHasSignal = XEU5XCHMAMNHasShortSignal(); - if (isXCHMAMNHasSignal) - { - // - Add( - EnumToString(XCHMAMN), - info.signallers); - } - - // - // XCHMA Cycles Max - bool isXCHMAMXHasSignal = XEU5XCHMAMXHasShortSignal(); - if (isXCHMAMXHasSignal) - { - // - Add( - EnumToString(XCHMAMX), - info.signallers); - } - - // - result = - // - isXTDHasSignal - // - || - // - isXTAMHasSignal - // - || - // - isXSIHasSignal - // - || - // - isXTSFIHasSignal - // - || - // - isXOBDLHHasSignal - // - || - // - isXCHMACCHasSignal - // - || - // - isXCHMAMNHasSignal - // - || - // - isXCHMAMXHasSignal - // - ; - - // - if (result) - { - // - // Only Log Signals Time Market Conditions if is in Testing Mode ... - if (xEU5IsTestMode) - { - // - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - string message = xEU5Provider.GenerateConditionsString(mConditions); - - // - LogMessage( - "Short Signal Provided by: \n" + - info.signallers[ArraySize(info.signallers) - 1] + "\n" + - "Pusher: " + (string)ArraySize(info.signallers) + "\n" + - "Market Conditions: " + message); - } - } - - // - return result; -} - -// -// -// END Combination Signaling ... -// -// - -// -// START Signal Providers ... -// - -// -// Disbale All Signallers Longs ... -void XEU5DisableLongSignallers() -{ - // - // XTD ... - if (xEU5MXTDEnableSignaller) - { - // - xEU5Provider.DisbaleXTDLongs(); - xEU5MXTDAllowLongSignals = false; - } - - // - // XTAM ... - if (xEU5MXTAMEnableSignaller) - { - // - xEU5Provider.DisbaleXTAMLongs(); - xEU5MXTAMAllowLongSignals = false; - } - - // - // XSI ... - if (xEU5MXSIEnableSignaller) - { - // - xEU5Provider.DisbaleXSILongs(); - xEU5MXSIAllowLongSignals = false; - } - - // - // XTSFI ... - if (xEU5MXTSFIEnableSignaller) - { - // - xEU5Provider.DisbaleXTSFILongs(); - xEU5MXTSFIAllowLongSignals = false; - } - - // - // XOBDLH ... - if (xEU5MXOBDLHEnableSignaller) - { - // - xEU5Provider.DisbaleXOBDLHLongs(); - xEU5MXOBDLHAllowLongSignals = false; - } - - // - // XCHMACC ... - if (xEU5MXCHMACCEnableSignaller) - { - // - xEU5Provider.DisbaleXCHMACCLongs(); - xEU5MXCHMACCAllowLongSignals = false; - } - - // - // XCHMAMX ... - if (xEU5MXCHMAMXEnableSignaller) - { - // - xEU5Provider.DisbaleXCHMAMXLongs(); - xEU5MXCHMAMXAllowLongSignals = false; - } - - // - // XCHMAMN ... - if (xEU5MXCHMAMNEnableSignaller) - { - // - xEU5Provider.DisbaleXCHMAMNLongs(); - xEU5MXCHMAMNAllowLongSignals = false; - } -} - -// -// Enable All Signallers Longs ... -// Only if they are Configured as Enable at Settings ... -void XEU5EnableLongSignallers() -{ - // - // XTD ... - if (xEU5MXTDEnableSignaller) - { - // - xEU5MXTDAllowLongSignals = - xEU5XTDAllowLongSignals - ? true - : xEU5MXTDAllowLongSignals; - - // - if (xEU5MXTDAllowLongSignals) - { - xEU5Provider.EnableXTDLongs(); - } - } - - // - // XTAM ... - if (xEU5MXTAMEnableSignaller) - { - // - xEU5MXTAMAllowLongSignals = - xEU5XTAMAllowLongSignals - ? true - : xEU5MXTAMAllowLongSignals; - - // - if (xEU5MXTAMAllowLongSignals) - { - xEU5Provider.EnableXTAMLongs(); - } - } - - // - // XSI ... - if (xEU5MXSIEnableSignaller) - { - // - xEU5MXSIAllowLongSignals = - xEU5XSIAllowLongSignals - ? true - : xEU5MXSIAllowLongSignals; - - // - if (xEU5MXSIAllowLongSignals) - { - xEU5Provider.EnableXSILongs(); - } - } - - // - // XTSFI ... - if (xEU5MXTSFIEnableSignaller) - { - // - xEU5MXTSFIAllowLongSignals = - xEU5XTSFIAllowLongSignals - ? true - : xEU5MXTSFIAllowLongSignals; - - // - if (xEU5MXTSFIAllowLongSignals) - { - xEU5Provider.EnableXTSFILongs(); - } - } - - // - // XOBDLH ... - if (xEU5MXOBDLHEnableSignaller) - { - // - xEU5MXOBDLHAllowLongSignals = - xEU5XOBDLHAllowLongSignals - ? true - : xEU5MXOBDLHAllowLongSignals; - - // - if (xEU5MXOBDLHAllowLongSignals) - { - xEU5Provider.EnableXOBDLHLongs(); - } - } - - // - // XCHMACC ... - if (xEU5MXCHMACCEnableSignaller) - { - // - xEU5MXCHMACCAllowLongSignals = - xEU5XCHMACCAllowLongSignals - ? true - : xEU5MXCHMACCAllowLongSignals; - - // - if (xEU5MXCHMACCAllowLongSignals) - { - xEU5Provider.EnableXCHMACCLongs(); - } - } - - // - // XCHMAMX ... - if (xEU5MXCHMAMXEnableSignaller) - { - // - xEU5MXCHMAMXAllowLongSignals = - xEU5XCHMAMXAllowLongSignals - ? true - : xEU5MXCHMAMXAllowLongSignals; - - // - if (xEU5MXCHMAMXAllowLongSignals) - { - xEU5Provider.EnableXCHMAMXLongs(); - } - } - - // - // XCHMAMN ... - if (xEU5MXCHMAMNEnableSignaller) - { - // - xEU5MXCHMAMNAllowLongSignals = - xEU5XCHMAMNAllowLongSignals - ? true - : xEU5MXCHMAMNAllowLongSignals; - - // - if (xEU5MXCHMAMNAllowLongSignals) - { - xEU5Provider.EnableXCHMAMNLongs(); - } - } -} - -// -// Disable All Signallers Shorts ... -void XEU5DisableShortSignallers() -{ - // - // XTD ... - if (xEU5MXTDEnableSignaller) - { - // - xEU5Provider.DisableXTDShorts(); - xEU5MXTDAllowShortSignals = false; - } - - // - // XTAM ... - if (xEU5MXTAMEnableSignaller) - { - // - xEU5Provider.DisableXTAMShorts(); - xEU5MXTAMAllowShortSignals = false; - } - - // - // XSI ... - if (xEU5MXSIEnableSignaller) - { - // - xEU5Provider.DisableXSIShorts(); - xEU5MXSIAllowShortSignals = false; - } - - // - // XTSFI ... - if (xEU5MXTSFIEnableSignaller) - { - // - xEU5Provider.DisableXTSFIShorts(); - xEU5MXTSFIAllowShortSignals = false; - } - - // - // XOBDLH ... - if (xEU5MXOBDLHEnableSignaller) - { - // - xEU5Provider.DisableXOBDLHShorts(); - xEU5MXOBDLHAllowShortSignals = false; - } - - // - // XCHMACC ... - if (xEU5MXCHMACCEnableSignaller) - { - // - xEU5Provider.DisableXCHMACCShorts(); - xEU5MXCHMACCAllowShortSignals = false; - } - - // - // XCHMAMX ... - if (xEU5MXCHMAMXEnableSignaller) - { - // - xEU5Provider.DisableXCHMAMXShorts(); - xEU5MXCHMAMXAllowShortSignals = false; - } - - // - // XCHMAMN ... - if (xEU5MXCHMAMNEnableSignaller) - { - // - xEU5Provider.DisableXCHMAMNShorts(); - xEU5MXCHMAMNAllowShortSignals = false; - } -} - -// -// Enable All Signallers Shorts ... -// Only if they are Configured as Enable at Settings ... -void XEU5EnableShortSignallers() -{ - // - // XTD ... - if (xEU5MXTDEnableSignaller) - { - // - xEU5MXTDAllowShortSignals = - xEU5XTDAllowShortSignals - ? true - : xEU5MXTDAllowShortSignals; - - // - if (xEU5MXTDAllowShortSignals) - { - xEU5Provider.EnableXTDShorts(); - } - } - - // - // XTAM ... - if (xEU5MXTAMEnableSignaller) - { - // - xEU5MXTAMAllowShortSignals = - xEU5XTAMAllowShortSignals - ? true - : xEU5MXTAMAllowShortSignals; - - // - if (xEU5MXTAMAllowShortSignals) - { - xEU5Provider.EnableXTAMShorts(); - } - } - - // - // XSI ... - if (xEU5MXSIEnableSignaller) - { - // - xEU5MXSIAllowShortSignals = - xEU5XSIAllowShortSignals - ? true - : xEU5MXSIAllowShortSignals; - - // - if (xEU5MXSIAllowShortSignals) - { - xEU5Provider.EnableXSIShorts(); - } - } - - // - // XTSFI ... - if (xEU5MXTSFIEnableSignaller) - { - // - xEU5MXTSFIAllowShortSignals = - xEU5XTSFIAllowShortSignals - ? true - : xEU5MXTSFIAllowShortSignals; - - // - if (xEU5MXTSFIAllowShortSignals) - { - xEU5Provider.EnableXTSFIShorts(); - } - } - - // - // XOBDLH ... - if (xEU5MXOBDLHEnableSignaller) - { - // - xEU5MXOBDLHAllowShortSignals = - xEU5XOBDLHAllowShortSignals - ? true - : xEU5MXOBDLHAllowShortSignals; - - // - if (xEU5MXOBDLHAllowShortSignals) - { - xEU5Provider.EnableXOBDLHShorts(); - } - } - - // - // XCHMACC ... - if (xEU5MXCHMACCEnableSignaller) - { - // - xEU5MXCHMACCAllowShortSignals = - xEU5XCHMACCAllowShortSignals - ? true - : xEU5MXCHMACCAllowShortSignals; - - // - if (xEU5MXCHMACCAllowShortSignals) - { - xEU5Provider.EnableXCHMACCShorts(); - } - } - - // - // XCHMAMX ... - if (xEU5MXCHMAMXEnableSignaller) - { - // - xEU5MXCHMAMXAllowShortSignals = - xEU5XCHMAMXAllowShortSignals - ? true - : xEU5MXCHMAMXAllowShortSignals; - - // - if (xEU5MXCHMAMXAllowShortSignals) - { - xEU5Provider.EnableXCHMAMXShorts(); - } - } - - // - // XCHMAMN ... - if (xEU5MXCHMAMNEnableSignaller) - { - // - xEU5MXCHMAMNAllowShortSignals = - xEU5XCHMAMNAllowShortSignals - ? true - : xEU5MXCHMAMNAllowShortSignals; - - // - if (xEU5MXCHMAMNAllowShortSignals) - { - xEU5Provider.EnableXCHMAMNShorts(); - } - } -} - -// -// -// - -// -// XTD Long Signal Checking ... -bool XEU5XTDHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXTDEnableSignaller || - !xEU5MXTDAllowLongSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XTDHasLongConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTSCurrentMin && - mConditions.isXTDSignalCrossedOverBear && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - || - // - ((mConditions.isXTSCurrentUnderNearest || - mConditions.isXTSCurrentCrossedUnderNearest) && - (mConditions.isXTSCurrentUnderMediest || - mConditions.isXTSCurrentCrossedUnderMediest) && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - || - // - (mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXTSCurrentMax && - mConditions.isXCHLHMCLCLLSame) - // - || - // - ((mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXCHMASCCrossedOverMin && - mConditions.isXTDSignalCrossedOverBear && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - ( - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXTSCurrentMax) - // - || - // - (mConditions.isXCHMALCVale && - mConditions.isXTSCurrentUnderNearest) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural) - // - || - // - (mConditions.isXFICrossedOverZero && - mConditions.isXTDSignalCrossedOverBear) - // - ) - // - ) - // - || - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ( - (mConditions.isXCHMAMCVale && - mConditions.isXTDBearishVale) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXCHLHMCLCLLSame) - // - || - // - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) - // - || - // - (mConditions.isXLHLLIncreased && - mConditions.isXTMStartBullish && - mConditions.isXAMAStartBullish && - mConditions.isXTSCurrentUnderFarest && - (mConditions.isXTSCurrentUnderNearest || - mConditions.isXTSCurrentCrossedUnderNearest)) - // - ) - // - ) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXTDBearishVale && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXCHMAMCTrendsDown) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ( - (mConditions.isXCHMAMCVale && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) && - ( - // - ( - // - mConditions.isXAMANeutural - // - || - // - (mConditions.isXLHLLDecreased && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXAMAStartBullish) - // - ) - // - ) - // - ) - // - || - // - // - ((mConditions.isXTSCurrentMax && - mConditions.isXLHHHDecreased) && - ( - // - (mConditions.isXTDBearishVale && - mConditions.isXCHLHMCLCLLSame && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - || - // - (mConditions.isXCHMALCVale && - mConditions.isXTDSignalCrossedOverBear && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXTMEndBullish && - mConditions.isXAMANeutural && - mConditions.isXAMAEndBullish && - mConditions.isXTDSignalCrossedOverBear && - (mConditions.isXTSCurrentUnderNearest || - mConditions.isXTSCurrentCrossedUnderNearest) && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (mConditions.isXAMANeutural && - mConditions.isXLHHHDecreased && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTDSignalCrossedOverBear && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMANeutural && - mConditions.isXAMAEndBearish && - mConditions.isXTDBearishVale && - mConditions.isXTMStartBullish && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTSCurrentUnderFarest) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMAMCVale && - // - ( - // - (mConditions.isXTMNeutural && - mConditions.isXTMEndBullish) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXCHMALCVale && - mConditions.isXTMStartBullish && - mConditions.isXCHLHMCLCLLSame) - // - || - // - (mConditions.isXAMANeutural && - mConditions.isXTDBearishVale && - mConditions.isXCHLHMCLCHHSame) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXLHHHDecreased) - // - || - // - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) - // - ) - // - ) - // - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMAMCVale && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXTDBearishVale && - mConditions.isXCHLHSCMCLLSame) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXLHHHDecreased && - mConditions.isXFICrossedOverZero) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXAMAStartBearish && - mConditions.isXTDSignalCrossedOverBear) - // - || - // - (mConditions.isXAMANeutural && - mConditions.isXTSCurrentUnderFarest && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXAMAVale && - mConditions.isXTSCurrentMax && - mConditions.isXTDBearishVale && - mConditions.isXLHLLIncreased) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXCHMALCVale && - mConditions.isXAMANeutural && - mConditions.isXFICrossedOverZero && - mConditions.isXTDSignalCrossedOverBear && - mConditions.isXLHPriceCrossedUnderSignal) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXAMANeutural && - mConditions.isXTSCurrentMax && - mConditions.isXTMStartBullish && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverNearest && - mConditions.isXTSCurrentOverMediest && - mConditions.isXTSCurrentCrossedOverFarest && - mConditions.isXTSCurrentCrossedOverNearest && - mConditions.isXTSCurrentCrossedOverMediest && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXLHHHIncreased && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXTSCurrentUnderMediest && - mConditions.isXTDSignalCrossedOverBear && - (mConditions.isXCHMASCTrendsUp && - (mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow))) - // - || - // - (mConditions.isXTDSignalCrossedOverBear && - (mConditions.isXCHMALCVale && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow))) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHLHMCLCLLSame && - mConditions.isXTSCurrentUnderNearest) - // - || - // - (mConditions.isXCHLHMCLCHHSame && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXTSCurrentUnderNearest) - // - ) - // - ) - // - || - // - (mConditions.isXCHMALCVale && - mConditions.isXTDBearishVale && - mConditions.isXTMStartBullish && - mConditions.isXAMAStartBullish) - // - || - // - ((mConditions.isXTSCurrentMax && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTDSignalCrossedOverBear) && - ( - // - ( - // - mConditions.isXCHMASCCrossedOverMax - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverNearest && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - ) - // - || - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXCHMASCCrossedOverMax && - mConditions.isXTDSignalCrossedOverBear) - // - || - // - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) - // - || - // - ((mConditions.isXTMNeutural && - mConditions.isXAMANeutural) && - ( - // - ( - // - (mConditions.isXTSCurrentUnderFarest || - mConditions.isXTSCurrentUnderMediest) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXTDBearishVale && - mConditions.isXTDSignalCrossedOverBear) - // - ) && - (mConditions.isXCHMALCVale && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCVale && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) && - ( - // - mConditions.isXRSICrossedOverLongExit - // - || - // - (mConditions.isXTSAllSame && - mConditions.isXAMAStartBullish && - mConditions.isXTDSignalCrossedOverBear) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXAMAStartBullish) - // - || - // - ((mConditions.isXTSCurrentUnderNearest || - mConditions.isXTSCurrentCrossedUnderNearest) && - (mConditions.isXTSCurrentUnderMediest || - mConditions.isXTSCurrentCrossedUnderMediest)) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXTSCurrentMax || - mConditions.isXTSCurrentUnderFarest) && - mConditions.isXTDBearishVale && - mConditions.isXLHLLDecreased && - mConditions.isXLHPriceCrossedOverSignal && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - || - // - ((mConditions.isXCHLHSCMCHHSame && - mConditions.isXTDSignalCrossedOverBear) && - ( - // - (mConditions.isXTSCurrentMax && - mConditions.isXLHHighAttachedHH) - // - || - // - (mConditions.isXCHLHMCLCLLSame && - ( - // - (mConditions.isXCHMASCCrossedOverMin && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (mConditions.isXCHMASCCrossedOverMax && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - (((mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) || - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) && - // - ( - // - ((mConditions.isXTSCurrentUnderNearest || - mConditions.isXTSCurrentCrossedUnderNearest) && - (mConditions.isXTSCurrentUnderMediest || - mConditions.isXTSCurrentCrossedUnderMediest)) - // - ) - // - ) - // - ) - // - ) - // - || - // - (( - // - (mConditions.isXFICrossedOverZero && - mConditions.isXTDSignalCrossedOverBear) - // - || - // - (mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverMediest) - // - ) && - (mConditions.isXCHMALCVale && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow))) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXFIOverZero && - mConditions.isXCHLHSameHHs && - mConditions.isXTSCurrentMax && - mConditions.isXCHMASCCrossedOverMax && - mConditions.isXTDSignalCrossedOverBear) - // - || - // - (mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXTDBearishVale && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXAMAStartBullish) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXTDBearishVale && - mConditions.isXCHLHMCLCHHSame && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (mConditions.isXTMEndBullish && - mConditions.isXTDBearishVale && - mConditions.isXFICrossedOverZero && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - || - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCVale && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXFICrossedOverZero && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverNearest && - mConditions.isXTSCurrentOverMediest && - mConditions.isXTDSignalCrossedOverBear) - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXTSCurrentMax && - mConditions.isXTDSignalCrossedOverBear) && - ( - // - (mConditions.isXCHLHSCMCHHSame && - mConditions.isXLHHighAttachedHH) - // - || - // - (mConditions.isXAMAEndBullish && - mConditions.isXCHLHSCMCLLSame && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural) - // - || - // - (mConditions.isXCHMALCVale && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) - // - ) - // - ) - // - || - // - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XTD Short Signal Checking ... -bool XEU5XTDHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXTDEnableSignaller || - !xEU5MXTDAllowShortSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XTDHasShortConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTDBullOverBear && - mConditions.isXFICrossedOverZero && - mConditions.isXTSCurrentOverNearest && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTDBullOverBear && - ( - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMAMCTrendsUp) - // - || - // - (mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame) - // - || - // - (mConditions.isXTSCurrentOverNearest && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXFIOverZero && - mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTDBullOverBear) - // - || - // - ((mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverNearest) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - ((mConditions.isXAMANeutural || - mConditions.isXAMAEndBullish) && - mConditions.isXTDBullOverBear) - // - || - // - (mConditions.isXCHLHSameLLs && - mConditions.isXCHMAMCTrendsUp && - mConditions.isXLHLowAttachedLL) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHMALCVale && - mConditions.isXTSCurrentMin && - mConditions.isXTDBullOverBear) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXTDBullOverBear && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural) - // - || - // - (mConditions.isXCHMASCTrendsUp && - mConditions.isXTMStartBearish && - mConditions.isXAMAStartBearish) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - mConditions.isXCHMASCTrendsUp - // - || - // - (mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverNearest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMALCTrendsDown && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXTDBullOverBear && - (mConditions.isXAMANeutural || - mConditions.isXTSCurrentOverFarest)) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMABullish && - mConditions.isXTDBullOverBear && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXCHMALCVale && - mConditions.isXCHMALCTrendsUp && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXCHMASCTrendsUp) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullOverBear && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXLHHighAttachedHH) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTDBullOverBear && - ( - // - (mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTMEndBullish && - mConditions.isXAMAEndBullish && - mConditions.isXLHHighAttachedHH) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - mConditions.isXCHMAMCTrendsUp - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXFIOverZero && - mConditions.isXTDBullOverBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XTAM Long Signal Checking ... -bool XEU5XTAMHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXTAMEnableSignaller || - !xEU5MXTAMAllowLongSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XTAMHasLongConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCVale && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) && - ( - // - (mConditions.isXTMStartBullish && - mConditions.isXAMAStartBullish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTSCurrentMax && - mConditions.isXLHLLIncreased && - mConditions.isXCHLHMCLCHHSame) - // - ) - // - ) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTSCurrentMax) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXCHLHSCMCLLSame) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCVale && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural) - // - ) - // - ) - // - || - // - (mConditions.isXCHMASCPeak && - (mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - ((mConditions.isXCHMAMCVale && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) && - (mConditions.isXCHMALCVale && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow))) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMAMCVale && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentMax && - mConditions.isXLHLLDecreased && - mConditions.isXCHLHMCLCLLSame) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMABearish && - mConditions.isXTMEndBearish && - mConditions.isXTSCurrentUnderFarest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHLHSCMCLLSame && - (mConditions.isXTSCurrentUnderFarest || - mConditions.isXTSCurrentUnderMediest)) - // - || - // - (mConditions.isXCHLHMCLCHHSame && - (mConditions.isXTSCurrentUnderNearest || - mConditions.isXTSCurrentCrossedUnderNearest)) - // - || - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXTSAllSame && - mConditions.isXCHMASCVale && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXCHLHMCLCHHSame) - // - ) - // - ) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ( - (mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderMediest && - mConditions.isXTDBullCrossedUnderBear) - // - ) - // - ) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMASCVale && - mConditions.isXTMNeutural && - mConditions.isXAMANeutural) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentMax && - mConditions.isXLHPriceCrossedOverSignal && - mConditions.isXTSCurrentCrossedOverFarest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMALCVale && - ( - // - mConditions.isXLHHHDecreased - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBearishVale) - // - ) - // - ) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTSCurrentMax && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXCHMASCFastCrossedOverSlow) - // - ) - // - ) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) && - ( - // - (mConditions.isXCHLHSameHHs && - mConditions.isXTSCurrentMax && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverMediest) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXTMStartBullish && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXAMAStartBullish && - mConditions.isXLHHighAttachedHH) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCVale || - mConditions.isXCHLHSameHHs) && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHLHSameHHs && - mConditions.isXLHLLDecreased && - mConditions.isXLHHighAttachedHH) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBearishVale && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXLHHighAttachedHH) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXCHMASCPeak && - (mConditions.isXCHMAMCTrendsDown || - mConditions.isXCHMAMCFastUnderSlow)) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXTMEndBearish && - mConditions.isXAMANeutural && - mConditions.isXAMAEndBearish && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXFICrossedOverZero && - mConditions.isXTSCurrentUnderFarest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTSCurrentMax && - mConditions.isXTMStartBullish && - mConditions.isXAMAStartBullish) - // - ) - // - ) - // - || - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XTAM Short Signal Checking ... -bool XEU5XTAMHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXTAMEnableSignaller || - !xEU5MXTAMAllowShortSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XTAMHasShortConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXFIOverZero && - mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentOverFarest) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ((mConditions.isXTMNeutural || - mConditions.isXTMEndBullish) && - mConditions.isXAMABullish && - mConditions.isXFIOverZero && - mConditions.isXTDBullOverBear) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXCHMASCTrendsUp && - mConditions.isXTSCurrentOverNearest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXCHMASCTrendsUp) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - || - // - (mConditions.isXFIOverZero && - mConditions.isXCHMASCPeak && - mConditions.isXTSCurrentOverFarest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ( - // - mConditions.isXCHMAMCTrendsUp - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXCHMALCVale && - mConditions.isXAMANeutural) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXCHMALCTrendsUp && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXFIOverZero && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTSCurrentMin && - mConditions.isXCHMALCTrendsUp && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest) - // - || - // - ((mConditions.isXAMAVale && - mConditions.isXCHMASCVale && - mConditions.isXTSCurrentMin) && - ( - // - mConditions.isXRSICrossedUnderShortExit - // - || - // - mConditions.isXTDBullishVale - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMALCVale && - mConditions.isXTSCurrentMin && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXLHLowAttachedLL) && - ( - // - mConditions.isXCHMALCTrendsDown - // - || - // - (mConditions.isXTMStartBearish && - mConditions.isXAMAStartBearish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXLHPriceCrossedUnderSignal) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - mConditions.isXRSICrossedUnderShortExit - // - || - // - (mConditions.isXAMAVale && - mConditions.isXTMBearish && - mConditions.isXCHMASCVale && - mConditions.isXAMABearish && - mConditions.isXCHLHSameLLs && - mConditions.isXTSCurrentMin && - mConditions.isXCHMASCTrendsUp && - mConditions.isXLHLowAttachedLL) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - ( - // - mConditions.isXRSICrossedUnderShortExit - // - || - // - (mConditions.isXAMAVale && - mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHMASCVale && - mConditions.isXTSCurrentMin && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderMediest) - // - || - // - ((mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTSCurrentMin && - mConditions.isXLHLowAttachedLL) && - ( - // - (mConditions.isXCHMAMCVale && - mConditions.isXCHLHSameLLs && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXCHMAMCTrendsUp) - // - || - // - (mConditions.isXCHMASCVale && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - ( - // - mConditions.isXRSICrossedUnderShortExit - // - || - // - ((mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTDSignalVale && - mConditions.isXTSCurrentMin && - mConditions.isXTDBullishVale) && - ( - // - (mConditions.isXTSAllSame && - mConditions.isXLHHHDecreased && - mConditions.isXCHLHSCMCLLSame) - // - || - // - (mConditions.isXLHLowAttachedLL && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXTMStartBullish && - mConditions.isXAMAStartBullish) && - ( - // - (mConditions.isXCHMASCPeak && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXCHLHMCLCLLSame) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear && - mConditions.isXTSCurrentOverFarest) - // - || - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullOverBear) && - ( - // - (mConditions.isXCHMASCTrendsUp && - mConditions.isXTDSignalOverBear) - // - || - // - (mConditions.isXFIOverZero && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMAMCTrendsUp) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - (mConditions.isXTDBullOverBear || - mConditions.isXTSCurrentOverFarest)) - // - || - // - (mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame && - (mConditions.isXTSCurrentOverFarest || - mConditions.isXTSCurrentOverMediest)) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXLHLLDecreased && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentMin && - mConditions.isXCHMAMCTrendsUp && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMASCTrendsUp) - // - || - // - (mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear && - mConditions.isXTSCurrentOverFarest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish) - // - || - // - (mConditions.isXFIOverZero && - mConditions.isXCHMALCVale && - mConditions.isXLHHHIncreased && - mConditions.isXTDBullOverBear && - mConditions.isXCHLHSCMCHHSame) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXCHMAMCTrendsUp) - // - || - // - (mConditions.isXTSCurrentMin && - mConditions.isXTDSignalUnderBear && - mConditions.isXFICrossedUnderZero && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest && - mConditions.isXTDBullCrossedUnderBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XSI Long Signal Checking ... -bool XEU5XSIHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXSIEnableSignaller || - !xEU5MXSIAllowLongSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XSIHasLongConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMASCVale && - mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentUnderNearest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXTSAllSame && - mConditions.isXCHLHSameLLs && - mConditions.isXTMStartBullish && - mConditions.isXAMAStartBullish) - // - || - // - (mConditions.isXCHMASCVale && - mConditions.isXCHMAMCVale && - mConditions.isXAMANeutural && - mConditions.isXLHHHDecreased && - mConditions.isXTMStartBullish && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTSCurrentUnderFarest) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMASCVale && - mConditions.isXCHMAMCVale) - // - || - // - (mConditions.isXAMANeutural && - mConditions.isXTMStartBullish) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTSCurrentMin && - mConditions.isXTSCurrentMax) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - (mConditions.isXAMANeutural || - mConditions.isXAMAEndBearish)) - // - || - // - (mConditions.isXTMVale && - mConditions.isXAMANeutural && - mConditions.isXAMAEndBullish && - mConditions.isXLHLLDecreased && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXCHLHMCLCLLSame) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXAMAEndBearish && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderMediest) - // - || - // - ((mConditions.isXTMVale && - mConditions.isXAMAVale) - // - && - // - (mConditions.isXCHMASCVale && - mConditions.isXCHMAMCVale) - // - && - // - (mConditions.isXCHLHSCMCLLSame && - mConditions.isXCHLHMCLCHHSame)) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMASCVale && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale) - // - || - // - (mConditions.isXTMVale && - mConditions.isXTMNeutural && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXAMAStartBullish && - mConditions.isXTSCurrentUnderFarest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMASCVale && - mConditions.isXCHMAMCVale) - // - || - // - (mConditions.isXLHHHDecreased && - mConditions.isXLHLLDecreased) - // - || - // - ((mConditions.isXTMVale || - mConditions.isXTMNeutural || - mConditions.isXTMEndBearish) && - mConditions.isXAMANeutural) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXCHLHSCMCLLSame) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMASCVale && - mConditions.isXCHMAMCVale) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale) - // - || - // - (mConditions.isXCHMASCVale && - mConditions.isXCHLHSCMCLLSame) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XSI Short Signal Checking ... -bool XEU5XSIHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXSIEnableSignaller || - !xEU5MXSIAllowShortSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XSIHasShortConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ((mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXLHHHIncreased && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXLHHHIncreased && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXFIOverZero && - mConditions.isXTDBullOverBear && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXTDSignalOverBear) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ((mConditions.isXTMBullish && - (mConditions.isXAMANeutural || - mConditions.isXAMAEndBullish)) && - mConditions.isXFIOverZero && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMAMCPeak && - mConditions.isXLHHHIncreased && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - || - // - ((mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMASCTrendsUp && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXCHLHMCLCLLSame) - // - || - // - ((mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame) && - ( - // - (mConditions.isXFIOverZero && - mConditions.isXCHMAMCPeak && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCVale && - mConditions.isXAMABearish && - mConditions.isXTSCurrentMin && - mConditions.isXTMStartBearish && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest && - mConditions.isXTSCurrentCrossedUnderFarest && - mConditions.isXTSCurrentCrossedUnderNearest && - mConditions.isXTSCurrentCrossedUnderMediest) - // - )) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCPeak) - // - || - // - (mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXTSCurrentOverNearest) - // - || - // - (((mConditions.isXTMBullish || - mConditions.isXTMStartBullish) && - (mConditions.isXAMABullish || - mConditions.isXAMAStartBullish)) && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - ) - // - ) - // - || - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCVale && - mConditions.isXLHHHIncreased && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ((mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXFIOverZero) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXFIOverZero && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMALCPeak && - mConditions.isXCHLHSCMCHHSame) - // - || - // - (mConditions.isXCHMASCPeak && - mConditions.isXTMEndBullish && - mConditions.isXTSCurrentMin && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXAMAStartBearish) - // - || - // - ((mConditions.isXCHMASCPeak && - mConditions.isXTSCurrentOverFarest) && - ( - // - mConditions.isXTMNeutural - // - || - // - mConditions.isXTSCurrentOverMediest - // - || - // - (mConditions.isXTMBullish && - mConditions.isXCHMALCVale && - mConditions.isXAMANeutural && - mConditions.isXLHHHIncreased) - // - ) - // - ) - // - || - // - (mConditions.isXCHMALCVale && - mConditions.isXTSCurrentMin && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXTMStartBearish && - mConditions.isXAMAStartBearish) - // - || - // - ((mConditions.isXCHMASCPeak && - mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCVale) && - ( - // - (mConditions.isXLHHHIncreased && - mConditions.isXLHLLIncreased) - // - || - // - (mConditions.isXCHLHSCMCHHSame && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMANeutural) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXTSCurrentMin) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHLHSameHHs && - mConditions.isXLHHHIncreased && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMAMCTrendsUp) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ((mConditions.isXTDBullOverBear && - (mConditions.isXTDSignalOverBear || - mConditions.isXTDSignalCrossedOverBear)) && - ( - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMAMCPeak && - (mConditions.isXFIOverZero || - mConditions.isXTSCurrentOverFarest)) - // - || - // - (mConditions.isXAMABullish && - mConditions.isXFIOverZero && - mConditions.isXTSCurrentMax && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHMASCTrendsUp) - // - ) - // - ) - // - || - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMASCTrendsUp) - // - || - // - ((mConditions.isXCHMASCPeak && - mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCVale) && - ( - // - ((mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXCHLHSCMCHHSame) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XTSFI Long Signal Checking ... -bool XEU5XTSFIHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXTSFIEnableSignaller || - !xEU5MXTSFIAllowLongSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XTSFIHasLongConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXAMANeutural && - mConditions.isXAMAEndBearish && - mConditions.isXTSCurrentUnderMediest) - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXCHLHMCLCHHSame) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - ((mConditions.isXTMNeutural && - mConditions.isXTSCurrentUnderMediest) && - ( - // - (mConditions.isXAMANeutural && - mConditions.isXTSCurrentUnderMediest) - // - || - // - (mConditions.isXTDSignalUnderBear && - mConditions.isXFICrossedUnderZero) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMNeutural && - (mConditions.isXAMANeutural || - mConditions.isXAMAEndBullish) && - mConditions.isXCHLHSameHHs && - mConditions.isXLHLLIncreased && - mConditions.isXLHHighAttachedHH) - // - ) - // - ) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTDBearishVale && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXTDSignalUnderBear && - mConditions.isXFICrossedUnderZero && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMASCPeak && - (mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXTMStartBearish && - mConditions.isXAMAStartBearish && - mConditions.isXTSCurrentUnderMediest) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMABearish && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXCHMAMCTrendsDown && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHMASCOverMax && - mConditions.isXCHMASCOverMin && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMAMCVale && - ( - // - mConditions.isXCHMALCVale - // - || - // - (mConditions.isXCHLHMCLCHHSame && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - || - // - (mConditions.isXCHLHMCLCHHSame && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXAMAStartBullish) - // - || - // - (mConditions.isXLHLLDecreased && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXTMNeutural || - mConditions.isXTMStartBullish) && - mConditions.isXLHHHDecreased && - (mConditions.isXAMANeutural || - mConditions.isXAMAStartBearish) && - mConditions.isXTSCurrentUnderMediest) - // - || - // - ((mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMAMCVale && - ( - // - mConditions.isXCHMALCVale - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMASCPeak && - (mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMABullish && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXCHLHMCLCLLSame && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMASCPeak && - (mConditions.isXAMANeutural || - mConditions.isXAMAEndBullish)) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural) - // - || - // - (mConditions.isXCHLHSameHHs && - mConditions.isXTSCurrentUnderMediest) - // - || - // - (mConditions.isXCHMALCVale && - (mConditions.isXAMANeutural || - mConditions.isXAMAEndBullish) && - mConditions.isXTMStartBearish) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - ((mConditions.isXCHLHSCMCHHSame && - mConditions.isXTSCurrentUnderMediest) && - ( - // - mConditions.isXCHMALCVale - // - || - // - (mConditions.isXCHMALCTrendsDown && - mConditions.isXTSCurrentCrossedUnderMediest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMASCPeak && - (mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXCHMALCVale && - mConditions.isXAMAStartBullish && - mConditions.isXFICrossedOverZero && - mConditions.isXTDBullCrossedOverBear && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXTMNeutural && - mConditions.isXAMANeutural) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMAMCPeak && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXTDBearishVale && - mConditions.isXCHLHSCMCHHSame) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XTSFI Short Signal Checking ... -bool XEU5XTSFIHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXTSFIEnableSignaller || - !xEU5MXTSFIAllowShortSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XTSFIHasShortConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMALCVale && - mConditions.isXCHLHMCLCLLSame) && - ( - // - mConditions.isXCHMASCTrendsDown - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXTMEndBearish && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - || - // - (((mConditions.isXTMVale || - mConditions.isXTMNeutural) && - mConditions.isXAMANeutural) && - (mConditions.isXFIOverZero || - mConditions.isXFICrossedOverZero) && - mConditions.isXTSCurrentOverMediest) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ( - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalCrossedOverBear) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXFIOverZero && - mConditions.isXTDBullOverBear) - // - || - // - (mConditions.isXCHMALCVale && - mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXTSCurrentCrossedUnderNearest) - // - || - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXFIOverZero) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXCHLHSCMCLLSame) - // - || - // - (mConditions.isXTDBearishVale && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalCrossedOverBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXFIOverZero && - mConditions.isXTDBullOverBear) && - ( - // - (mConditions.isXAMANeutural && - mConditions.isXTMStartBullish) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDSignalOverBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXCHMASCVale && - mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXFIOverZero && - mConditions.isXTDBullOverBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXCHMALCPeak && - (mConditions.isXTMNeutural || - mConditions.isXTMEndBullish) && - (mConditions.isXAMANeutural || - mConditions.isXAMAEndBullish) && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXCHMALCPeak && - mConditions.isXTDBullOverBear && - (mConditions.isXFIOverZero || - mConditions.isXFICrossedOverZero)) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ((mConditions.isXAMANeutural && - mConditions.isXFIOverZero && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverMediest) && - ( - // - mConditions.isXTMNeutural - // - || - // - (mConditions.isXTMBullish && - mConditions.isXLHLLDecreased) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXFIOverZero && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCPeak && - mConditions.isXLHHHDecreased && - (mConditions.isXTMBullish || - mConditions.isXTMStartBullish) && - mConditions.isXAMABullish && - mConditions.isXTSCurrentOverMediest && - mConditions.isXTDBullCrossedOverBear) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMABullish && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCPeak && - mConditions.isXLHHHDecreased && - mConditions.isXFICrossedOverZero && - mConditions.isXTDBullCrossedOverBear) - // - || - // - (mConditions.isXFIOverZero && - mConditions.isXCHMALCPeak && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear && - mConditions.isXTSCurrentOverMediest) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXFIOverZero && - mConditions.isXCHMALCPeak && - mConditions.isXLHHHDecreased && - mConditions.isXTSCurrentOverMediest && - mConditions.isXTDBullCrossedUnderBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXTMNeutural && - mConditions.isXAMANeutural) - // - || - // - (mConditions.isXAMANeutural && - mConditions.isXTMStartBearish && - mConditions.isXTDBullUnderBear && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXTDSignalUnderBear) - // - || - // - ((mConditions.isXTMBullish || - mConditions.isXTMStartBullish) && - (mConditions.isXAMABullish || - mConditions.isXAMAStartBullish) && - (mConditions.isXFIOverZero || - mConditions.isXFICrossedOverZero) && - mConditions.isXCHLHSameLLs) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXCHMASCTrendsUp) - // - || - // - (mConditions.isXCHLHSameLLs && - mConditions.isXTDBearishVale && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXCHMALCPeak && - mConditions.isXAMANeutural && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTSCurrentOverMediest && - mConditions.isXTSCurrentCrossedUnderFarest) - // - || - // - ((mConditions.isXCHMAMCVale && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTSCurrentOverMediest) && - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXTMEndBearish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTSCurrentOverMediest && - ( - // - ((mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest) && - ( - // - mConditions.isXTSCurrentUnderNearest - // - || - // - (mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXCHMASCTrendsUp) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverMediest) - // - || - // - (mConditions.isXTDBullOverBear && - mConditions.isXLHHHDecreased && - mConditions.isXLHLLDecreased && - mConditions.isXTSCurrentOverMediest) - // - || - // - ((mConditions.isXFIOverZero && - mConditions.isXTSCurrentOverMediest) && - ( - // - (mConditions.isXTMStartBullish && - mConditions.isXAMAStartBullish) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish) - // - || - // - ((mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) && - ( - // - (mConditions.isXTMStartBearish && - mConditions.isXAMAStartBearish) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTDBullOverBear) - // - || - // - (mConditions.isXCHMALCVale && - mConditions.isXTMStartBearish && - mConditions.isXAMAStartBearish && - mConditions.isXCHLHSCMCLLSame) - // - || - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXCHMALCVale && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - mConditions.isXOBDSwingLow - // - || - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCPeak) - // - || - // - (mConditions.isXCHMAMCVale && - mConditions.isXCHLHSameLLs && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCPeak && - mConditions.isXTDBullCrossedUnderBear && - mConditions.isXTSCurrentCrossedOverMediest) - // - || - // - ((mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) && - ( - // - mConditions.isXCHMALCPeak - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTSCurrentCrossedOverMediest) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXTMNeutural && - mConditions.isXFIOverZero && - mConditions.isXTSCurrentCrossedOverMediest) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXTMBearish && - mConditions.isXCHMAMCVale && - mConditions.isXCHLHMCLCLLSame) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXFIOverZero && - mConditions.isXLHHHIncreased && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXFICrossedOverZero) - // - || - // - (mConditions.isXAMABearish && - mConditions.isXCHMAMCVale && - mConditions.isXCHLHMCLCLLSame && - (mConditions.isXTMNeutural || - mConditions.isXTMEndBearish)) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXCHMAMCVale && - mConditions.isXTMStartBearish && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXTSCurrentUnderFarest) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXTMNeutural && - mConditions.isXCHMAMCVale && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXFICrossedUnderZero && - mConditions.isXTSCurrentCrossedUnderNearest) - // - || - // - ((mConditions.isXAMAVale && - mConditions.isXTMNeutural && - mConditions.isXCHMALCPeak && - mConditions.isXCHMAMCVale) && - ( - // - mConditions.isXLHPriceCrossedUnderSignal - // - || - // - (mConditions.isXCHLHSCMCLLSame && - mConditions.isXFICrossedUnderZero && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentCrossedUnderNearest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - (((mConditions.isXTMBullish || - mConditions.isXTMNeutural || - mConditions.isXTMStartBullish) && - mConditions.isXTSCurrentOverMediest) && - ( - // - (mConditions.isXAMAVale && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCPeak && - (mConditions.isXTMStartBullish || - mConditions.isXTMEndBullish)) - // - || - // - (mConditions.isXCHMAMCVale && - mConditions.isXTDBullOverBear && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXAMAStartBearish) - // - || - // - (mConditions.isXCHMALCPeak && - mConditions.isXFIOverZero && - mConditions.isXTMEndBearish && - mConditions.isXFICrossedOverZero) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCVale && - mConditions.isXTSCurrentOverMediest) && - ( - // - (mConditions.isXCHMALCPeak && - mConditions.isXLHHHDecreased && - mConditions.isXCHLHSCMCLLSame) - // - || - // - ((mConditions.isXTMNeutural && - mConditions.isXAMAStartBearish) && - ( - // - (mConditions.isXCHLHSameLLs && - mConditions.isXTDBullOverBear) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXCHLHMCLCLLSame) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCVale && - mConditions.isXCHMALCPeak && - mConditions.isXTSCurrentOverMediest) && - ( - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXLHHHDecreased) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTDBullOverBear && - mConditions.isXCHLHMCLCLLSame) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) - // - || - // - (mConditions.isXTSCurrentOverMediest && - ( - // - ((mConditions.isXCHMALCVale && - mConditions.isXCHLHSCMCLLSame) && - ( - // - (mConditions.isXAMAVale && - mConditions.isXCHMASCUnderMax && - mConditions.isXCHMASCUnderMin) - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTDBullOverBear && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXCHMASCTrendsUp && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - ((mConditions.isXCHMAMCVale && - mConditions.isXTSCurrentOverMediest) && - ( - // - mConditions.isXLHHHDecreased - // - || - // - mConditions.isXTSCurrentCrossedOverMediest - // - || - // - (mConditions.isXTMVale && - mConditions.isXTMNeutural && - mConditions.isXAMAVale && - mConditions.isXAMANeutural) - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHMALCTrendsDown) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXFIOverZero && - mConditions.isXTMEndBearish && - mConditions.isXTDBullOverBear) - // - || - // - (mConditions.isXCHMALCPeak && - ( - // - mConditions.isXCHLHMCLCLLSame - // - || - // - (mConditions.isXTMVale && - mConditions.isXAMAVale) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentCrossedOverMediest) - // - || - // - ((mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTDSignalUnderBear) && - ( - // - mConditions.isXTDBullCrossedUnderBear - // - || - // - (mConditions.isXCHMALCVale && - mConditions.isXLHHHIncreased && - mConditions.isXTDBullUnderBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ( - // - ((mConditions.isXCHMALCVale && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverMediest) && - ( - // - (mConditions.isXFIOverZero && - mConditions.isXCHMASCTrendsUp) - // - || - // - (mConditions.isXAMANeutural && - mConditions.isXLHHHIncreased && - mConditions.isXTMStartBearish && - mConditions.isXCHLHSCMCHHSame) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentOverMediest) - // - || - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXCHMASCVale && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXTSCurrentOverMediest && - ( - // - mConditions.isXCHLHSameLLs - // - || - // - (mConditions.isXAMAVale && - mConditions.isXTMNeutural && - mConditions.isXFIOverZero && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCPeak && - mConditions.isXLHHHDecreased) - // - || - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCPeak && - mConditions.isXLHHHDecreased && - mConditions.isXTSCurrentCrossedUnderNearest) - // - || - // - (mConditions.isXCHLHSCMCLLSame && - ( - // - (mConditions.isXCHLHMCLCHHSame && - ( - // - (mConditions.isXAMAVale && - mConditions.isXCHMAMCVale && - mConditions.isXTMStartBearish) - // - || - // - ((mConditions.isXTMNeutural || - mConditions.isXTMEndBearish) && - (mConditions.isXAMANeutural || - mConditions.isXAMAEndBearish)) - // - || - // - (mConditions.isXTMVale && - mConditions.isXCHMAMCVale && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest) - // - ) - // - ) - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish) - // - || - // - (mConditions.isXFIOverZero && - mConditions.isXCHMAMCVale && - mConditions.isXTMEndBearish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXCHMALCPeak && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMABearish && - mConditions.isXFIOverZero && - mConditions.isXCHMAMCVale && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMABearish && - mConditions.isXCHMAMCVale && - mConditions.isXLHHHDecreased && - mConditions.isXFICrossedUnderZero && - mConditions.isXTSCurrentCrossedUnderNearest) - // - ) - // - ) - // - || - // - ((mConditions.isXAMAVale && - mConditions.isXCHMALCPeak) && - ( - // - mConditions.isXTMNeutural - // - || - // - (mConditions.isXTMVale && - mConditions.isXTMEndBearish && - mConditions.isXLHLLDecreased) - // - ) - // - ) - // - || - // - (mConditions.isXTMVale && - mConditions.isXTMNeutural && - mConditions.isXAMABearish && - mConditions.isXCHMAMCVale && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentCrossedUnderNearest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHLHSCMCLLSame && - mConditions.isXCHMASCUnderMax && - mConditions.isXCHMASCUnderMin && - mConditions.isXTSCurrentOverMediest) && - ( - // - mConditions.isXCHMAMCTrendsDown - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMASCTrendsUp && - mConditions.isXTMStartBearish && - mConditions.isXTDBullOverBear && - mConditions.isXAMAStartBearish && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - ((mConditions.isXCHMAMCVale && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTSCurrentOverMediest) && - ( - // - (mConditions.isXAMAVale && - mConditions.isXTMBullish) - // - || - // - (mConditions.isXAMAVale && - (mConditions.isXTMNeutural || - mConditions.isXTMEndBearish)) - // - || - // - (mConditions.isXCHMALCPeak && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXTMNeutural && - mConditions.isXCHMALCVale && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentOverMediest) && - ( - // - (mConditions.isXCHLHMCLCLLSame && - mConditions.isXLHPriceCrossedOverSignal) - // - || - // - (mConditions.isXTDBullUnderBear && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTSCurrentOverMediest) - // - || - // - ((mConditions.isXTMBullish && - mConditions.isXFIOverZero && - mConditions.isXTSCurrentOverMediest) && - ( - // - (mConditions.isXAMANeutural && - mConditions.isXTDBullOverBear) - // - || - // - (mConditions.isXAMABullish && - mConditions.isXTDBullCrossedOverBear) - // - ) - // - ) - // - || - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXCHMALCVale && - mConditions.isXAMANeutural && - mConditions.isXLHLLIncreased && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHMASCTrendsUp) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMAMCTrendsUp) - // - || - // - (mConditions.isXCHMAMCTrendsUp && - mConditions.isXTSCurrentOverMediest) - // - || - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCPeak && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXFIOverZero && - mConditions.isXCHMALCPeak) - // - || - // - (mConditions.isXCHMAMCVale && - mConditions.isXCHLHSCMCLLSame) - // - || - // - (mConditions.isXCHMALCPeak && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXLHHHDecreased) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - ((mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) && - ( - // - ((mConditions.isXTMBullish || - mConditions.isXTMStartBullish) - // - && - // - (mConditions.isXAMABullish || - mConditions.isXAMAStartBullish)) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMAMCTrendsUp) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTDBullCrossedUnderBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXTMStartBullish && - mConditions.isXAMAStartBullish && - mConditions.isXLHPriceCrossedOverSignal) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXLHLLIncreased && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentCrossedUnderNearest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXLHHHIncreased && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHMASCTrendsUp) - // - || - // - (mConditions.isXTSCurrentOverMediest && - ( - // - (mConditions.isXAMANeutural && - mConditions.isXTMStartBearish && - mConditions.isXTDBullOverBear) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXFIOverZero && - mConditions.isXTDBullOverBear) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMABullish && - mConditions.isXCHMALCVale && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHMASCTrendsUp) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMAMCTrendsUp && - ( - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMAMCTrendsUp) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentOverMediest) - // - || - // - ((mConditions.isXTMBullish || - mConditions.isXTMStartBullish) && - (mConditions.isXAMABullish || - mConditions.isXAMAStartBullish) && - (mConditions.isXTSCurrentOverMediest || - mConditions.isXTSCurrentCrossedOverMediest)) - // - )) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - ((mConditions.isXTSCurrentOverMediest || - mConditions.isXTSCurrentCrossedOverMediest) && - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHMAMCVale && - mConditions.isXLHHHDecreased && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXTMNeutural && - mConditions.isXFIOverZero && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCPeak && - mConditions.isXTDBullCrossedUnderBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverMediest) && - ( - // - (mConditions.isXAMANeutural && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXTMStartBearish) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXCHLHSameLLs) - // - ) - // - ) - // - || - // - (mConditions.isXCHMASCTrendsUp && - (mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow)) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XOBDLH Long Signal Checking ... -bool XEU5XOBDLHHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXOBDLHEnableSignaller || - !xEU5MXOBDLHAllowLongSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - XMarketConditions xMConditions2 = xEU5Provider.GenerateMarketConditions(2); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XOBDLHHasLongConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXCHMALCVale && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXCHLHSCMCLLSame) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXLHLLDecreased && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTSCurrentUnderFarest) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTMEndBearish && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXCHLHMCLCHHSame) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXCHLHSCMCLLSame) - // - || - // - (mConditions.isXCHMAMCVale && - mConditions.isXCHMALCPeak && - mConditions.isXCHLHSCMCLLSame) - // - || - // - (mConditions.isXCHMASCVale && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale) - // - || - // - (mConditions.isXCHMASCVale && - mConditions.isXCHMALCPeak && - mConditions.isXCHLHSCMCLLSame) - // - || - // - (mConditions.isXTMVale && - mConditions.isXLHLLDecreased && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXAMAStartBearish) - // - || - // - (mConditions.isXCHMALCPeak && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderMediest) - // - || - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXCHMAMCVale && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXCHLHMCLCHHSame) - // - || - // - ((mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXCHMAMCVale && - mConditions.isXCHLHSameLLs) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXLHHHDecreased) - // - ) - // - ) - // - || - // - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) - // - || - // - ((mConditions.isXCHMASCVale && - mConditions.isXCHMALCPeak && - mConditions.isXCHLHSCMCLLSame) && - ( - // - mConditions.isXTSCurrentMax - // - || - // - mConditions.isXLHLowAttachedLL - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMASCVale && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale) - // - || - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTSCurrentUnderFarest) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXCHMALCPeak && - mConditions.isXTMEndBearish && - mConditions.isXCHLHSCMCLLSame) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXTMNeutural && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXTDBearishVale && - mConditions.isXCHLHSCMCLLSame) - // - || - // - (mConditions.isXCHMALCPeak && - mConditions.isXTMStartBearish && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXAMAStartBearish) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXTSAllSame && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXTMStartBearish && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXLHLowAttachedLL) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXAMANeutural && - mConditions.isXCHLHSameLLs) - // - || - // - (mConditions.isXCHMALCPeak && - mConditions.isXAMANeutural && - mConditions.isXTMStartBullish && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTDSignalCrossedOverBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XOBDLH Short Signal Checking ... -bool XEU5XOBDLHHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXOBDLHEnableSignaller || - !xEU5MXOBDLHAllowShortSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XOBDLHHasShortConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) && - ( - // - ((mConditions.isXTMNeutural && - mConditions.isXAMANeutural) && - ( - // - (mConditions.isXCHMALCPeak && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHMASCCrossedUnderMax) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) && - ( - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMAMCTrendsUp && - mConditions.isXCHMALCPeak && - mConditions.isXCHMALCTrendsUp) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentMax && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverNearest && - mConditions.isXTSCurrentOverMediest && - mConditions.isXTDSignalCrossedOverBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXFIOverZero && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXTDBullOverBear) && - ( - // - (mConditions.isXTSCurrentMax && - mConditions.isXTMStartBullish && - mConditions.isXAMAStartBullish && - mConditions.isXTDSignalOverBear) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMABullish && - mConditions.isXTMEndBullish && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMABullish && - mConditions.isXTMEndBullish) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMABullish && - mConditions.isXTSCurrentMin && - mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - || - // - (mConditions.isXFIOverZero && - ( - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMAMCPeak && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXCHMASCPeak && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - ) - // - ) - // - || - // - (((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) && - ( - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish) && - ( - // - ((mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCPeak) && - ( - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish) && - ( - // - (mConditions.isXCHLHSameHHs && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverMediest && - mConditions.isXTDSignalCrossedOverBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCPeak && - mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCPeak) && - ( - // - (mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - || - // - (mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - (((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullCrossedOverBear) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverNearest && - mConditions.isXTSCurrentOverMediest) - // - || - // - (mConditions.isXCHMASCTrendsUp && - mConditions.isXCHMAMCTrendsUp) - // - || - // - ((mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) && - ( - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMAMCPeak) - // - ) - // - ) - // - ) - // - ) - // - || - // - (((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) && - ( - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCPeak && - mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - || - // - ((mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCPeak) && - ( - // - (mConditions.isXCHMAMCTrendsUp && - mConditions.isXCHMALCTrendsUp) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear && - mConditions.isXTSCurrentOverFarest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) && - ( - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMASCTrendsUp && - mConditions.isXCHMAMCPeak && - mConditions.isXCHMAMCTrendsUp) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMStartBullish && - mConditions.isXTDBullOverBear && - mConditions.isXAMAStartBullish && - mConditions.isXTDSignalOverBear) - // - ) - // - ) - // - || - // - (((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMABullish && - mConditions.isXFIOverZero && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverNearest) - // - || - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMASCTrendsUp && - mConditions.isXCHMAMCTrendsUp) - // - ) - // - ) - // - || - // - (((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) && - ( - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCPeak && - mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXFIOverZero && - mConditions.isXCHLHSameHHs && - mConditions.isXTSCurrentMax && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACC Long Signal Checking ... -bool XEU5XCHMACCHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXCHMACCEnableSignaller || - !xEU5MXCHMACCAllowLongSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XCHMACCHasLongConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMAMCTrendsDown && - ( - // - (mConditions.isXCHMALCPeak && - ( - // - (mConditions.isXTSCurrentMax && - mConditions.isXCHLHMCLCHHSame && - (mConditions.isXTSCurrentOverFarest || - mConditions.isXTDSignalCrossedUnderBear)) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMANeutural && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXTMStartBullish && - mConditions.isXFICrossedUnderZero) - // - || - // - ( - (mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXAMAStartBullish) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXLHLLDecreased) - // - ) - // - ) - // - ) - // - ) - // - )) - // - || - // - (((mConditions.isXTMNeutural && - mConditions.isXTMEndBullish && - mConditions.isXFICrossedUnderZero) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullOverBear)) - // - && - // - (mConditions.isXCHMALCPeak && - ( - // - mConditions.isXCHMALCTrendsDown - // - || - // - (mConditions.isXCHLHMCLCHHSame && - (mConditions.isXTDSignalUnderBear || - mConditions.isXTDSignalCrossedUnderBear)) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMAMCTrendsDown && - ( - // - (mConditions.isXTSCurrentMax && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - || - // - (mConditions.isXTDBullOverBear && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMAMCTrendsDown && - ( - // - (mConditions.isXCHMALCPeak && - ( - // - (mConditions.isXTDSignalUnderBear && - ( - // - (mConditions.isXAMAVale && - mConditions.isXAMABearish) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMAStartBearish && - mConditions.isXFICrossedUnderZero) - // - || - // - ((mConditions.isXAMANeutural || - mConditions.isXAMAEndBearish) && - mConditions.isXTMStartBullish && - mConditions.isXFICrossedOverZero) - // - || - // - (mConditions.isXCHLHMCLCHHSame && - mConditions.isXTMStartBullish && - mConditions.isXAMAStartBullish && - mConditions.isXTSCurrentUnderFarest) - // - ) - // - ) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentMax && - mConditions.isXTMStartBullish && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTDBullUnderBear) - // - ) - // - ) - // - || - // - ((mConditions.isXAMABearish && - (mConditions.isXTMNeutural || - mConditions.isXTMBearish)) && - mConditions.isXTSCurrentUnderMediest && - (mConditions.isXTDBullCrossedUnderBear || - (mConditions.isXTDBullUnderBear && - mConditions.isXFICrossedUnderZero))) - // - || - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish) && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentOverFarest && - mConditions.isXLHPriceCrossedUnderSignal) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMAMCTrendsDown && - ( - // - (mConditions.isXCHMALCPeak && - ( - // - (mConditions.isXTSCurrentMax && - ( - // - (mConditions.isXAMABearish && - mConditions.isXTDBullCrossedOverBear) - // - || - // - (mConditions.isXTMStartBullish && - ( - // - ( - // - mConditions.isXAMAStartBullish - // - || - // - (mConditions.isXAMAEndBearish && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - (mConditions.isXLHLLDecreased && - mConditions.isXTMStartBullish && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMEndBullish && - mConditions.isXAMAEndBullish) - // - || - // - (mConditions.isXTSCurrentMax && - (mConditions.isXTMBullish || - mConditions.isXTMStartBullish) && - (mConditions.isXAMABullish || - mConditions.isXAMAStartBullish) && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXTDSignalUnderBear) - // - || - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish) && - ( - // - mConditions.isXTDBearishVale - // - || - // - mConditions.isXRSICrossedOverLongExit - // - || - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHLHMCLCLLSame) - // - || - // - (mConditions.isXTDSignalUnderBear && - ( - // - (mConditions.isXTSCurrentMax && - mConditions.isXCHLHMCLCHHSame) - // - || - // - (mConditions.isXCHMALCPeak && - mConditions.isXTSCurrentUnderFarest) - // - ) - // - ) - // - ) - // - ) - // - || - // - (mConditions.isXCHMASCTrendsDown && - ( - // - (mConditions.isXCHMALCPeak && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - || - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish) && - ( - // - (mConditions.isXTSCurrentMax && - mConditions.isXCHLHMCLCHHSame) - // - || - // - (mConditions.isXCHMASCVale && - mConditions.isXFIUnderZero && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentMax && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXLHPriceCrossedOverSignal) - // - ) - // - ) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXTDBearishVale && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame && - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMAMCTrendsDown)) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMALCPeak && - ( - // - ( - // - mConditions.isXCHMALCTrendsDown - // - || - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish) && - ( - // - ( - mConditions.isXTDSignalUnderBear && - ( - // - mConditions.isXTSAllSame - // - || - // - ((mConditions.isXTSCurrentUnderNearest || - mConditions.isXTSCurrentCrossedUnderNearest)) - // - ) - // - ) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXCHMALCTrendsUp && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverNearest && - mConditions.isXTSCurrentOverMediest) - // - || - // - (mConditions.isXTDBullOverBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXLHPriceCrossedOverSignal && - (mConditions.isXCHMAMCTrendsDown && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow))) - // - || - // - (mConditions.isXTSCurrentMax && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear && - mConditions.isXCHMAMCTrendsDown) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTSCurrentMax && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXLHHighAttachedHH) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMALCPeak && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) && - ( - // - (mConditions.isXCHMALCTrendsDown && - ( - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish) && - ( - // - (mConditions.isXTSCurrentMax && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXCHLHSCMCHHSame && - mConditions.isXLHHighAttachedHH) - // - ) - // - ) - // - ) - // - ) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXCHLHSameHHs && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderNearest) - // - || - // - ( - (mConditions.isXAMABullish && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXLHHighAttachedHH) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXTMEndBullish && - mConditions.isXTDSignalUnderBear) - // - || - // - ((mConditions.isXTMBullish && - mConditions.isXTSCurrentMax) && - ( - // - (mConditions.isXTDBullOverBear && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXTDBullCrossedOverBear && - mConditions.isXLHPriceCrossedOverSignal) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - ( - (mConditions.isXCHMAMCTrendsDown && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish) - // - || - (mConditions.isXLHLLDecreased && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXCHMAMCPeak && - ( - // - (mConditions.isXTDBearishVale && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame) - // - ) - // - ) - // - )) - // - || - // - (mConditions.isXCHMASCPeak && - mConditions.isXCHLHSameHHs && - (mConditions.isXTSCurrentUnderNearest || - mConditions.isXTSCurrentCrossedUnderNearest) && - (mConditions.isXTSCurrentUnderMediest || - mConditions.isXTSCurrentCrossedUnderMediest)) - // - || - // - (mConditions.isXCHMAMCPeak && - mConditions.isXTSCurrentMax && - mConditions.isXTMStartBullish && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXLHHighAttachedHH && - mConditions.isXTDSignalCrossedOverBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMAMCTrendsDown && - ( - // - (mConditions.isXCHMALCPeak && - mConditions.isXTMNeutural && - mConditions.isXTMEndBullish && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - || - // - (mConditions.isXCHMALCTrendsDown && - ( - // - (((mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTSCurrentMax) && - ( - // - mConditions.isXCHLHMCLCHHSame - // - || - // - (mConditions.isXTDSignalUnderBear && - mConditions.isXCHMALCPeak) - // - || - // - (mConditions.isXTDSignalUnderBear && - mConditions.isXFICrossedOverZero) - // - ) - // - ) - // - ) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXCHMAMCPeak && - mConditions.isXTMEndBullish && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTSCurrentUnderNearest) - // - ) - // - ) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXCHMALCPeak && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMAMCTrendsDown && - ( - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXCHLHSCMCHHSame) && - ( - // - mConditions.isXTSCurrentUnderNearest - // - || - // - (mConditions.isXLHLLIncreased && - mConditions.isXTDBullUnderBear && - mConditions.isXLHHighAttachedHH && - mConditions.isXTDSignalUnderBear && - mConditions.isXFICrossedUnderZero) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMALCTrendsDown && - ( - // - (mConditions.isXCHMALCPeak && - ( - // - (mConditions.isXCHLHSameHHs && - mConditions.isXTSCurrentMax && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXTMBullish && - mConditions.isXAMABullish && - (mConditions.isXTSCurrentMin || - mConditions.isXTSCurrentMax)) && - ( - // - (mConditions.isXCHMALCPeak && - mConditions.isXCHLHSameHHs && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXLHLLIncreased && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXTDBullUnderBear && - mConditions.isXLHHighAttachedHH && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMACC Short Signal Checking ... -bool XEU5XCHMACCHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXCHMACCEnableSignaller || - !xEU5MXCHMACCAllowShortSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XCHMACCHasShortConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTDBullOverBear && - ( - // - (mConditions.isXAMANeutural && - mConditions.isXTMStartBullish && - mConditions.isXTDSignalOverBear && - mConditions.isXTSCurrentOverFarest) - // - || - // - ((mConditions.isXFIOverZero && - mConditions.isXTSCurrentOverNearest && - mConditions.isXTSCurrentOverMediest) && - ( - // - (mConditions.isXAMAStartBearish && - mConditions.isXFICrossedOverZero) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMABullish && - mConditions.isXAMAStartBullish) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCVale && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) && - ( - // - // - ((mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) && - ( - // - (mConditions.isXTMBearish && - mConditions.isXLHLLIncreased && - mConditions.isXAMAStartBearish && - mConditions.isXTSCurrentOverNearest) - // - || - // - (((mConditions.isXTMNeutural || - mConditions.isXTMEndBearish) && - (mConditions.isXAMANeutural || - mConditions.isXAMAEndBullish)) && - ( - // - (mConditions.isXTSCurrentMax && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXTSAllSame && - mConditions.isXCHMAMCTrendsDown) - // - ) - // - ) - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTSCurrentMin && - mConditions.isXCHMALCTrendsUp && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMALCVale && - ( - // - ((mConditions.isXTMEndBearish || - mConditions.isXTMNeutural) && - (mConditions.isXAMABearish || - mConditions.isXAMANeutural) && - mConditions.isXFIOverZero && - mConditions.isXTDBullOverBear && - mConditions.isXFICrossedOverZero && - mConditions.isXTSCurrentOverFarest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXAMANeutural && - mConditions.isXTMStartBearish && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXTSCurrentOverMediest) - // - || - // - (mConditions.isXCHMALCVale && - ( - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXAMANeutural && - mConditions.isXTMStartBearish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentOverMediest) - // - || - // - ((mConditions.isXTMNeutural || - mConditions.isXTMEndBearish) && - (mConditions.isXAMANeutural || - mConditions.isXAMAEndBearish) && - mConditions.isXLHHHIncreased && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverFarest) - // - || - // - ((mConditions.isXTMNeutural && - mConditions.isXAMABearish && - mConditions.isXTMEndBearish && - mConditions.isXTDBullOverBear) && - ( - // - mConditions.isXCHLHSCMCLLSame - // - || - // - (mConditions.isXFIOverZero && - mConditions.isXFICrossedOverZero && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentCrossedOverFarest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTSCurrentMin && - mConditions.isXTDBullOverBear && - mConditions.isXAMAStartBearish && - mConditions.isXTDSignalUnderBear) - // - || - // - ((mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) && - ( - // - (mConditions.isXTSCurrentMax && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXTSCurrentMin && - mConditions.isXCHMASCUnderMin) - // - ) - // - ) - // - || - // - ((mConditions.isXTMStartBearish && - mConditions.isXTDBullOverBear && - mConditions.isXAMAStartBearish) && - ( - // - (mConditions.isXTSCurrentMin && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXTSCurrentOverFarest && - mConditions.isXLHPriceCrossedUnderSignal) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCVale && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) && - ( - // - mConditions.isXCHMALCTrendsDown - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXFIOverZero && - mConditions.isXFICrossedOverZero) - // - || - // - ((mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTSCurrentMin) && - ( - // - (mConditions.isXFICrossedUnderZero && - mConditions.isXTDBullCrossedUnderBear) - // - || - // - (mConditions.isXCHMALCTrendsUp && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest) - // - || - // - (mConditions.isXTDBullOverBear && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXFICrossedUnderZero && - mConditions.isXLHPriceCrossedUnderSignal) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCTrendsDown && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXTSCurrentOverNearest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXCHMASCTrendsDown && - mConditions.isXTSCurrentOverNearest) - // - || - // - (mConditions.isXCHMALCVale && - (mConditions.isXTSCurrentOverNearest || - mConditions.isXTSCurrentCrossedOverNearest) && - (mConditions.isXTSCurrentOverFarest || - mConditions.isXTSCurrentCrossedOverFarest)) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTSCurrentMin) && - ( - // - ((mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXCHMALCTrendsUp) - // - || - // - ((mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest) && - ( - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXCHMASCVale) - // - || - // - ((mConditions.isXCHLHSameLLs && - mConditions.isXLHHHIncreased && - mConditions.isXLHLowAttachedLL) && - ( - // - mConditions.isXCHMAMCTrendsDown - // - || - // - mConditions.isXCHMASCCrossedUnderMin - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCVale && - mConditions.isXTDBullCrossedUnderBear) && - ( - // - (mConditions.isXCHLHSCMCLLSame && - mConditions.isXLHLowAttachedLL) - // - || - // - (mConditions.isXCHLHMCLCHHSame && - mConditions.isXCHMALCTrendsDown && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHMAMCVale && - mConditions.isXTSCurrentMin && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - ((mConditions.isXAMABearish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) && - ( - // - (mConditions.isXTMEndBearish && - mConditions.isXTSCurrentOverNearest && - mConditions.isXTSCurrentOverMediest) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXTSCurrentMin && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - || - // - ((mConditions.isXTMBearish && - mConditions.isXAMABearish) && - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverNearest) - // - || - // - (mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMALCVale && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) && - ( - // - ((mConditions.isXTMNeutural && - mConditions.isXAMANeutural) && - ( - // - (mConditions.isXCHMAMCTrendsDown && - mConditions.isXTSCurrentOverMediest) - // - || - // - (mConditions.isXFIUnderZero && - mConditions.isXTSCurrentMin && - mConditions.isXTDBullUnderBear && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest && - mConditions.isXTSCurrentCrossedUnderFarest && - mConditions.isXTSCurrentCrossedUnderNearest && - mConditions.isXTSCurrentCrossedUnderMediest) - // - ) - // - ) - // - || - // - (mConditions.isXTSCurrentOverFarest && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMABullish && - mConditions.isXCHLHMCLCLLSame) - // - || - // - (mConditions.isXTMEndBearish && - mConditions.isXAMAEndBearish && - mConditions.isXTDBullOverBear) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentMax) - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMANeutural && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXFIOverZero && - mConditions.isXTMStartBullish && - mConditions.isXTDBullOverBear && - mConditions.isXAMAStartBullish && - mConditions.isXTSCurrentOverNearest) - // - ) - // - ) - // - || - // - ((mConditions.isXTDSignalVale && - mConditions.isXTSCurrentMin && - mConditions.isXTDBullishVale && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest) && - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMANeutural) - // - ) - // - ) - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMANeutural && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMABullish && - mConditions.isXTSCurrentMin && - mConditions.isXCHMASCOverMin && - mConditions.isXCHLHMCLCLLSame && - mConditions.isXCHMASCUnderMax && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentMax && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCVale && - mConditions.isXAMANeutural && - mConditions.isXLHHHIncreased && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverFarest && - mConditions.isXTSCurrentOverNearest) - // - || - // - ((mConditions.isXTMNeutural || - mConditions.isXTMEndBearish) && - (mConditions.isXAMANeutural || - mConditions.isXAMAEndBearish) && - mConditions.isXFIOverZero && - mConditions.isXTDBullOverBear && - mConditions.isXFICrossedOverZero && - mConditions.isXTSCurrentOverNearest) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXFIOverZero && - mConditions.isXTSCurrentMax && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverFarest) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMALCVale && - mConditions.isXTSCurrentMin) && - ( - // - (mConditions.isXTMVale && - mConditions.isXAMAVale) - // - || - // - (mConditions.isXTMBearish && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXLHLLIncreased && - mConditions.isXCHMALCTrendsUp && - mConditions.isXAMAStartBearish) - // - || - // - ((mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow) && - ( - // - (mConditions.isXAMANeutural && - mConditions.isXTDSignalVale && - mConditions.isXTDBullishVale && - mConditions.isXLHLLIncreased && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest) - // - || - // - (mConditions.isXAMANeutural && - mConditions.isXTSCurrentMin && - mConditions.isXAMAEndBullish && - mConditions.isXTMStartBearish && - mConditions.isXTDBullOverBear && - mConditions.isXCHMAMCTrendsDown) - // - || - // - (mConditions.isXAMAVale && - mConditions.isXCHMALCVale && - mConditions.isXTSCurrentMin && - mConditions.isXTDBullUnderBear && - mConditions.isXCHMALCTrendsDown && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderFarest && - mConditions.isXTSCurrentUnderNearest && - mConditions.isXTSCurrentUnderMediest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMAMN Long Signal Checking ... -bool XEU5XCHMAMNHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXCHMAMNEnableSignaller || - !xEU5MXCHMAMNAllowLongSignals) - { - return result; - } - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); - double xCHMANonSCMin2 = XCHMAGetCyclesMinValue(2, cycles); - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XCHMAMNHasLongConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown) && - ( - // - ( - // - (mConditions.isXCHMALCVale && - mConditions.isXAMANeutural) - // - || - // - (mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMALCTrendsDown) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXCHMAMCVale && - mConditions.isXCHLHMCLCLLSame) - // - || - // - (mConditions.isXAMANeutural && - mConditions.isXLHHHDecreased && - mConditions.isXLHLLDecreased && - mConditions.isXTMStartBullish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXLHHHDecreased && - mConditions.isXLHLLDecreased && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMALCTrendsDown) && - ( - // - (((mConditions.isXTMVale || - mConditions.isXTMNeutural) && - mConditions.isXTMEndBearish) && - (mConditions.isXAMANeutural || - mConditions.isXAMAEndBearish) && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMALCTrendsDown) && - ( - // - (mConditions.isXCHMAMCVale && - mConditions.isXLHLLDecreased && - mConditions.isXCHLHMCLCHHSame) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - || - // - // LC Vale ... - (mConditions.isXCHMALCVale && - ( - // - (mConditions.isXCHMAMCVale && - ( - // - (mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) && - ( - // - mConditions.isXCHMASCTrendsDown - // - || - // - (mConditions.isXTMVale && - mConditions.isXAMAVale && - mConditions.isXLHLLIncreased && - mConditions.isXCHLHMCLCHHSame && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - || - // - ((mConditions.isXCHMAMCVale && - mConditions.isXCHMAMCTrendsUp && - (mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow)) && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMALCTrendsDown) && - ( - // - (mConditions.isXCHMAMCVale && - mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown) && - ( - // - ((mConditions.isXCHMASCPeak && - mConditions.isXCHMALCVale) && - ( - // - mConditions.isXCHMAMCVale - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXLHHHDecreased && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - ) - // - ) - // - || - // - (mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXCHLHMCLCLLSame) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDSignalUnderBear && - mConditions.isXTSCurrentUnderNearest) - // - || - // - (mConditions.isXCHMALCVale && - ( - // - mConditions.isXCHMASCTrendsDown - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTSCurrentMax && - mConditions.isXTDBearishVale) - // - || - // - (mConditions.isXAMANeutural && - mConditions.isXTSCurrentMax && - mConditions.isXTDBearishVale && - mConditions.isXTMStartBullish && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - (mConditions.isXCHMALCTrendsDown && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - (mConditions.isXCHLHMCLCHHSame || - mConditions.isXCHLHMCLCLLSame) && - mConditions.isXTSCurrentUnderNearest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown) && - ( - // - mConditions.isXCHMALCVale - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) && - ( - // - ((mConditions.isXCHLHSCMCHHSame && - mConditions.isXLHHighAttachedHH) && - ( - // - (mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale) - // - || - // - (mConditions.isXTMStartBullish && - mConditions.isXAMAStartBullish) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXCHMALCVale && - mConditions.isXTSCurrentMax && - mConditions.isXTDBullUnderBear) - // - ) - // - ) - // - || - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTSCurrentMax && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXTDSignalUnderBear) - // - || - // - mConditions.isXCHMASCTrendsDown - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - // LC Vale ... - (mConditions.isXCHMALCVale && - ( - // - (mConditions.isXCHMAMCVale && - ( - // - (mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXTSCurrentMax && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXTDBullUnderBear && - mConditions.isXLHHighAttachedHH && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMAMN Short Signal Checking ... -bool XEU5XCHMAMNHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXCHMAMNEnableSignaller || - !xEU5MXCHMAMNAllowShortSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XCHMAMNHasShortConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTSAllSame && - mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalOverBear) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXTMBearish || - mConditions.isXTMNeutural) && - mConditions.isXAMANeutural && - mConditions.isXCHMASCVale && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXLHLLIncreased && - mConditions.isXTSCurrentOverNearest) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentOverFarest) && - ( - // - (mConditions.isXFIOverZero && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - mConditions.isXAMANeutural && - mConditions.isXAMAEndBullish && - mConditions.isXTMStartBearish) - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXTSCurrentMax && - mConditions.isXTSCurrentOverNearest && - mConditions.isXTSCurrentOverMediest && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHMALCVale && - mConditions.isXTDBullOverBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXFICrossedUnderZero && - mConditions.isXTSCurrentOverFarest) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - mConditions.isXRSICrossedUnderShortExit - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXTSCurrentOverFarest && - (mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow)) && - ( - // - (mConditions.isXTMNeutural && - mConditions.isXAMAStartBearish) - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHMASCVale && - mConditions.isXCHMAMCVale && - mConditions.isXCHMALCVale && - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow))) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXAMANeutural && - mConditions.isXTMEndBearish && - mConditions.isXTSCurrentOverMediest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMAMX Long Signal Checking ... -bool XEU5XCHMAMXHasLongSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXCHMAMXEnableSignaller || - !xEU5MXCHMAMXAllowLongSignals) - { - return result; - } - - // - ENUM_XCHMA_CYCLES cycles[]; - Add( - X_XCHMA_CYCLE_MEDIUM, - cycles); - Add( - X_XCHMA_CYCLE_LONG, - cycles); - - // - double xCHMANonSCMax2 = XCHMAGetCyclesMaxValue(2, cycles); - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XCHMAMXHasLongConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMALCPeak && - ( - // - (mConditions.isXCHMALCTrendsDown && - ( - // - ( - // - mConditions.isXCHMASCPeak - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural && - mConditions.isXCHLHSameHHs && - mConditions.isXLHHighAttachedHH && - mConditions.isXTDSignalUnderBear) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (((mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow) && - (mConditions.isXCHMALCFastUnderSlow || - mConditions.isXCHMALCFastCrossedUnderSlow)) && - ( - // - (mConditions.isXLHHHDecreased && - mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear && - mConditions.isXLHPriceCrossedOverSignal) - // - || - // - (mConditions.isXTMNeutural && - mConditions.isXAMANeutural) - // - || - // - (mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - || - // - (((mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMALCTrendsDown) || - (mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown) || - (mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown)) && - ( - // - (mConditions.isXCHMAMCPeak - // - || - // - mConditions.isXRSICrossedOverLongExit) - // - || - // - ((mConditions.isXCHMAMCFastUnderSlow || - mConditions.isXCHMAMCFastCrossedUnderSlow) && - ( - // - (mConditions.isXTMBullish && - mConditions.isXAMABullish && - mConditions.isXCHLHSCMCHHSame) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - (mConditions.isXCHMASCTrendsDown && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// XCHMAMX Short Signal Checking ... -bool XEU5XCHMAMXHasShortSignal() -{ - // - bool result = false; - - // - // Validate Args ... - if (!xEU5MXCHMAMXEnableSignaller || - !xEU5MXCHMAMXAllowShortSignals) - { - return result; - } - - // - // Retrieve Market Condition ... - XMarketConditions mConditions = xEU5Provider.GetLastMarketCondition(); - - // - // Start Analysing Market based On Conditions ... - result = - // - // Base Condition: - xEU5Provider.XCHMAMXHasShortConditions() - // - && - // - // Exceptions: - // there some commonly Exceptions which makes our choice incorrect, - // here we are combined knownly Exceptions ... - !( - // - // for Exception we used XLH Conditions as follow ... - // - // Check Conditions if Price In Signal Range ... - (mConditions.isXLHPriceInSignalRange && - // - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceInSignalRange ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTMNeutural && - mConditions.isXCHMASCVale && - mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCPeak && - mConditions.isXAMANeutural && - mConditions.isXTSCurrentMin) - // - || - // - (((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) && - ( - // - (mConditions.isXAMAStartBearish && - mConditions.isXTSCurrentOverFarest) - // - || - // - (mConditions.isXCHMASCVale && - mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCPeak) - // - || - // - (mConditions.isXTSCurrentMin && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXAMAStartBearish) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMBearish && - mConditions.isXLHHHIncreased && - mConditions.isXTDBullOverBear && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHMAMCTrendsUp && - mConditions.isXAMAStartBearish && - mConditions.isXTSCurrentOverFarest) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHLHSameHHs && - mConditions.isXTSCurrentMin && - mConditions.isXTMStartBearish && - mConditions.isXAMAStartBearish && - mConditions.isXLHLowAttachedLL) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceInSignalRange ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Under Signal ... - ( - // - ((mConditions.isXLHPriceUnderSignal || - mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceUnderSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) && - ( - // - ((mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCPeak) && - ( - // - (mConditions.isXTMVale && - mConditions.isXAMAVale) - // - || - // - (mConditions.isXTMStartBearish && - mConditions.isXAMAStartBearish && - mConditions.isXTSCurrentOverFarest) - // - ) - // - ) - // - || - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHMALCPeak && - mConditions.isXTSCurrentMin && - mConditions.isXCHMAMCTrendsDown) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXTMBearish && - mConditions.isXCHMAMCPeak && - mConditions.isXAMAStartBearish && - mConditions.isXTSCurrentOverFarest) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXTSCurrentMin && - mConditions.isXLHHHDecreased && - mConditions.isXTMStartBearish && - mConditions.isXCHMALCTrendsUp && - mConditions.isXAMAStartBearish) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - mConditions.isXCHMALCPeak - // - || - // - (mConditions.isXTSAllSame && - mConditions.isXAMAEndBullish && - mConditions.isXTMStartBearish && - mConditions.isXTDBullOverBear && - mConditions.isXLHLowAttachedLL) - // - ) - // - ) - // - || - // - (((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow)) && - ( - // - ( - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHLHSCMCLLSame && - mConditions.isXLHLowAttachedLL) && - ( - // - (mConditions.isXTSCurrentMin && - mConditions.isXCHLHMCLCHHSame) - // - || - // - (mConditions.isXCHMALCPeak && - mConditions.isXTDBullOverBear && - mConditions.isXTSCurrentCrossedUnderNearest) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceUnderSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHLHSameHHs && - mConditions.isXCHLHSameLLs && - mConditions.isXTSCurrentMin && - mConditions.isXTMStartBearish && - mConditions.isXAMAStartBearish && - mConditions.isXLHLowAttachedLL) - // - ) - // - ) - // - || - // - (mConditions.isXTSCurrentMin && - mConditions.isXTMStartBearish && - mConditions.isXAMAStartBearish && - mConditions.isXLHLowAttachedLL && - ((mConditions.isXCHMASCFastOverSlow || - mConditions.isXCHMASCFastCrossedOverSlow) && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - (mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow))) - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is Over Signal ... - ( - // - ((mConditions.isXLHPriceOverSignal || - mConditions.isXLHPriceCrossedOverSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceOverSignal ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - (mConditions.isXTMBearish && - mConditions.isXAMABearish && - mConditions.isXCHMAMCPeak && - mConditions.isXTSCurrentMin && - mConditions.isXCHMAMCTrendsUp) - // - || - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMAMCTrendsUp && - (mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow)) - // - || - // - ((mConditions.isXCHMALCFastOverSlow || - mConditions.isXCHMALCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMASCVale && - mConditions.isXTSCurrentMin && - mConditions.isXTMStartBearish && - mConditions.isXAMAStartBearish) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - ((mConditions.isXTMBearish && - mConditions.isXCHMAMCPeak && - mConditions.isXAMANeutural && - mConditions.isXCHLHSCMCHHSame && - mConditions.isXCHLHMCLCLLSame) && - ( - // - mConditions.isXTSCurrentOverFarest - // - || - // - (mConditions.isXTSCurrentMin && - mConditions.isXCHMAMCTrendsDown && - mConditions.isXCHMALCTrendsDown) - // - ) - // - ) - // - || - // - ((mConditions.isXCHMAMCFastOverSlow || - mConditions.isXCHMAMCFastCrossedOverSlow) && - ( - // - (mConditions.isXCHMAMCPeak && - mConditions.isXCHMALCPeak && - mConditions.isXAMANeutural && - mConditions.isXTMStartBearish) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - ((mConditions.isXCHMASCTrendsUp && - (mConditions.isXCHMASCFastUnderSlow || - mConditions.isXCHMASCFastCrossedUnderSlow)) && - ( - // - (mConditions.isXFIUnderZero && - (mConditions.isXTMBearish || - mConditions.isXTMStartBearish) && - (mConditions.isXAMABearish || - mConditions.isXAMAStartBearish) && - (mConditions.isXTDBullUnderBear && - mConditions.isXTDSignalUnderBear)) - // - ) - // - ) - // - ) - // - ) - // - || - // - // PriceOverSignal ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - || - // - // Check Conditions if Price is not has clear state ... - ( - // - ((!mConditions.isXLHPriceOverSignal && - !mConditions.isXLHPriceUnderSignal && - !mConditions.isXLHPriceInSignalRange && - !mConditions.isXLHPriceCrossedOverSignal && - !mConditions.isXLHPriceCrossedUnderSignal) && - ( - // - // Next Step is to Check LL and HH Same Style ... - // - // PriceFree ... - // Check if Both LL and HH Same In Length ... - ((mConditions.isXLHLLSameInLength && - mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If LL Same In Length ... - ((mConditions.isXLHLLSameInLength && - !mConditions.isXLHHHSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Check If HH is Same In Length ... - ((mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - || - // - // PriceFree ... - // Not Same LL or HH in Lenght ... - ((!mConditions.isXLHHHSameInLength && - !mConditions.isXLHLLSameInLength) && - // - ( - // - false - // - ) - // - ) - // - ) - // - ) - // - ) - // - ) - // - ; - - // - return result; -} - -// -// END Signal Providers ... -// diff --git a/BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 b/BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 deleted file mode 100644 index 03e0a509..00000000 --- a/BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.inputs.lib.mq5 +++ /dev/null @@ -1,280 +0,0 @@ -/////////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XEU5 Signal Provider Library Inputs -// ----------------------------------------------------------- -// -// 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 Logger ... -#include "../Libraries/x-saherelm.log.lib.mq5" - -// -// Include Classes ... -#include "../Classes/x-saherelm.class.lib.mq5" - -// -input group "XEU5 Provider"; - -// -// Commonly Used Configurations ... -input group "XEU5 Common"; -// -// Provider ... -input bool xEU5EnableProvider = true; // Enable Provider -input int xEU5NumberOfItemsPerTick = 30; // Number Of items Readed In Each Tick -// -// Alerts ... -input bool xEU5EnableAlerts = true; // Enable Events Alert -input bool xEU5EnableHourlyAlerts = false; // Send Alert on each new Hour -input bool xEU5EnableDailyAlerts = false; // Send Alert on each new Day -input bool xEU5EnableWeeklyAlerts = false; // Send Alert on each new Week -input bool xEU5EnableMonthlyAlerts = true; // Send Alert on each new Month -// -// Reports ... -input bool xEU5EnableDailyReports = false; // Send Report on each new Day -input bool xEU5EnableWeeklyReports = false; // Send Report on each new Week -input bool xEU5EnableMonthlyReports = true; // Send Report on each new Month - -// -// Trader and Expert Specific Configurations ... -input group "XEU5 Trader"; -input int xEU5MagicNumber = 16940560; // Trader MagicNumber -input int xEU5Slippage = 10; // Trader Slippage - -// -// Trades Management Configurations ... -input group "XEU5 Trade Management"; -input bool xEU5AllowLongTrades = true; // Allow Long Trades -input bool xEU5AllowShortTrades = true; // Allow Short Trades - -// -// Risk Management Configurations ... -input group "XEU5 Risk Management"; -// -input bool xEU5UseVirtualTPSl = false; // Use Virtual TP SL -// -// Trade Count ... -input int xEU5MaxAllowedTrades = 10; // Max Allowed Trades at Same Time -input ENUM_X_CROSS_SIGNAL_METHOD xEU5CrossSignalsMethod = X_CROSS_SIGNAL_REGULAR; // Handle Cross Signals Method -// -// Max Allowed Trade Age ... -input int xEU5MaxAllowedTradeAge = 1500; // Detect Long Time Trades -input ENUM_X_GUARD_ACTIONS xEU5OldTradesAction = X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_1; // What to do with Old Trades -// -// Trade Volume Specific Configurations ... -input double xEU5StaticVolumeFactor = 0.0002; // Static Volume baesd on Balance -input ENUM_STATIC_VOLUME_METHODS xEU5StaticVolumeMethod = X_STATIC_VOLUME_BASED_ON_BALANCE; // How to Calculate Static Volume -input double xEU5VolumeMultiplier = 0; // Volume Increase Multiplier -input double xEU5ApplyVolumeMultiplierFactor = 0; // Apply Volume Multiplier Rate based on Balance -input double xEU5MaxSupportedVolumePerTradeFactor = 0; // Max Supported Volume Per Trade Factor based on Balance -input double xEU5IncreasedMaxSupportedVolumeRate = 0; // Increase Max Supported Volume based on Balance -// -// Trade Profits ... -input double xEU5MinRewardInPips = 15; // Minimum Reward Per Trade in Pips -input double xEU5RiskFreeStepInPips = 6; // Make Trades Risk Free Steps in Pips -input double xEU5RiskFreeRate = 0.6; // Volume Multiplier for Risk Free Trades -// -// Guard Riskable Money and Profits ... -input double xEU5CriticalDrawDownFactor = 0.40; // Critical Allowed Drawdown Factor based on Balance -input ENUM_X_GUARD_ACTIONS xEU5CriticalGuardAction = X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_5; // Specify Guard Action on Critical Drawdown -input double xEU5MaxAllowedDrawDownFactor = 0.45; // Max Allowed Drawdown Factor based on Balance -input ENUM_X_GUARD_ACTIONS xEU5MaxAllowedGuardAction = X_GUARD_PARTIAL_CLOSE_MAX_IN_DD_10; // Specify Guard Action on Max Allowed Drawdown -input int xEU5GuardStopoutFiredAfterTouches = 5; // Guard Stopout all Trades if Max Allowed Drawdown touched - -// -// Account Conditions for Trading ... -input double xEU5BalanceFactorForOpenTrades = 0.5; // Minimum Balance for Open Trades -input double xEU5FreeMarginFactorForOpenTrades = 0.8; // Minimum Free Margin for Open Trades - -// -// Validate Inputs before Initialization ... -bool XEU5ValidateInputs() -{ - // - bool result = false; - - // - // Implement Other Verifications ... - - // - // Check Trading Availability ... - bool isTradeAvailable = xEU5AllowLongTrades || xEU5AllowShortTrades; - if (!isTradeAvailable) - { - LogMessage("XEU5 => Warning: Trading disabled ..."); - } - - // - // Chekc Number of reading items per tick ... - result = xEU5NumberOfItemsPerTick >= 5; - if (!result) - { - // - LogMessage("XEU5 invalid Number of items Reading Per Tick ..."); - - // - return result; - } - - // - // Check Max Allowed Trades Count ... - result = isTradeAvailable && xEU5MaxAllowedTrades >= 1; - if (!result) - { - // - LogMessage("XEU5 Number of Trades not valid ..."); - - // - return result; - } - - // - // Check Free Margin ... - result = - isTradeAvailable && - xEU5FreeMarginFactorForOpenTrades > 0 && - xEU5FreeMarginFactorForOpenTrades < 1; - if (!result) - { - // - LogMessage("XEU5 Invalid Free Margin ..."); - - // - return result; - } - - // - // Check min Balance for Open Trades ... - result = - isTradeAvailable && - xEU5BalanceFactorForOpenTrades > 0 && - xEU5BalanceFactorForOpenTrades < 1; - if (!result) - { - // - LogMessage("XEU5 Invalid Min Balance for Open Trades ..."); - - // - return result; - } - - // - // Check Min Reward Per Trade ... - result = xEU5MinRewardInPips > 0; - if (!result) - { - // - LogMessage("XEU5 Invalid Min Reward Per Trade ..."); - - // - return result; - } - - // - // Check Trades Volume ... - result = xEU5StaticVolumeFactor > 0; - if (!result) - { - // - LogMessage("XEU5 Invalid Static Volume ..."); - - // - return result; - } - - // - // Check Volume Multiplier ... - result = xEU5VolumeMultiplier >= 0; - if (!result) - { - // - LogMessage("XEU5 Invalid Volume Multiplier ..."); - - // - return result; - } - - // - result = - xEU5CriticalDrawDownFactor == 0 || (xEU5CriticalDrawDownFactor > 0 && - xEU5CriticalDrawDownFactor < 1); - if (!result) - { - // - LogMessage("XEU5 Invalid Critical DrawDown Factor ..."); - - // - return result; - } - - // - result = - xEU5MaxAllowedDrawDownFactor == 0 || (xEU5MaxAllowedDrawDownFactor > 0 && - xEU5MaxAllowedDrawDownFactor < 1); - if (!result) - { - // - LogMessage("XEU5 Invalid Max Allowed DrawDown Factor ..."); - - // - return result; - } - - // - // Check Guard Actions ... - // - result = - xEU5CriticalDrawDownFactor > 0 && - xEU5CriticalDrawDownFactor < 1 && - xEU5MaxAllowedDrawDownFactor > 0 && - xEU5MaxAllowedDrawDownFactor < 1; - if (!result) - { - // - LogMessage("XEU5 For Critical Drawdown, you have to Specify Max Drawdown also ..."); - - // - return result; - } - - // - result = xEU5CriticalDrawDownFactor > 0 && xEU5CriticalDrawDownFactor < xEU5MaxAllowedDrawDownFactor; - if (!result) - { - // - LogMessage("XEU5 Critical Drawdown must Smaller than Max Drawdown ..."); - - // - return result; - } - - // - if (xEU5CriticalDrawDownFactor > 0 && xEU5CriticalGuardAction == X_GUARD_DO_NOTHING) - { - LogMessage("XEU5 IMPORTANT you Specified Critical Drawdown, but there is no any Guard Action ..."); - } - - // - if (xEU5MaxAllowedDrawDownFactor > 0 && xEU5MaxAllowedGuardAction == X_GUARD_DO_NOTHING) - { - LogMessage("XEU5 IMPORTANT you Specified Max Allowed Drawdown, but there is no any Guard Action ..."); - } - - // - result = true; - - // - return result; -} \ No newline at end of file diff --git a/BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.lib.mq5 b/BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.lib.mq5 deleted file mode 100644 index c57de45d..00000000 --- a/BKP/XAU5-0.43/Providers/x-saherelm.xeu5.provider.lib.mq5 +++ /dev/null @@ -1,1370 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SaherElm IT Center MQL5 XEU5 Signal Provider Library -// -------------------------------------------------------- -// Name: XEU5SignalProvider -// Description: XEU5 based signal provider ... -// -// -// 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 - -#define XEU5ProviderName "XEU5" - -// -// START Inputs ... -// - -#include "x-saherelm.xeu5.provider.inputs.lib.mq5"; - -// -// END Inputs ... -// - -// -// Include Common Library ... -#include "../Libraries/x-saherelm.common.lib.mq5" - -// -// Include Logger Library ... -#include "../Libraries/x-saherelm.log.lib.mq5" - -// -// Include Alert Library ... -#include "../Libraries/x-saherelm.alert.lib.mq5" - -// -// Include Draw Library ... -#include "../Libraries/x-saherelm.draw.lib.mq5" - -// -// Include Class Libraries ... -#include "../Classes/x-saherelm.class.lib.mq5" - -// -// START Global Definitions: Variables, Properties and etc ... -// - -// -XCGuard *xEU5Guard; -XCTrade *xEU5Trader; -XCReporter *xEU5Reporter; -XCCollector *xEU5Collector; -XCAccountInfo *xEU5AccountInfo; -XCVolumeManager *xEU5VolumeManager; - -// -#include "x-saherelm.xeu5.provider.indicators.lib.mq5" - -// -// Controlling Variables ... -bool xEU5MEnableProvider = false; -bool xEU5MAllowLongTrades = false; -bool xEU5MAllowShortTrades = false; - -// -double xEU5Deposit = 0; -double xEU5Balance = 0; -double xEU5MinReward = 0; -double xEU5FreeMargin = 0; -double xEU5BalanceForOpenTrades = 0; -double xEU5FreeMarginForOpenTrades = 0; - -// -// Guard ... -double xEU5CriticalDrawDown = 0; -double xEU5MaxAllowedDrawDown = 0; - -// -double xEU5MaxDrawUp = 0; -double xEU5MaxDrawDown = 0; - -// -int NOT_ENOUGH_MONEY_ERROR = 4756; -const string XEU5_SUPPORT_ID = "SP"; - -// -// END Global Definitions: Variables, Properties and etc ... -// - -// -// START Provided Functions ... -// - -// -// Initial Library if required ... -bool XEU5InitSignalProviderLibrary() -{ - // - bool result = false; - - // - if (!xEU5EnableProvider) - { - return result; - } - - // - // Controlling Variables ... - xEU5MEnableProvider = xEU5EnableProvider; - xEU5MAllowLongTrades = xEU5AllowLongTrades; - xEU5MAllowShortTrades = xEU5AllowShortTrades; - - // - // Validate Inputs ... - result = XEU5ValidateInputs(); - if (!result) - { - return result; - } - - // - // Init Indicators ... - result = XEU5InitIndicators(); - if (!result) - { - return result; - } - - // - xEU5Reporter = new XCReporter(); - xEU5Collector = new XCCollector(); - xEU5AccountInfo = new XCAccountInfo(); - - // - // Calculate Account Deposit ... - xEU5Deposit = xEU5AccountInfo.GetInitialBalance(); - - // - // Prepare Min Reward ... - if (xEU5MinRewardInPips > 0) - { - xEU5MinReward = PipsToPrice(xEU5MinRewardInPips); - } - - // - // Calculate Min Balance for Trades ... - if (xEU5BalanceFactorForOpenTrades > 0) - { - xEU5BalanceForOpenTrades = xEU5BalanceFactorForOpenTrades * xEU5Deposit; - } - - // - // Claculate Min Free Marging for Trades ... - if (xEU5FreeMarginFactorForOpenTrades > 0) - { - xEU5FreeMarginForOpenTrades = xEU5FreeMarginFactorForOpenTrades * xEU5Deposit; - } - - // - // Calculate Init Time Critical DrawDown Value ... - if (xEU5CriticalDrawDownFactor > 0) - { - xEU5CriticalDrawDown = xEU5CriticalDrawDownFactor * xEU5Deposit; - } - - // - // Calculate Init Time Max Allowed DrawDown Value ... - if (xEU5MaxAllowedDrawDownFactor > 0) - { - xEU5MaxAllowedDrawDown = xEU5MaxAllowedDrawDownFactor * xEU5Deposit; - } - - // - // Instant Volume Manager ... - xEU5VolumeManager = new XCVolumeManager( - xEU5StaticVolumeFactor, - xEU5StaticVolumeMethod, - xEU5VolumeMultiplier, - xEU5ApplyVolumeMultiplierFactor, - xEU5MaxSupportedVolumePerTradeFactor, - xEU5IncreasedMaxSupportedVolumeRate); - - // - // Make XCTrader instance ... - xEU5Trader = new XCTrade( - XEU5ProviderName, - _Symbol, - xEU5Slippage, - xEU5MagicNumber, - xEU5UseVirtualTPSl, - xEU5MaxAllowedTrades, - xEU5FreeMarginForOpenTrades, - xEU5BalanceForOpenTrades); - - // - // Instantiate Account Guard ... - xEU5Guard = new XCGuard( - // - // Old Trades ... - xEU5MaxAllowedTradeAge, - xEU5OldTradesAction, - // - // Critical DrawDown ... - xEU5CriticalDrawDownFactor, - xEU5CriticalGuardAction, - // - // Max Allowed DrawDown ... - xEU5MaxAllowedDrawDownFactor, - xEU5MaxAllowedGuardAction, - xEU5GuardStopoutFiredAfterTouches, - // - // xEU5GuardSupportMethod - X_SUPPORT_DO_NOTHING - // - ); - - // - // Reset Calculations Buffers and Variables ... - XEU5ResetCollectors(); - - // - XEU5UpdateReports(); - - // - result = true; - - // - // Logging State ... - XEU5IssueInitializationSucceedAlert(); - - // - return result; -} - -// -// DeInitial Library if required ... -void XEU5DeinitSignalProviderLibrary(const int reason) -{ - // - // Release Handlers ... - XEU5ReleaseIndicators(); - - // - // Logging State ... - XEU5IssueDeinitializationSucceedAlert(); -} - -// -// this is a Globally Function which do all of -// checkings and positions handling ... -void XEU5SignalProviderHandleTick() -{ - // - // Check Provider is Enable or Not ... - if (!xEU5MEnableProvider) - { - return; - } - - // - XEU5SignalProviderDoControlState(); - - // - // Reading Indicator Buffers ... - XEU5HandleReadingBuffers(); - if (xEU5CalculatedBars < xEU5MaxLengthOfInputs) - { - return; - } - - // - // Handle Open Trades ... - XEU5HandleOpenTrades(); - - // - // Handle Close Trades ... - XEU5HandleCloseTrades(); - - // - // DrawDown and DrawUp ... - XEU5HandleCalculateDrawDownUp(); -} - -// -// Do Control Checks here ... -void XEU5SignalProviderDoControlState() -{ - // - // Update account Balance ... - xEU5Balance = xEU5AccountInfo.GetBalance(); - xEU5FreeMargin = xEU5AccountInfo.GetFreeMargin(); - - // - // Check Provider is Enable or Not ... - if (!xEU5MEnableProvider) - { - return; - } - - // - // Protect Account by Guarding Maximum Drawdown ... - // TODO: add Guard Result here ... - string guardMessage = ""; - XGuardHandlerResult guardHandlerResult; - bool isGuarded = xEU5Guard.Guard( - guardHandlerResult, - guardMessage, - xEU5Trader, - _Period); - if (isGuarded) - { - // - // Criticals ... - int criticalsCount = ArraySize(guardHandlerResult.criticals); - if (criticalsCount > 0) - { - // - for (int i = 0; i < criticalsCount; i++) - { - // - XSignal iSignal = guardHandlerResult.criticals[i]; - - // - XEU5OnGuard( - iSignal, - X_GUARDED_CRITICAL, - guardMessage); - } - } - - // - // Maxes ... - int maxesCount = ArraySize(guardHandlerResult.maxes); - if (maxesCount > 0) - { - // - for (int i = 0; i < maxesCount; i++) - { - // - XSignal iSignal = guardHandlerResult.maxes[i]; - - // - XEU5OnGuard( - iSignal, - X_GUARDED_MAX, - guardMessage, - guardHandlerResult.isStopOut); - } - } - - // - // Olds ... - int oldsCount = ArraySize(guardHandlerResult.olds); - if (oldsCount > 0) - { - // - for (int i = 0; i < oldsCount; i++) - { - // - XSignal iSignal = guardHandlerResult.olds[i]; - - // - XEU5OnGuard( - iSignal, - X_GUARDED_OLD, - guardMessage); - } - } - } - - // - // Signal Protection ... - XSignal protectSupports[]; - bool isSupported = xEU5Guard.ProtectSignals( - protectSupports, - xEU5Trader); - if (isSupported) - { - // - LogMessage("Guard do Support Trdae ..."); - } - - // - // Handling Signals ... - XTraderHandlerResult signalHandlerResult; - xEU5Trader.HandleSignals( - signalHandlerResult, - false // Ignore Risk Free Trdaes - ); - - // - // Handle Sl Reports ... - int handledSLsCount = ArraySize(signalHandlerResult.sl); - if (handledSLsCount > 0) - { - // - for (int i = 0; i < handledSLsCount; i++) - { - // - XSignal iSignal = signalHandlerResult.sl[i]; - XEU5OnSL(iSignal); - } - } - - // - // Handle TP Reports ... - int handledTPsCount = ArraySize(signalHandlerResult.tp); - if (handledTPsCount > 0) - { - // - for (int i = 0; i < handledTPsCount; i++) - { - // - XSignal iSignal = signalHandlerResult.tp[i]; - XEU5OnTP(iSignal); - } - } - - // - // Handle RFs as TP Reports ... - int handledRFsCount = ArraySize(signalHandlerResult.rf); - if (handledRFsCount > 0) - { - // - for (int i = 0; i < handledRFsCount; i++) - { - // - XSignal iSignal = signalHandlerResult.rf[i]; - XEU5OnRF(iSignal); - } - } -} - -// -// Handle Trades when OnTrade Event Hnadler Calls ... -void XEU5SignalProviderHandleTrade() -{ - // - // Check Provider Enabled ... - if (!xEU5MEnableProvider) - { - return; - } - - // - // Handle OnTrade Event ... - XOnTradeHandlerResult result = {}; - xEU5Trader.HandleOnTradeEvent( - result); - - // - // Detected TP or SL ... - if (result.hasNewDeal) - { - // - XDeal last = xEU5Trader.GetLastDeal(); - - // - if (last.reason == DEAL_REASON_SL) - { - xEU5Reporter.AddTradeSLInReports(); - } - else if (last.reason == DEAL_REASON_TP) - { - xEU5Reporter.AddTradeTPInReports(); - } - } -} - -// -// Handle Open Trades ... -void XEU5HandleOpenTrades() -{ - // - // Check Can Trade ... - bool canTrade = xEU5MAllowLongTrades || xEU5MAllowShortTrades; - if (!canTrade) - { - return; - } - - // - // Check Max Open Trades ... - int openSignals = xEU5Trader.Count(); - bool canOpenPositions = openSignals < xEU5MaxAllowedTrades; - if (!canOpenPositions) - { - return; - } - - // - // Check Signals Exists ... - XProvidedSignal longSignalInfo; - XProvidedSignal shortSignalInfo; - bool hasLongSignal = XEU5CanOpenLongTrade(longSignalInfo); - bool hasShortSignal = XEU5CanOpenShortTrade(shortSignalInfo); - if (!hasLongSignal && !hasShortSignal) - { - return; - } - - // - // Update Reports ... - XEU5UpdateReports(); - - // - // Open Long Trades ... - if ( - // - hasLongSignal && - xEU5MAllowLongTrades) - { - // - bool isOpened = XEU5OpenLongPosition(longSignalInfo); - } - - // - // Open Short Trades ... - if ( - // - hasShortSignal && - xEU5MAllowShortTrades) - { - // - bool isOpened = XEU5OpenShortPosition(shortSignalInfo); - } -} - -// -// Handle Close Trades ... -void XEU5HandleCloseTrades() -{ - // - // Force Close Long Trades ... - bool isClosedLongTrades = false; - bool canCloseLongTrades = XEU5CanCloseLongTrade(); - if (xEU5MAllowLongTrades && canCloseLongTrades) - { - // - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_LONG; - - // - XSignal closed[]; - xEU5Trader.CloseSignals( - closed, - type); - - // - int closedTradesCount = ArraySize(closed); - isClosedLongTrades = closedTradesCount > 0; - if (isClosedLongTrades) - { - // - for (int i = 0; i < closedTradesCount; i++) - { - // - XSignal iSignal = closed[i]; - XEU5OnFC(iSignal); - } - } - } - - // - // Force Close Short Trades ... - bool isClosedShortTrades = false; - bool canCloseShortTrades = XEU5CanCloseShortTrade(); - if (xEU5MAllowShortTrades && canCloseShortTrades) - { - // - ENUM_X_SIGNAL_TYPE type = X_SIGNAL_SHORT; - - // - XSignal closed[]; - xEU5Trader.CloseSignals( - closed, - type); - - // - int closedTradesCount = ArraySize(closed); - isClosedShortTrades = closedTradesCount > 0; - if (isClosedShortTrades) - { - // - for (int i = 0; i < closedTradesCount; i++) - { - // - XSignal iSignal = closed[i]; - XEU5OnFC(iSignal); - } - } - } -} - -// -// Open Long Position ... -bool XEU5OpenLongPosition( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - // Calculate Required Data for Position ... - double entry = GetEntry(_Symbol, X_SIGNAL_LONG); - double sl = info.sl > 0 ? info.sl : 0; - // entry - (200 * _Point); - // info.sl > 0 ? info.sl : 0; - double tp = info.tp > 0 ? info.tp : entry + xEU5MinReward; - double riskFreeRate = xEU5RiskFreeRate; - double riskFreeStep = xEU5RiskFreeStepInPips; - double volume = XEU5CalculateVolume(ArraySize(info.signallers)); - - // - XSignal signal = {}; - signal = xEU5Trader.GenerateSignal( - X_SIGNAL_LONG, - tp, - sl, - volume, - riskFreeStep, - riskFreeRate); - bool isValidSignal = IsValid( - signal, - xEU5MagicNumber); - if (!isValidSignal) - { - return result; - } - - // - int signalsCount = xEU5Trader.Count(); - bool isCross = signalsCount >= 1; - if (isCross) - { - // - // Handle Cross Signals ... - XEU5HnadleCrossSignal(signal); - } - - // - // Retrieve Can Execute Signal or not ... - bool canExecuteSignal = - !isCross - // - || - // - ( - // - isCross && - xEU5CrossSignalsMethod != X_CROSS_SIGNAL_DO_NOTHING - // - ); - if (!canExecuteSignal) - { - return result; - } - - // - // Execute Signal ... - ENUM_EXECUTION_SIGNAL_RESULT executionResult = xEU5Trader.ExecuteSignal( - signal, - false, // Ignore Number of Trades ... - true // Check Account Conditions ... - ); - result = executionResult == X_TRADER_SUCCEED_EXECUTION; - if (result) - { - // - // Update Reports ... - string providers[]; - ArrayCopy( - providers, - info.signallers - ); - - // - XSignal tSignal = xEU5Trader.GetSignal(signal.ticket); - - // - XEU5OnSignal( - tSignal, - providers); - } - else - { - XEU5IssueSignalExecutionError(executionResult); - } - - // - return result; -} - -// -// Open Short Position ... -bool XEU5OpenShortPosition( - XProvidedSignal &info // Retrieve Signal Additional Info on this Object -) -{ - // - bool result = false; - - // - // Calculate Required Data for Position ... - double entry = GetEntry(_Symbol, X_SIGNAL_SHORT); - double sl = info.sl > 0 ? info.sl : 0; - // entry + (200 * _Point); - // info.sl > 0 ? info.sl : 0; - double tp = info.tp > 0 ? info.tp : entry - xEU5MinReward; - double riskFreeRate = xEU5RiskFreeRate; - double riskFreeStep = xEU5RiskFreeStepInPips; - double volume = XEU5CalculateVolume(ArraySize(info.signallers)); - - // - XSignal signal = {}; - signal = xEU5Trader.GenerateSignal( - X_SIGNAL_SHORT, - tp, - sl, - volume, - riskFreeStep, - riskFreeRate); - bool isValidSignal = IsValid( - signal, - xEU5MagicNumber); - if (!isValidSignal) - { - return result; - } - - // - int signalsCount = xEU5Trader.Count(); - bool isCross = signalsCount >= 1; - if (isCross) - { - // - // Handle Cross Signals ... - XEU5HnadleCrossSignal(signal); - } - - // - // Retrieve Can Execute Signal or not ... - bool canExecuteSignal = - !isCross - // - || - // - ( - // - isCross && - xEU5CrossSignalsMethod != X_CROSS_SIGNAL_DO_NOTHING - // - ); - if (!canExecuteSignal) - { - return result; - } - - // - // Execute Signal ... - ENUM_EXECUTION_SIGNAL_RESULT executionResult = xEU5Trader.ExecuteSignal( - signal, - false, // Ignore Number of Trades ... - true // Check Account Conditions ... - ); - result = executionResult == X_TRADER_SUCCEED_EXECUTION; - if (result) - { - string providers[]; - ArrayCopy( - providers, - info.signallers - ); - - // - XSignal tSignal = xEU5Trader.GetSignal(signal.ticket); - - // - XEU5OnSignal( - tSignal, - providers); - } - else - { - XEU5IssueSignalExecutionError(executionResult); - } - - // - return result; -} - -// -// Apply Cross Signal Actions ... -void XEU5HnadleCrossSignal( - XSignal &signal // Specified Signal ... -) -{ - // - // Check Cross Signal Handling Enabled ... - if (xEU5CrossSignalsMethod == X_CROSS_SIGNAL_DO_NOTHING) - { - return; - } - - // - // First We have to Change Cross Signals Comment ... - string comment = xEU5Trader.GenerateSignalComment( - signal, - true); - - // - signal.comment = comment; - - // - // If Every thing is Regular, prevent any changes here ... - if (xEU5CrossSignalsMethod == X_CROSS_SIGNAL_REGULAR) - { - return; - } - - // - // Retrieve Max in Drawdown Signal ... - XSignal maxInDDSignal = xEU5Trader.GetMaxInDrawdownSignal(); - - // - // Validate Signal ... - bool isValidSignal = - maxInDDSignal.ticket > 0 && - maxInDDSignal.symbol == signal.symbol && - IsValid(maxInDDSignal, xEU5MagicNumber); - if (!isValidSignal) - { - return; - } - - // - double volume = signal.volume; - bool isDirectional = maxInDDSignal.type == signal.type; - - // - // Prevent any changes on Regular Conditions ... - bool isRegular = - isDirectional - ? ( - // - xEU5CrossSignalsMethod == X_CROSS_SIGNAL_DIRECTION_REGULAR || - xEU5CrossSignalsMethod == X_CROSS_SIGNAL_DIRECTION_REGULAR_INDIRECTION_IMPORTANT - // - ) - : ( - // - xEU5CrossSignalsMethod == X_CROSS_SIGNAL_INDIRECTION_REGULAR || - xEU5CrossSignalsMethod == X_CROSS_SIGNAL_DIRECTION_IMPORTANT_INDIRECTION_REGULAR - // - ); - if (isRegular) - { - return; - } - - // - // Important Act needs to Multiply volume by 2 ... - volume *= 2; - - // - // Set Volume of signal ... - signal.volume = volume; -} - -// -// Calculate Usefull data ... -void XEU5HandleCalculateDrawDownUp() -{ - // - XSignal signals[]; - xEU5Trader.GetSignals(signals); - int signalsCount = ArraySize(signals); - if (signalsCount <= 0) - { - return; - } - - // - double profit = 0; - double volume = 0; - XCollector collector = {}; - double maxAllowedVolume = xEU5VolumeManager.GetMaxAllowedVolume(); - for (int i = 0; i < signalsCount; i++) - { - // - XSignal iSignal = signals[i]; - - // - profit += iSignal.profit; - - // - volume = - volume == 0 || - volume < iSignal.volume - ? iSignal.volume - : volume; - } - - // - if (profit < 0) - { - // - xEU5MaxDrawDown = - xEU5MaxDrawDown == 0 || - xEU5MaxDrawDown > MathAbs(profit) - ? MathAbs(profit) - : xEU5MaxDrawDown; - - // - // Update Buffers ... - datetime time = iTime(_Symbol, _Period, 0); - - // - // Calculate Max Allowed Drawdown ... - // - collector.time = time; - collector.volume = volume; - collector.maxDrawDown = xEU5MaxDrawDown; - collector.maxAllowedVolume = maxAllowedVolume; - collector.minBalanceForOpenTrade = xEU5Trader.GetMinBalanceForOpenTrades(); - } - else - { - // - xEU5MaxDrawUp = - xEU5MaxDrawUp == 0 || - xEU5MaxDrawUp < profit - ? profit - : xEU5MaxDrawUp; - } - - // - // Update Collector ... - xEU5Collector.Add(collector); - - // - // Update Reports ... - xEU5Reporter.UpdateMaxDrawUpInReports(xEU5MaxDrawUp); - xEU5Reporter.UpdateMaxDrawDownInReports(xEU5MaxDrawDown); - xEU5Reporter.UpdateMaxSameTimeTradesInReports(signalsCount); -} - -// -// START Event Handlers ... -// - -// -// Runs When a Signal Successfully Executed ... -void XEU5OnSignal( - XSignal &signal, // Specified Signal - string &providers[] // Signal Providers -) -{ - // - // Issue Propper Alert ... - XEU5IssueSignalExecutionAlert( - signal, - providers); - - // - // Add Signal To Supports on Guard ... - xEU5Guard.AddSupport(signal); - - // - // Update Reports ... - xEU5Reporter.AddSignalToReports( - signal, - providers); -} - -// -// Runs when a Position Got Take Profit ... -void XEU5OnTP( - XSignal &signal // Specified Signal -) -{ - // - // Issue Propper Alert ... - XEU5IssueTPAlert(signal); - - // - // Remove Signal From Guard Protector ... - xEU5Guard.Remove(signal.ticket); - xEU5Guard.RemoveSupport(signal.ticket); - - // - // Update Reports ... - xEU5Reporter.AddTradeTPInReports(); - XEU5UpdateReports(); -} - -// -// Runs when a Position Got Stop Loss ... -void XEU5OnSL( - XSignal &signal // Specified Signal -) -{ - // - // Issue Propper Alert ... - XEU5IssueSLAlert(signal); - - // - // Remove Signal From Guard Protector ... - xEU5Guard.Remove(signal.ticket); - xEU5Guard.RemoveSupport(signal.ticket); - - // - // Update Reports ... - xEU5Reporter.AddTradeSLInReports(); - XEU5UpdateReports(); -} - -// -// Runs when a Position Risk Free ... -void XEU5OnRF( - XSignal &signal // Specified Signal -) -{ - // - // Issue Propper Alert ... - XEU5IssueRFAlert(signal); - - // - // Remove Signal From Guard Protector ... - // since RiskFree Signals has SL ... - xEU5Guard.Remove(signal.ticket); - xEU5Guard.RemoveSupport(signal.ticket); - - // - // Update Reports ... - xEU5Reporter.AddTradeSLInReports(); - XEU5UpdateReports(); -} - -// -// Runs when a Position Force Closed ... -void XEU5OnFC( - XSignal &signal // Specified Signal -) -{ - // - // Issue Propper Alert ... - XEU5IssueFCAlert(signal); - - // - // Remove Signal From Guard Protector ... - xEU5Guard.Remove(signal.ticket); - xEU5Guard.RemoveSupport(signal.ticket); - - // - // Update Reports ... - xEU5Reporter.AddTradeSLInReports(); - XEU5UpdateReports(); -} - -// -// Runs when a Position Guarded ... -void XEU5OnGuard( - XSignal &signal, // Specified Signal - ENUM_X_GUARD_REASONS reason, // Reason of Guard Applied - string message, // Guard Returned Message - bool isStopOut = false // Specified StopOut Fired or not -) -{ - // - // Chekc StopOut ... - if (isStopOut) - { - // - LogMessage(message); - - // - xEU5MEnableProvider = false; - } - - // - // Issue Propper Alert ... - XEU5IssueGuardAlert(signal, reason, isStopOut); - - // - // Update Reports ... - xEU5Reporter.AddTradeSLInReports(); - XEU5UpdateReports(); -} - -// -// END Event Handlers ... -// - -// -// END Provided Functions ... -// - -// -// START Private Functions ... -// - -// -// START Volume Baseed Functions ... -// - -// -// Calculating Volume for Tradings ... -double XEU5CalculateVolume( - double forceMultiplier = 0 // some times we get more than one signal at the same time, here we increase volume using this ... -) -{ - // - // Check Open Trades ... - int openSignals = xEU5Trader.Count(); - - // - double result = xEU5VolumeManager.CalculateVolume( - openSignals, - _Symbol); - - // - result *= forceMultiplier; - - // - // Normalize Volume ... - result = NormalizeVolume(result, _Symbol, 2); - - // - return result; -} - -// -// END Volume Baseed Functions ... -// - -// -// START Report/Collect and Guard Functions ... -// - -// -// Update Report Info ... -void XEU5UpdateReports() -{ - // - double staticVolume = xEU5VolumeManager.GetStaticVolume(); - string staticVolumeCalculationMethod = EnumToString(xEU5StaticVolumeMethod); - double maxAllowedVolume = xEU5VolumeManager.GetMaxAllowedVolume(); - double volumeIncreaseMultiplier = xEU5VolumeManager.GetVolumeMultiplier(); - double balanceGowingToApplyMultiplier = xEU5VolumeManager.GetIncreaseMultiplierBalance(); - - double balanceGrowingToIncreaseMaxAllowedVolume = xEU5VolumeManager.GetIncreaseMaxAllowedVolumeBalance(); - - // - // Update Reports Volume Info ... - xEU5Reporter.UpdateReportsVolumeInfo( - staticVolume, - staticVolumeCalculationMethod, - maxAllowedVolume, - volumeIncreaseMultiplier, - balanceGowingToApplyMultiplier, - balanceGrowingToIncreaseMaxAllowedVolume); - - // - // Calculate Max Allowed Drawdown ... - double minBalanceForTradeBasedOnBalance = xEU5Trader.GetMinBalanceForOpenTrades(); - xEU5Reporter.UpdateMinBalanceForOpenTradesInReports(minBalanceForTradeBasedOnBalance); -} - -// -// Reset XEU5 Info Buffers ... -void XEU5ResetCollectors() -{ - // - // Reset Calculations Buffers and Variables ... - xEU5MaxDrawUp = 0; - xEU5MaxDrawDown = 0; - - // - xEU5Trader.Reset(); - xEU5Reporter.Reset(); - xEU5Collector.Reset(); - xEU5VolumeManager.ResetForceVolumeMultiplier(); -} - -// -// END Report/Collect and Guard Functions ... -// - -// -// START Alert Functions ... -// - -// -// Send Alert ... -void XEU5IssueAlert(string message) -{ - // - // Validate Args ... - if (StringLen(message) <= 0) - { - return; - } - - // - if (xEU5EnableAlerts) - { - SendAlert(message); - } - else - { - LogMessage(message); - } -} - -// -// Send Take Profit Alert on Specific Signal ... -void XEU5IssueTPAlert( - XSignal &signal // Specified Signal -) -{ - // - string message = ""; - - // - message = xEU5Trader.GenerateSignalTPComment(signal); - - // - XEU5IssueAlert(message); -} - -// -// Send Stop Loss Alert on Specific Signal ... -void XEU5IssueSLAlert( - XSignal &signal // Specified Signal -) -{ - // - string message = ""; - - // - message = xEU5Trader.GenerateSignalSLComment(signal); - - // - XEU5IssueAlert(message); -} - -// -// Send Force Close Alert on Specific Signal ... -void XEU5IssueFCAlert( - XSignal &signal // Specified Signal -) -{ - // - string message = ""; - - // - message = xEU5Trader.GenerateSignalForceCloseComment(signal); - - // - XEU5IssueAlert(message); -} - -// -// Send Risk Free Alert on Specific Signal ... -void XEU5IssueRFAlert( - XSignal &signal // Specified Signal -) -{ - // - string message = ""; - - // - message = xEU5Trader.GenerateSignalRFComment(signal, 0); - - // - XEU5IssueAlert(message); -} - -// -// Send Guard Alert on Specific Signal ... -void XEU5IssueGuardAlert( - XSignal &signal, // Specified Signal - ENUM_X_GUARD_REASONS reason, // Specified Guard Reason - bool isStopOut = false // Specified StopOut Fired or not -) -{ - // - string message = ""; - - // - message = xEU5Guard.GenerateGuardedSignalComment( - signal, - reason); - - // - XEU5IssueAlert(message); -} - -// -// Send Initialization Succeed Alert ... -void XEU5IssueInitializationSucceedAlert() -{ - // - string message = "Initializion of (" + XEU5ProviderName + " Provider" + " _ " + _Symbol + " _ " + EnumToString(_Period) + ") Succeeded ..."; - XEU5IssueAlert(message); -} - -// -// Send De Initialization Succeed Alert ... -void XEU5IssueDeinitializationSucceedAlert() -{ - // - string message = "De Initializion of (" + XEU5ProviderName + " Provider" + ") Succeeded ..."; - XEU5IssueAlert(message); -} - -// -// Send Signal Successfully Execution Alert ... -void XEU5IssueSignalExecutionAlert( - XSignal &signal, // Specified Signal - string &providers[] // Signal Providers -) -{ - // - string message = xEU5Trader.ToString(signal); - - // - string providersMsg = ToString(providers); - if (StringLen(providersMsg) > 0) - { - message += ", Providers: " + providersMsg; - } - - // - XEU5IssueAlert(message); -} - -// -// Send Signal Execution Alert ... -void XEU5IssueSignalExecutionError(int error) -{ - // - string message = GetSignalExecutionError(error); - if (StringLen(message) == 0) - { - return; - } - - // - XEU5IssueAlert(message); -} - -// -// END Alert Functions ... -// - -// -// END Private Functions ... -//