Backup ...
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user