/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Indicator // ------------------------------------------------- // Name: XSTRCCISignaller Lib // Description: Library for XSTRCCI Signaller ... // // // 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 Library for XSTRCCI Signaller" #property strict // // Imports ... #include "../../Libraries/x-saherelm.common.lib.mq5" #include "../../Libraries/x-saherelm.x-poi.lib.mq5" #include "../../Libraries/x-saherelm.x-trade.lib.mq5" #include "../Helpers/xstrcci.helper.mq5" // // Enumeration ... // // Guard Actions ... enum ENUM_GUARD_ACTIONS { X_GUARD_ACTION_NONE, // Nothing to Do X_GUARD_ACTION_CLOSE, // Close Specified Position X_GUARD_ACTION_CLOSE_ALL, // Close All Positions X_GUARD_ACTION_CLOSE_LONGS, // Close All Long Positions X_GUARD_ACTION_CLOSE_SHORTS, // Close All Short Position X_GUARD_ACTION_PARTIAL_CLOSE, // Partial Close Specified Position X_GUARD_ACTION_TRAIL_STOP, // Trail Stop of Specified Position X_GUARD_ACTION_TRAIL_TARGET, // Trail Target of Specified Position X_GUARD_ACTION_HEDGE, // Hedge Specified Positions }; // // Definitions ... // // Conditions Struct ... struct XSTRCCIStrategyConditions { // // Props ... // string symbol; ENUM_TIMEFRAMES period; // // Setup Props ... // double sl; double tp; double pivot; double point; double sls[]; string provider; double targets[]; // datetime time; datetime setupTime; datetime triggerTime; // XBoxZone signalBox; ENUM_X_DIRECTION dir; ENUM_X_POSITION_TYPES type; ENUM_X_DIRECTION signalDir; // // Constructor ... XSTRCCIStrategyConditions() { Clean(); } // // Tools ... /** * Cleaning Up ... */ void Clean() { // sl = 0; tp = 0; pivot = 0; point = 0; // symbol = NULL; period = NULL; provider = NULL; // time = NULL; setupTime = NULL; triggerTime = NULL; // Clean(sls); Clean(targets); // signalBox.Clean(); // dir = X_DIRECTION_NONE; type = X_POSITION_TYPE_NONE; signalDir = X_DIRECTION_NONE; // } // // Signalling ... /** * Validate ... * * @return ( bool ) */ bool IsValid() { // bool result = false; // result = IsSpecifiedValid(symbol) && IsSpecifiedValid(period) && IsSpecifiedValid(time); // return result; } /** * Check Conditions Has Valid Bullish Signal ... * * @return ( bool ) */ bool HasBullishSignal() { // bool result = false; // result = (sl > 0 || tp > 0) && IsValid() && HasDirection(signalDir); if (!result) { return result; } // result = IsBullish(signalDir); // return result; } /** * Check Conditions Has Valid Bearish Signal ... * * @return ( bool ) */ bool HasBearishSignal() { // bool result = false; // result = (sl > 0 || tp > 0) && IsValid() && HasDirection(signalDir); if (!result) { return result; } // result = IsBearish(signalDir); // return result; } // // Setting Up and Triggering Up ... /** * Check Condition is Setting Up ... * * @param dir: ENUM_X_DIRECTION member, Setting Up Direction ... * * @return ( bool ) */ bool IsSetuped() { // bool result = false; // result = IsValid(setupTime) && HasDirection(dir); if (!result) { return result; } // return result; } /** * Calculate Setup Age ... * * @return ( int ) */ int GetSetupAge() { // int result = 0; // if (!IsSetuped()) { return result; } // result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period); // return result; } /** * Detect How we Can Trigger Signal ... * * @return ( bool ) */ bool CanTrigger() { // bool result = false; // result = // sl > 0 && IsValid(symbol) && IsValid(period) && IsValid(triggerTime) && type != X_POSITION_TYPE_ALL && type != X_POSITION_TYPE_NONE // ; // return result; } // }; // // Model a Guard Action ... struct XSTRCCIGuard { // // Props ... ENUM_GUARD_ACTIONS action; datetime time; // string symbol; string provider; // // Specified Position ... ulong ticket; // // Partial Close ... double volumeMultiplier; // // SL Trial ... double sl; // // TP Trial ... double tp; // // Constructor ... XSTRCCIGuard() { Clean(); } // // Tools ... /** * Cleanup ... */ void Clean() { // time = NULL; action = X_GUARD_ACTION_NONE; // symbol = NULL; provider = NULL; // ticket = 0; // volumeMultiplier = 0; // sl = 0; tp = 0; // ZeroMemory(this); } /** * Validate ... * * @return ( bool ) */ bool IsValid() { // bool result = false; // result = // IsValid(time) && IsValid(symbol) && IsValid(provider) && action != X_GUARD_ACTION_NONE // ; if (!result) { return result; } // // Validate Model Based On Specified Guard Actions ... // return result; } }; /** * Add Guard to Collection ... * * @param guard: XSTRCCIGuard instance ... * @param guards: XSTRCCIGuard instance Collection ... * * @return ( int ) */ int AddGuard( XSTRCCIGuard &guard, XSTRCCIGuard &guards[] // ) { // int result = 0; // if (!guard.IsValid()) { return result; } // AddRef( guard, guards // ); // result = ArraySize(guards); // return result; } // bool DetectXSTRCCIConditions( XBoxZone &box, ENUM_X_DIRECTION &dir, XCXSTRCCIHelper *helper, int barIndex = 0, int loopback = 10 // ) { // bool result = false; // box.Clean(); dir = X_DIRECTION_NONE; // if (barIndex < 0) { barIndex = 0; } loopback = NormalizeInt(loopback, 5); // string symbol = helper.GetSymbol(); ENUM_TIMEFRAMES period = helper.GetPeriod(); // XSTRCCIConditions conditions; result = helper.GetConditions( conditions, barIndex, loopback // ); if (!result) { // conditions.Clean(); return result; } // int zIDX = barIndex; int cIDX = zIDX + 1; int pIDX = cIDX + 1; int ppIDX = pIDX + 1; int p3IDX = ppIDX + 1; int p4IDX = p3IDX + 1; // XOHCL zBar; XOHCL cBar; XOHCL pBar; XOHCL ppBar; XOHCL p3Bar; XOHCL p4Bar; result = zBar.Init( symbol, period, zIDX // ); result = result && zBar.GetPreviousBar(cBar); result = result && cBar.GetPreviousBar(pBar); result = result && pBar.GetPreviousBar(ppBar); result = result && ppBar.GetPreviousBar(p3Bar); result = result && p3Bar.GetPreviousBar(p4Bar); if (!result) { // zBar.Clean(); cBar.Clean(); pBar.Clean(); ppBar.Clean(); p3Bar.Clean(); p4Bar.Clean(); // return result; } // // Bars Conditions ... // ENUM_X_DIRECTION cBarDir; // // Hammer ... bool isCBarHammer = helper .barAnalyser .IsHammer( cBar, cBarDir // ); bool isCBarBullishHammer = isCBarHammer && IsBullish(cBarDir); bool isCBarBearishHammer = isCBarHammer && IsBearish(cBarDir); // // Rejected ... bool isCBarRejected = helper .barAnalyser .IsRejected( cBar, cBarDir, false, // Force Type ... true // Force Fibo Pressure ... ); bool isCBarBullishRejected = isCBarRejected && IsBullish(cBarDir); bool isCBarBearishRejected = isCBarRejected && IsBearish(cBarDir); // // Engulfed ... bool isCBarEngulfed = helper .barAnalyser .IsEngulfed( cBar, cBarDir // ); bool isCBarBullishEngulfed = isCBarEngulfed && IsBullish(cBarDir); bool isCBarBearishEngulfed = isCBarEngulfed && IsBearish(cBarDir); // // Momentum ... bool isCBarMomentum = helper .barAnalyser .IsMomentum( cBar, cBarDir, 1 // ); bool isCBarBullishMomentum = isCBarMomentum && IsBullish(cBarDir); bool isCBarBearishMomentum = isCBarMomentum && IsBearish(cBarDir); // // Bar Sumarise ... // bool isCBarValidForBullish = (isCBarBullishHammer || isCBarBullishRejected || isCBarBullishMomentum || isCBarBullishEngulfed); // bool isCBarValidForBearish = (isCBarBearishHammer || isCBarBearishRejected || isCBarBearishMomentum || isCBarBearishEngulfed); // // Conditions ... // bool isLowsUnderValesGolden = // pBar.low < conditions.valesGoldenBuffer[pIDX] && ppBar.low < conditions.valesGoldenBuffer[ppIDX] && p3Bar.low < conditions.valesGoldenBuffer[p3IDX] && p4Bar.low < conditions.valesGoldenBuffer[p4IDX] // ; // bool isHighsOverPeaksGolden = // pBar.high > conditions.peaksGoldenBuffer[pIDX] && ppBar.high > conditions.peaksGoldenBuffer[ppIDX] && p3Bar.high > conditions.peaksGoldenBuffer[p3IDX] && p4Bar.high > conditions.peaksGoldenBuffer[p4IDX] // ; // bool isSwingLowSameAsVale = conditions.swingLowsBuffer[p4IDX] == conditions.valesBuffer[p4IDX]; // bool isSwingHighSameAsPeak = conditions.swingHighsBuffer[p4IDX] == conditions.peaksBuffer[p4IDX]; // bool isStrSame = conditions.strBuffer[cIDX] == conditions.strBuffer[pIDX] && conditions.strBuffer[pIDX] == conditions.strBuffer[ppIDX]; // bool isSameStrBreakedUp = isStrSame && conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX]; // bool isSameStrBreakedDown = isStrSame && conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX]; // bool isStrBullishVPattern = // conditions.strStateBuffer[zIDX] > 0 && conditions.strStateBuffer[cIDX] > 0 && conditions.strStateBuffer[pIDX] > 0 && conditions.strBuffer[pIDX] < conditions.strBuffer[ppIDX] && conditions.strBuffer[pIDX] < conditions.strBuffer[cIDX] && conditions.strBuffer[pIDX] < conditions.strBuffer[zIDX] && conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX] // ; // bool isStrBearishVPattern = // conditions.strStateBuffer[zIDX] < 0 && conditions.strStateBuffer[cIDX] < 0 && conditions.strStateBuffer[pIDX] < 0 && conditions.strBuffer[pIDX] > conditions.strBuffer[ppIDX] && conditions.strBuffer[pIDX] > conditions.strBuffer[cIDX] && conditions.strBuffer[pIDX] > conditions.strBuffer[zIDX] && conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX] // ; // bool isCBarLowInTKZone = // cBar.low < conditions.tenkanSenBuffer[cIDX] && cBar.low > conditions.kijunSenBuffer[cIDX] // ; // bool isCBarHighInTKZone = // cBar.high > conditions.tenkanSenBuffer[cIDX] && cBar.high < conditions.kijunSenBuffer[cIDX] // ; // // Summarise Conditions ... // bool isBullish = // isCBarLowInTKZone && isCBarBullishRejected && isCBarValidForBullish && conditions.isX3MaSlowBullish && conditions.isTenkanSenOverKijunSen && conditions.kijunSenBuffer[cIDX] > conditions.x3maSlowBuffer[cIDX] // ; // bool isBearish = // isCBarHighInTKZone && isCBarBearishRejected && isCBarValidForBearish && conditions.isX3MaSlowBearish && conditions.isTenkanSenUnderKijunSen && conditions.kijunSenBuffer[cIDX] < conditions.x3maSlowBuffer[cIDX] // ; // result = isBullish || isBearish; if (result) { // dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // double entry = GetEntry( conditions.symbol, dir // ); double sl = conditions.kijunSenBuffer[cIDX]; // box.dir = dir; box.symbol = conditions.symbol; box.period = conditions.period; // box.upper = isBullish ? entry : sl; // box.lower = isBullish ? sl : entry; // box.to = zBar.time; box.from = p4Bar.time; // box.type = ToString(dir) + "_Signal_" + conditions.symbol + "_" + ToString(conditions.period); // XCBoxObject *iObj; bool isCreated = helper.poiDrawer.DrawBox( box, iObj // ); if (isCreated) { Print("Signal Box ..."); } } // result = box.IsValid() && HasDirection(dir); // // Cleanup Resources ... // zBar.Clean(); cBar.Clean(); pBar.Clean(); ppBar.Clean(); p3Bar.Clean(); p4Bar.Clean(); // conditions.Clean(); // return result; } //