Files
MQL5Data/X121SMCEA/Signals/x-121.smc.xwz.signal.class.mq5
T
2025-02-18 18:48:43 +03:30

1667 lines
41 KiB
Plaintext

///////////////////////////////////////////////////////
//
// 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 "../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.xwz.signal.lib.mq5"
//
// Definition ...
class XCX121SMCXWZSignalDetector : public XCBase
{
//
public:
//
// Props ...
X121SMCStrategyXWZSignalConditions mConditions;
X121SMCStrategyXWZSignalConditions mConditionsCollection[];
//
// Constructor(s) ...
XCX121SMCXWZSignalDetector()
{
Init();
}
//
// Deconstructor ...
~XCX121SMCXWZSignalDetector()
{
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)
{
//
mConditions.Clean();
//
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 pivot = 0;
double point = 0;
double target = 0;
double reward = 0;
double amountPercent = 0;
ENUM_X_DIRECTION conditionsDir = X_DIRECTION_NONE;
ENUM_X121SMC_XWZ_PRIORITY priority = X121SMC_XWZ_PRIORITY_NONE;
//
// Cycles Conditions ...
//
// Decision ...
ENUM_XPOI_EVENTS decisionPoiEvents[];
ENUM_X_CYCLE_EVENTS decisionCycleEvents[];
X121SMCCycleConditions decisionConditions;
result = decisionCycleHelper.GetConditions(
decisionCycleEvents,
decisionPoiEvents,
decisionConditions,
zIndex,
loopback //
);
if (!result)
{
//
mConditions.Clean();
//
return result;
}
//
// Analyse ...
ENUM_XPOI_EVENTS analysePoiEvents[];
ENUM_X_CYCLE_EVENTS analyseCycleEvents[];
X121SMCCycleConditions analyseConditions;
result = analyseCycleHelper.GetConditions(
analyseCycleEvents,
analysePoiEvents,
analyseConditions,
zIndex,
loopback //
);
if (!result)
{
//
mConditions.Clean();
//
return result;
}
//
// Consolidation ...
ENUM_XPOI_EVENTS consolidationPoiEvents[];
ENUM_X_CYCLE_EVENTS consolidationCycleEvents[];
X121SMCCycleConditions consolidationConditions;
result = consolidationCycleHelper.GetConditions(
consolidationCycleEvents,
consolidationPoiEvents,
consolidationConditions,
zIndex,
loopback //
);
if (!result)
{
//
mConditions.Clean();
//
return result;
}
//
// Vision ...
ENUM_XPOI_EVENTS visionPoiEvents[];
ENUM_X_CYCLE_EVENTS visionCycleEvents[];
X121SMCCycleConditions visionConditions;
result = visionCycleHelper.GetConditions(
visionCycleEvents,
visionPoiEvents,
visionConditions,
zIndex,
loopback //
);
if (!result)
{
//
mConditions.Clean();
//
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 ...
//
int bullishFlowCount = mConditions.DetectOrderFlow(
X_DIRECTION_BULLISH,
consolidationState,
analyseState,
zIndex,
period,
visionCycleHelper.mPOIDrawer //
);
// //
// int bearishFlowCount = mConditions.DetectOrderFlow(
// X_DIRECTION_BEARISH,
// consolidationState,
// analyseState,
// zIndex,
// period,
// visionCycleHelper.mPOIDrawer //
// );
//
return false;
//
// Summarise Conditions ...
//
//
mConditions.pivot = pivot;
mConditions.point = point;
mConditions.reward = reward;
mConditions.target = target;
mConditions.setupTime = cTime;
mConditions.priority = priority;
mConditions.dir = conditionsDir;
mConditions.amountPercent = amountPercent;
//
mConditions.UpdateTo(cTime);
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(decisionPoiEvents);
Clean(visionCycleEvents);
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();
//
return result;
}
//
// Detect Trigger Conditions ...
bool DetectSignalTrigger(
//
X121SMCStrategyXWZSignalConditions &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 &&
// cBar.IsBullish()
//
;
//
isBearish =
//
isBearish
// &&
// isPointBreaked &&
// cBar.IsBearish()
//
;
//
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 ...
//
double sls[];
Add(
conditions.pivot,
sls //
);
//
// TODO: Add Consolidation Zone for 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;
return result;
//
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_XWZ);
//
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 ...
X121SMCStrategyXWZSignalConditions tmpItems[];
Copy(
mConditionsCollection,
tmpItems //
);
//
// Prese Item Data ...
bool isBullish = IsBullish(mConditions.dir);
//
for (int i = 0; i < count; i++)
{
//
X121SMCStrategyXWZSignalConditions 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 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)
// {
// 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 DrawConditions(
X121SMCStrategyXWZSignalConditions &conditions,
XCPOIDrawer *drawer,
bool forceClean = false //
)
{
//
if (drawer == NULL)
{
return;
}
//
if (forceClean)
{
mObjects.Clear();
}
//
bool isCreated = false;
//
ulong chartID = drawer.ChartIdentification();
int subWindow = drawer.SubWindowIdentification();
color bullishColor = drawer.BarBullishColor();
color bearishColor = drawer.BarBearishColor();
}
//
protected:
//
//
private:
//
// Props ...
CArrayObj mObjects;
/**
* Initialize ...
*/
void Init()
{
}
/**
* DeInitialize ...
*/
void DeInit()
{
//
RemoveDraws();
mConditions.Clean();
Clean(mConditionsCollection);
}
//
// Helpers ...
//
bool CalculateRiskReward(
ENUM_X121SMC_XWZ_PRIORITY priority,
double &reward,
double &amountPercent //
)
{
//
bool result = false;
//
reward = 0;
amountPercent = 0;
//
result = priority != X121SMC_XWZ_PRIORITY_NONE;
if (!result)
{
return result;
}
//
switch (priority)
{
//
case X121SMC_XWZ_PRIORITY_STRONG_HIGH:
//
reward = 6;
amountPercent = 2;
break;
//
case X121SMC_XWZ_PRIORITY_HIGH:
//
reward = 4;
amountPercent = 2;
break;
//
case X121SMC_XWZ_PRIORITY_REGULAR:
//
reward = 3;
amountPercent = 1.5;
break;
//
case X121SMC_XWZ_PRIORITY_LOW:
//
reward = 2;
amountPercent = 1;
break;
//
case X121SMC_XWZ_PRIORITY_WEAK:
//
reward = 1;
amountPercent = 0.5;
break;
}
//
result =
//
reward > 0 &&
amountPercent > 0
//
;
//
return result;
}
//
};
//