/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 X121 SMC Signal Class // ------------------------------------------------- // Name: XWZ // Description: provide all Signalling 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 // // Imports ... // #include "../../Libraries/x-trade.lib" #include "../Classes/x-121.smc.market.cycle.helper.class.mq5" #include "../Libraries/x-121.smc.guard.lib.mq5" #include "../Libraries/x-121.smc.lib.mq5" // // Provided Signals Enumeration ... enum ENUM_X121SMC_XWZ_PROVIDERS { X121SMC_XWZ_PROVIDER_NONE, X121SMC_XWZ_PROVIDER_PVHK, X121SMC_XWZ_PROVIDER_ACTIVATED_MA, X121SMC_XWZ_PROVIDER_ACTIVATED_BOX, X121SMC_XWZ_PROVIDER_ACTIVATED_AREA, }; // // Provided Priority based on Working Zone and // Quarter Places ... enum ENUM_X121SMC_XWZ_PRIORITY { X121SMC_XWZ_PRIORITY_NONE, X121SMC_XWZ_PRIORITY_WEAK, X121SMC_XWZ_PRIORITY_LOW, X121SMC_XWZ_PRIORITY_REGULAR, X121SMC_XWZ_PRIORITY_HIGH, X121SMC_XWZ_PRIORITY_STRONG_HIGH, }; // // Definitions ... // // XWZ Working Zone Model ... struct X121SMCStrategyXWZWorkingZone { // // Props ... // string symbol; ENUM_TIMEFRAMES period; // double quarter1; double quarter2; double quarter3; // XCSupplyZone *supplyZone; XCDemandZone *demandZone; // XBoxZone waitingBoxes[]; XBoxZone breakedBoxes[]; XBoxZone unavailableBoxes[]; // CArrayObj mDrawnObjects; CArrayObj mWorkingZoneObjects; // // Constructor ... X121SMCStrategyXWZWorkingZone() { Clean(); } // // Properties ... /** * Check Working Zone has Supply Zone as Upper Boundary ... * * @return ( bool ) */ bool HasSupplyZone() { return supplyZone != NULL && supplyZone.IsValid(); } /** * Check Working Zone has Demand Zone as Lower Boundary ... * * @return ( bool ) */ bool HasDemandZone() { return demandZone != NULL && demandZone.IsValid(); } /** * Check Working Zone has Waiting Boxes or not ... * * @return ( bool ) */ bool HasWaitingBoxes() { return HasChild(waitingBoxes); } /** * Count Working Zone's Waiting Boxes ... * * @return ( int ) */ int CountWaitingBoxes() { return ArraySize(waitingBoxes); } /** * Check Working Zone has Breaked Boxes or not ... * * @return ( bool ) */ bool HasBreakedBoxes() { return HasChild(breakedBoxes); } /** * Count Working Zone's Breaked Boxes ... * * @return ( int ) */ int CountBreakedBoxes() { return ArraySize(breakedBoxes); } /** * Check Working Zone has Unavailable Boxes or not ... * * @return ( bool ) */ bool HasUnavailableBoxes() { return HasChild(unavailableBoxes); } /** * Count Working Zone's Unavailable Boxes ... * * @return ( int ) */ int CountUnavailableBoxes() { return ArraySize(unavailableBoxes); } // // Tools ... /** * Cleanup Model ... */ void Clean() { // quarter1 = 0; quarter2 = 0; quarter3 = 0; // symbol = NULL; period = NULL; // Clean(waitingBoxes); Clean(breakedBoxes); Clean(unavailableBoxes); // ZeroMemory(supplyZone); ZeroMemory(demandZone); // mDrawnObjects.Clear(); mWorkingZoneObjects.Clear(); } /** * Validate Model ... * * @return ( bool ) */ bool IsValid() { // bool result = false; // result = // quarter1 > 0 && quarter2 > 0 && quarter3 > 0 && HasSupplyZone() && HasDemandZone() && quarter1 > quarter2 && quarter2 > quarter3 // ; // return result; } /** * Checking a Box Exists in Collections or not ... * * @param box: XBoxZone instance reference ... * * @return ( bool ) */ bool IsExists(XBoxZone &box) { // bool result = false; // // Check Validation ... result = box.IsValid() && (HasWaitingBoxes() || HasBreakedBoxes() || HasUnavailableBoxes()); if (!result) { return result; } // int idx = -1; bool has = false; // // Check Index in Waiting Boxes ... has = HasWaitingBoxes(); if (has) { // idx = FindIndex( box, waitingBoxes // ); result = IsValidIndex(idx); if (result) { return result; } } // // Check Index in Breaked Boxes ... has = HasBreakedBoxes(); if (has) { // idx = FindIndex( box, breakedBoxes // ); result = IsValidIndex(idx); if (result) { return result; } } // // Check Index in Unavailable Boxes ... has = HasUnavailableBoxes(); if (has) { // idx = FindIndex( box, unavailableBoxes // ); result = IsValidIndex(idx); if (result) { return result; } } // return result; } /** * Initialize Working Zone ... * * @param _symbol: String ... * @param _period: ENUM_TIMEFRAMES member ... * @param barIndex: int ... * @param provider: X121SMCStrategySignalProviderData instance reference ... * * @return ( bool ) */ bool Init( string _symbol, ENUM_TIMEFRAMES _period, int barIndex, X121SMCStrategySignalProviderData &provider // ) { // bool result = false; // if (barIndex < 0) { barIndex = 0; } // result = // IsValid(_symbol) && IsValid(_period) && // provider.IsValid() // ; if (!result) { return result; } // symbol = _symbol; period = _period; // int idx = -1; int count = 0; bool has = false; // XOHCL zBar; has = zBar.Init( symbol, period, barIndex // ); result = has; if (!result) { zBar.Clean(); return result; } double ll5 = zBar.FindLowest(5, MODE_LOW); double hh5 = zBar.FindHighest(5, MODE_HIGH); zBar.Clean(); // // Supply Zone ... has = HasSupplyZone(); if (!has) { // idx = GetHighest(provider .consolidationState .supplyZones // ); has = IsValidIndex(idx); if (has) { // supplyZone = provider .consolidationState .supplyZones[idx]; has = hh5 < supplyZone.Lower(); if (!has) { supplyZone = NULL; } } } // // Demand Zone ... has = HasDemandZone(); if (!has) { // idx = GetLowest(provider .consolidationState .demandZones // ); has = IsValidIndex(idx); if (has) { // demandZone = provider .consolidationState .demandZones[idx]; has = ll5 > demandZone.Upper(); if (!has) { demandZone = NULL; } } } // if (supplyZone != NULL && demandZone != NULL && supplyZone.IsValid() && demandZone.IsValid()) { // double upper = supplyZone.Lower(); double lower = demandZone.Upper(); // double delta = ((upper - lower) / 100) * 25; // quarter1 = upper - (1 * delta); quarter2 = upper - (2 * delta); quarter3 = upper - (3 * delta); } // result = IsValid(); if (!result) { Clean(); } // return result; } /** * Detect Signal Boxes ... * * @param cycle: ENUM_X_CYCLES member ... * @param provider: X121SMCStrategySignalProviderData instance reference ... * @param barIndex: int ... * * @return ( bool ) */ bool DetectSignalBoxes( ENUM_X_CYCLES cycle, X121SMCStrategySignalProviderData &provider, int barIndex = 0 // ) { // bool result = false; // if (barIndex < 0) { barIndex = 0; } // // Select Cycle ... XPOIState cState; X121Conditions cXConditions; XC121SMCCycleHelper *cHelper; X121SMCCycleConditions cConditions; result = provider.SelectCycle( cycle, cState, cXConditions, cHelper, cConditions // ); if (!result) { // cState.Clean(); ZeroMemory(cHelper); cConditions.Clean(); cXConditions.Clean(); // return result; } // // Select Validate Rejection Boxes ... XBoxZone rejections[]; int count = cHelper .DetectRejections( rejections, barIndex // ); // result = IsValidSize(count); if (result) { // for (int i = 0; i < count; i++) { // bool has = IsExists(rejections[i]); if (!has) { // AddRef( rejections[i], waitingBoxes // ); } } } // count = CountWaitingBoxes(); result = IsValidSize(count); // // Cleanup Resources ... // cState.Clean(); ZeroMemory(cHelper); cConditions.Clean(); cXConditions.Clean(); // return result; } /** * Validating Waiting Boxes and Detect Breaked Boxes ... * * @param barIndex: int ... * * @return ( int ) */ int ValidateWaitingBoxes( int barIndex = 0 // ) { // int result = 0; // bool has = false; // if (barIndex < 0) { barIndex = 0; } // if (barIndex == 0) { barIndex = 1; } // has = HasWaitingBoxes(); if (!has) { return result; } // int removeIDX[]; result = CountWaitingBoxes(); for (int i = 0; i < result; i++) { // XOHCL iBar; XBoxZone iBox = waitingBoxes[i]; bool isInite = iBar .Init( iBox.symbol, iBox.period, iBox.from // ); // has = isInite && IsBoxBreaked( iBox, iBar.Index() - 1, barIndex, period // ); if (has) { // Add( i, removeIDX // ); // AddRef( iBox, breakedBoxes // ); } // iBox.Clean(); iBar.Clean(); } // has = HasChild(removeIDX); if (has) { // CleanupArray( removeIDX, waitingBoxes // ); } Clean(removeIDX); // result = CountWaitingBoxes(); // return result; } /** * Detect Overal Trend of Working Zone ... * * @param dir: ENUM_X_DIRECTION member ... * * @return ( bool ) */ bool DetectOveralDirection( ENUM_X_DIRECTION &dir // ) { // bool result = false; // dir = X_DIRECTION_NONE; // result = IsValid() && HasSupplyZone() && HasDemandZone(); if (!result) { return result; } // XBoxZone demBox; XBoxZone supBox; result = ToBox( demBox, demandZone // ); if (!result) { // supBox.Clean(); demBox.Clean(); // return result; } result = ToBox( supBox, supplyZone // ); if (!result) { // supBox.Clean(); demBox.Clean(); // return result; } // XOHCL supPriceOutBar; bool hasSupPriceOutBar = false; result = DetectBoxNearestPriceOut( supBox, supPriceOutBar, supBox.period // ); // XOHCL demPriceOutBar; bool hasDemPriceOutBar = false; result = DetectBoxNearestPriceOut( demBox, demPriceOutBar, demBox.period // ); // hasSupPriceOutBar = supPriceOutBar.IsValid(); hasDemPriceOutBar = demPriceOutBar.IsValid(); // // Specified Direction ... dir = (hasSupPriceOutBar && hasDemPriceOutBar) ? supPriceOutBar.time > demPriceOutBar.time ? X_DIRECTION_BEARISH : demPriceOutBar.time > supPriceOutBar.time ? X_DIRECTION_BULLISH : X_DIRECTION_NONE : (hasSupPriceOutBar && !hasDemPriceOutBar) ? X_DIRECTION_BEARISH : (!hasSupPriceOutBar && hasDemPriceOutBar) ? X_DIRECTION_BULLISH : X_DIRECTION_NONE; // result = HasDirection(dir); // // Clean Up Resources ... // demBox.Clean(); supBox.Clean(); supPriceOutBar.Clean(); demPriceOutBar.Clean(); // return result; } /** * Update all Collections Members To Time ... * * @param value: datetime, Specified To Time ... */ void UpdateTo(datetime value = NULL) { // value = NormalizeTime(value); // int count = 0; bool has = false; // has = HasSupplyZone(); if (has) { supplyZone.To(value); } // has = HasDemandZone(); if (has) { demandZone.To(value); } // has = HasWaitingBoxes(); if (has) { // count = CountWaitingBoxes(); for (int i = 0; i < count; i++) { waitingBoxes[i].to = value; } } // } /** * Check Working Zone is Destroyed or not ... * * @param barIndex: int, bar index ... * @param forPeriod: ENUM_TIMEFRAMES member ... * * @return ( bool ) */ bool IsDestroyed( int barIndex = 0, ENUM_TIMEFRAMES forPeriod = NULL // ) { // bool result = false; // if (barIndex < 0) { barIndex = 0; } // if (!IsValid(forPeriod)) { forPeriod = period; } // result = IsValid(); if (!result) { return result; } // XOHCL bar; result = bar.Init( symbol, period, barIndex // ); if (!result) { // bar.Clean(); return result; } // XOHCL cBar; result = bar.GetPreviousBar(cBar); if (!result) { // bar.Clean(); cBar.Clean(); // return result; } // bool isSupplyZoneBreaked = // bar.low > supplyZone.Upper() && cBar.low > supplyZone.Upper() // ; // bool isDemandZoneBreaked = // bar.high < demandZone.Lower() && cBar.high < demandZone.Lower() // ; // bar.Clean(); cBar.Clean(); // result = isSupplyZoneBreaked || isDemandZoneBreaked; // return result; } /** * Detect Signal Box Conditions ... * * @param box: XBoxZone instance reference, Signalled Box ... * @param holderBox: XBoxZone instance reference, Signalled Holder Box ... * @param dir: ENUM_X_DIRECTION member, Specified Signal Direction ... * @param signalProvider: ENUM_X121SMC_XWZ_PROVIDERS member, Specified Signal Type ... * @param provider: X121SMCStrategySignalProviderData instance reference ... * @param barIndex: int ... * * @return ( bool ) */ bool DetectSignalConditions( XBoxZone &box, XBoxZone &holderBox, ENUM_X_DIRECTION &dir, ENUM_X121SMC_XWZ_PROVIDERS &signalProvider, X121SMCStrategySignalProviderData &provider, int barIndex = 0 // ) { // bool result = false; // // Normalize Bars ... // box.Clean(); holderBox.Clean(); dir = X_DIRECTION_NONE; signalProvider = X121SMC_XWZ_PROVIDER_NONE; // if (barIndex < 0) { barIndex = 0; } // ENUM_X_DIRECTION trend; result = IsValid(); //&& // DetectOveralDirection(trend); if (!result) { return result; } // int idx = -1; int count = 0; bool has = false; // int zIDX = barIndex; int cIDX = zIDX + 1; int pIDX = cIDX + 1; // bool isBullish = false; bool isBearish = false; // X121SMCStrategyConditionParser cParser; // // Senario 1: // --------------------------------------------- // XPVHK Conditions ... // --------------------------------------------- bool useSenario1 = true; bool isSenario1Happend = false; bool isSenario1Bullish = false; bool isSenario1Bearish = false; if (useSenario1) { // isSenario1Happend = cParser.HasSenario1Conditions( X_CYCLE_DECISION, box, holderBox, dir, provider, X_CYCLE_ANALYSE, barIndex // ); // isSenario1Bullish = isSenario1Happend && IsBullish(dir); // isSenario1Bearish = isSenario1Happend && IsBearish(dir); // if (isSenario1Happend) { signalProvider = X121SMC_XWZ_PROVIDER_PVHK; } } // // Senario 2: // --------------------------------------------------- // Detect Signal Based On Breaked Rejection Boxes ... // --------------------------------------------------- bool useSenario2 = false; bool isSenario2Happend = false; bool isSenario2Bullish = false; bool isSenario2Bearish = false; if (useSenario2) { // // Senario 2 Working Based on // Breaked Boxes ... // Since we Works only // when Has UnAvailable Boxes ... has = HasBreakedBoxes(); if (has) { // isSenario2Happend = cParser.HasSenario2Conditions( X_CYCLE_DECISION, trend, breakedBoxes, box, dir, provider, barIndex // ); // isSenario2Bullish = isSenario2Happend && IsBullish(dir); // isSenario2Bearish = isSenario2Happend && IsBearish(dir); // if (isSenario2Happend) { signalProvider = X121SMC_XWZ_PROVIDER_ACTIVATED_BOX; } } } // // Senario 3: // --------------------------------------------- // --------------------------------------------- bool useSenario3 = false; bool isSenario3Happend = false; bool isSenario3Bullish = false; bool isSenario3Bearish = false; if (useSenario3) { } // // Senario 4: // --------------------------------------------- // Detect Signal Box Based On Conditions ... // --------------------------------------------- bool useSenario4 = false; bool isSenario4Happend = false; bool isSenario4Bullish = false; bool isSenario4Bearish = false; if (useSenario4) { // isSenario4Happend = cParser.HasSenario4Conditions( X_CYCLE_ANALYSE, box, holderBox, dir, provider, X_CYCLE_CONSOLIDATION, barIndex // ); // isSenario4Bullish = isSenario4Happend && IsBullish(dir); // isSenario4Bearish = isSenario4Happend && IsBearish(dir); // if (isSenario4Happend) { signalProvider = X121SMC_XWZ_PROVIDER_ACTIVATED_BOX; } } // // Senario 5: // --------------------------------------------- // --------------------------------------------- bool useSenario5 = false; bool isSenario5Happend = false; bool isSenario5Bullish = false; bool isSenario5Bearish = false; if (useSenario5) { } // // Summarize All Senario(s) Conditions ... // isBullish = // isSenario1Bullish || isSenario2Bullish || isSenario3Bullish || isSenario4Bullish // ; // isBearish = // isSenario1Bearish || isSenario2Bearish || isSenario3Bearish || isSenario4Bearish // ; // // Check All Conditions ... result = box.IsValid() && HasDirection(dir) && (isBullish || isBearish); // if (!result) { // box.Clean(); holderBox.Clean(); } // return result; } /** * Detect a Signal Priority forDynamic Risk Reward ratio ... * * @param priority: ENUM_X121SMC_XWZ_PRIORITY member, holds Specified position Priority ... * @param forDir: ENUM_X_DIRECTION member, Specified Position Direction for Priority ... * @param barIndex: int ... * @param forPeriod: ENUM_TIMEFRAMES member ... * * @return ( bool ) */ bool DetectPriority( ENUM_X121SMC_XWZ_PRIORITY &priority, ENUM_X_DIRECTION forDir, int barIndex = 0, ENUM_TIMEFRAMES forPeriod = NULL // ) { // bool result = false; // priority = X121SMC_XWZ_PRIORITY_NONE; // if (barIndex < 0) { barIndex = 0; } // if (!IsValid(forPeriod)) { forPeriod = period; } // result = IsValid() && HasDirection(forDir); if (!result) { return result; } // bool isBullish = IsBullish(forDir); // XOHCL bar; result = bar.Init( symbol, forPeriod, barIndex // ); if (!result) { // bar.Clean(); return result; } // if (bar.high < supplyZone.Upper() && bar.low > supplyZone.Lower()) { // priority = isBullish ? X121SMC_XWZ_PRIORITY_NONE : X121SMC_XWZ_PRIORITY_STRONG_HIGH; } else if (bar.high < supplyZone.Lower() && bar.low > quarter1) { // priority = isBullish ? X121SMC_XWZ_PRIORITY_WEAK : X121SMC_XWZ_PRIORITY_HIGH; } else if (bar.high < quarter1 && bar.low > quarter2) { // priority = isBullish ? X121SMC_XWZ_PRIORITY_LOW : X121SMC_XWZ_PRIORITY_REGULAR; } else if (bar.high < quarter2 && bar.low > quarter3) { // priority = isBullish ? X121SMC_XWZ_PRIORITY_REGULAR : X121SMC_XWZ_PRIORITY_LOW; } else if (bar.high < quarter3 && bar.low > demandZone.Upper()) { // priority = isBullish ? X121SMC_XWZ_PRIORITY_HIGH : X121SMC_XWZ_PRIORITY_WEAK; } else if (bar.high < demandZone.Upper() && bar.low > demandZone.Lower()) { // priority = isBullish ? X121SMC_XWZ_PRIORITY_STRONG_HIGH : X121SMC_XWZ_PRIORITY_NONE; } // result = priority != X121SMC_XWZ_PRIORITY_NONE && priority != X121SMC_XWZ_PRIORITY_WEAK; // bar.Clean(); // return result; } /** * Draw Working Zne and all of * it's Collections and Conditions ... * * @param drawSupplyZone: boolean ... * @param drawDemandZone: boolean ... * @param drawWaitingZones: boolean ... */ void Draw( XCPOIDrawer *drawer, bool drawSupplyZone = false, bool drawDemandZone = false, bool drawWaitingZones = false // ) { // if (drawer == NULL) { return; } // int count = 0; bool has = false; bool isCreated = false; // ulong chartID = drawer.ChartIdentification(); int subWindow = drawer.SubWindowIdentification(); color bullishColor = drawer.BarBullishColor(); color bearishColor = drawer.BarBearishColor(); // // Supply Zone ... if (drawSupplyZone) { // has = HasSupplyZone(); if (has) { // XCSupplyZoneObject *iObj; isCreated = drawer.CreateSupplyZone( supplyZone, iObj // ); // if (isCreated) { mWorkingZoneObjects.Add(iObj); } } } // // Demand Zone ... if (drawDemandZone) { // has = HasDemandZone(); if (has) { // XCDemandZoneObject *iObj; isCreated = drawer.CreateDemandZone( demandZone, iObj // ); // if (isCreated) { mWorkingZoneObjects.Add(iObj); } } } // // // // // Quarters ... has = IsValid(); if (has) { // double zoneUpper = supplyZone.Upper(); double upper = supplyZone.Lower(); // double lower = demandZone.Upper(); double zoneLower = demandZone.Lower(); // string prefix = "X121WZone_" + symbol + "_" + ToString(period); // // Zone Upper ... CChartObjectHLine *zoneUpperLine; zoneUpperLine = new CChartObjectHLine(); isCreated = zoneUpperLine.Create( chartID, prefix + "_ZoneTop", subWindow, zoneUpper // ); if (isCreated) { // zoneUpperLine.Color(clrRed); // mWorkingZoneObjects.Add(zoneUpperLine); } // // Zone Lower ... CChartObjectHLine *zoneLowerLine; zoneLowerLine = new CChartObjectHLine(); isCreated = zoneLowerLine.Create( chartID, prefix + "_ZoneDown", subWindow, zoneLower // ); if (isCreated) { // zoneLowerLine.Color(clrRed); // mWorkingZoneObjects.Add(zoneLowerLine); } // // Upper ... CChartObjectHLine *upperLine; upperLine = new CChartObjectHLine(); isCreated = upperLine.Create( chartID, prefix + "_Upper", subWindow, upper // ); if (isCreated) { // upperLine.Color(clrLime); // mWorkingZoneObjects.Add(upperLine); } // // Lower ... CChartObjectHLine *lowerLine; lowerLine = new CChartObjectHLine(); isCreated = lowerLine.Create( chartID, prefix + "_Lower", subWindow, lower // ); if (isCreated) { // lowerLine.Color(clrLime); // mWorkingZoneObjects.Add(lowerLine); } // // Quarters ... // // Quarter 1 ... CChartObjectHLine *q1Line; q1Line = new CChartObjectHLine(); isCreated = q1Line.Create( chartID, prefix + "_Q1", subWindow, quarter1 // ); if (isCreated) { // q1Line.Color(clrYellow); // mWorkingZoneObjects.Add(q1Line); } // // Quarter 2 ... CChartObjectHLine *q2Line; q2Line = new CChartObjectHLine(); isCreated = q2Line.Create( chartID, prefix + "_Q2", subWindow, quarter2 // ); if (isCreated) { // q2Line.Color(clrYellow); // mWorkingZoneObjects.Add(q2Line); } // // Quarter 3 ... CChartObjectHLine *q3Line; q3Line = new CChartObjectHLine(); isCreated = q3Line.Create( chartID, prefix + "_Q3", subWindow, quarter3 // ); if (isCreated) { // q3Line.Color(clrYellow); // mWorkingZoneObjects.Add(q3Line); } } // // Waiting Zones ... if (drawWaitingZones) { // has = HasWaitingBoxes(); if (has) { // count = CountWaitingBoxes(); for (int i = 0; i < count; i++) { // XCBoxObject *iBoxObj; has = drawer.DrawBox( waitingBoxes[i], iBoxObj // ); if (has) { mDrawnObjects.Add(iBoxObj); } // ZeroMemory(iBoxObj); } } } // } // }; // // XWZ Signal Conditions ... struct X121SMCStrategyXWZSignalConditions { // // Props ... // string symbol; ENUM_TIMEFRAMES period; // double sl; double reward; double amountPercent; ENUM_X_DIRECTION dir; ENUM_X_POSITION_TYPES type; // // Setup Props ... // datetime setupTime; datetime triggerTime; // double pivot; double point; double sls[]; double targets[]; // XBoxZone signalBox; // ENUM_X121SMC_XWZ_PRIORITY priority; ENUM_X121SMC_XWZ_PROVIDERS provider; // // Constructor ... X121SMCStrategyXWZSignalConditions() { Clean(); } // // Tools ... /** * Cleaning Up ... */ void Clean() { // sl = 0; // dir = X_DIRECTION_NONE; type = X_POSITION_TYPE_NONE; // symbol = NULL; period = NULL; setupTime = NULL; triggerTime = NULL; // ExtensionClean(); // ZeroMemory(this); } /** * 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; } // // Extensions ... /** * Clean Additional Properties ... */ void ExtensionClean() { // pivot = 0; point = 0; // reward = 0; amountPercent = 0; // Clean(sls); Clean(targets); signalBox.Clean(); // provider = X121SMC_XWZ_PROVIDER_NONE; } // // // // void UpdateTo(datetime value = NULL) { // value = NormalizeTime(value); // int count = 0; bool has = false; } // }; // // Extension Functions ... //