Files
xMQL5/BKPS/14031206/Documents/BKP/xsupdem/x-121.smc.xsupdemobs.signal.class.mq5
T
2025-02-24 19:20:10 +03:30

3699 lines
101 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 X121 SMC Signal Class
// -------------------------------------------------
// Name: XSupDemOBS
// 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 "../Classes/x-121.smc.market.cycle.helper.class.mq5"
#include "../Libraries/x-121.smc.guard.lib.mq5"
#include "../Libraries/x-121.smc.lib.mq5"
#include "./x-121.smc.xsupdemobs.signal.lib.mq5"
//
// Definition ...
class XCX121SMCXSupDemOBSSignalDetector : public XCBase
{
//
public:
//
// Props ...
X121SMCStrategyXSupDemOBSSignalConditions mConditions;
X121SMCStrategyXSupDemOBSSignalConditions mConditionsCollection[];
//
// Constructor(s) ...
XCX121SMCXSupDemOBSSignalDetector()
{
Init();
}
//
// Deconstructor ...
~XCX121SMCXSupDemOBSSignalDetector()
{
DeInit();
}
//
//
//
//
// Detect Setup Conditions ...
bool DetectSignalSetup(
//
string _symbol,
ENUM_TIMEFRAMES _period,
//
XC121SMCCycleHelper *decisionCycleHelper,
XC121SMCCycleHelper *analyseCycleHelper,
XC121SMCCycleHelper *consolidationCycleHelper,
XC121SMCCycleHelper *visionCycleHelper
//
)
{
//
bool result = false;
//
// Validate Cycle Helpers ...
result =
//
visionCycleHelper != NULL &&
analyseCycleHelper != NULL &&
decisionCycleHelper != NULL &&
consolidationCycleHelper != NULL
//
;
if (!result)
{
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;
//
string symbol = _symbol;
ENUM_TIMEFRAMES period = _period;
//
mConditions.symbol = symbol;
mConditions.period = period;
//
double ask = GetAsk(symbol);
double bid = GetBid(symbol);
datetime cTime = TimeCurrent();
double points = GetPoints(symbol);
//
double target = 0;
//
// Cycles Conditions ...
//
// Decision ...
ENUM_XPOI_EVENTS decisionPoiEvents[];
ENUM_X_CYCLE_EVENTS decisionCycleEvents[];
X121SMCCycleConditions decisionConditions;
result = decisionCycleHelper.GetConditions(
decisionCycleEvents,
decisionPoiEvents,
decisionConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Analyse ...
ENUM_XPOI_EVENTS analysePoiEvents[];
ENUM_X_CYCLE_EVENTS analyseCycleEvents[];
X121SMCCycleConditions analyseConditions;
result = analyseCycleHelper.GetConditions(
analyseCycleEvents,
analysePoiEvents,
analyseConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Consolidation ...
ENUM_XPOI_EVENTS consolidationPoiEvents[];
ENUM_X_CYCLE_EVENTS consolidationCycleEvents[];
X121SMCCycleConditions consolidationConditions;
result = consolidationCycleHelper.GetConditions(
consolidationCycleEvents,
consolidationPoiEvents,
consolidationConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Vision ...
ENUM_XPOI_EVENTS visionPoiEvents[];
ENUM_X_CYCLE_EVENTS visionCycleEvents[];
X121SMCCycleConditions visionConditions;
result = visionCycleHelper.GetConditions(
visionCycleEvents,
visionPoiEvents,
visionConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Cycles POI States ...
XPOIState decisionState = decisionConditions.state;
XPOIState analyseState = analyseConditions.state;
XPOIState consolidationState = consolidationConditions.state;
XPOIState visionState = visionConditions.state;
//
// Cycle X121Conditions ...
X121Conditions decisionXConditions = decisionConditions.x121Conditions;
X121Conditions analyseXConditions = analyseConditions.x121Conditions;
X121Conditions consolidationXConditions = consolidationConditions.x121Conditions;
X121Conditions visionXConditions = visionConditions.x121Conditions;
//
// Setup Conditions ...
//
XOHCL decisionZBar;
XOHCL decisionCBar;
XOHCL decisionPBar;
double decisionCBarBullishZoneChechValue = 0;
double decisionCBarBearishZoneChechValue = 0;
//
result = decisionZBar.Init(
decisionState.symbol,
decisionState.period,
0 //
);
if (!result)
{
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(decisionPoiEvents);
Clean(visionCycleEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionZBar.Clean();
decisionCBar.Clean();
decisionPBar.Clean();
decisionState.Clean();
visionConditions.Clean();
analyseConditions.Clean();
visionXConditions.Clean();
consolidationState.Clean();
decisionConditions.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
return result;
}
//
result = decisionZBar
.GetPreviousBar(decisionCBar);
if (!result)
{
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(decisionPoiEvents);
Clean(visionCycleEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionZBar.Clean();
decisionCBar.Clean();
decisionPBar.Clean();
decisionState.Clean();
visionConditions.Clean();
analyseConditions.Clean();
visionXConditions.Clean();
consolidationState.Clean();
decisionConditions.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
return result;
}
//
result = decisionCBar
.GetPreviousBar(decisionPBar);
if (!result)
{
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(decisionPoiEvents);
Clean(visionCycleEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionZBar.Clean();
decisionCBar.Clean();
decisionPBar.Clean();
decisionState.Clean();
visionConditions.Clean();
analyseConditions.Clean();
visionXConditions.Clean();
consolidationState.Clean();
decisionConditions.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
return result;
}
//
decisionCBarBullishZoneChechValue = decisionCBar
.GetZoneCheckValue(X_DIRECTION_BULLISH);
decisionCBarBearishZoneChechValue = decisionCBar
.GetZoneCheckValue(X_DIRECTION_BEARISH);
//
mConditions.UpdateTo();
//
// 1- Detect Valid Working Area ...
//
bool hasVisionHighestSupplyZone = mConditions.HasVisionHighestSupplyZone();
bool hasConsolidationHighestSupplyZone = mConditions.HasConsolidationHighestSupplyZone();
//
bool hasVisionLowestDemandZone = mConditions.HasVisionLowestDemandZone();
bool hasConsolidationLowestDemandZone = mConditions.HasConsolidationLowestDemandZone();
//
bool hasWorkingZone = mConditions.workingZone.IsValid();
//
bool isDestroyed = false;
ENUM_X_DIRECTION destroyedDir;
//
XOHCL trendStartBar;
ENUM_X_DIRECTION trendDir;
bool hasTrend = false;
bool hasBullishTrend = false;
bool hasBearishTrend = false;
//
if (!hasVisionHighestSupplyZone)
{
//
int hasZones = visionState.HasSupplyZones();
int zonesCount = visionState.HasSupplyZones();
//
if (hasZones)
{
//
int idx = GetHighest(visionState.supplyZones);
hasVisionHighestSupplyZone = IsValidIndex(idx);
if (hasVisionHighestSupplyZone)
{
//
// Validate Zone ...
XCSupplyZone *zone = visionState.supplyZones[idx];
bool isBelow = IsBelow(
decisionCBarBearishZoneChechValue,
zone //
);
if (isBelow)
{
mConditions.visionHighestSupplyZone = zone;
}
}
}
//
hasVisionHighestSupplyZone = mConditions.HasVisionHighestSupplyZone();
}
//
if (!hasVisionLowestDemandZone)
{
//
int hasZones = visionState.HasDemandZones();
int zonesCount = visionState.HasDemandZones();
//
if (hasZones)
{
//
int idx = GetLowest(visionState.demandZones);
hasVisionLowestDemandZone = IsValidIndex(idx);
if (hasVisionLowestDemandZone)
{
//
// Validate Zone ...
XCDemandZone *zone = visionState.demandZones[idx];
bool isAbove = IsAbove(
decisionCBarBullishZoneChechValue,
zone //
);
if (isAbove)
{
mConditions.visionLowestDemandZone = zone;
}
}
}
//
hasVisionLowestDemandZone = mConditions.HasVisionLowestDemandZone();
}
//
if (!hasConsolidationHighestSupplyZone)
{
//
int hasZones = consolidationState.HasSupplyZones();
int zonesCount = consolidationState.HasSupplyZones();
//
if (hasZones)
{
//
int idx = GetHighest(consolidationState.supplyZones);
hasConsolidationHighestSupplyZone = IsValidIndex(idx);
if (hasConsolidationHighestSupplyZone)
{
//
// Validate Zone ...
XCSupplyZone *zone = consolidationState.supplyZones[idx];
bool isBelow = IsBelow(
decisionCBarBearishZoneChechValue,
zone //
);
if (isBelow)
{
//
if (mConditions.workingZone.IsValid())
{
//
RemoveDraws();
result = false;
mConditions.Clean();
RemoveWorkingZoneDraws();
//
return result;
}
//
mConditions.consolidationHighestSupplyZone = zone;
}
}
}
//
hasConsolidationHighestSupplyZone = mConditions.HasConsolidationHighestSupplyZone();
}
//
if (!hasConsolidationLowestDemandZone)
{
//
int hasZones = consolidationState.HasDemandZones();
int zonesCount = consolidationState.HasDemandZones();
//
if (hasZones)
{
//
int idx = GetLowest(consolidationState.demandZones);
hasConsolidationLowestDemandZone = IsValidIndex(idx);
if (hasConsolidationLowestDemandZone)
{
//
// Validate Zone ...
XCDemandZone *zone = consolidationState.demandZones[idx];
bool isAbove = IsAbove(
decisionCBarBullishZoneChechValue,
zone //
);
if (isAbove)
{
//
if (mConditions.workingZone.IsValid())
{
//
RemoveDraws();
result = false;
mConditions.Clean();
RemoveWorkingZoneDraws();
//
return result;
}
//
mConditions.consolidationLowestDemandZone = zone;
}
}
}
//
hasConsolidationLowestDemandZone = mConditions.HasConsolidationLowestDemandZone();
}
//
// 2- Detect Working Zone ...
if (!hasWorkingZone)
{
hasWorkingZone = mConditions.ExtractWorkingZone();
}
//
// Here we Can Detect Price Inside SupDem Zones ...
//
bool isPriceInsideSupplyZone = false;
bool isPriceInsideDemandZone = false;
bool isPriceInsideVisionSupplyZone = false;
bool isPriceInsideVisionDemandZone = false;
bool isPriceInsideConsolidationSupplyZone = false;
bool isPriceInsideConsolidationDemandZone = false;
if (hasVisionLowestDemandZone)
{
//
double iUpper = mConditions.visionLowestDemandZone.Upper();
double iLower = mConditions.visionLowestDemandZone.Lower();
//
isPriceInsideVisionDemandZone =
//
decisionZBar.high < iUpper &&
decisionCBar.high < iUpper &&
//
decisionZBar.low > iLower &&
decisionCBar.low > iLower
//
;
}
if (hasVisionHighestSupplyZone)
{
//
double iUpper = mConditions.visionHighestSupplyZone.Upper();
double iLower = mConditions.visionHighestSupplyZone.Lower();
//
isPriceInsideVisionSupplyZone =
//
decisionZBar.high < iUpper &&
decisionCBar.high < iUpper &&
//
decisionZBar.low > iLower &&
decisionCBar.low > iLower
//
;
}
if (hasConsolidationLowestDemandZone)
{
//
double iUpper = mConditions.consolidationLowestDemandZone.Upper();
double iLower = mConditions.consolidationLowestDemandZone.Lower();
//
isPriceInsideConsolidationDemandZone =
//
decisionZBar.high < iUpper &&
decisionCBar.high < iUpper &&
//
decisionZBar.low > iLower &&
decisionCBar.low > iLower
//
;
}
if (hasConsolidationHighestSupplyZone)
{
//
double iUpper = mConditions.consolidationHighestSupplyZone.Upper();
double iLower = mConditions.consolidationHighestSupplyZone.Lower();
//
isPriceInsideConsolidationSupplyZone =
//
decisionZBar.high < iUpper &&
decisionCBar.high < iUpper &&
//
decisionZBar.low > iLower &&
decisionCBar.low > iLower
//
;
}
//
isPriceInsideSupplyZone = isPriceInsideVisionSupplyZone ||
isPriceInsideConsolidationSupplyZone;
if (isPriceInsideSupplyZone)
{
//
if (isPriceInsideVisionSupplyZone)
{
mConditions.insideSupplyZone = mConditions.visionHighestSupplyZone;
}
else if (isPriceInsideConsolidationSupplyZone)
{
mConditions.insideSupplyZone = mConditions.consolidationHighestSupplyZone;
}
}
//
isPriceInsideDemandZone = isPriceInsideVisionDemandZone ||
isPriceInsideConsolidationDemandZone;
if (isPriceInsideDemandZone)
{
//
if (isPriceInsideVisionDemandZone)
{
mConditions.insideDemandZone = mConditions.visionLowestDemandZone;
}
else if (isPriceInsideConsolidationDemandZone)
{
mConditions.insideDemandZone = mConditions.consolidationLowestDemandZone;
}
}
//
// Check Working Zone Destroy ...
isDestroyed = mConditions.IsWorkingZoneDestroyed(
destroyedDir, // Direction ...
0, // Bar Index ...
decisionState.period // Period ...
);
if (isDestroyed)
{
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(decisionPoiEvents);
Clean(visionCycleEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionZBar.Clean();
decisionCBar.Clean();
decisionPBar.Clean();
decisionState.Clean();
visionConditions.Clean();
analyseConditions.Clean();
visionXConditions.Clean();
consolidationState.Clean();
decisionConditions.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
result = false;
mConditions.Clean();
RemoveDraws();
RemoveWorkingZoneDraws();
//
return result;
}
//
// 2- Detect Market Trend Based On Nearest Zone Hunting ...
hasTrend = mConditions.DetectOveralTrend(
trendStartBar,
trendDir,
0 //
);
hasBullishTrend = IsBullish(trendDir);
hasBearishTrend = IsBearish(trendDir);
//
result = hasTrend;
if (!result)
{
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(decisionPoiEvents);
Clean(visionCycleEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionZBar.Clean();
decisionCBar.Clean();
decisionPBar.Clean();
decisionState.Clean();
visionConditions.Clean();
analyseConditions.Clean();
visionXConditions.Clean();
consolidationState.Clean();
decisionConditions.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
RemoveDraws();
RemoveWorkingZoneDraws();
//
return result;
}
//
// 3- Checking Price Inside Valid Quarters Based on Trend ...
//
// in Bullish Trend:
// -----------------------------
// - if Price Under Lower: HIGH;
// - if Price Under Quarter 3 and Above Lower: REGULAR;
// - if Price Under Quarter 2 and Above Quarter 3: LOW;
// - if Price Above Quarter 2: NONE;
//
// in Bearish Trend:
// -----------------------------
// - if Price Above Upper: HIGH;
// - if Price Above Quarter 1 and Below Upper: REGULAR;
// - if Price Above Quarter 2 and Below Quarter 1: LOW;
// - if Price Below Quarter 2: NONE;
//
ENUM_X121SMC_XSUPDEMOBS_PRIORITY bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE;
ENUM_X121SMC_XSUPDEMOBS_PRIORITY bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE;
//
bool isInQuarter0 = CheckPriceInside(
decisionZBar,
decisionCBar,
mConditions.workingZone.zoneUpper,
mConditions.workingZone.upper //
);
bool isInQuarter1 = CheckPriceInside(
decisionZBar,
decisionCBar,
mConditions.workingZone.upper,
mConditions.workingZone.quarter1 //
);
bool isInQuarter2 = CheckPriceInside(
decisionZBar,
decisionCBar,
mConditions.workingZone.quarter1,
mConditions.workingZone.quarter2 //
);
bool isInQuarter3 = CheckPriceInside(
decisionZBar,
decisionCBar,
mConditions.workingZone.quarter2,
mConditions.workingZone.quarter3 //
);
bool isInQuarter4 = CheckPriceInside(
decisionZBar,
decisionCBar,
mConditions.workingZone.quarter3,
mConditions.workingZone.lower //
);
bool isInQuarter5 = CheckPriceInside(
decisionZBar,
decisionCBar,
mConditions.workingZone.lower,
mConditions.workingZone.zoneLower //
);
//
if (isInQuarter0)
{
//
bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE;
bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_HIGH;
}
else if (isInQuarter1)
{
//
bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE;
bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_REGULAR;
}
else if (isInQuarter2)
{
//
bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_WEAK;
bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_LOW;
}
else if (isInQuarter3)
{
//
bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_LOW;
bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_WEAK;
}
else if (isInQuarter4)
{
//
bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_REGULAR;
bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE;
}
else if (isInQuarter5)
{
//
bullishPriority = X121SMC_XSUPDEMOBS_PRIORITY_HIGH;
bearishPriority = X121SMC_XSUPDEMOBS_PRIORITY_NONE;
}
//
bool lookingForLong = bullishPriority != X121SMC_XSUPDEMOBS_PRIORITY_NONE;
bool lookingForShort = bearishPriority != X121SMC_XSUPDEMOBS_PRIORITY_NONE;
//
result = lookingForLong ||
lookingForShort;
if (!result)
{
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(visionCycleEvents);
Clean(decisionPoiEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionZBar.Clean();
decisionCBar.Clean();
decisionPBar.Clean();
decisionState.Clean();
visionConditions.Clean();
analyseConditions.Clean();
visionXConditions.Clean();
consolidationState.Clean();
decisionConditions.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
RemoveDraws();
RemoveWorkingZoneDraws();
//
return result;
}
//
// Detect Order Blocks in Direction of Trend ...
XCOrderBlock *obs[];
Copy(
consolidationState.bullishOrderBlocks,
obs //
);
Copy(
consolidationState.bearishOrderBlocks,
obs //
);
//
// Validate OB FVG ...
XCFVG *fvgs[];
Copy(
analyseState.bullishFairValueGaps,
fvgs //
);
Copy(
analyseState.bearishFairValueGaps,
fvgs //
);
//
int obsCount = ArraySize(obs);
bool hasOBs = IsValidSize(obsCount);
//
int fvgsCount = ArraySize(fvgs);
bool hasFVGs = IsValidSize(fvgsCount);
//
bool hasOBFVGs = mConditions.HasOBFVGs();
int obFVGsCount = mConditions.CountOBFVGs();
//
if (hasOBs &&
hasFVGs &&
!hasOBFVGs)
{
//
for (int i = 0; i < obsCount; i++)
{
//
XCOrderBlock *iOB = obs[i];
//
// Check Ob Index inside OB FVGS ...
bool isOBFVGExists = false;
hasOBFVGs = mConditions.HasOBFVGs();
obFVGsCount = mConditions.CountOBFVGs();
if (hasOBFVGs)
{
//
for (int j = 0; j < obFVGsCount; j++)
{
//
bool isSame = IsSame(
mConditions.obFVGs[j].ob,
iOB //
);
//
if (isSame)
{
//
isOBFVGExists = true;
break;
}
}
}
if (isOBFVGExists)
{
continue;
}
//
for (int j = 0; j < fvgsCount; j++)
{
//
XCFVG *jFVG = fvgs[j];
//
ENUM_TIMEFRAMES jPeriod = jFVG.GetPeriod();
if (jPeriod != PERIOD_M15)
{
Print(ToString(jPeriod));
}
//
XOBFVG iOBFVG;
//
iOBFVG.time = cTime;
iOBFVG.symbol = iOB.GetSymbol();
iOBFVG.period = iOB.GetPeriod();
//
iOBFVG.ob = iOB;
iOBFVG.fvg = jFVG;
//
bool isValidOBFVG = iOBFVG.IsValid();
if (isValidOBFVG)
{
//
AddRef(
iOBFVG,
mConditions.obFVGs //
);
//
iOBFVG.Clean();
//
break;
}
//
iOBFVG.Clean();
}
}
//
hasOBFVGs = mConditions.HasOBFVGs();
obFVGsCount = mConditions.CountOBFVGs();
}
//
// Now We Have to Check OBFVGs ...
result = hasOBFVGs;
if (!result)
{
//
Clean(obs);
Clean(fvgs);
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(decisionPoiEvents);
Clean(visionCycleEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionZBar.Clean();
decisionCBar.Clean();
decisionPBar.Clean();
decisionState.Clean();
visionConditions.Clean();
analyseConditions.Clean();
visionXConditions.Clean();
consolidationState.Clean();
decisionConditions.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
RemoveDraws();
RemoveWorkingZoneDraws();
//
return result;
}
//
// Detect Un Activated POI(s) ...
// including:
// - Order Blocks;
// - Fair Value Gaps;
//
bool hasUnActivatedOBs = false;
bool hasUnActivatedFVGs = false;
for (int i = 0; i < obFVGsCount; i++)
{
//
bool iHasUnActivatedOBs = mConditions.obFVGs[i].HasUnActivatedOBs();
bool iHasUnActivatedFVGs = mConditions.obFVGs[i].HasUnActivatedFVGs();
//
if (hasOBs)
{
//
for (int j = 0; j < obsCount; j++)
{
mConditions.obFVGs[i].AddUnActivatedOB(
obs[j],
decisionZBar //
);
}
//
iHasUnActivatedOBs = mConditions.obFVGs[i].HasUnActivatedOBs();
}
//
if (hasFVGs)
{
//
for (int j = 0; j < fvgsCount; j++)
{
mConditions.obFVGs[i].AddUnActivatedFVG(
fvgs[j],
decisionZBar //
);
}
//
iHasUnActivatedFVGs = mConditions.obFVGs[i].HasUnActivatedFVGs();
}
//
if (iHasUnActivatedOBs &&
!hasUnActivatedOBs)
{
hasUnActivatedOBs = iHasUnActivatedOBs;
}
//
if (iHasUnActivatedFVGs &&
!hasUnActivatedFVGs)
{
hasUnActivatedFVGs = iHasUnActivatedFVGs;
}
}
//
result =
(isPriceInsideSupplyZone ||
isPriceInsideDemandZone)
? true
: (hasUnActivatedOBs ||
hasUnActivatedFVGs);
if (!result)
{
//
Clean(obs);
Clean(fvgs);
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(visionCycleEvents);
Clean(decisionPoiEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionZBar.Clean();
decisionCBar.Clean();
decisionPBar.Clean();
decisionState.Clean();
visionConditions.Clean();
analyseConditions.Clean();
visionXConditions.Clean();
consolidationState.Clean();
decisionConditions.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
RemoveDraws();
RemoveWorkingZoneDraws();
//
return result;
}
//
// Now We Have to Wait for Price Inside Box ...
//
XOHCL swingBar;
XOHCL rejectBar;
XOHCL breakerBar;
XOHCL momentumBar;
bool isPriceRejected = false;
XCFVG *insideFVG = mConditions.insideFVG;
XCFVG *rejectedFVG = mConditions.rejectedFVG;
XCOrderBlock *insideOB = mConditions.insideOB;
XCOrderBlock *rejectedOB = mConditions.rejectedOB;
XCSupplyZone *insideSupplyZone = mConditions.insideSupplyZone;
XCDemandZone *insideDemandZone = mConditions.insideDemandZone;
//
bool hasInsideOB = insideOB != NULL &&
insideOB.IsValid();
bool hasInsideFVG = insideFVG != NULL &&
insideFVG.IsValid();
bool hasInsideZone = hasInsideOB ||
hasInsideFVG;
bool hasRejectedOB = rejectedOB != NULL &&
rejectedOB.IsValid();
bool hasRejectedFVG = rejectedFVG != NULL &&
rejectedFVG.IsValid();
bool hasRejectedZone = hasRejectedOB ||
hasRejectedFVG;
bool hasInsideSupplyZone = insideSupplyZone != NULL &&
insideSupplyZone.IsValid();
bool hasInsideDemandZone = insideDemandZone != NULL &&
insideDemandZone.IsValid();
bool hasInsideSupDemZone = hasInsideSupplyZone ||
hasInsideDemandZone;
if (!hasInsideZone)
{
//
for (int i = 0; i < obFVGsCount; i++)
{
//
bool iOBFVGHasUnActivatedOBs = mConditions.obFVGs[i].HasUnActivatedOBs();
int iOBFVGUnActivatedOBsCount = mConditions.obFVGs[i].CountUnActivatedOBs();
//
bool iOBFVGHasUnActivatedFVGs = mConditions.obFVGs[i].HasUnActivatedFVGs();
int iOBFVGUnActivatedFVGsCount = mConditions.obFVGs[i].CountUnActivatedFVGs();
//
// Detect Inside Zones ...
//
if (!hasInsideOB &&
iOBFVGHasUnActivatedOBs)
{
//
int idx = -1;
for (int j = 0; j < iOBFVGUnActivatedOBsCount; j++)
{
//
ENUM_X_DIRECTION iForDir = mConditions.obFVGs[i].unActivatedOBs[j].GetDirection();
bool isIBullish = IsBullish(iForDir);
//
bool isInsideFromUpper = IsInside(
decisionZBar.low,
mConditions.obFVGs[i].unActivatedOBs[j] //
);
bool isInsideFromLower = IsInside(
decisionZBar.high,
mConditions.obFVGs[i].unActivatedOBs[j] //
);
//
bool isInside =
isBullish
? isInsideFromUpper
: isInsideFromLower;
if (isInside)
{
//
idx = j;
insideOB = mConditions.obFVGs[i].unActivatedOBs[j];
mConditions.insideOB = insideOB;
break;
}
}
//
if (IsValidIndex(idx))
{
//
ArrayRemove(
mConditions.obFVGs[i].unActivatedOBs,
idx,
1 //
);
}
}
//
if (insideOB == NULL &&
!hasInsideFVG &&
iOBFVGHasUnActivatedFVGs)
{
//
int idx = -1;
for (int j = 0; j < iOBFVGUnActivatedFVGsCount; j++)
{
//
ENUM_X_DIRECTION iForDir = mConditions.obFVGs[i].unActivatedFVGs[j].GetDirection();
bool isIBullish = IsBullish(iForDir);
//
bool isInsideFromUpper = IsInside(
decisionZBar.low,
mConditions.obFVGs[i].unActivatedFVGs[j] //
);
bool isInsideFromLower = IsInside(
decisionZBar.high,
mConditions.obFVGs[i].unActivatedFVGs[j] //
);
//
bool isInside =
isBullish
? isInsideFromUpper
: isInsideFromLower;
if (isInside)
{
//
idx = j;
insideFVG = mConditions.obFVGs[i].unActivatedFVGs[j];
mConditions.insideFVG = insideFVG;
break;
}
}
//
if (IsValidIndex(idx))
{
//
ArrayRemove(
mConditions.obFVGs[i].unActivatedFVGs,
idx,
1 //
);
}
}
}
//
hasInsideOB = insideOB != NULL &&
insideOB.IsValid();
hasInsideFVG = insideFVG != NULL &&
insideFVG.IsValid();
hasInsideZone = hasInsideOB ||
hasInsideFVG;
//
// Here Detect Inside or Rejected Zones inside Supply and Demand Zones ...
// For Using them for Positions ...
if (!hasInsideZone &&
hasInsideSupDemZone)
{
//
ENUM_X_DIRECTION forDir =
hasInsideSupplyZone
? X_DIRECTION_BEARISH
: X_DIRECTION_BULLISH;
//
bool isLookingForBullish = IsBullish(forDir);
//
XCFVG *fvgs[];
XCOrderBlock *obs[];
int obsCount = 0;
int fvgsCount = 0;
bool hasOBs = false;
bool hasFVGs = false;
//
if (isLookingForBullish)
{
//
Copy(
analyseState.bullishOrderBlocks,
obs //
);
FilterZones(
insideDemandZone,
obs,
true, // Filter Direction ...
true, // Filter From ...
true, // Filter Price ...
true, // Ignore Out of Box ...
true, // Apply Sort ...
true // Ignore Inside ...
);
//
Copy(
analyseState.bullishFairValueGaps,
fvgs //
);
FilterZones(
insideDemandZone,
fvgs,
true, // Filter Direction ...
true, // Filter From ...
true, // Filter Price ...
true, // Ignore Out of Box ...
true, // Apply Sort ...
true // Ignore Inside ...
);
}
else
{
//
Copy(
analyseState.bearishOrderBlocks,
obs //
);
FilterZones(
insideSupplyZone,
obs,
true, // Filter Direction ...
true, // Filter From ...
true, // Filter Price ...
false, // Ignore Out of Box ...
true, // Apply Sort ...
true // Ignore Inside ...
);
//
Copy(
analyseState.bearishFairValueGaps,
fvgs //
);
FilterZones(
insideSupplyZone,
fvgs,
true, // Filter Direction ...
true, // Filter From ...
true, // Filter Price ...
false, // Ignore Out of Box ...
true, // Apply Sort ...
true // Ignore Inside ...
);
}
//
obsCount = ArraySize(obs);
fvgsCount = ArraySize(fvgs);
//
hasOBs = IsValidSize(obsCount);
hasFVGs = IsValidSize(fvgsCount);
//
if (hasOBs ||
hasFVGs)
{
//
if (hasOBs)
{
//
for (int i = 0; i < obsCount; i++)
{
//
ENUM_X_DIRECTION iForDir = obs[i].GetDirection();
bool isIBullish = IsBullish(iForDir);
//
isPriceRejected = false;
// IsReject(
// iForDir,
// decisionZBar,
// obs[i],
// decisionState,
// swingBar,
// rejectBar,
// breakerBar,
// momentumBar,
// false //
// );
if (isPriceRejected)
{
//
rejectedOB = obs[i];
mConditions.rejectedOB = rejectedOB;
}
//
bool isInsideFromUpper = IsInside(
decisionZBar.low,
obs[i] //
);
bool isInsideFromLower = IsInside(
decisionZBar.high,
obs[i] //
);
//
bool isInside =
isBullish
? isInsideFromUpper
: isInsideFromLower;
if (isInside)
{
//
insideOB = obs[i];
mConditions.insideOB = obs[i];
break;
}
}
}
//
hasInsideOB = insideOB != NULL &&
insideOB.IsValid();
//
hasRejectedOB = rejectedOB != NULL &&
rejectedOB.IsValid();
//
if (hasFVGs &&
!hasInsideOB &&
!hasRejectedOB)
{
//
for (int i = 0; i < fvgsCount; i++)
{
//
ENUM_X_DIRECTION iForDir = fvgs[i].GetDirection();
bool isIBullish = IsBullish(iForDir);
//
isPriceRejected = false;
// IsReject(
// iForDir,
// decisionZBar,
// fvgs[i],
// decisionState,
// swingBar,
// rejectBar,
// breakerBar,
// momentumBar,
// false //
// );
if (isPriceRejected)
{
//
rejectedFVG = fvgs[i];
mConditions.rejectedFVG = rejectedFVG;
}
//
bool isInsideFromUpper = IsInside(
decisionZBar.low,
fvgs[i] //
);
bool isInsideFromLower = IsInside(
decisionZBar.high,
fvgs[i] //
);
//
bool isInside =
isBullish
? isInsideFromUpper
: isInsideFromLower;
if (isInside)
{
//
insideFVG = fvgs[i];
mConditions.insideFVG = fvgs[i];
break;
}
}
}
}
//
Clean(obs);
Clean(fvgs);
}
//
mConditions.UpdateTo(cTime);
//
hasInsideOB = insideOB != NULL &&
insideOB.IsValid();
hasInsideFVG = insideFVG != NULL &&
insideFVG.IsValid();
hasInsideZone = hasInsideOB ||
hasInsideFVG;
//
hasRejectedOB = rejectedOB != NULL &&
rejectedOB.IsValid();
hasRejectedFVG = rejectedFVG != NULL &&
rejectedFVG.IsValid();
hasRejectedZone = hasRejectedOB ||
hasRejectedFVG;
//
if (hasInsideSupDemZone &&
(hasInsideZone ||
hasRejectedZone))
{
//
RemoveDraws();
RemoveWorkingZoneDraws();
//
// Set Target Based On Supply or Demand Zone ...
//
// Supply Zone ...
if (isPriceInsideSupplyZone)
{
target = mConditions.workingZone.quarter1;
}
//
// Demand Zone ...
if (isPriceInsideDemandZone)
{
target = mConditions.workingZone.quarter3;
}
}
}
//
result = hasInsideZone ||
hasRejectedZone;
if (!result)
{
//
decisionZBar.Clean();
decisionCBar.Clean();
decisionPBar.Clean();
//
swingBar.Clean();
rejectBar.Clean();
breakerBar.Clean();
momentumBar.Clean();
//
Clean(obs);
Clean(fvgs);
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(visionCycleEvents);
Clean(decisionPoiEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionState.Clean();
visionConditions.Clean();
analyseConditions.Clean();
visionXConditions.Clean();
consolidationState.Clean();
decisionConditions.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
ZeroMemory(insideOB);
ZeroMemory(insideFVG);
ZeroMemory(rejectedOB);
ZeroMemory(rejectedFVG);
ZeroMemory(insideSupplyZone);
ZeroMemory(insideDemandZone);
//
return result;
}
//
// Waiting for Price Breakes Inside Zone ...
//
double upper = 0;
double lower = 0;
bool isInsideZoneDirectionBullish = false;
bool isInsideZoneDirectionBearish = false;
//
if (hasInsideOB)
{
//
upper = insideOB.Upper();
lower = insideOB.Lower();
//
isInsideZoneDirectionBullish = insideOB.IsBullish();
isInsideZoneDirectionBearish = insideOB.IsBearish();
}
else if (hasInsideFVG)
{
//
upper = insideFVG.Upper();
lower = insideFVG.Lower();
//
isInsideZoneDirectionBullish = insideFVG.IsBullish();
isInsideZoneDirectionBearish = insideFVG.IsBearish();
}
//
// Cleanup Unused Objects ...
//
decisionZBar.Clean();
decisionCBar.Clean();
decisionPBar.Clean();
//
ZeroMemory(insideOB);
ZeroMemory(insideFVG);
ZeroMemory(rejectedOB);
ZeroMemory(rejectedFVG);
ZeroMemory(insideSupplyZone);
ZeroMemory(insideDemandZone);
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(visionCycleEvents);
Clean(decisionPoiEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionZBar.Clean();
decisionCBar.Clean();
decisionPBar.Clean();
decisionState.Clean();
visionConditions.Clean();
analyseConditions.Clean();
visionXConditions.Clean();
consolidationState.Clean();
decisionConditions.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
// Summarize Conditions ...
//
bool isCondition1Bullish =
//
hasBullishTrend &&
isInsideZoneDirectionBullish &&
bullishPriority != X121SMC_XSUPDEMOBS_PRIORITY_NONE
//
;
//
bool isCondition1Bearish =
//
hasBearishTrend &&
isInsideZoneDirectionBearish &&
bearishPriority != X121SMC_XSUPDEMOBS_PRIORITY_NONE
//
;
//
bool hasCondition1 = isCondition1Bullish ||
isCondition1Bearish;
if (hasCondition1)
{
//
ENUM_X_DIRECTION pzDir =
isCondition1Bullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
double point = GetEntry(
mConditions.symbol,
pzDir //
);
//
double longPivot = lower; // triggerXConditions.valesBuffer[1];
double shortPivot = upper; // triggerXConditions.peaksBuffer[1];
//
// Manipulate Conditions Point ...
//
mConditions.point =
isCondition1Bullish
? shortPivot
: longPivot;
//
// Manipulate Conditions Pivot ...
//
mConditions.pivot =
isCondition1Bullish
? longPivot
: shortPivot;
}
//
// Summarize Conditions ...
//
//
isBullish =
//
isCondition1Bullish
//
;
//
isBearish =
//
isCondition1Bearish
//
;
//
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
double reward;
double amountPercent;
ENUM_X121SMC_XSUPDEMOBS_PRIORITY priority =
isBullish
? bullishPriority
: bearishPriority;
bool hasRewardAmount = CalculateRiskReward(
priority,
reward,
amountPercent //
);
result = hasRewardAmount;
if (!result)
{
return result;
}
//
mConditions.setupTime = cTime;
mConditions.dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
mConditions.reward = reward;
mConditions.target = target;
mConditions.priority = priority;
mConditions.amountPercent = amountPercent;
//
swingBar.Clean();
rejectBar.Clean();
breakerBar.Clean();
momentumBar.Clean();
//
return result;
}
//
// Detect Trigger Conditions ...
bool DetectSignalTrigger(
//
X121SMCStrategyXSupDemOBSSignalConditions &conditions,
//
string _symbol,
ENUM_TIMEFRAMES _period,
//
XC121SMCCycleHelper *decisionCycleHelper,
XC121SMCCycleHelper *analyseCycleHelper,
XC121SMCCycleHelper *consolidationCycleHelper,
XC121SMCCycleHelper *visionCycleHelper,
//
int maxAllowedSetupAge = 60
//
)
{
//
bool result = false;
//
result =
//
visionCycleHelper != NULL &&
analyseCycleHelper != NULL &&
decisionCycleHelper != NULL &&
consolidationCycleHelper != NULL
//
;
if (!result)
{
return result;
}
//
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;
//
string symbol = _symbol;
ENUM_TIMEFRAMES period = _period;
//
XOHCL zBar;
result = decisionCycleHelper.GetBar(
zBar,
zIndex //
);
if (!result)
{
return result;
}
//
XOHCL cBar;
result = decisionCycleHelper.GetBar(
cBar,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL pBar;
result = decisionCycleHelper.GetBar(
pBar,
pIndex //
);
if (!result)
{
return result;
}
//
double ask = GetAsk(symbol);
double bid = GetBid(symbol);
datetime cTime = TimeCurrent();
double points = GetPoints(symbol);
//
int swingLoopback = 9;
double ll = cBar.FindLowest(swingLoopback, MODE_LOW);
double hh = cBar.FindHighest(swingLoopback, MODE_HIGH);
double llDown = cBar.FindLowesttDown(swingLoopback);
double hhUp = cBar.FindHighestUp(swingLoopback);
//
// Cycles Conditions ...
//
// Decision ...
ENUM_XPOI_EVENTS decisionPoiEvents[];
ENUM_X_CYCLE_EVENTS decisionCycleEvents[];
X121SMCCycleConditions decisionConditions;
result = decisionCycleHelper.GetConditions(
decisionCycleEvents,
decisionPoiEvents,
decisionConditions,
zIndex,
loopback //
);
if (!result)
{
//
// Cleanup ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
//
Clean(decisionPoiEvents);
Clean(decisionCycleEvents);
//
decisionConditions.Clean();
//
return result;
}
//
// Cycles POI States ...
XPOIState decisionState = decisionConditions.state;
//
// Cycle X121Conditions ...
X121Conditions decisionXConditions = decisionConditions.x121Conditions;
//
// Trigger Conditions ...
//
double point = conditions.point;
bool isPointBreaked = IsBarBreak(
point,
setupDir,
cBar //
);
//
// Summary ...
//
isBullish =
//
isBullish &&
isPointBreaked
//
;
//
isBearish =
//
isBearish &&
isPointBreaked
//
;
//
result = isBullish ||
isBearish;
if (!result)
{
//
// Cleanup Setup Conditions ...
int setupAge = conditions.GetSetupAge();
if (IsValidSize(setupAge) &&
IsValidSize(maxAllowedSetupAge) &&
setupAge >= maxAllowedSetupAge)
{
conditions.Clean();
}
//
// Cleanup ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
//
Clean(decisionPoiEvents);
Clean(decisionCycleEvents);
//
decisionState.Clean();
decisionConditions.Clean();
decisionXConditions.Clean();
//
return result;
}
//
// Detect Nearest Pivot Point ...
//
double entry = GetEntry(
conditions.symbol,
setupDir //
);
//
// Manipulate SL Based on Consolidation Zones ...
XConsolidationZone cZone;
bool hasCZone = decisionCycleHelper.GetActiveConsolidationZone(cZone);
bool hasCZones = decisionCycleHelper.HasConsolidationZones();
int cZonesCount = decisionCycleHelper.CountConsolidationZones();
if (!hasCZone &&
hasCZones)
{
//
hasCZone = decisionCycleHelper.GetLastDirectionalConsolidationZone(
conditions.dir,
cZone //
);
}
//
double sls[];
Add(
conditions.pivot,
sls //
);
//
if (hasCZone)
{
//
conditions.consolidationZone = cZone;
//
if (isBullish)
{
//
Add(
cZone.lower,
sls //
);
}
else
{
//
Add(
cZone.upper,
sls //
);
}
}
//
double iAtr = decisionXConditions.atrBuffer[1];
iAtr *= 2;
//
double slsMin = GetMin(sls);
double slsMax = GetMax(sls);
//
double sl = isBullish
? slsMin - iAtr
: slsMax + iAtr;
double risk = MathAbs(entry - sl);
//
// Filling Conditions Props ...
conditions.sl = sl;
conditions.triggerTime = cTime;
conditions.type = isBullish
? X_POSITION_TYPE_LONG
: X_POSITION_TYPE_SHORT;
//
// Cleanup ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
//
Clean(decisionPoiEvents);
Clean(decisionCycleEvents);
//
decisionState.Clean();
decisionConditions.Clean();
decisionXConditions.Clean();
//
return result;
}
//
// Detect Guards ...
bool DetectGuards(
//
X121SMCGuard &guards[],
const XPosition &positions[],
//
XC121SMCCycleHelper *decisionCycleHelper,
XC121SMCCycleHelper *analyseCycleHelper,
XC121SMCCycleHelper *consolidationCycleHelper,
XC121SMCCycleHelper *visionCycleHelper
//
)
{
//
bool result = false;
//
Clean(guards);
//
bool isCycleHelpersValid =
//
visionCycleHelper != NULL &&
analyseCycleHelper != NULL &&
decisionCycleHelper != NULL &&
consolidationCycleHelper != NULL
//
;
//
result = isCycleHelpersValid;
if (!result)
{
return result;
}
//
int count = ArraySize(positions);
result = IsValidSize(count);
if (!result)
{
return result;
}
//
string symbol = decisionCycleHelper.GetSymbol();
ENUM_TIMEFRAMES period = decisionCycleHelper.GetPeriod();
string provider = ToString(X_121_SMC_PROVIDER_XSUPDEMOBS);
//
XPosition ownPositions[];
XPosition ownLongPositions[];
XPosition ownShortPositions[];
for (int i = 0; i < count; i++)
{
//
XPosition iPosition = positions[i];
bool isOwn = iPosition
.IsFiltersPassed(
symbol,
provider,
NULL,
X_POSITION_TYPE_ALL,
iPosition.magic //
);
if (isOwn)
{
//
AddRef(
iPosition,
ownPositions //
);
//
bool isLong = IsLong(positions[i].type);
if (isLong)
{
//
AddRef(
iPosition,
ownLongPositions //
);
}
else
{
//
AddRef(
iPosition,
ownShortPositions //
);
}
}
}
//
count = ArraySize(ownPositions);
//
int longsCount = ArraySize(ownLongPositions);
bool hasLongs = IsValidSize(longsCount);
//
int shortsCount = ArraySize(ownShortPositions);
bool hasShorts = IsValidSize(shortsCount);
//
result = IsValidSize(count);
if (!result)
{
//
Clean(ownPositions);
Clean(ownLongPositions);
Clean(ownShortPositions);
//
return result;
}
//
//
//
//
// Get Global and Common Guards ...
//
ENUM_X_121_SMC_GUARD_ACTIONS ignoreGuards[1] = {
X_121_SMC_GUARD_ACTION_TRAIL_STOP};
result = DetectX121SMCGuards(
provider,
guards,
positions,
decisionCycleHelper,
analyseCycleHelper,
consolidationCycleHelper,
visionCycleHelper,
//
ignoreGuards
//
);
//
//
//
//
// Get Custom Implemented Guards ...
//
// Here we Are Sure there is Positions to Guard ...
// based on Current Provider ...
//
// Detect Required Data for Analyse Market to Guard Positions ...
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
int loopback = 10;
//
XOHCL zBar;
result = zBar.Init(
symbol,
period,
zIndex //
);
if (!result)
{
//
result = HasChild(guards);
return result;
}
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
//
zBar.Clean();
result = HasChild(guards);
return result;
}
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
result = HasChild(guards);
return result;
}
//
XOHCL ppBar;
result = ppBar.Init(
symbol,
period,
ppIndex //
);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
result = HasChild(guards);
return result;
}
//
double ask = GetAsk(symbol);
double bid = GetBid(symbol);
datetime cTime = TimeCurrent();
double points = GetPoints(symbol);
//
//
// Cycles Conditions ...
//
// Decision ...
ENUM_XPOI_EVENTS decisionPoiEvents[];
ENUM_X_CYCLE_EVENTS decisionCycleEvents[];
X121SMCCycleConditions decisionConditions;
result = decisionCycleHelper.GetConditions(
decisionCycleEvents,
decisionPoiEvents,
decisionConditions,
zIndex,
loopback //
);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
result = HasChild(guards);
return result;
}
//
// Analyse ...
ENUM_XPOI_EVENTS analysePoiEvents[];
ENUM_X_CYCLE_EVENTS analyseCycleEvents[];
X121SMCCycleConditions analyseConditions;
result = analyseCycleHelper.GetConditions(
analyseCycleEvents,
analysePoiEvents,
analyseConditions,
zIndex,
loopback //
);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
//
Clean(decisionPoiEvents);
Clean(decisionCycleEvents);
//
decisionConditions.Clean();
//
result = HasChild(guards);
return result;
}
//
// Consolidation ...
ENUM_XPOI_EVENTS consolidationPoiEvents[];
ENUM_X_CYCLE_EVENTS consolidationCycleEvents[];
X121SMCCycleConditions consolidationConditions;
result = consolidationCycleHelper.GetConditions(
consolidationCycleEvents,
consolidationPoiEvents,
consolidationConditions,
zIndex,
loopback //
);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
//
Clean(decisionPoiEvents);
Clean(decisionCycleEvents);
//
decisionConditions.Clean();
//
Clean(analysePoiEvents);
Clean(analyseCycleEvents);
//
analyseConditions.Clean();
//
result = HasChild(guards);
return result;
}
//
// Vision ...
ENUM_XPOI_EVENTS visionPoiEvents[];
ENUM_X_CYCLE_EVENTS visionCycleEvents[];
X121SMCCycleConditions visionConditions;
result = visionCycleHelper.GetConditions(
visionCycleEvents,
visionPoiEvents,
visionConditions,
zIndex,
loopback //
);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
//
Clean(decisionPoiEvents);
Clean(decisionCycleEvents);
//
decisionConditions.Clean();
//
Clean(analysePoiEvents);
Clean(analyseCycleEvents);
//
analyseConditions.Clean();
//
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
consolidationConditions.Clean();
//
result = HasChild(guards);
return result;
}
//
// Cycles POI States ...
XPOIState decisionState = decisionConditions.state;
XPOIState analyseState = analyseConditions.state;
XPOIState consolidationState = consolidationConditions.state;
XPOIState visionState = visionConditions.state;
//
// Cycle X121Conditions ...
X121Conditions decisionXConditions = decisionConditions.x121Conditions;
X121Conditions analyseXConditions = analyseConditions.x121Conditions;
X121Conditions consolidationXConditions = consolidationConditions.x121Conditions;
X121Conditions visionXConditions = visionConditions.x121Conditions;
//
//
//
//
// Detect Consolidation Zone ...
//
XBoxZone lastBullishBox;
XBoxZone prevLastBullishBox;
bool hasLastBullishBox = false;
bool hasPrevLastBullishBox = false;
XConsolidationZone lastBullishZone;
bool isLastBullishAbovePrev = false;
bool isLastBullishBelowPrev = false;
XConsolidationZone prevLastBullishZone;
//
XBoxZone lastBearishBox;
XBoxZone prevLastBearishBox;
bool hasLastBearishBox = false;
bool hasPrevLastBearishBox = false;
XConsolidationZone lastBearishZone;
bool isLastBearishAbovePrev = false;
bool isLastBearishBelowPrev = false;
XConsolidationZone prevLastBearishZone;
//
int bullishConsolidationZonesCount = 0;
int bearishConsolidationZonesCount = 0;
bool hasBullishConsolidationZones = false;
bool hasBearishConsolidationZones = false;
XConsolidationZone bullishConsolidationZones[];
XConsolidationZone bearishConsolidationZones[];
bool hasConsolidationZones = decisionCycleHelper.HasConsolidationZones();
int consolidationZonesCount = decisionCycleHelper.CountConsolidationZones();
if (hasConsolidationZones)
{
//
bullishConsolidationZonesCount = decisionCycleHelper
.FillConsolidationZones(
X_DIRECTION_BULLISH,
bullishConsolidationZones //
);
hasBullishConsolidationZones = IsValidSize(bullishConsolidationZonesCount);
//
bearishConsolidationZonesCount = decisionCycleHelper
.FillConsolidationZones(
X_DIRECTION_BEARISH,
bearishConsolidationZones //
);
hasBearishConsolidationZones = IsValidSize(bearishConsolidationZonesCount);
//
//
//
//
if (hasBullishConsolidationZones &&
bullishConsolidationZonesCount >= 2)
{
//
lastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 1];
prevLastBullishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 2];
//
hasLastBullishBox = ToBox(
lastBullishBox,
lastBullishZone //
);
hasPrevLastBullishBox = ToBox(
prevLastBullishBox,
prevLastBullishZone //
);
//
isLastBullishAbovePrev = hasLastBullishBox &&
hasPrevLastBullishBox &&
IsBoxAbove(
lastBullishBox,
prevLastBullishBox //
);
//
isLastBullishBelowPrev = hasLastBullishBox &&
hasPrevLastBullishBox &&
IsBoxBelow(
lastBullishBox,
prevLastBullishBox //
);
}
//
if (hasBearishConsolidationZones &&
bearishConsolidationZonesCount >= 2)
{
//
lastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 1];
prevLastBearishZone = bearishConsolidationZones[bearishConsolidationZonesCount - 2];
//
hasLastBearishBox = ToBox(
lastBearishBox,
lastBearishZone //
);
hasPrevLastBearishBox = ToBox(
prevLastBearishBox,
prevLastBearishZone //
);
//
isLastBearishAbovePrev = hasLastBearishBox &&
hasPrevLastBearishBox &&
IsBoxAbove(
lastBearishBox,
prevLastBearishBox //
);
//
isLastBearishBelowPrev = hasLastBearishBox &&
hasPrevLastBearishBox &&
IsBoxBelow(
lastBearishBox,
prevLastBearishBox //
);
}
//
}
//
// Detect High Probability Swings ...
bool isSwingLow =
//
cBar.low > pBar.low &&
ppBar.low > pBar.low &&
//
zBar.low > pBar.low
//
;
bool isSwingHigh =
//
cBar.high < pBar.high &&
ppBar.high < pBar.high &&
//
zBar.high < pBar.high
//
;
bool isStrongSwingLow =
pBar.IsBullish() &&
pBar.GetLowShadow() >= pBar.GetBody() * 2;
bool isStrongSwingHigh =
pBar.IsBearish() &&
pBar.GetHighShadow() >= pBar.GetBody() * 2;
//
bool isStrongSwingLowAboveLastBullishBox =
isStrongSwingLow &&
hasLastBullishBox &&
pBar.low > lastBullishBox.upper;
//
bool isStrongSwingHighBelowLastBearishBox =
isStrongSwingHigh &&
hasLastBearishBox &&
pBar.high < lastBearishBox.lower;
//
// Here We Have all Requirements for Guarding Positions ...
//
// Available Guards:
// X_121_SMC_GUARD_ACTION_NONE
// X_121_SMC_GUARD_ACTION_CLOSE
// X_121_SMC_GUARD_ACTION_CLOSE_ALL
// X_121_SMC_GUARD_ACTION_CLOSE_LONGS
// X_121_SMC_GUARD_ACTION_CLOSE_SHORTS
// X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE
// X_121_SMC_GUARD_ACTION_TRAIL_STOP
// X_121_SMC_GUARD_ACTION_TRAIL_TARGET
// X_121_SMC_GUARD_ACTION_HEDGE
//
// X_121_SMC_GUARD_ACTION_CLOSE:
// Close Specified Position on Specified Conditions ...
//
// X_121_SMC_GUARD_ACTION_CLOSE_ALL:
// Close All Positions on Specified Conditions ...
//
// X_121_SMC_GUARD_ACTION_CLOSE_LONGS:
// Close All Long Positions on Specified Conditions ...
//
// X_121_SMC_GUARD_ACTION_CLOSE_SHORTS:
// Close All Short Positions on Specified Conditions ...
//
// X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE:
// Partial Close Specified Position on Specified Conditions ...
//
// X_121_SMC_GUARD_ACTION_TRAIL_STOP:
// Trail Stop Specified Position on Specified Conditions ...
//
// X_121_SMC_GUARD_ACTION_TRAIL_TARGET:
// Trail Target Specified Position on Specified Conditions ...
//
// X_121_SMC_GUARD_ACTION_HEDGE:
// Hedge all Positions on Specified Conditions ...
//
// Cleanup Collections ...
//
Clean(ownPositions);
Clean(ownLongPositions);
Clean(ownShortPositions);
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(visionCycleEvents);
Clean(decisionPoiEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionState.Clean();
visionConditions.Clean();
analyseConditions.Clean();
visionXConditions.Clean();
decisionConditions.Clean();
consolidationState.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
lastBullishBox.Clean();
lastBearishBox.Clean();
lastBullishZone.Clean();
lastBearishZone.Clean();
prevLastBullishBox.Clean();
prevLastBearishBox.Clean();
prevLastBullishZone.Clean();
prevLastBearishZone.Clean();
//
count = ArraySize(guards);
result = IsValidSize(count);
//
return result;
}
//
//
//
//
// Add Conditions to Conditions Collection ...
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 ...
X121SMCStrategyXSupDemOBSSignalConditions tmpItems[];
Copy(
mConditionsCollection,
tmpItems //
);
//
// Prese Item Data ...
bool isBullish = IsBullish(mConditions.dir);
//
for (int i = 0; i < count; i++)
{
//
X121SMCStrategyXSupDemOBSSignalConditions 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;
}
//
// Draw Functions ...
//
//
void RemoveDraws()
{
mObjects.Clear();
}
//
void RemoveWorkingZoneDraws()
{
mWorkingZoneObjects.Clear();
}
//
void DrawOrderBlock(
XCOrderBlock *ob,
XCPOIDrawer *drawer //
)
{
//
if (ob == NULL ||
drawer == NULL)
{
return;
}
//
ENUM_X_DIRECTION forDir = ob.GetDirection();
//
color bullishColor = drawer.BarBullishColor();
color bearishColor = drawer.BarBearishColor();
color forColor = IsBullish(forDir)
? bullishColor
: bearishColor;
//
// Draw Order Block ...
XCBaseObject *obj;
bool isCreated = drawer.CreateOrderBlock(
ob,
obj //
);
if (isCreated)
{
mObjects.Add(obj);
}
//
ulong chartID = drawer.ChartIdentification();
int subWindow = drawer.SubWindowIdentification();
//
XOHCL startedBar;
ENUM_X_DIRECTION startedDir;
bool isStarted = ob.IsStarted(
forDir,
startedBar,
startedDir //
);
if (isStarted)
{
//
datetime to = startedBar.time + (PeriodSeconds(startedBar.period));
//
XCOHCLObject *obj;
bool isCreated = drawer.CreateBar(
startedBar,
obj,
to //
);
if (isCreated)
{
//
obj.BodyColor(clrYellow);
obj.HighShadowColor(clrYellow);
obj.LowShadowColor(clrYellow);
//
obj.BodyStyle(STYLE_SOLID);
obj.HighShadowStyle(STYLE_SOLID);
obj.LowShadowStyle(STYLE_SOLID);
//
mObjects.Add(obj);
}
//
string startVLineName = "Start_" + ob.GetTag();
//
CChartObjectVLine *startVLine;
startVLine = new CChartObjectVLine();
isCreated = startVLine.Create(
chartID,
startVLineName,
subWindow,
startedBar.time //
);
if (isCreated)
{
//
startVLine.Color(forColor);
//
mObjects.Add(startVLine);
}
}
}
//
void DrawFairValueGap(
XCFVG *fvg,
XCPOIDrawer *drawer //
)
{
//
if (fvg == NULL ||
drawer == NULL)
{
return;
}
//
ENUM_X_DIRECTION forDir = fvg.GetDirection();
//
color bullishColor = drawer.BarBullishColor();
color bearishColor = drawer.BarBearishColor();
color forColor = IsBullish(forDir)
? bullishColor
: bearishColor;
//
// Draw Order Block ...
XCBaseObject *obj;
bool isCreated = drawer.CreateFairValueGap(
fvg,
obj //
);
if (isCreated)
{
mObjects.Add(obj);
}
//
ulong chartID = drawer.ChartIdentification();
int subWindow = drawer.SubWindowIdentification();
//
XOHCL startedBar;
ENUM_X_DIRECTION startedDir;
bool isStarted = fvg.IsStarted(
forDir,
startedBar,
startedDir //
);
if (isStarted)
{
//
datetime to = startedBar.time + (PeriodSeconds(startedBar.period));
//
XCOHCLObject *obj;
bool isCreated = drawer.CreateBar(
startedBar,
obj,
to //
);
if (isCreated)
{
//
obj.BodyColor(clrYellow);
obj.HighShadowColor(clrYellow);
obj.LowShadowColor(clrYellow);
//
obj.BodyStyle(STYLE_SOLID);
obj.HighShadowStyle(STYLE_SOLID);
obj.LowShadowStyle(STYLE_SOLID);
//
mObjects.Add(obj);
}
//
string startVLineName = "Start_" + fvg.GetTag();
//
CChartObjectVLine *startVLine;
startVLine = new CChartObjectVLine();
isCreated = startVLine.Create(
chartID,
startVLineName,
subWindow,
startedBar.time //
);
if (isCreated)
{
//
startVLine.Color(forColor);
//
mObjects.Add(startVLine);
}
}
}
//
void DrawWorkingZone(
X121SMCStrategyXSupDemOBSSignalConditions &conditions,
XCPOIDrawer *drawer //
)
{
//
if (drawer == NULL)
{
return;
}
//
bool isCreated = false;
//
bool hasVisionHighestSupplyZone = conditions.HasVisionHighestSupplyZone();
if (hasVisionHighestSupplyZone)
{
//
XCSupplyZoneObject *ivhSupObj;
isCreated = drawer.CreateSupplyZone(
conditions.visionHighestSupplyZone,
ivhSupObj //
);
if (isCreated)
{
mWorkingZoneObjects.Add(ivhSupObj);
}
}
//
bool hasConsolidationHighestSupplyZone = conditions.HasConsolidationHighestSupplyZone();
if (hasConsolidationHighestSupplyZone)
{
//
XCSupplyZoneObject *ichSupObj;
isCreated = drawer.CreateSupplyZone(
conditions.consolidationHighestSupplyZone,
ichSupObj //
);
if (isCreated)
{
mWorkingZoneObjects.Add(ichSupObj);
}
}
//
bool hasVisionLowestDemandZone = conditions.HasVisionLowestDemandZone();
if (hasVisionLowestDemandZone)
{
//
XCDemandZoneObject *ivlSupObj;
isCreated = drawer.CreateDemandZone(
conditions.visionLowestDemandZone,
ivlSupObj //
);
if (isCreated)
{
mWorkingZoneObjects.Add(ivlSupObj);
}
}
//
bool hasConsolidationLowestDemandZone = conditions.HasConsolidationLowestDemandZone();
if (hasConsolidationLowestDemandZone)
{
//
XCDemandZoneObject *iclSupObj;
isCreated = drawer.CreateDemandZone(
conditions.consolidationLowestDemandZone,
iclSupObj //
);
if (isCreated)
{
mWorkingZoneObjects.Add(iclSupObj);
}
}
//
bool hasWorkingZone = conditions.workingZone.IsValid();
if (hasWorkingZone)
{
//
string zonePrefix = "X121_WZ_" + conditions.workingZone.symbol + "_" + ToString(conditions.workingZone.period);
string fromStr = ToFormatString(conditions.workingZone.from);
string fromMD5 = ToMD5(fromStr);
//
string upperName = zonePrefix + "_Upper_" + fromMD5;
string lowerName = zonePrefix + "_Lower_" + fromMD5;
string zoneUpperName = zonePrefix + "_ZoneUpper_" + fromMD5;
string zoneLowerName = zonePrefix + "_ZoneLower_" + fromMD5;
//
string q1Name = zonePrefix + "_Q1_" + fromMD5;
string q2Name = zonePrefix + "_Q2_" + fromMD5;
string q3Name = zonePrefix + "_Q3_" + fromMD5;
//
ulong chartID = drawer.ChartIdentification();
int subWindow = drawer.SubWindowIdentification();
//
bool isCreated = false;
//
// Lower ...
CChartObjectHLine *lowerHLine;
lowerHLine = new CChartObjectHLine();
isCreated = lowerHLine.Create(
chartID,
lowerName,
subWindow,
conditions.workingZone.lower //
);
if (isCreated)
{
//
lowerHLine.Color(clrLime);
mWorkingZoneObjects.Add(lowerHLine);
}
//
CChartObjectHLine *upperHLine;
upperHLine = new CChartObjectHLine();
isCreated = upperHLine.Create(
chartID,
upperName,
subWindow,
conditions.workingZone.upper //
);
if (isCreated)
{
//
upperHLine.Color(clrLime);
mWorkingZoneObjects.Add(upperHLine);
}
//
CChartObjectHLine *zoneLowerHLine;
zoneLowerHLine = new CChartObjectHLine();
isCreated = zoneLowerHLine.Create(
chartID,
zoneLowerName,
subWindow,
conditions.workingZone.zoneLower //
);
if (isCreated)
{
//
zoneLowerHLine.Color(clrRed);
mWorkingZoneObjects.Add(zoneLowerHLine);
}
//
CChartObjectHLine *zoneUpperHLine;
zoneUpperHLine = new CChartObjectHLine();
isCreated = zoneUpperHLine.Create(
chartID,
zoneUpperName,
subWindow,
conditions.workingZone.zoneUpper //
);
if (isCreated)
{
//
zoneUpperHLine.Color(clrRed);
mWorkingZoneObjects.Add(zoneUpperHLine);
}
//
CChartObjectHLine *quarter1HLine;
quarter1HLine = new CChartObjectHLine();
isCreated = quarter1HLine.Create(
chartID,
q1Name,
subWindow,
conditions.workingZone.quarter1 //
);
if (isCreated)
{
//
quarter1HLine.Color(clrYellow);
mWorkingZoneObjects.Add(quarter1HLine);
}
//
CChartObjectHLine *quarter2HLine;
quarter2HLine = new CChartObjectHLine();
isCreated = quarter2HLine.Create(
chartID,
q2Name,
subWindow,
conditions.workingZone.quarter2 //
);
if (isCreated)
{
//
quarter2HLine.Color(clrYellow);
mWorkingZoneObjects.Add(quarter2HLine);
}
//
CChartObjectHLine *quarter3HLine;
quarter3HLine = new CChartObjectHLine();
isCreated = quarter3HLine.Create(
chartID,
q3Name,
subWindow,
conditions.workingZone.quarter3 //
);
if (isCreated)
{
//
quarter3HLine.Color(clrYellow);
mWorkingZoneObjects.Add(quarter3HLine);
}
}
}
//
void DrawConditions(
X121SMCStrategyXSupDemOBSSignalConditions &conditions,
XCPOIDrawer *drawer,
bool forceClean = false //
)
{
//
if (drawer == NULL)
{
return;
}
//
if (forceClean)
{
mObjects.Clear();
}
//
bool isCreated = false;
//
int obFVGsCount = ArraySize(conditions.obFVGs);
bool hasOBFVGs = IsValidSize(obFVGsCount);
if (hasOBFVGs)
{
//
for (int i = 0; i < obFVGsCount; i++)
{
//
XOBFVG iOBFVG = conditions.obFVGs[i];
//
DrawOrderBlock(
iOBFVG.ob,
drawer //
);
//
DrawFairValueGap(
iOBFVG.fvg,
drawer //
);
//
int hasUnActivatedOBs = iOBFVG.HasUnActivatedOBs();
int unActivatedOBsCount = iOBFVG.CountUnActivatedOBs();
if (hasUnActivatedOBs)
{
//
for (int j = 0; j < unActivatedOBsCount; j++)
{
//
DrawOrderBlock(
iOBFVG.unActivatedOBs[j],
drawer //
);
}
}
//
int hasUnActivatedFVGs = iOBFVG.HasUnActivatedFVGs();
int unActivatedFVGsCount = iOBFVG.CountUnActivatedFVGs();
if (hasUnActivatedFVGs)
{
//
for (int j = 0; j < unActivatedFVGsCount; j++)
{
//
DrawFairValueGap(
iOBFVG.unActivatedFVGs[j],
drawer //
);
}
}
}
}
//
int insideZoneWidth = 1;
color insideZoneColor = clrYellow;
bool hasInsideOB = conditions.insideOB != NULL &&
conditions.insideOB.IsValid();
if (hasInsideOB)
{
//
bool isBullish = conditions.insideOB.IsBullish();
//
XCBaseObject *iObj = NULL;
isCreated = false;
if (isBullish)
{
//
XCBullishOrderBlockObject *iiObj;
isCreated = drawer.CreateBullishOrderBlock(
conditions.insideOB,
iiObj //
);
//
if (isCreated)
{
//
iiObj.ZoneColor(insideZoneColor);
iiObj.ZoneWidth(insideZoneWidth);
//
iObj = (XCBaseObject *)iiObj;
}
}
else
{
//
XCBearishOrderBlockObject *iiObj;
isCreated = drawer.CreateBearishOrderBlock(
conditions.insideOB,
iiObj //
);
//
if (isCreated)
{
//
iiObj.ZoneColor(insideZoneColor);
iiObj.ZoneWidth(insideZoneWidth);
//
iObj = (XCBaseObject *)iiObj;
}
}
//
if (isCreated)
{
mObjects.Add(iObj);
}
}
//
bool hasInsideFVG = conditions.insideFVG != NULL &&
conditions.insideFVG.IsValid();
if (hasInsideFVG)
{
//
bool isBullish = conditions.insideFVG.IsBullish();
//
XCBaseObject *iObj = NULL;
isCreated = false;
if (isBullish)
{
//
XCBullishFairValueGapObject *iiObj;
isCreated = drawer.CreateBullishFairValueGap(
conditions.insideFVG,
iiObj //
);
//
if (isCreated)
{
//
iiObj.ZoneColor(insideZoneColor);
iiObj.ZoneWidth(insideZoneWidth);
//
iObj = (XCBaseObject *)iiObj;
}
}
else
{
//
XCBearishFairValueGapObject *iiObj;
isCreated = drawer.CreateBearishFairValueGap(
conditions.insideFVG,
iiObj //
);
//
if (isCreated)
{
//
iiObj.ZoneColor(insideZoneColor);
iiObj.ZoneWidth(insideZoneWidth);
//
iObj = (XCBaseObject *)iiObj;
}
}
//
if (isCreated)
{
mObjects.Add(iObj);
}
}
//
bool hasConsolidationZone = conditions.consolidationZone.IsValid();
if (hasConsolidationZone)
{
//
XCConsolidationZoneObject *iObj;
isCreated = drawer.CreateConsolidationZone(
conditions.consolidationZone,
iObj //
);
//
if (isCreated)
{
mObjects.Add(iObj);
}
}
}
//
protected:
//
//
private:
//
// Props ...
CArrayObj mObjects;
CArrayObj mWorkingZoneObjects;
/**
* Initialize ...
*/
void Init()
{
}
/**
* DeInitialize ...
*/
void DeInit()
{
//
RemoveDraws();
mConditions.Clean();
RemoveWorkingZoneDraws();
Clean(mConditionsCollection);
}
//
// Helpers ...
//
bool CheckPriceInside(
XOHCL &zBar,
XOHCL &cBar,
double upper,
double lower //
)
{
//
bool result = false;
//
result = zBar.IsValid() &&
cBar.IsValid() &&
upper > 0 &&
lower > 0 &&
upper > lower &&
zBar.time > cBar.time;
if (!result)
{
return result;
}
//
result =
//
zBar.high < upper &&
cBar.high < upper &&
//
zBar.low > lower &&
cBar.low > lower
//
;
//
return result;
}
//
bool CalculateRiskReward(
ENUM_X121SMC_XSUPDEMOBS_PRIORITY priority,
double &reward,
double &amountPercent //
)
{
//
bool result = false;
//
reward = 0;
amountPercent = 0;
//
result = priority != X121SMC_XSUPDEMOBS_PRIORITY_NONE;
if (!result)
{
return result;
}
//
switch (priority)
{
//
case X121SMC_XSUPDEMOBS_PRIORITY_HIGH:
//
reward = 6;
amountPercent = 2;
break;
//
case X121SMC_XSUPDEMOBS_PRIORITY_REGULAR:
//
reward = 6;
amountPercent = 1.5;
break;
//
case X121SMC_XSUPDEMOBS_PRIORITY_LOW:
//
reward = 4;
amountPercent = 1;
break;
//
case X121SMC_XSUPDEMOBS_PRIORITY_WEAK:
//
reward = 2;
amountPercent = 0.5;
break;
}
//
result =
//
reward > 0 &&
amountPercent > 0
//
;
//
return result;
}
//
};
//