Files
xMQL5/BKPS/14031106/Documents/BKP/1/x-121.smc.xobspv.signal.lib.mq5
T
2025-01-25 03:57:57 +03:30

1139 lines
24 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 X121 SMC Signal Class
// -------------------------------------------------
// Name: XOBSPV
// Description: provide all Signalling functions ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://www.saherelm.ir"
#property version "1.00"
#property strict
//
// Imports ...
#include "../Classes/x-121.smc.market.cycle.helper.class.mq5"
#include "../Libraries/x-121.smc.lib.mq5"
//
// Definitions ...
struct X121SMCStrategyXOBSPVSignalConditions
{
//
// Props ...
//
string symbol;
ENUM_TIMEFRAMES period;
//
double sl;
double target;
ENUM_X_DIRECTION dir;
ENUM_X_POSITION_TYPES type;
//
// Setup Props ...
//
datetime setupTime;
datetime triggerTime;
//
double pivot;
XPriceZones priceZone;
//
// Constructor ...
X121SMCStrategyXOBSPVSignalConditions()
{
Clean();
}
//
// Tools ...
/**
* Cleaning Up ...
*/
void Clean()
{
//
sl = 0;
target = 0;
//
dir = X_DIRECTION_NONE;
type = X_POSITION_TYPE_NONE;
//
symbol = NULL;
period = NULL;
setupTime = NULL;
triggerTime = NULL;
//
ExtensionClean();
}
/**
* Check Condition is Setting Up ...
*
* @param dir: ENUM_X_DIRECTION member, Setting Up Direction ...
*
* @return ( bool )
*/
bool IsSetuped()
{
//
bool result = false;
//
result = IsValid(setupTime) &&
HasDirection(dir);
if (!result)
{
return result;
}
//
return result;
}
/**
* Calculate Setup Age ...
*
* @return ( int )
*/
int GetSetupAge()
{
//
int result = 0;
//
if (!IsSetuped())
{
return result;
}
//
result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period);
//
return result;
}
/**
* Detect How we Can Trigger Signal ...
*
* @return ( bool )
*/
bool CanTrigger()
{
//
bool result = false;
//
result =
//
sl > 0 &&
IsValid(symbol) &&
IsValid(period) &&
IsValid(triggerTime) &&
type != X_POSITION_TYPE_ALL &&
type != X_POSITION_TYPE_NONE
//
;
//
return result;
}
//
// Extensions ...
/**
* Clean Additional Properties ...
*/
void ExtensionClean()
{
//
pivot = 0;
//
priceZone.Clean();
}
//
};
//
// Signaller Data Sources ...
X121SMCStrategyXOBSPVSignalConditions mXOBSPVConditions;
X121SMCStrategyXOBSPVSignalConditions mXOBSPVConditionsCollection[];
//
// Extension Functions ...
//
// Detect Setup Conditions ...
bool DetectX121SMCXOBSPVSiganlSetup(
string _symbol,
ENUM_TIMEFRAMES _period,
//
X121SMCStrategyXOBSPVSignalConditions &conditions,
//
XC121SMCCycleHelper *triggerCycleHelper,
XC121SMCCycleHelper *decisionCycleHelper,
XC121SMCCycleHelper *analyseCycleHelper,
XC121SMCCycleHelper *verificationCycleHelper,
XC121SMCCycleHelper *consolidationCycleHelper,
XC121SMCCycleHelper *visionCycleHelper
//
)
{
//
bool result = false;
//
bool isBullish = false;
bool isBearish = false;
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
int loopback = 10;
//
string symbol = _symbol;
ENUM_TIMEFRAMES period = _period;
//
conditions.symbol = symbol;
conditions.period = period;
//
XOHCL zBar;
result = zBar.Init(
symbol,
period,
zIndex //
);
if (!result)
{
return result;
}
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
return result;
}
//
double ask = GetAsk(symbol);
double bid = GetBid(symbol);
datetime cTime = TimeCurrent();
double points = GetPoints(symbol);
//
int swingLoopback = 9;
double ll = cBar.FindLowest(swingLoopback, MODE_LOW);
double hh = cBar.FindHighest(swingLoopback, MODE_HIGH);
double llDown = cBar.FindLowesttDown(swingLoopback);
double hhUp = cBar.FindHighestUp(swingLoopback);
//
// Cycles Conditions ...
//
// Trigger ...
ENUM_XPOI_EVENTS triggerPoiEvents[];
ENUM_X_CYCLE_EVENTS triggerCycleEvents[];
X121SMCCycleConditions triggerConditions;
result = triggerCycleHelper.GetConditions(
triggerCycleEvents,
triggerPoiEvents,
triggerConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Decision ...
ENUM_XPOI_EVENTS decisionPoiEvents[];
ENUM_X_CYCLE_EVENTS decisionCycleEvents[];
X121SMCCycleConditions decisionConditions;
result = decisionCycleHelper.GetConditions(
decisionCycleEvents,
decisionPoiEvents,
decisionConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Analyse ...
ENUM_XPOI_EVENTS analysePoiEvents[];
ENUM_X_CYCLE_EVENTS analyseCycleEvents[];
X121SMCCycleConditions analyseConditions;
result = analyseCycleHelper.GetConditions(
analyseCycleEvents,
analysePoiEvents,
analyseConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Verification ...
ENUM_XPOI_EVENTS verificationPoiEvents[];
ENUM_X_CYCLE_EVENTS verificationCycleEvents[];
X121SMCCycleConditions verificationConditions;
result = verificationCycleHelper.GetConditions(
verificationCycleEvents,
verificationPoiEvents,
verificationConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Consolidation ...
ENUM_XPOI_EVENTS consolidationPoiEvents[];
ENUM_X_CYCLE_EVENTS consolidationCycleEvents[];
X121SMCCycleConditions consolidationConditions;
result = consolidationCycleHelper.GetConditions(
consolidationCycleEvents,
consolidationPoiEvents,
consolidationConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Vision ...
ENUM_XPOI_EVENTS visionPoiEvents[];
ENUM_X_CYCLE_EVENTS visionCycleEvents[];
X121SMCCycleConditions visionConditions;
result = visionCycleHelper.GetConditions(
visionCycleEvents,
visionPoiEvents,
visionConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Cycles POI States ...
XPOIState triggerState = triggerConditions.state;
XPOIState decisionState = decisionConditions.state;
XPOIState analyseState = analyseConditions.state;
XPOIState verificationState = verificationConditions.state;
XPOIState consolidationState = consolidationConditions.state;
XPOIState visionState = visionConditions.state;
//
// Setup Conditions ...
//
// Waits for new Peak or Vale ...
//
// Reading Previous Conditions ...
ENUM_XPOI_EVENTS consolidationPoiEventsPrev[];
ENUM_X_CYCLE_EVENTS consolidationCycleEventsPrev[];
X121SMCCycleConditions consolidationConditionsPrev;
result = consolidationCycleHelper.GetConditions(
consolidationCycleEventsPrev,
consolidationPoiEventsPrev,
consolidationConditionsPrev,
cIndex,
loopback //
);
if (!result)
{
return result;
}
//
double decisionPeak = decisionConditions.x121Conditions.peaksBuffer[1];
double decisionVale = decisionConditions.x121Conditions.valesBuffer[1];
//
// Find Price Inside Zone ...
XPriceZones priceZone = conditions.priceZone;
bool hasPriceZones = conditions.priceZone.IsValid();
if (!hasPriceZones)
{
//
hasPriceZones = CalculatePriceInsideZones(
priceZone,
analyseState,
cBar //
);
//
if (hasPriceZones)
{
//
// Validate Price Zone ...
double upper = 0;
double lower = 0;
hasPriceZones = priceZone.GetBoundary(
X_DIRECTION_ALL,
upper,
lower //
);
result = hasPriceZones;
if (!result)
{
return result;
}
//
bool isValid = decisionPeak <= upper ||
decisionVale >= lower;
hasPriceZones = isValid;
result = hasPriceZones;
if (!result)
{
return result;
}
//
conditions.priceZone = priceZone;
}
}
//
// Detect Str Change Direction ...
//
bool isDecisionSarBullish = decisionConditions.x121Conditions.isSarBullish;
bool isDecisionSarBearish = decisionConditions.x121Conditions.isSarBearish;
//
bool isDecisionStrBullish = decisionConditions.x121Conditions.isStrBullish;
bool isDecisionStrBearish = decisionConditions.x121Conditions.isStrBearish;
//
bool isDecisionSarCrossedOverVale = decisionConditions.x121Conditions.isSarCrossedOverVale;
bool isDecisionSarCrossedUnderPeak = decisionConditions.x121Conditions.isSarCrossedUnderPeak;
//
bool isDecisionStrCrossedOverVale = decisionConditions.x121Conditions.isStrCrossedOverVale;
bool isDecisionStrCrossedUnderPeak = decisionConditions.x121Conditions.isStrCrossedUnderPeak;
//
bool isDecisionPeakOverAtrUpper = decisionConditions.x121Conditions.isPeakOverAtrUpper;
bool isDecisionValeUnderAtrLower = decisionConditions.x121Conditions.isValeUnderAtrLower;
//
bool isDecisionVWapBullishState = decisionConditions.x121Conditions.isVWapBullishState;
bool isDecisionVWapSwitchedToBullishState = decisionConditions.x121Conditions.isVWapSwitchedToBullishState;
//
bool isDecisionVWapBullishOrdered = decisionConditions.x121Conditions.isVWapBullishOrdered;
bool isDecisionVWapSwitchedToBullishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBullishOrdered;
//
bool isDecisionVWapBearishState = decisionConditions.x121Conditions.isVWapBearishState;
bool isDecisionVWapSwitchedToBearishState = decisionConditions.x121Conditions.isVWapSwitchedToBearishState;
//
bool isDecisionVWapBearishOrdered = decisionConditions.x121Conditions.isVWapBearishOrdered;
bool isDecisionVWapSwitchedToBearishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBearishOrdered;
//
bool isDecisionStrUpperOverPeak = decisionConditions.x121Conditions.isStrUpperOverPeak;
bool isDecisionStrLowerOverVale = decisionConditions.x121Conditions.isStrLowerOverVale;
//
bool isDecisionStrUpperUnderPeak = decisionConditions.x121Conditions.isStrUpperUnderPeak;
bool isDecisionStrLowerUnderVale = decisionConditions.x121Conditions.isStrLowerUnderVale;
//
bool isDecisionDonLowUpperLesserThanDonCloseUpper =
decisionConditions.x121Conditions.donLowUpperBuffer[1] <
decisionConditions.x121Conditions.donCloseUpperBuffer[1];
//
bool isDecisionDonHighLowerGreaterThanDonCloseLower =
decisionConditions.x121Conditions.donHighLowerBuffer[1] <
decisionConditions.x121Conditions.donCloseLowerBuffer[1];
//
// Summarize Conditions ...
//
isBullish =
//
isDecisionValeUnderAtrLower
//
&&
//
isDecisionDonHighLowerGreaterThanDonCloseLower
//
&&
//
(
//
isDecisionVWapBullishState ||
isDecisionVWapBullishOrdered
//
)
//
&&
//
(
//
isDecisionStrUpperOverPeak ||
isDecisionStrLowerOverVale
//
)
//
&&
//
(
//
(
//
isDecisionStrBullish &&
isDecisionSarCrossedOverVale
//
)
//
||
//
(
//
isDecisionSarBullish &&
isDecisionStrCrossedOverVale
//
)
//
)
//
;
//
isBearish =
//
isDecisionPeakOverAtrUpper
//
&&
//
isDecisionDonLowUpperLesserThanDonCloseUpper
//
&&
//
(
//
isDecisionVWapBearishState ||
isDecisionVWapBearishOrdered
//
)
//
&&
//
(
//
isDecisionStrUpperUnderPeak ||
isDecisionStrLowerUnderVale
//
)
//
&&
//
(
//
(
//
isDecisionStrBearish &&
isDecisionSarCrossedUnderPeak
//
)
//
||
//
(
//
isDecisionSarBearish &&
isDecisionStrCrossedUnderPeak //
)
//
)
//
;
//
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
conditions.setupTime = cTime;
conditions.dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
return result;
}
//
// Detect Trigger Conditions ...
bool DetectX121SMCXOBSPVSiganlTrigger(
//
X121SMCStrategyXOBSPVSignalConditions &conditions,
//
string _symbol,
ENUM_TIMEFRAMES _period,
//
XC121SMCCycleHelper *triggerCycleHelper,
XC121SMCCycleHelper *decisionCycleHelper,
XC121SMCCycleHelper *analyseCycleHelper,
XC121SMCCycleHelper *verificationCycleHelper,
XC121SMCCycleHelper *consolidationCycleHelper,
XC121SMCCycleHelper *visionCycleHelper,
//
int maxAllowedSetupAge = 60 //
//
)
{
//
bool result = false;
//
result = conditions.IsSetuped();
if (!result)
{
return result;
}
//
datetime setupTime = conditions.setupTime;
ENUM_X_DIRECTION setupDir = conditions.dir;
//
bool isBullish = IsBullish(setupDir);
bool isBearish = IsBearish(setupDir);
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
int loopback = 10;
//
string symbol = _symbol;
ENUM_TIMEFRAMES period = _period;
//
XOHCL zBar;
result = zBar.Init(
symbol,
period,
zIndex //
);
if (!result)
{
return result;
}
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
return result;
}
//
double ask = GetAsk(symbol);
double bid = GetBid(symbol);
datetime cTime = TimeCurrent();
double points = GetPoints(symbol);
//
int swingLoopback = 9;
double ll = cBar.FindLowest(swingLoopback, MODE_LOW);
double hh = cBar.FindHighest(swingLoopback, MODE_HIGH);
double llDown = cBar.FindLowesttDown(swingLoopback);
double hhUp = cBar.FindHighestUp(swingLoopback);
//
// Cycles Conditions ...
//
// Trigger ...
ENUM_XPOI_EVENTS triggerPoiEvents[];
ENUM_X_CYCLE_EVENTS triggerCycleEvents[];
X121SMCCycleConditions triggerConditions;
result = triggerCycleHelper.GetConditions(
triggerCycleEvents,
triggerPoiEvents,
triggerConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Decision ...
ENUM_XPOI_EVENTS decisionPoiEvents[];
ENUM_X_CYCLE_EVENTS decisionCycleEvents[];
X121SMCCycleConditions decisionConditions;
result = decisionCycleHelper.GetConditions(
decisionCycleEvents,
decisionPoiEvents,
decisionConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Analyse ...
ENUM_XPOI_EVENTS analysePoiEvents[];
ENUM_X_CYCLE_EVENTS analyseCycleEvents[];
X121SMCCycleConditions analyseConditions;
result = analyseCycleHelper.GetConditions(
analyseCycleEvents,
analysePoiEvents,
analyseConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Verification ...
ENUM_XPOI_EVENTS verificationPoiEvents[];
ENUM_X_CYCLE_EVENTS verificationCycleEvents[];
X121SMCCycleConditions verificationConditions;
result = verificationCycleHelper.GetConditions(
verificationCycleEvents,
verificationPoiEvents,
verificationConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Consolidation ...
ENUM_XPOI_EVENTS consolidationPoiEvents[];
ENUM_X_CYCLE_EVENTS consolidationCycleEvents[];
X121SMCCycleConditions consolidationConditions;
result = consolidationCycleHelper.GetConditions(
consolidationCycleEvents,
consolidationPoiEvents,
consolidationConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Vision ...
ENUM_XPOI_EVENTS visionPoiEvents[];
ENUM_X_CYCLE_EVENTS visionCycleEvents[];
X121SMCCycleConditions visionConditions;
result = visionCycleHelper.GetConditions(
visionCycleEvents,
visionPoiEvents,
visionConditions,
zIndex,
loopback //
);
if (!result)
{
return result;
}
//
// Cycles POI States ...
XPOIState triggerState = triggerConditions.state;
XPOIState decisionState = decisionConditions.state;
XPOIState analyseState = analyseConditions.state;
XPOIState verificationState = verificationConditions.state;
XPOIState consolidationState = consolidationConditions.state;
XPOIState visionState = visionConditions.state;
//
// Trigger Conditions ...
//
double decisionLastBullishStr = decisionCycleHelper.mX121Helper.xstrHelper.GetLastSTR(X_DIRECTION_BULLISH);
double decisionLastBearishStr = decisionCycleHelper.mX121Helper.xstrHelper.GetLastSTR(X_DIRECTION_BEARISH);
//
bool isDecisionLastBearishStrBreakedUp = IsBarBreak(
decisionLastBearishStr,
X_DIRECTION_BULLISH,
cBar //
);
//
bool isDecisionLastBullishStrBreakedDown = IsBarBreak(
decisionLastBullishStr,
X_DIRECTION_BEARISH,
cBar //
);
//
// Detect Bullish Conditions ...
isBullish =
//
isBullish &&
cBar.IsBullish() &&
isDecisionLastBearishStrBreakedUp
//
;
//
// Detect Bearish Conditions ...
isBearish =
//
isBearish &&
cBar.IsBearish() &&
isDecisionLastBullishStrBreakedDown
//
;
//
result = isBullish ||
isBearish;
if (!result)
{
//
// Cleanup Setup Conditions ...
int setupAge = conditions.GetSetupAge();
if (IsValidSize(setupAge) &&
IsValidSize(maxAllowedSetupAge) &&
setupAge >= maxAllowedSetupAge)
{
conditions.Clean();
}
//
return result;
}
//
// Detect Nearest Pivot Point ...
//
// Detect Target ...
double target = CalculateTarget(
cBar,
analyseState,
setupDir //
);
if (target == 0)
{
//
target = CalculateTarget(
cBar,
verificationState,
setupDir //
);
}
//
double oppositTarget = CalculateTarget(
cBar,
analyseState,
Opposit(setupDir) //
);
//
double entry = GetEntry(
conditions.symbol,
setupDir //
);
//
// Filling SL Candidates ...
//
double sls[];
//
double iAtr = decisionConditions.x121Conditions.atrBuffer[1];
double iPeak = decisionConditions.x121Conditions.peaksBuffer[1];
double iVale = decisionConditions.x121Conditions.valesBuffer[1];
//
if (isBullish)
{
//
int lowerValeIDX = -1;
double lowerVale = triggerCycleHelper.mX121Helper.xpvHelper.GetLowerVale(
lowerValeIDX,
iVale //
);
if (lowerVale > 0)
{
//
Add(
lowerVale,
sls //
);
}
//
Add(
iVale,
sls //
);
}
else if (isBearish)
{
//
int higherPeakIDX = -1;
double higherPeak = triggerCycleHelper.mX121Helper.xpvHelper.GetHigherPeak(
higherPeakIDX,
iPeak //
);
if (higherPeak > 0)
{
//
Add(
higherPeak,
sls //
);
}
//
Add(
iPeak,
sls //
);
}
//
double slsMin = GetMin(sls);
double slsMax = GetMax(sls);
//
double sl = isBullish
? slsMin - iAtr
: slsMax + iAtr;
double risk = MathAbs(entry - sl);
double targetDelta = 2 * (risk / 3);
if (target == 0)
{
//
int minTargetPint = 50;
double minTargetPointValue = minTargetPint * points;
if (targetDelta < minTargetPointValue)
{
targetDelta = minTargetPointValue;
}
//
// Force Target On Half Risk ...
target =
isBullish
? entry + targetDelta
: entry - targetDelta;
//
target = 0;
//
}
//
// Ignore Target ...
target = 0;
//
// Filling Conditions Props ...
conditions.sl = sl;
conditions.target = target;
conditions.triggerTime = cTime;
conditions.type = isBullish
? X_POSITION_TYPE_LONG
: X_POSITION_TYPE_SHORT;
//
return result;
}
//
int AddX121SMCXOBSPVConditionsIfNotExists(
X121SMCStrategyXOBSPVSignalConditions &item,
X121SMCStrategyXOBSPVSignalConditions &items[],
int maxAllowed = 10 //
)
{
//
int result = 0;
//
bool isSetuped = IsValid(item.setupTime) &&
HasDirection(item.dir);
if (!isSetuped)
{
return result;
}
//
int count = ArraySize(items);
if (IsValidSize(count))
{
//
// Copy Original Items ...
X121SMCStrategyXOBSPVSignalConditions tmpItems[];
Copy(
items,
tmpItems //
);
//
// Prese Item Data ...
bool isBullish = IsBullish(item.dir);
//
for (int i = 0; i < count; i++)
{
//
X121SMCStrategyXOBSPVSignalConditions iItem = tmpItems[i];
//
bool canRemove = item.dir == iItem.dir &&
item.pivot == iItem.pivot;
if (canRemove)
{
//
ArrayRemove(
items,
i,
1 //
);
}
}
//
Clean(tmpItems);
}
//
AddRef(
item,
items //
);
//
// Remove Olds ...
CleanupArray(
items,
maxAllowed //
);
//
result = ArraySize(items);
//
return result;
}
//