Backup ...
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,974 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 X121 SMC Signal Class
|
||||
// -------------------------------------------------
|
||||
// Name:
|
||||
// Description: provide all Global Guarding 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.lib.mq5"
|
||||
|
||||
//
|
||||
XConsolidationZone x121SMCConsolidationZone;
|
||||
bool DetectX121SMCGuards(
|
||||
//
|
||||
string provider, // Provider ...
|
||||
X121SMCGuard &guards[],
|
||||
const XPosition &positions[],
|
||||
XC121SMCCycleHelper *decisionCycleHelper,
|
||||
XC121SMCCycleHelper *analyseCycleHelper,
|
||||
XC121SMCCycleHelper *consolidationCycleHelper,
|
||||
XC121SMCCycleHelper *visionCycleHelper,
|
||||
//
|
||||
// Guard Types ...
|
||||
ENUM_X_121_SMC_GUARD_ACTIONS &ignoreGuards[],
|
||||
//
|
||||
// Required Configurations ...
|
||||
double breakEvenTPLevel = 2.0
|
||||
//
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isCycleHelpersValid =
|
||||
//
|
||||
visionCycleHelper != NULL &&
|
||||
analyseCycleHelper != NULL &&
|
||||
decisionCycleHelper != NULL &&
|
||||
consolidationCycleHelper != NULL
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Ignore Guards ...
|
||||
bool hasIgnoreGuards = HasChild(ignoreGuards);
|
||||
bool isColseIgnored =
|
||||
hasIgnoreGuards &&
|
||||
Contains(
|
||||
X_121_SMC_GUARD_ACTION_CLOSE,
|
||||
ignoreGuards //
|
||||
);
|
||||
bool isColseAllIgnored =
|
||||
hasIgnoreGuards &&
|
||||
Contains(
|
||||
X_121_SMC_GUARD_ACTION_CLOSE_ALL,
|
||||
ignoreGuards //
|
||||
);
|
||||
bool isColseLongsIgnored =
|
||||
hasIgnoreGuards &&
|
||||
Contains(
|
||||
X_121_SMC_GUARD_ACTION_CLOSE_LONGS,
|
||||
ignoreGuards //
|
||||
);
|
||||
bool isColseShortsIgnored =
|
||||
hasIgnoreGuards &&
|
||||
Contains(
|
||||
X_121_SMC_GUARD_ACTION_CLOSE_SHORTS,
|
||||
ignoreGuards //
|
||||
);
|
||||
bool isPartialColseIgnored =
|
||||
hasIgnoreGuards &&
|
||||
Contains(
|
||||
X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE,
|
||||
ignoreGuards //
|
||||
);
|
||||
bool isTrailStopIgnored =
|
||||
hasIgnoreGuards &&
|
||||
Contains(
|
||||
X_121_SMC_GUARD_ACTION_TRAIL_STOP,
|
||||
ignoreGuards //
|
||||
);
|
||||
bool isTrailTargetIgnored =
|
||||
hasIgnoreGuards &&
|
||||
Contains(
|
||||
X_121_SMC_GUARD_ACTION_TRAIL_TARGET,
|
||||
ignoreGuards //
|
||||
);
|
||||
bool isHedgeIgnored =
|
||||
hasIgnoreGuards &&
|
||||
Contains(
|
||||
X_121_SMC_GUARD_ACTION_HEDGE,
|
||||
ignoreGuards //
|
||||
);
|
||||
|
||||
//
|
||||
bool isAllIgnores =
|
||||
//
|
||||
isColseIgnored &&
|
||||
isHedgeIgnored &&
|
||||
isColseAllIgnored &&
|
||||
isTrailStopIgnored &&
|
||||
isColseLongsIgnored &&
|
||||
isColseShortsIgnored &&
|
||||
isTrailTargetIgnored &&
|
||||
isPartialColseIgnored
|
||||
//
|
||||
;
|
||||
result = !isAllIgnores &&
|
||||
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();
|
||||
|
||||
//
|
||||
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;
|
||||
}
|
||||
|
||||
//
|
||||
// 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)
|
||||
{
|
||||
//
|
||||
zBar.Clean();
|
||||
result = HasChild(guards);
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
symbol,
|
||||
period,
|
||||
cIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
zBar.Clean();
|
||||
cBar.Clean();
|
||||
result = HasChild(guards);
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
result = pBar.Init(
|
||||
symbol,
|
||||
period,
|
||||
pIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
zBar.Clean();
|
||||
cBar.Clean();
|
||||
pBar.Clean();
|
||||
result = HasChild(guards);
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL ppBar;
|
||||
result = ppBar.Init(
|
||||
symbol,
|
||||
period,
|
||||
ppIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
zBar.Clean();
|
||||
cBar.Clean();
|
||||
pBar.Clean();
|
||||
ppBar.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);
|
||||
|
||||
//
|
||||
Clean(decisionPoiEvents);
|
||||
Clean(decisionCycleEvents);
|
||||
|
||||
//
|
||||
decisionConditions.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)
|
||||
{
|
||||
//
|
||||
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;
|
||||
}
|
||||
|
||||
//
|
||||
// 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();
|
||||
|
||||
//
|
||||
Clean(consolidationPoiEvents);
|
||||
Clean(consolidationCycleEvents);
|
||||
|
||||
//
|
||||
consolidationConditions.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();
|
||||
|
||||
//
|
||||
Clean(visionPoiEvents);
|
||||
Clean(visionCycleEvents);
|
||||
|
||||
//
|
||||
visionConditions.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 ...
|
||||
|
||||
//
|
||||
// Detect Consolidation Zones ...
|
||||
|
||||
//
|
||||
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 ...
|
||||
if (!isColseIgnored)
|
||||
{
|
||||
//
|
||||
// TODO:
|
||||
// - [] Implement Close on Nearest on TP ...
|
||||
}
|
||||
|
||||
//
|
||||
// X_121_SMC_GUARD_ACTION_CLOSE_ALL:
|
||||
// Close All Positions on Specified Conditions ...
|
||||
if (!isColseAllIgnored)
|
||||
{
|
||||
//
|
||||
// TODO:
|
||||
// - [] Implement Close All Positions on Weekend ...
|
||||
}
|
||||
|
||||
//
|
||||
// X_121_SMC_GUARD_ACTION_CLOSE_LONGS:
|
||||
// Close All Long Positions on Specified Conditions ...
|
||||
if (!isColseLongsIgnored)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// X_121_SMC_GUARD_ACTION_CLOSE_SHORTS:
|
||||
// Close All Short Positions on Specified Conditions ...
|
||||
if (!isColseShortsIgnored)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE:
|
||||
// Partial Close Specified Position on Specified Conditions ...
|
||||
if (!isPartialColseIgnored)
|
||||
{
|
||||
//
|
||||
// Breake Even ...
|
||||
// Usually Break Even Works on TP2 Reached ...
|
||||
// when tp reached to required Level, we Close 50% of Entered Volume ...
|
||||
bool canBreakEven = breakEvenTPLevel >= 0;
|
||||
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
XPosition iPosition = ownPositions[i];
|
||||
|
||||
//
|
||||
bool isInProfit = iPosition.profit > 0;
|
||||
|
||||
//
|
||||
double reachedTPLevel = 0;
|
||||
double reachedTPPrice = 0;
|
||||
if (isInProfit)
|
||||
{
|
||||
//
|
||||
iPosition.CalculateReahedTP(
|
||||
reachedTPLevel,
|
||||
reachedTPPrice //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Break Event ...
|
||||
if (canBreakEven)
|
||||
{
|
||||
//
|
||||
// Position Must be In Profit ...
|
||||
if (!isInProfit)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
bool canDoBreakEven = reachedTPLevel == breakEvenTPLevel &&
|
||||
reachedTPPrice > 0;
|
||||
if (canDoBreakEven)
|
||||
{
|
||||
//
|
||||
X121SMCGuard iGuard;
|
||||
|
||||
//
|
||||
iGuard.time = cTime;
|
||||
iGuard.symbol = symbol;
|
||||
iGuard.provider = provider;
|
||||
iGuard.action = X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE;
|
||||
|
||||
//
|
||||
iGuard.ticket = iPosition.ticket;
|
||||
|
||||
//
|
||||
iGuard.volumeMultiplier = 0.5;
|
||||
|
||||
//
|
||||
AddGuard(
|
||||
iGuard,
|
||||
guards //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// X_121_SMC_GUARD_ACTION_TRAIL_STOP:
|
||||
// Trail Stop Specified Position on Specified Conditions ...
|
||||
if (!isTrailStopIgnored)
|
||||
{
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
XPosition iPosition = ownPositions[i];
|
||||
|
||||
//
|
||||
bool isLong = IsLong(iPosition.type);
|
||||
bool isInProfit = iPosition.profit > 0;
|
||||
|
||||
//
|
||||
double reachedTPLevel = 0;
|
||||
double reachedTPPrice = 0;
|
||||
if (isInProfit)
|
||||
{
|
||||
//
|
||||
iPosition.CalculateReahedTP(
|
||||
reachedTPLevel,
|
||||
reachedTPPrice //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Trai Stop ...
|
||||
if (!isInProfit)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
double trailedStop = 0;
|
||||
|
||||
//
|
||||
// Trail Stop Senarios ...
|
||||
// - occures two same type consolidation zones in order of positions type;
|
||||
// - occures a swing in order of consolidation zones ...
|
||||
|
||||
//
|
||||
bool canTrailBasedOnTwoZone =
|
||||
isLong
|
||||
? isLastBullishAbovePrev
|
||||
: isLastBearishBelowPrev;
|
||||
if (canTrailBasedOnTwoZone)
|
||||
{
|
||||
//
|
||||
trailedStop =
|
||||
isLong
|
||||
? prevLastBullishBox.lower
|
||||
: prevLastBearishBox.upper;
|
||||
}
|
||||
|
||||
//
|
||||
bool canTrailBasedOnZoneSwing =
|
||||
trailedStop <= 0 &&
|
||||
(isLong
|
||||
? isStrongSwingLowAboveLastBullishBox
|
||||
: isStrongSwingHighBelowLastBearishBox);
|
||||
if (canTrailBasedOnZoneSwing)
|
||||
{
|
||||
//
|
||||
trailedStop =
|
||||
isLong
|
||||
? pBar.low
|
||||
: pBar.high;
|
||||
}
|
||||
|
||||
//
|
||||
bool canDoTrailStop =
|
||||
trailedStop > 0 &&
|
||||
(
|
||||
//
|
||||
iPosition.sl == 0
|
||||
? (isLong
|
||||
? trailedStop > iPosition.entry &&
|
||||
trailedStop < iPosition.price
|
||||
: trailedStop < iPosition.entry &&
|
||||
trailedStop > iPosition.price)
|
||||
: (isLong
|
||||
? trailedStop > iPosition.sl &&
|
||||
trailedStop > iPosition.entry &&
|
||||
trailedStop < iPosition.price
|
||||
: trailedStop < iPosition.sl &&
|
||||
trailedStop < iPosition.entry &&
|
||||
trailedStop > iPosition.price)
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (canDoTrailStop)
|
||||
{
|
||||
//
|
||||
X121SMCGuard iGuard;
|
||||
|
||||
//
|
||||
iGuard.time = cTime;
|
||||
iGuard.symbol = symbol;
|
||||
iGuard.provider = provider;
|
||||
iGuard.action = X_121_SMC_GUARD_ACTION_TRAIL_STOP;
|
||||
|
||||
//
|
||||
iGuard.ticket = iPosition.ticket;
|
||||
|
||||
//
|
||||
iGuard.sl = trailedStop;
|
||||
|
||||
//
|
||||
AddGuard(
|
||||
iGuard,
|
||||
guards //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// X_121_SMC_GUARD_ACTION_TRAIL_TARGET:
|
||||
// Trail Target Specified Position on Specified Conditions ...
|
||||
if (!isTrailTargetIgnored)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// X_121_SMC_GUARD_ACTION_HEDGE:
|
||||
// Hedge all Positions on Specified Conditions ...
|
||||
if (!isHedgeIgnored)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,734 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Common Library
|
||||
// --------------------------------------
|
||||
// Name: X121SMCLib
|
||||
// Description: provide all commonly used 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-saherelm.base.class.mq5"
|
||||
#include "../../Classes/x-saherelm.x-poi.drawer.class.mq5"
|
||||
#include "../../Helpers/x-saherelm.x121.helper.mq5"
|
||||
#include "../../Libraries/x-saherelm.common.lib.mq5"
|
||||
#include "../../Libraries/x-saherelm.x-poi.extensions.lib.mq5"
|
||||
#include "../../Libraries/x-saherelm.x-poi.lib.mq5"
|
||||
#include "../../Libraries/x-saherelm.x-trade.lib.mq5"
|
||||
|
||||
//
|
||||
// Definitions ...
|
||||
|
||||
//
|
||||
const string X121SMCStrategyToken = "X121SMC";
|
||||
|
||||
//
|
||||
const string X121SMCXWZToken = "X121XWZ";
|
||||
|
||||
//
|
||||
// X121 SMC Providers ...
|
||||
enum ENUM_X_121_SMC_PROVIDERS
|
||||
{
|
||||
//
|
||||
X_121_SMC_PROVIDER_NONE,
|
||||
X_121_SMC_PROVIDER_XWZ,
|
||||
};
|
||||
|
||||
//
|
||||
// Guard Actions ...
|
||||
enum ENUM_X_121_SMC_GUARD_ACTIONS
|
||||
{
|
||||
X_121_SMC_GUARD_ACTION_NONE, // Nothing to Do
|
||||
X_121_SMC_GUARD_ACTION_CLOSE, // Close Specified Position
|
||||
X_121_SMC_GUARD_ACTION_CLOSE_ALL, // Close All Positions
|
||||
X_121_SMC_GUARD_ACTION_CLOSE_LONGS, // Close All Long Positions
|
||||
X_121_SMC_GUARD_ACTION_CLOSE_SHORTS, // Close All Short Position
|
||||
X_121_SMC_GUARD_ACTION_PARTIAL_CLOSE, // Partial Close Specified Position
|
||||
X_121_SMC_GUARD_ACTION_TRAIL_STOP, // Trail Stop of Specified Position
|
||||
X_121_SMC_GUARD_ACTION_TRAIL_TARGET, // Trail Target of Specified Position
|
||||
X_121_SMC_GUARD_ACTION_HEDGE, // Hedge Specified Positions
|
||||
};
|
||||
|
||||
//
|
||||
// Each Market Cycle (Time Frame) Conditions
|
||||
// Model as this Structure ...
|
||||
struct X121SMCCycleConditions
|
||||
{
|
||||
//
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
XPOIState state;
|
||||
X121Conditions x121Conditions;
|
||||
|
||||
//
|
||||
void X121SMCStrategyConditions()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
/**
|
||||
* Cleanup ...
|
||||
*/
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
symbol = NULL;
|
||||
period = NULL;
|
||||
time = NULL;
|
||||
|
||||
//
|
||||
state.Clean();
|
||||
x121Conditions.Clean();
|
||||
|
||||
//
|
||||
ZeroMemory(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsValid()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = IsSpecifiedValid(symbol) &&
|
||||
IsSpecifiedValid(period) &&
|
||||
IsSpecifiedValid(time);
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Reporter Functions ...
|
||||
|
||||
/**
|
||||
* Generate Provided Scores ...
|
||||
*
|
||||
* @param bullishScore: Integer, reference ...
|
||||
* @param bearishScore: Integer, referenceF ...
|
||||
*/
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (!IsValid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
double bullScore = 0;
|
||||
double bearScore = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate Summary ...
|
||||
*
|
||||
* @param onlyCommons: Boolean ...
|
||||
* @param onlyConditions: Boolean ...
|
||||
* @param includeScores: Boolean ...
|
||||
* @param ignoreFalseConditions: Boolean ...
|
||||
* @param separator: String ...
|
||||
*
|
||||
* @return ( string )
|
||||
*/
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
"----------" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Unique Identifier ...
|
||||
*
|
||||
* @param forObject: Boolean ...
|
||||
*
|
||||
* @return ( string )
|
||||
*/
|
||||
string GetTag(
|
||||
bool forObject = false //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
string typeName = GetTypeName(this);
|
||||
|
||||
//
|
||||
if (!forObject)
|
||||
{
|
||||
result = typeName;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
result = typeName + "_" +
|
||||
symbol + "_" + ToString(period) + "_" +
|
||||
ToMD5(time);
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
};
|
||||
|
||||
//
|
||||
// Model Signalling Conditions ...
|
||||
struct X121SMCStrategyConditions
|
||||
{
|
||||
//
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
double sl;
|
||||
double tp;
|
||||
double target;
|
||||
string provider;
|
||||
ENUM_X_DIRECTION signalDir;
|
||||
|
||||
//
|
||||
void X121SMCStrategyConditions()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
/**
|
||||
* Cleanup ...
|
||||
*/
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
symbol = NULL;
|
||||
period = NULL;
|
||||
time = NULL;
|
||||
|
||||
//
|
||||
sl = 0;
|
||||
tp = 0;
|
||||
provider = NULL;
|
||||
signalDir = X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
ZeroMemory(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsValid()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = IsSpecifiedValid(symbol) &&
|
||||
IsSpecifiedValid(period) &&
|
||||
IsSpecifiedValid(time);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Conditions Has Valid Bullish Signal ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool HasBullishSignal()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
(sl > 0 ||
|
||||
tp > 0) &&
|
||||
IsValid() &&
|
||||
HasDirection(signalDir);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
IsBullish(signalDir);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Conditions Has Valid Bearish Signal ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool HasBearishSignal()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
(sl > 0 ||
|
||||
tp > 0) &&
|
||||
IsValid() &&
|
||||
HasDirection(signalDir);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
IsBearish(signalDir);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Reporter Functions ...
|
||||
|
||||
/**
|
||||
* Generate Provided Scores ...
|
||||
*
|
||||
* @param bullishScore: Integer, reference ...
|
||||
* @param bearishScore: Integer, referenceF ...
|
||||
*/
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (!IsValid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
double bullScore = 0;
|
||||
double bearScore = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate Summary ...
|
||||
*
|
||||
* @param onlyCommons: Boolean ...
|
||||
* @param onlyConditions: Boolean ...
|
||||
* @param includeScores: Boolean ...
|
||||
* @param ignoreFalseConditions: Boolean ...
|
||||
* @param separator: String ...
|
||||
*
|
||||
* @return ( string )
|
||||
*/
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
"----------" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Unique Identifier ...
|
||||
*
|
||||
* @param forObject: Boolean ...
|
||||
*
|
||||
* @return ( string )
|
||||
*/
|
||||
string GetTag(
|
||||
bool forObject = false //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
string typeName = GetTypeName(this);
|
||||
|
||||
//
|
||||
if (!forObject)
|
||||
{
|
||||
result = typeName;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
result = typeName + "_" +
|
||||
symbol + "_" + ToString(period) + "_" +
|
||||
ToMD5(time);
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
};
|
||||
|
||||
//
|
||||
// Model a Guard Action ...
|
||||
struct X121SMCGuard
|
||||
{
|
||||
//
|
||||
// Props ...
|
||||
ENUM_X_121_SMC_GUARD_ACTIONS action;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
string symbol;
|
||||
string provider;
|
||||
|
||||
//
|
||||
// Specified Position ...
|
||||
ulong ticket;
|
||||
|
||||
//
|
||||
// Partial Close ...
|
||||
double volumeMultiplier;
|
||||
|
||||
//
|
||||
// SL Trial ...
|
||||
double sl;
|
||||
|
||||
//
|
||||
// TP Trial ...
|
||||
double tp;
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
X121SMCGuard()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
/**
|
||||
* Cleanup ...
|
||||
*/
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
time = NULL;
|
||||
action = X_121_SMC_GUARD_ACTION_NONE;
|
||||
|
||||
//
|
||||
symbol = NULL;
|
||||
provider = NULL;
|
||||
|
||||
//
|
||||
ticket = 0;
|
||||
|
||||
//
|
||||
volumeMultiplier = 0;
|
||||
|
||||
//
|
||||
sl = 0;
|
||||
tp = 0;
|
||||
|
||||
//
|
||||
ZeroMemory(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsValid()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
IsValid(time) &&
|
||||
IsValid(symbol) &&
|
||||
IsValid(provider) &&
|
||||
action != X_121_SMC_GUARD_ACTION_NONE
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Validate Model Based On Specified Guard Actions ...
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Add Guard to Collection ...
|
||||
*
|
||||
* @param guard: X121SMCGuard instance ...
|
||||
* @param guards: X121SMCGuard instance Collection ...
|
||||
*
|
||||
* @return ( int )
|
||||
*/
|
||||
int AddGuard(
|
||||
X121SMCGuard &guard,
|
||||
X121SMCGuard &guards[] //
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
if (!guard.IsValid())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
AddRef(
|
||||
guard,
|
||||
guards //
|
||||
);
|
||||
|
||||
//
|
||||
result = ArraySize(guards);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
typedef void (*TOnX121SMCSignal)(
|
||||
XSignal &signal,
|
||||
X121SMCStrategyConditions &conditions //
|
||||
);
|
||||
|
||||
//
|
||||
// Extentions ...
|
||||
|
||||
/**
|
||||
* Validate a Signal Provider ...
|
||||
*
|
||||
* @param value: ENUM_X_121_SMC_PROVIDERS member ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsValid(ENUM_X_121_SMC_PROVIDERS value)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = value != X_121_SMC_PROVIDER_NONE;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a Signal Provider to String ...
|
||||
*
|
||||
* @param value: ENUM_X_121_SMC_PROVIDERS member ...
|
||||
*
|
||||
* @return ( string )
|
||||
*/
|
||||
string ToString(ENUM_X_121_SMC_PROVIDERS value)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
if (!IsValid(value))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
switch (value)
|
||||
{
|
||||
//
|
||||
case X_121_SMC_PROVIDER_XWZ:
|
||||
result = X121SMCXWZToken;
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse Specified String as a Signal Provider ...
|
||||
*
|
||||
* @param value: String ...
|
||||
*
|
||||
* @return ( ENUM_X_121_SMC_PROVIDERS )
|
||||
*/
|
||||
ENUM_X_121_SMC_PROVIDERS ParseProvider(string value)
|
||||
{
|
||||
//
|
||||
ENUM_X_121_SMC_PROVIDERS result = X_121_SMC_PROVIDER_NONE;
|
||||
|
||||
//
|
||||
if (!IsValid(value))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (Contains(X121SMCXWZToken, value))
|
||||
{
|
||||
result = X_121_SMC_PROVIDER_XWZ;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
Reference in New Issue
Block a user