943 lines
24 KiB
Plaintext
943 lines
24 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// 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)
|
|
{
|
|
//
|
|
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 ...
|
|
|
|
//
|
|
// 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 = bullishConsolidationZones[bullishConsolidationZonesCount - 1];
|
|
prevLastBearishZone = bullishConsolidationZones[bullishConsolidationZonesCount - 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;
|
|
}
|