Backup ...

This commit is contained in:
2025-02-24 19:20:10 +03:30
parent a0307177a0
commit 8b79f5c87e
373 changed files with 175584 additions and 0 deletions
@@ -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;
}
//