/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Indicator // ------------------------------------------------- // Name: XCXCAEASignaller ... // Description: Class for XCAEA Signaller ... // // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // ////////////////////////////////////////////////////// // // Global Properties ... #property library #property copyright "Copyright 2023, SaherElm IT Center" #property link "https://saherelm.ir" #property version "1.00" #property description "SaherElm Class for XCAEA Signaller" #property strict // // Imports ... #include "../../Classes/x-saherelm.base.class.mq5" #include "../../Classes/x-saherelm.x-cobject.class.mq5" #include "../Classes/xcaea.x-poi.detector.class.mq5" #include "../Classes/xcaea.x-poi.drawer.class.mq5" #include "../Helpers/xcaea.helper.mq5" #include "../Libraries/xcaea.signaller.lib.mq5" // // Definitions ... class XCXCAEASignaller : XCBase { // // Public ... public: // // Props ... bool useGuards; XCAEAInputs inputs; XBarTracker barTraker; XCXCAEAHelper *helper; XCXCAEAPOIDrawer *drawer; bool continuesRFTillTarget; XBoxZone unAvailableBoxes[]; XCXCAEAPOIDetector *detector; XCAEAStrategyConditions mConditions; XCAEAStrategyConditions mConditionsCollection[]; // // Constructor ... XCXCAEASignaller( string _symbol, ENUM_TIMEFRAMES _period // ) { // symbol = _symbol; period = _period; // Init(); } // // Deconstructor ... ~XCXCAEASignaller() { DeInit(); } // // Properties ... string GetSymbol() { return symbol; } ENUM_TIMEFRAMES GetPeriod() { return period; } // // Signaller Tools ... /** * Detect Setup Conditions based on Signalling ... * * @param maxAllowedSLDistanceInPoint: int, Max Allowed SL Distance in Points (if Bigger thn Zero Provided) ... * * @return ( bool ) */ bool DetectSignalSetup( double tpReward = 3, double maxAllowedSLDistanceInPoint = 100 // ) { // bool result = false; // // Check Bar Processing ... if (!barTraker.CanProcessBar()) { return result; } // bool isBullish = false; bool isBearish = false; // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // int loopback = 10; // int idx = -1; int count = 0; bool has = false; // double ask = GetAsk(symbol); double bid = GetBid(symbol); datetime cTime = TimeCurrent(); double points = GetPoints(symbol); // XOHCL zBar; XOHCL cBar; XOHCL pBar; XOHCL pPBar; result = zBar.Init( symbol, period, zIndex // ); result = result && zBar.GetPreviousBar(cBar); result = result && cBar.GetPreviousBar(pBar); result = result && pBar.GetPreviousBar(pPBar); if (!result) { // zBar.Clean(); cBar.Clean(); pBar.Clean(); pPBar.Clean(); // return result; } // // Setup Conditions ... XBoxZone boxes[]; XBoxZone pivotBox; XBoxZone signalBox; double additionalSL = 0; XBoxZone bullishBoxes[]; XBoxZone bearishBoxes[]; bool hasSignalBox = false; XCAEAConditions conditions; ENUM_X_DIRECTION signalBoxDir = X_DIRECTION_NONE; // // Detecting Pivots ... detector.Update( zIndex // ); // // Validate Pivots ... detector.Validate( unAvailableBoxes, zIndex // ); // // Draw Founded Pivots ... drawer.Draw(cTime); // // Retrieve Valid Boxes ... // // // // Bullish ... // int bullishBoxesCount = // detector // .FillBullishBoxes(bullishBoxes); // // // // Bearish ... // int bearishBoxesCount = // detector // .FillBearishBoxes(bearishBoxes); // // // Copy( // bullishBoxes, // boxes, // false // // ); // Copy( // bearishBoxes, // boxes, // false // // ); int boxesCount = ArraySize(boxes); bool hasBoxes = IsValidSize(boxesCount); // // Filter UnAvailable Boxes ... if (hasBoxes) { // // Remove UnAvailable Boxes ... has = HasChild(unAvailableBoxes); if (has) { // count = ArraySize(unAvailableBoxes); for (int i = 0; i < count; i++) { // XBoxZone iBox = unAvailableBoxes[i]; // has = FindBoxIndex( idx, iBox, boxes // ); if (has) { // ArrayRemove( boxes, idx, 1 // ); } } } // hasBoxes = HasChild(boxes); boxesCount = ArraySize(boxes); } // // // // // if (hasBoxes) // { // } // // Detect Sinal Box ... hasSignalBox = DetectXCAEAConditions( boxes, conditions, pivotBox, signalBox, additionalSL, signalBoxDir, helper, zIndex, loopback // ); // // Make Pivot Box UnAvailable ... if (pivotBox.IsValid()) { // AddRef( pivotBox, unAvailableBoxes // ); } // isBullish = hasSignalBox && IsBullish(signalBoxDir); // isBearish = hasSignalBox && IsBearish(signalBoxDir); // result = isBullish || isBearish; if (result) { // // Do What we Want ... barTraker.Waits(); // // Draw Signal Box ... XCBoxObject *iObj; bool isCreated = helper.poiDrawer.DrawBox( signalBox, iObj // ); if (isCreated) { // mObjects.Add(iObj); ZeroMemory(iObj); // Print("Signal Box ..."); } // // Prepare Conditions ... mConditions.symbol = symbol; mConditions.period = period; // double spread = GetSpread(symbol); // double entry = isBullish ? signalBox.upper : signalBox.lower; // double sl = isBullish ? signalBox.lower : signalBox.upper; if (additionalSL > 0) { // sl = isBullish ? sl - additionalSL : sl + additionalSL; } // double risk = isBullish ? entry - sl : sl - entry; risk += spread; if (risk >= maxAllowedSLDistanceInPoint * points) { // // Fix Risk in Big Distances ... double hh5 = zBar.FindHighest(5, MODE_HIGH); double ll5 = zBar.FindLowest(5, MODE_LOW); // double hhll5Delta = hh5 - ll5; double riskDelta = hhll5Delta / 2; risk = riskDelta; } // double rewardTP = risk * tpReward; // double tp = isBullish ? entry + rewardTP : entry - rewardTP; // // Filling ... mConditions.sl = sl; mConditions.tp = tp; mConditions.pivot = isBullish ? sl : entry; mConditions.point = isBullish ? entry : sl; mConditions.dir = signalBoxDir; mConditions.provider = "XCAEA"; mConditions.signalBox = signalBox; mConditions.setupTime = zBar.time; mConditions.conditions = conditions; // // Select RF Rewards ... if (continuesRFTillTarget) { // double rfReward = 1; while (rfReward < tpReward) { // double rewardRF = risk * rfReward; double rfTP = isBullish ? entry + rewardRF : entry - rewardRF; // Add( rfTP, mConditions.targets // ); // rfReward++; } } else { // double rfReward = 1; // double rewardRF = risk * rfReward; double rfTP = isBullish ? entry + rewardRF : entry - rewardRF; // Add( rfTP, mConditions.targets // ); } } // // Cleanup Resource ... // Clean(boxes); Clean(bullishBoxes); Clean(bearishBoxes); // zBar.Clean(); cBar.Clean(); pBar.Clean(); pPBar.Clean(); // pivotBox.Clean(); signalBox.Clean(); conditions.Clean(); // return result; } /** * Detect Trigger Conditions for Specified Signal ... * * @param conditions: XCAEAStrategyConditions instance Reference, Specified Signal Conditions ... * @param maxAllowedSetupAge: specified Setup Age for Expiration (if bigger than Zero) ... * * @return ( bool ) */ bool DetectSignalTrigger( XCAEAStrategyConditions &conditions, int maxAllowedSetupAge = 60 // ) { // bool result = false; // result = conditions.IsSetuped(); if (!result) { return result; } // datetime setupTime = conditions.setupTime; ENUM_X_DIRECTION setupDir = conditions.dir; // bool isBullish = IsBullish(setupDir); bool isBearish = IsBearish(setupDir); // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // int loopback = 10; // double ask = GetAsk(symbol); double bid = GetBid(symbol); datetime cTime = TimeCurrent(); double points = GetPoints(symbol); // // Check Signal Validation ... // IMPORTANT: since all Validations done in SetUp Process ... // here we only Execute Signal ... // result = isBullish || isBearish; // if (result) { // conditions.triggerTime = cTime; conditions.type = isBullish ? X_POSITION_TYPE_LONG : X_POSITION_TYPE_SHORT; // } // // Cleanup ... // return result; } /** * Detect Guards bsed on Signalling Class ... * * @param guards: XCAEAGuard instance Collection, Holds Provided Guards ... * @param positions: XPosition instance Collection, Provides Signalling Based Positions for Apply Guards on them ... * @param provider: X121SMCStrategySignalProviderData instance Reference, Specified Data for Cycles ... * * @return ( bool ) */ bool DetectGuards( XCAEAGuard &guards[], const XPosition &positions[] // ) { // bool result = false; // return result; } /** * Add Conditions to Conditions Collection if not Exists ... * * @param maxAllowed: int, Specified Max Allowed Holding Conditions ... * * @return ( int ) */ int AddConditionsIfNotExists( int maxAllowed = 10 // ) { // int result = 0; // bool isSetuped = IsValid(mConditions.setupTime) && HasDirection(mConditions.dir); if (!isSetuped) { return result; } // int count = ArraySize(mConditionsCollection); if (IsValidSize(count)) { // // Copy Original Items ... XCAEAStrategyConditions tmpItems[]; Copy( mConditionsCollection, tmpItems // ); // // Prese Item Data ... bool isBullish = IsBullish(mConditions.dir); // for (int i = 0; i < count; i++) { // XCAEAStrategyConditions iItem = tmpItems[i]; // bool canRemove = mConditions.dir == iItem.dir && mConditions.pivot == iItem.pivot; if (canRemove) { // ArrayRemove( mConditionsCollection, i, 1 // ); } } // Clean(tmpItems); } // AddRef( mConditions, mConditionsCollection // ); // // Remove Olds ... CleanupArray( mConditionsCollection, maxAllowed // ); // result = ArraySize(mConditionsCollection); // return result; } // // Protected ... protected: // // // Private ... private: // // Props ... string symbol; ENUM_TIMEFRAMES period; CArrayObj mObjects; CArrayObj mBarObjects; /** * Initialize ... */ void Init() { // useGuards = false; continuesRFTillTarget = true; // barTraker.Init( symbol, period // ); // inputs.Default(); // // Configure Indicators ... // // XCC ... inputs.ccInputs.showCandles = true; // // XCT ... inputs.ctInputs.showCandleTime = true; // // XCA ... // inputs.caInputs.supResSmoothingLength = 7; inputs.caInputs.supResSmoothingMode = X_MA_MODE_NONE; // inputs.caInputs.showKI = true; inputs.caInputs.showTKI = false; inputs.caInputs.showSar = false; inputs.caInputs.showVidya = true; inputs.caInputs.showTrend = false; inputs.caInputs.showSwings = false; inputs.caInputs.showLongCycle = false; inputs.caInputs.showHindCycle = false; inputs.caInputs.showFiboLevel1 = false; inputs.caInputs.showFiboLevel2 = false; inputs.caInputs.showFiboLevel3 = false; inputs.caInputs.showShortCycle = false; inputs.caInputs.showMediumCycle = false; inputs.caInputs.showPeaksAndVales = true; inputs.caInputs.showPeakAndValeGolden = false; inputs.caInputs.showSupportAndResistance = false; // // XOSCS ... // inputs.oscsInputs.rsiLength = 5; // inputs.oscsInputs.cciLength = 5; // inputs.oscsInputs.mfiLength = 5; // inputs.oscsInputs.rviLength = 5; // // Oscillators Views ... inputs.showCCI = false; inputs.showRSI = false; inputs.showMFI = false; inputs.showRVI = false; inputs.showADX = false; inputs.showMACD = false; // // XCAEA Helper ... helper = new XCXCAEAHelper(); helper.Init( symbol, period, inputs // ); // // Initialize and Configure Detector ... detector = new XCXCAEAPOIDetector(helper); // // Configure Detector ... detector.detectRSIPeakPivots = true; detector.detectRSIValePivots = true; detector.detectCCIPeakPivots = true; detector.detectCCIValePivots = true; detector.detectFVGBullishPivots = true; detector.detectFVGBearishPivots = true; detector.detectValeSupSWLPivots = true; detector.detectPeakResSWHPivots = true; detector.detectPVFVGBullishPivots = true; detector.detectPVFVGBearishPivots = true; // // Initialize and Configure Drawer ... drawer = new XCXCAEAPOIDrawer(detector); // drawer.ignoreUpdateOSCTos = true; // // Configure Drawer ... drawer.drawRSIPeakPivots = true; drawer.drawRSIValePivots = true; drawer.drawCCIPeakPivots = true; drawer.drawCCIValePivots = true; drawer.drawFVGBullishPivots = false; drawer.drawFVGBearishPivots = false; drawer.drawValeSupSWLPivots = true; drawer.drawPeakResSWHPivots = true; drawer.drawPVFVGBullishPivots = true; drawer.drawPVFVGBearishPivots = true; // // Configure Widths ... drawer.rsiPeakPivotsWidth = 4; drawer.rsiValePivotsWidth = 4; drawer.cciPeakPivotsWidth = 4; drawer.cciValePivotsWidth = 4; drawer.fvgBullishPivotsWidth = 2; drawer.fvgBearishPivotsWidth = 2; drawer.valeSupSWLPivotsWidth = 1; drawer.peakResSWHPivotsWidth = 1; drawer.pvFVGBullishPivotsWidth = 1; drawer.pvFVGBearishPivotsWidth = 1; // // Configure Colors ... drawer.rsiPeakPivotsColor = clrMagenta; drawer.rsiValePivotsColor = clrAqua; drawer.cciPeakPivotsColor = clrMagenta; drawer.cciValePivotsColor = clrAqua; drawer.fvgBullishPivotsColor = clrLime; drawer.fvgBearishPivotsColor = clrRed; drawer.valeSupSWLPivotsColor = clrAqua; drawer.peakResSWHPivotsColor = clrMagenta; drawer.pvFVGBullishPivotsColor = clrLime; drawer.pvFVGBearishPivotsColor = clrRed; // // Configures Styles ... drawer.rsiPeakPivotsStyle = STYLE_DASH; drawer.rsiValePivotsStyle = STYLE_DASH; drawer.cciPeakPivotsStyle = STYLE_DASH; drawer.cciValePivotsStyle = STYLE_DASH; drawer.fvgBullishPivotsStyle = STYLE_DASHDOTDOT; drawer.fvgBearishPivotsStyle = STYLE_DASHDOTDOT; drawer.valeSupSWLPivotsStyle = STYLE_SOLID; drawer.peakResSWHPivotsStyle = STYLE_SOLID; drawer.pvFVGBullishPivotsStyle = STYLE_DASHDOTDOT; drawer.pvFVGBearishPivotsStyle = STYLE_DASHDOTDOT; // } /** * DeInitialize ... */ void DeInit() { // inputs.Clean(); // ZeroMemory(drawer); ZeroMemory(helper); ZeroMemory(detector); // mConditions.Clean(); Clean(mConditionsCollection); // mObjects.Clear(); mBarObjects.Clear(); // barTraker.Clean(); } // }; //