/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Seriallize Library // --------------------------------------- // Name: X121SMCLib // Description: All models related to X121SMC ... // // // 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 // // Imports ... #include "../../Classes/x-saherelm.base.class.mq5" #include "../../Libraries/x-saherelm.common.lib.mq5" #include "../../Libraries/x-saherelm.x-poi.lib.mq5" #include "../../Libraries/x-saherelm.xtrade.lib.mq5" // // Definitions ... // // Specific Identifier(s) of XStrategy ... string X121SMCStrategyToken = "X121SMC"; string X121SMCOBStrategyToken = "X121SMCOB"; string X121SMCSUPDEMStrategyToken = "X121SMCSUPDEM"; string X121SMCConditionsToken = "X121SMCConditions"; string X121SMCMarketStructureToken = "X121SMCMarketStructure"; // // Condition Structure ... struct X121SMCStrategyConditions { // // Props ... // // Common ... string symbol; ENUM_TIMEFRAMES period; datetime time; // // Conditions ... // XOHCL swingHigh; XZone supplyZone; XZone bearishFVG; XOHCL resistance; XZone bearishOrderBlock; XOHCL bullishMomentumBar; XOHCL bullishRejectionBar; // XZone demandZones[]; XZone bearishFVGs[]; XZone bearishOrderBlocks[]; XOHCL swingHighs[]; XOHCL resistances[]; XOHCL bearishMomentumBars[]; XOHCL bearishRejectionBars[]; // XOHCL support; XOHCL swingLow; XZone demandZone; XZone bullishFVG; XZone bullishOrderBlock; XOHCL bearishMomentumBar; XOHCL bearishRejectionBar; // XZone supplyZones[]; XZone bullishFVGs[]; XZone bullishOrderBlocks[]; XOHCL supports[]; XOHCL swingLows[]; XOHCL bullishMomentumBars[]; XOHCL bullishRejectionBars[]; // // Constructor ... void XStrategyConditions() { Clean(); } // // Tools ... /** * Cleanup ... */ void Clean() { // symbol = NULL; period = NULL; time = NULL; // CleanDemand(); CleanSupply(); } /** * Cleanup Demand Related ... */ void CleanDemand() { // support.Clean(); swingLow.Clean(); demandZone.Clean(); bullishFVG.Clean(); bullishOrderBlock.Clean(); bullishMomentumBar.Clean(); bullishRejectionBar.Clean(); // Clean(supports); Clean(swingLows); Clean(supplyZones); Clean(bullishFVGs); Clean(bullishOrderBlocks); Clean(bullishMomentumBars); Clean(bullishRejectionBars); } /** * Cleanup Supply Related ... */ void CleanSupply() { // swingHigh.Clean(); supplyZone.Clean(); bearishFVG.Clean(); resistance.Clean(); bearishOrderBlock.Clean(); bearishMomentumBar.Clean(); bearishRejectionBar.Clean(); // Clean(swingHighs); Clean(demandZones); Clean(bearishFVGs); Clean(resistances); Clean(bearishOrderBlocks); Clean(bearishMomentumBars); Clean(bearishRejectionBars); } /** * Validate Demand ... * * @return ( bool ) */ bool ValidateDemand() { // bool result = false; // result = IsValid(); if (!result) { return result; } // result = // support.IsValid() && swingLow.IsValid() && demandZone.IsValid() && bullishFVG.IsValid() && bullishOrderBlock.IsValid() && bullishMomentumBar.IsValid() && bullishRejectionBar.IsValid() && // (ArraySize(supports) > 0 || ArraySize(swingLows) > 0 || ArraySize(supplyZones) > 0 || ArraySize(bullishFVGs) > 0 || ArraySize(bullishOrderBlocks) > 0 || ArraySize(bullishMomentumBars) > 0 || ArraySize(bullishRejectionBars) > 0) // ; // return result; } /** * Validate Supply ... * * @return ( bool ) */ bool ValidateSupply() { // bool result = false; // result = IsValid(); if (!result) { return result; } // result = // swingHigh.IsValid() && supplyZone.IsValid() && bearishFVG.IsValid() && resistance.IsValid() && bearishOrderBlock.IsValid() && bearishMomentumBar.IsValid() && bearishRejectionBar.IsValid() && // (ArraySize(swingHighs) > 0 || ArraySize(demandZones) > 0 || ArraySize(bearishFVGs) > 0 || ArraySize(resistances) > 0 || ArraySize(bearishOrderBlocks) > 0 || ArraySize(bearishMomentumBars) > 0 || ArraySize(bearishRejectionBars) > 0) // ; // return result; } // // Validate ... bool IsValid() { // bool result = false; // result = // IsValid(time) && IsValid(symbol) && IsValid(period) // ; // return result; } // // Generate Provided Scores ... void GenerateScore( double &bullishScore, double &bearishScore // ) { // bullishScore = 0; bearishScore = 0; // if (!IsValid()) { return; } // double bullScore = 0; double bearScore = 0; // // Generate Helpers Conitions Scores ... } // // Generate Summary ... string GenerateSummary( bool onlyCommons = false, bool onlyConditions = false, bool includeScores = true, bool ignoreFalseConditions = true, string separator = "\n" // ) { // string result = NULL; // double bullishScore = 0; double bearishScore = 0; GenerateScore( bullishScore, bearishScore // ); // string commonStr = GenerateSpecifiedCommonSummary( this, separator, includeScores, true // ); // // Generate Helpers Conditions Strings ... // // Combine Helpers Conditions Strings ... string conditionsStr = // "" + separator + "" // ; // result = // "[" + GetTag() + "]" + separator + "----------" + separator + (onlyConditions ? "" : commonStr) + " " + separator + (onlyCommons ? "" : conditionsStr) + "" // ; // return result; } // string GetTag( bool fullTag = false // ) { // string result = NULL; // if (!IsValid()) { return result; } // if (fullTag) { // result = // symbol + "," + ToString(period) + "," + ToFormatString(time) + "_" + demandZone.GetTag() + "," + supplyZone.GetTag() + "_" + bullishOrderBlock.GetTag() + "," + bearishOrderBlock.GetTag() // ; // result = X121SMCConditionsToken + "_" + ToMD5(result); } else { result = X121SMCConditionsToken; } // return result; } // }; // // Market Structure Models ... struct X121SMCMarketStructure { // XZone demandZone; XZone supplyZone; // XZone bullishOrderBlock; XZone bearishOrderBlock; // XZone demandZones[]; XZone supplyZones[]; // XZone bearishOrderBlocks[]; XZone bearishFVGs[]; // XOHCL swingHighs[]; XOHCL resistances[]; XOHCL bearishMomentumBars[]; XOHCL bearishRejectionBars[]; // XZone bullishOrderBlocks[]; XZone bullishFVGs[]; // XOHCL supports[]; XOHCL swingLows[]; XOHCL bullishMomentumBars[]; XOHCL bullishRejectionBars[]; // void Clean() { // demandZone.Clean(); supplyZone.Clean(); // Clean(supports); Clean(swingLows); Clean(swingHighs); Clean(demandZones); Clean(supplyZones); Clean(bearishFVGs); Clean(resistances); Clean(bullishFVGs); Clean(bearishOrderBlocks); Clean(bullishOrderBlocks); Clean(bearishMomentumBars); Clean(bearishRejectionBars); Clean(bullishMomentumBars); Clean(bullishRejectionBars); } // string GetTag() { // string result = NULL; // result = // demandZone.GetTag() + "," + supplyZone.GetTag() + "_" + bullishOrderBlock.GetTag() + "," + bearishOrderBlock.GetTag() // ; result = X121SMCMarketStructureToken + "_" + ToMD5(X121SMCMarketStructureToken); // return result; } }; // // On Signal Event Handler ... typedef void (*TOnX121SMCSignal)( XSignal &signal, X121SMCStrategyConditions &conditions // ); // struct XRange { // string symbol; ENUM_TIMEFRAMES period; // double upper; double lower; // datetime from; datetime to; // void XRange() { Clean(); } // // Tools ... /** * Initial ... * * @param _symbol: String ... * @param _period: ENUM_TIMEFRAMES member ... * @param _upper: Double ... * @param _lower: Double ... * @param _from: DateTime ... * @param _to: DateTime ... * * @return ( bool ) */ bool Init( string _symbol, ENUM_TIMEFRAMES _period, double _upper, double _lower, datetime _from, datetime _to // ) { // bool result = false; // result = // IsValid(_symbol) && IsValid(_period) && IsValid(_from) && IsValid(_to) && _upper > 0 && _lower > 0 && _to > _from // ; // symbol = _symbol; period = _period; // upper = _upper; lower = _lower; // from = _from; to = _to; // result = IsValid(); // return result; } /** * Cleanup ... */ void Clean() { // symbol = NULL; period = NULL; // upper = 0; lower = 0; // from = NULL; to = NULL; } /** * Validate ... * * @return ( bool ) */ bool IsValid() { // bool result = false; // result = // IsValid(symbol) && IsValid(period) && IsValid(from) && IsValid(to) && upper > 0 && lower > 0 && to > from // ; // return result; } /** * Generate Unique Tag ... * * @return ( string ) */ string GetTag() { // string result = NULL; // string hash = ToString(upper) + "," + ToString(lower) + ToFormatString(from); hash = ToMD5(hash); // result = // "XRNG_" + symbol + "_" + ToString(period) + "_" + hash // ; // return result; } /** * Generate Tooltip ... * * @return ( string ) */ string GetTooltip() { // string result = NULL; // result = // "XRNG" + "\n" + symbol + "\n" + ToString(period) + "\n" + ToString(from) + "\n" + ToString(to) // ; // return result; } // }; // struct XRangeStructure { // XRange range; // XZone demandZones[]; XZone supplyZones[]; // XZone bearishOrderBlocks[]; XZone bearishFVGs[]; // XOHCL swingHighs[]; XOHCL resistances[]; XOHCL bearishMomentumBars[]; XOHCL bearishRejectionBars[]; // XZone bullishOrderBlocks[]; XZone bullishFVGs[]; // XOHCL supports[]; XOHCL swingLows[]; XOHCL bullishMomentumBars[]; XOHCL bullishRejectionBars[]; // // Constructor ... void XRangeStructure() { Clean(); } // // Tools ... /** * Cleanup ... */ void Clean() { // range.Clean(); // Clean(supports); Clean(swingLows); Clean(swingHighs); Clean(demandZones); Clean(supplyZones); Clean(bearishFVGs); Clean(resistances); Clean(bullishFVGs); Clean(bearishOrderBlocks); Clean(bullishOrderBlocks); Clean(bearishMomentumBars); Clean(bearishRejectionBars); Clean(bullishMomentumBars); Clean(bullishRejectionBars); } /** * Validate ... * * @return ( bool ) */ bool IsValid() { // bool result = false; // result = range.IsValid(); if (!result) { return result; } // result = // ArraySize(supports) > 0 || ArraySize(swingLows) > 0 || ArraySize(swingHighs) > 0 || ArraySize(demandZones) > 0 || ArraySize(supplyZones) > 0 || ArraySize(bearishFVGs) > 0 || ArraySize(resistances) > 0 || ArraySize(bullishFVGs) > 0 || ArraySize(bearishOrderBlocks) > 0 || ArraySize(bullishOrderBlocks) > 0 || ArraySize(bearishMomentumBars) > 0 || ArraySize(bearishRejectionBars) > 0 || ArraySize(bullishMomentumBars) > 0 || ArraySize(bullishRejectionBars) > 0 // ; // return result; } /** * Generate Tag ... * * @return ( string ) */ string GetTag() { // string result = NULL; // string hash = range.GetTag(); hash = ToMD5(hash); // result = X121SMCMarketStructureToken + "_" + hash; // return result; } }; /** * Check a Zone is Between to other Zones ... * * @param source: XZone instance ... * @param upper: XZone instance ... * @param lower: XZone instance ... * * @return ( bool ) */ bool IsBetween( XZone &source, XRange &range // ) { // bool result = false; // result = source.IsValid() && range.IsValid(); if (!result) { return result; } // result = source.upper <= range.upper && source.lower >= range.lower; // return result; } bool IsBetween( XOHCL &source, XRange &range // ) { // bool result = false; // result = source.IsValid() && range.IsValid(); if (!result) { return result; } // result = source.high <= range.upper && source.low >= range.lower; // return result; } //