// // Represent a Session Working Time ... struct XSession { // // Props ... ENUM_XSESSION session; // Session Identifier string start; // Start Time string end; // End Time // bool allowDraw; color startColor; ENUM_LINE_STYLE startStyle; color endColor; ENUM_LINE_STYLE endStyle; /** * Constructor ... */ void XSession() { Clean(); } /** * Clean Structure ... */ void Clean() { // start = NULL; end = NULL; // allowDraw = false; endColor = clrAqua; endStyle = STYLE_DOT; startColor = clrAqua; endStyle = STYLE_DOT; } /** * Validate Structure ... * * @return ( bool ) */ bool IsValid() { // bool result = false; // result = IsValid(start) && IsValid(end); // return result; } /** * Initialize Specified Session ... * * @param _session: ENUM_XSESSION member ... * @param _start: String (Session Start Time) ... * @param _end: String (Session End Time) ... * * @return ( bool ) */ bool Init( ENUM_XSESSION _session, string _start, string _end // ) { // bool result = false; // result = IsValid(_start) && IsValid(_end); if (!result) { return result; } // end = _end; start = _start; session = _session; // result = IsValid(); // return result; } // }; // struct XTradeDay { // datetime from; datetime to; // void XTradeDay() { Clean(); } // void Clean() { // from = NULL; to = NULL; } // bool IsValid() { // bool result = false; // result = IsValid(from) && IsValid(to); // return result; } // string GetTag() { // string result = NULL; // if (!IsValid()) { return result; } // result = ToString(X_POI_TRADING_DAY) + "_" + ToFormatString(from) + "_" + ToFormatString(to); // return result; } // }; // // Detected Session ... struct XMarketSession { // ENUM_XSESSION session; datetime from; datetime to; // void XMarketSession() { Clean(); } // void Clean() { from = NULL; to = NULL; } // bool IsValid() { // bool result = false; // result = IsValid(from) && IsValid(to); // return result; } // string GetTag() { // string result = NULL; // if (!IsValid()) { return result; } // result = ToString(X_POI_MARKET_SESSION) + "_" + ToString(session) + "_" + ToFormatString(from) + "_" + ToFormatString(to) + "_"; // return result; } }; // // Zone Struct ... struct XZone { // // Props ... double upper; double lower; string prefix; // datetime from; datetime to; // // Constructor ... void XZone() { Clean(); } // bool Init( double _upper, double _lower, string _prefix, datetime _from, datetime _to // ) { // bool result = false; // result = _upper > 0 && _lower > 0 && _upper > _lower && IsValid(_prefix) && IsValid(_from); if (!result) { return result; } // NormalizeTime(_to); // upper = _upper; lower = _lower; prefix = _prefix; from = _from; to = _to; // result = IsValid(); // return result; } // void Clean() { // upper = 0; lower = 0; // to = NULL; from = NULL; prefix = NULL; } // bool IsValid() { // bool result = false; // result = upper > 0 && lower > 0 && upper > lower && IsValid(to) && IsValid(from) && IsValid(prefix); // return result; } // double GetRange() { // double result = 0; // if (!IsValid()) { return result; } // result = upper - lower; // return result; } // double GetMiddle() { // double result = 0; // double range = GetRange(); if (range <= 0) { return result; } // result = lower + (range / 2); // return result; } // string GetTag() { // string result = NULL; // result = prefix + "_" + ToString(upper) + "_" + ToString(lower); // return result; } }; // // XOHCL Event Handler ... typedef void (*TXOHCLEventHandler)( ENUM_XPOI_EVENTS event, XOHCL &bar // ); // // POI Event Handler ... typedef void (*TXPOIEventHandler)( ENUM_XPOI_EVENTS event // ); // // Session Event Handler ... typedef void (*TXSessionEventHandler)( ENUM_XSESSION session, ENUM_XPOI_EVENTS event // ); // // Zone Handler ... typedef void (*TXZoneEventHandler)( ENUM_XPOI_EVENTS event, XZone &zone // ); // // Model Exists Founded POIs ... struct XPOIState { // string symbol; ENUM_TIMEFRAMES period; datetime reportedAt; // XTradeDay tradingDays[]; XMarketSession marketSessions[]; // XOHCL momentumBars[]; XOHCL rejectionBars[]; // XOHCL swingHighs[]; XOHCL swingLows[]; // XOHCL supportZones[]; XOHCL resistanceZones[]; // XZone supplyZones[]; XZone demandZones[]; // XZone bullishOrderBlocks[]; XZone bearishOrderBlocks[]; // XZone bullishFVGs[]; XZone bearishFVGs[]; // // Constructor ... void XPOIState() { Clean(); } // // Actions ... /** * Cleanup all props ... */ void Clean() { // symbol = NULL; period = NULL; reportedAt = NULL; // Clean(tradingDays); Clean(marketSessions); // Clean(momentumBars); Clean(rejectionBars); // Clean(swingHighs); Clean(swingLows); // Clean(supportZones); Clean(resistanceZones); // Clean(supplyZones); Clean(demandZones); // Clean(bullishOrderBlocks); Clean(bearishOrderBlocks); // Clean(bullishFVGs); Clean(bearishFVGs); } /** * Fill Trading Days ... * * @param source: XTradeDay instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillTradingDays( XTradeDay &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(tradingDays); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, tradingDays // ); result = ArraySize(tradingDays); // return result; } /** * Fill Market Sessions ... * * @param source: XMarketSession instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillMarketSessions( XMarketSession &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(marketSessions); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, marketSessions // ); result = ArraySize(marketSessions); // return result; } /** * Fill Momentum Bars ... * * @param source: XOHCL instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillMomentumBars( XOHCL &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(momentumBars); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, momentumBars // ); result = ArraySize(momentumBars); // return result; } /** * Fill Retection Bars ... * * @param source: XOHCL instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillRejectionBars( XOHCL &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(rejectionBars); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, rejectionBars // ); result = ArraySize(rejectionBars); // return result; } /** * Fill Swing Highs ... * * @param source: XOHCL instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillSwingHighs( XOHCL &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(swingHighs); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, swingHighs // ); result = ArraySize(swingHighs); // return result; } /** * Fill Swing Lows ... * * @param source: XOHCL instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillSwingLows( XOHCL &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(swingLows); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, swingLows // ); result = ArraySize(swingLows); // return result; } /** * Fill Support Zones ... * * @param source: XOHCL instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillSupportZones( XOHCL &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(supportZones); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, supportZones // ); result = ArraySize(supportZones); // return result; } /** * Fill Resistance Zones ... * * @param source: XOHCL instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillResistanceZones( XOHCL &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(resistanceZones); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, resistanceZones // ); result = ArraySize(resistanceZones); // return result; } /** * Fill Supply Zones ... * * @param source: XZone instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillSupplyZones( XZone &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(supplyZones); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, supplyZones // ); result = ArraySize(supplyZones); // return result; } /** * Fill Demand Zones ... * * @param source: XZone instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillDemandZones( XZone &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(demandZones); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, demandZones // ); result = ArraySize(demandZones); // return result; } /** * Fill Bullish Order Blockss ... * * @param source: XZone instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillBullishOrderBlocks( XZone &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(bullishOrderBlocks); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, bullishOrderBlocks // ); result = ArraySize(bullishOrderBlocks); // return result; } /** * Fill Bearish Order Blockss ... * * @param source: XZone instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillBearishOrderBlocks( XZone &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(bearishOrderBlocks); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, bearishOrderBlocks // ); result = ArraySize(bearishOrderBlocks); // return result; } /** * Fill Bullish FVGs ... * * @param source: XZone instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillBullishFVGs( XZone &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(bullishFVGs); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, bullishFVGs // ); result = ArraySize(bullishFVGs); // return result; } /** * Fill Bearish FVGs ... * * @param source: XZone instance Collection ... * @param forceClean: Boolean ... * * @return ( int ) */ int FillBearishFVGs( XZone &source[], bool forceClean = true // ) { // int result = 0; // if (forceClean) { Clean(bearishFVGs); } // int count = ArraySize(source); if (!IsValidSize(count)) { return result; } // Copy( source, bearishFVGs // ); result = ArraySize(bearishFVGs); // return result; } // };