Files
MQL5Data/X121SMCEA/Signals/x-121.smc.xstrpv.signal.lib.mq5
T

1693 lines
41 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 X121 SMC Signal Class
// -------------------------------------------------
// Name: XSTRPV
// 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 X121SMCStrategyXSTRPVSignalConditions
{
//
// 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;
double point;
//
// Constructor ...
X121SMCStrategyXSTRPVSignalConditions()
{
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;
point = 0;
}
//
};
//
// Signaller Data Sources ...
X121SMCStrategyXSTRPVSignalConditions mXSTRPVConditions;
X121SMCStrategyXSTRPVSignalConditions mXSTRPVConditionsCollection[];
//
// Extension Functions ...
//
// Detect Setup Conditions ...
bool DetectX121SMCXSTRPVSiganlSetup(
string _symbol,
ENUM_TIMEFRAMES _period,
//
X121SMCStrategyXSTRPVSignalConditions &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 = 3;
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;
}
//
// Setup Conditions ...
//
// Detect Trend ...
//
ENUM_X_DIRECTION marketDir;
bool hasMarketDir = decisionCycleHelper.DetectMarketStructure(marketDir);
//
bool hasBullishTrend =
hasMarketDir &&
IsBullish(marketDir);
//
bool hasBearishTrend =
hasMarketDir &&
IsBearish(marketDir);
//
// Reading Bar State ...
//
// Engulf ...
ENUM_X_DIRECTION cBarEngulfDir;
bool isCBarEngulfed = decisionCycleHelper
.mBarAnalyser
.IsEngulfBar(
cBar,
cBarEngulfDir,
0 // Extended ...
);
bool isCBarBullishEngulfed =
isCBarEngulfed &&
IsBullish(cBarEngulfDir);
bool isCBarBearishEngulfed =
isCBarEngulfed &&
IsBearish(cBarEngulfDir);
//
// Momentum ...
ENUM_X_DIRECTION cBarMomentumDir;
bool isCBarMomentum = decisionCycleHelper
.mBarAnalyser
.IsMomentumBar(
cBar,
cBarMomentumDir,
0 // Extended ...
);
bool isCBarBullishMomentum =
isCBarMomentum &&
IsBullish(cBarMomentumDir);
bool isCBarBearishMomentum =
isCBarMomentum &&
IsBearish(cBarMomentumDir);
//
// Reject ...
ENUM_X_DIRECTION cBarRejectDir;
bool isCBarRejected = decisionCycleHelper
.mBarAnalyser
.IsRejectionBar(
cBar,
cBarRejectDir,
0 // Extended ...
);
bool isCBarBullishRejected =
isCBarRejected &&
IsBullish(cBarRejectDir);
bool isCBarBearishRejected =
isCBarRejected &&
IsBearish(cBarRejectDir);
//
// HH/LL Break ...
//
bool isCBarBreaksUpHH = IsBarBreak(
hh,
X_DIRECTION_BULLISH,
cBar //
);
//
bool isCBarBreaksDownLL = IsBarBreak(
hh,
X_DIRECTION_BEARISH,
cBar //
);
//
// Bar Checking Summary ...
//
// Bullish ...
bool isCBarBullishFormed =
//
isCBarBreaksUpHH ||
isCBarBullishEngulfed ||
isCBarBullishMomentum ||
isCBarBullishRejected
//
;
//
// Bearish ...
bool isCBarBearishFormed =
//
isCBarBreaksDownLL ||
isCBarBearishEngulfed ||
isCBarBearishMomentum ||
isCBarBearishRejected
//
;
//
// Read Slopes ...
double rsiSlope = decisionConditions.x121Conditions.rsiSlope;
double strSlope = decisionConditions.x121Conditions.strSlope;
double atrUpperSlope = decisionConditions.x121Conditions.atrUpperSlope;
double atrLowerSlope = decisionConditions.x121Conditions.atrLowerSlope;
double vwapFastSlope = decisionConditions.x121Conditions.vwapFastSlope;
double vwapMidSlope = decisionConditions.x121Conditions.vwapMidSlope;
double vwapSlowSlope = decisionConditions.x121Conditions.vwapSlowSlope;
//
bool isRsiSlopeBullish = decisionConditions.x121Conditions.isRsiSlopeBullish;
bool isStrSlopeBullish = decisionConditions.x121Conditions.isStrSlopeBullish;
bool isAtrUpperSlopeBullish = decisionConditions.x121Conditions.isAtrUpperSlopeBullish;
bool isAtrLowerSlopeBullish = decisionConditions.x121Conditions.isAtrLowerSlopeBullish;
bool isVwapFastSlopeBullish = decisionConditions.x121Conditions.isVwapFastSlopeBullish;
bool isVwapMidSlopeBullish = decisionConditions.x121Conditions.isVwapMidSlopeBullish;
bool isVwapSlowSlopeBullish = decisionConditions.x121Conditions.isVwapSlowSlopeBullish;
//
bool isRsiSlopeBearish = decisionConditions.x121Conditions.isRsiSlopeBearish;
bool isStrSlopeBearish = decisionConditions.x121Conditions.isStrSlopeBearish;
bool isAtrUpperSlopeBearish = decisionConditions.x121Conditions.isAtrUpperSlopeBearish;
bool isAtrLowerSlopeBearish = decisionConditions.x121Conditions.isAtrLowerSlopeBearish;
bool isVwapFastSlopeBearish = decisionConditions.x121Conditions.isVwapFastSlopeBearish;
bool isVwapMidSlopeBearish = decisionConditions.x121Conditions.isVwapMidSlopeBearish;
bool isVwapSlowSlopeBearish = decisionConditions.x121Conditions.isVwapSlowSlopeBearish;
//
bool isSlopesBullish =
isRsiSlopeBullish &&
isVwapMidSlopeBullish &&
isAtrUpperSlopeBullish &&
isAtrLowerSlopeBullish &&
isVwapFastSlopeBullish &&
isVwapSlowSlopeBullish;
//
bool isSlopesBearish =
isRsiSlopeBearish &&
isVwapMidSlopeBearish &&
isAtrUpperSlopeBearish &&
isAtrLowerSlopeBearish &&
isVwapFastSlopeBearish &&
isVwapSlowSlopeBearish;
//
// RSI ...
//
double rsiMult1 = 2;
double rsiMult2 = 2;
//
double rsi = decisionConditions.x121Conditions.rsiBuffer[1];
//
bool isRsiOverSold = decisionConditions.x121Conditions.isRsiOverSold;
bool isRsiOverBought = decisionConditions.x121Conditions.isRsiOverBought;
//
bool isRsiCrossedOverOverSold = decisionConditions.x121Conditions.isRsiCrossedOverOverSold;
bool isRsiCrossedUnderOverBought = decisionConditions.x121Conditions.isRsiCrossedUnderOverBought;
//
bool isRsiBullishFormed =
//
(rsiSlope > rsiMult2)
//
||
//
(rsiSlope > rsiMult1 &&
isRsiCrossedOverOverSold)
//
;
//
bool isRsiBearishFormed =
//
(rsiSlope < (-1 * rsiMult2))
//
||
//
(rsiSlope < (-1 * rsiMult1) &&
isRsiCrossedUnderOverBought)
//
;
//
// SAR ...
//
double sar = decisionConditions.x121Conditions.sarBuffer[1];
double sarPrev = decisionConditions.x121Conditions.sarBuffer[2];
//
bool isSarBullish = decisionConditions.x121Conditions.isSarBullish;
bool isSarBearish = decisionConditions.x121Conditions.isSarBearish;
//
bool isSarSwitchedToBullish = decisionConditions.x121Conditions.isSarSwitchedToBullish;
bool isSarSwitchedToBearish = decisionConditions.x121Conditions.isSarSwitchedToBearish;
//
bool isPrevSarBreakedUp = IsBarBreak(
sarPrev,
X_DIRECTION_BULLISH,
cBar //
);
bool isPrevSarBreakedDown = IsBarBreak(
sarPrev,
X_DIRECTION_BEARISH,
cBar //
);
//
// ATR ...
//
double atr = decisionConditions.x121Conditions.atrBuffer[1];
double atrUpper = decisionConditions.x121Conditions.atrUpperBuffer[1];
double atrLower = decisionConditions.x121Conditions.atrLowerBuffer[1];
//
bool isAtrUpperBullishSlope = atrUpperSlope > 0;
bool isAtrLowerBullishSlope = atrLowerSlope > 0;
//
bool isAtrUpperBearishSlope = atrUpperSlope < 0;
bool isAtrLowerBearishSlope = atrLowerSlope < 0;
//
bool isAtrBullishSlope = isAtrUpperBullishSlope &&
isAtrLowerBullishSlope;
bool isAtrBearishSlope = isAtrUpperBearishSlope &&
isAtrLowerBearishSlope;
//
// STR ...
//
double str = decisionConditions.x121Conditions.strBuffer[1];
//
bool isStrBullish = decisionConditions.x121Conditions.isStrBullish;
bool isStrBearish = decisionConditions.x121Conditions.isStrBearish;
//
bool isStrSwitchedToBullish = decisionConditions.x121Conditions.isStrSwitchedToBullish;
bool isStrSwitchedToBearish = decisionConditions.x121Conditions.isStrSwitchedToBearish;
//
// PV ...
//
double peak = decisionConditions.x121Conditions.peaksBuffer[1];
double vale = decisionConditions.x121Conditions.valesBuffer[1];
//
bool isPeakIncreasing = IsIncreasing(decisionConditions.x121Conditions.peaksBuffer);
bool isPeakDecreasing = IsDecreasing(decisionConditions.x121Conditions.peaksBuffer);
//
bool isValeIncreasing = IsIncreasing(decisionConditions.x121Conditions.valesBuffer);
bool isValeDecreasing = IsDecreasing(decisionConditions.x121Conditions.valesBuffer);
//
bool isPVIncreasing = (isPeakIncreasing &&
isValeIncreasing) &&
!(isPeakDecreasing &&
isValeDecreasing);
bool isPVDecreasing = (isPeakDecreasing &&
isValeDecreasing) &&
!(isPeakIncreasing &&
isValeIncreasing);
//
bool isNewPeak = decisionConditions.x121Conditions.isNewPeak;
bool isNewPeakOverLast = decisionConditions.x121Conditions.isNewPeakOverLast;
bool isNewPeakUnderLast = decisionConditions.x121Conditions.isNewPeakUnderLast;
//
bool isNewVale = decisionConditions.x121Conditions.isNewVale;
bool isNewValeOverLast = decisionConditions.x121Conditions.isNewValeOverLast;
bool isNewValeUnderLast = decisionConditions.x121Conditions.isNewValeUnderLast;
//
bool isPVBullishFormed =
isPVIncreasing ||
isNewPeakOverLast ||
isNewValeOverLast;
//
bool isPVBearishFormed =
isPVDecreasing ||
isNewPeakUnderLast ||
isNewValeUnderLast;
//
// VWAP ...
//
bool isVWapFastOverMid = decisionConditions.x121Conditions.isVWapFastOverMid;
bool isVWapFastUnderMid = decisionConditions.x121Conditions.isVWapFastUnderMid;
//
bool isVWapBullishState = decisionConditions.x121Conditions.isVWapBullishState;
bool isVWapBearishState = decisionConditions.x121Conditions.isVWapBearishState;
//
bool isVWapSwitchedToBullishState = decisionConditions.x121Conditions.isVWapSwitchedToBullishState;
bool isVWapSwitchedToBearishState = decisionConditions.x121Conditions.isVWapSwitchedToBearishState;
//
bool isVWapBullishOrdered = decisionConditions.x121Conditions.isVWapBullishOrdered;
bool isVWapBearishOrdered = decisionConditions.x121Conditions.isVWapBearishOrdered;
//
bool isVWapSwitchedToBullishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBullishOrdered;
bool isVWapSwitchedToBearishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBearishOrdered;
//
bool isVWapMinBreakedUp = decisionConditions.x121Conditions.isVWapMinBreakedUp;
bool isVWapMaxBreakedUp = decisionConditions.x121Conditions.isVWapMaxBreakedUp;
//
bool isVWapMinBreakedDown = decisionConditions.x121Conditions.isVWapMinBreakedDown;
bool isVWapMaxBreakedDown = decisionConditions.x121Conditions.isVWapMaxBreakedDown;
//
bool isVWapFastCrossedOverMid = decisionConditions.x121Conditions.isVWapFastCrossedOverMid;
bool isVWapFastCrossedUnderMid = decisionConditions.x121Conditions.isVWapFastCrossedUnderMid;
//
bool isVWapFastCrossedOverSlow = decisionConditions.x121Conditions.isVWapFastCrossedOverSlow;
bool isVWapFastCrossedUnderSlow = decisionConditions.x121Conditions.isVWapFastCrossedUnderSlow;
//
bool isClosedOverVWapMin = decisionConditions.x121Conditions.isClosedOverVWapMin;
bool isClosedUnderVWapMin = decisionConditions.x121Conditions.isClosedUnderVWapMin;
//
bool isClosedOverVWapMax = decisionConditions.x121Conditions.isClosedOverVWapMax;
bool isClosedUnderVWapMax = decisionConditions.x121Conditions.isClosedUnderVWapMax;
//
bool isVWapBullishSlope =
vwapFastSlope > 0 &&
vwapMidSlope > 0 &&
vwapSlowSlope > 0;
//
bool isVWapBearishSlope =
vwapFastSlope < 0 &&
vwapMidSlope < 0 &&
vwapSlowSlope < 0;
//
bool isVWapBullishFormed =
//
isVWapBullishSlope
//
&&
//
(
//
(isVWapBullishOrdered &&
isVWapSwitchedToBullishState)
//
||
//
(isVWapBullishState &&
isVWapSwitchedToBullishOrdered)
//
||
//
((isVWapMaxBreakedUp ||
isClosedOverVWapMax) &&
(isVWapFastCrossedOverMid ||
isVWapFastCrossedOverSlow))
//
)
//
;
//
bool isVWapBearishFormed =
//
isVWapBearishSlope
//
&&
//
(
//
(isVWapBearishOrdered &&
isVWapSwitchedToBearishState)
//
||
//
(isVWapBearishState &&
isVWapSwitchedToBearishOrdered)
//
||
//
((isVWapMinBreakedDown ||
isClosedUnderVWapMin) &&
(isVWapFastCrossedUnderMid ||
isVWapFastCrossedUnderSlow))
//
)
//
;
//
// Complext ...
//
bool isSarIncreased = decisionConditions.x121Conditions.isSarIncreased;
bool isSarDecreased = decisionConditions.x121Conditions.isSarDecreased;
bool isSarEqualsToPeak = decisionConditions.x121Conditions.isSarEqualsToPeak;
bool isSarEqualsToVale = decisionConditions.x121Conditions.isSarEqualsToVale;
bool isStrEqualsToPeak = decisionConditions.x121Conditions.isStrEqualsToPeak;
bool isStrEqualsToVale = decisionConditions.x121Conditions.isStrEqualsToVale;
bool isStrUpperOverPeak = decisionConditions.x121Conditions.isStrUpperOverPeak;
bool isPeakOverAtrUpper = decisionConditions.x121Conditions.isPeakOverAtrUpper;
bool isStrLowerOverVale = decisionConditions.x121Conditions.isStrLowerOverVale;
bool isBreakedUpPrevSar = decisionConditions.x121Conditions.isBreakedUpPrevSar;
bool isBreakedUpPrevStr = decisionConditions.x121Conditions.isBreakedUpPrevStr;
bool isStrLowerUnderVale = decisionConditions.x121Conditions.isStrLowerUnderVale;
bool isStrUpperUnderPeak = decisionConditions.x121Conditions.isStrUpperUnderPeak;
bool isValeUnderAtrLower = decisionConditions.x121Conditions.isValeUnderAtrLower;
bool isSarCrossedOverVale = decisionConditions.x121Conditions.isSarCrossedOverVale;
bool isStrCrossedOverVale = decisionConditions.x121Conditions.isStrCrossedOverVale;
bool isBreakedDownPrevStr = decisionConditions.x121Conditions.isBreakedDownPrevStr;
bool isBreakedDownPrevSar = decisionConditions.x121Conditions.isBreakedDownPrevSar;
bool isSarCrossedUnderPeak = decisionConditions.x121Conditions.isSarCrossedUnderPeak;
bool isStrCrossedUnderPeak = decisionConditions.x121Conditions.isStrCrossedUnderPeak;
bool isNewPeakOverAtrUpper = decisionConditions.x121Conditions.isNewPeakOverAtrUpper;
bool isNewValeUnderAtrLower = decisionConditions.x121Conditions.isNewValeUnderAtrLower;
bool isStrUpperOverAtrUpper = decisionConditions.x121Conditions.isStrUpperOverAtrUpper;
bool isStrLowerOverAtrLower = decisionConditions.x121Conditions.isStrLowerOverAtrLower;
bool isStrUpperUnderAtrUpper = decisionConditions.x121Conditions.isStrUpperUnderAtrUpper;
bool isStrLowerUnderAtrLower = decisionConditions.x121Conditions.isStrLowerUnderAtrLower;
bool isBreakedUpPrevAtrUpper = decisionConditions.x121Conditions.isBreakedUpPrevAtrUpper;
bool isBreakedUpPrevAtrLower = decisionConditions.x121Conditions.isBreakedUpPrevAtrLower;
bool isBreakedDownPrevAtrUpper = decisionConditions.x121Conditions.isBreakedDownPrevAtrUpper;
bool isBreakedDownPrevAtrLower = decisionConditions.x121Conditions.isBreakedDownPrevAtrLower;
bool isDonLowLowerEqualsToVale = decisionConditions.x121Conditions.isDonLowLowerEqualsToVale;
bool isStrUpperCrossedOverPeak = decisionConditions.x121Conditions.isStrUpperCrossedOverPeak;
bool isStrLowerCrossedOverVale = decisionConditions.x121Conditions.isStrLowerCrossedOverVale;
bool isStrLowerOverDonLowLower = decisionConditions.x121Conditions.isStrLowerOverDonLowLower;
bool isStrUpperOverDonHighUpper = decisionConditions.x121Conditions.isStrUpperOverDonHighUpper;
bool isStrLowerUnderDonLowLower = decisionConditions.x121Conditions.isStrLowerUnderDonLowLower;
bool isDonHighUpperEqualsToPeak = decisionConditions.x121Conditions.isDonHighUpperEqualsToPeak;
bool isStrUpperCrossedUnderPeak = decisionConditions.x121Conditions.isStrUpperCrossedUnderPeak;
bool isStrLowerCrossedUnderVale = decisionConditions.x121Conditions.isStrLowerCrossedUnderVale;
bool isStrUpperUnderDonHighUpper = decisionConditions.x121Conditions.isStrUpperUnderDonHighUpper;
bool isStrLowerCrossedOverAtrLower = decisionConditions.x121Conditions.isStrLowerCrossedOverAtrLower;
bool isStrUpperCrossedOverAtrUpper = decisionConditions.x121Conditions.isStrUpperCrossedOverAtrUpper;
bool isStrUpperCrossedUnderAtrUpper = decisionConditions.x121Conditions.isStrUpperCrossedUnderAtrUpper;
bool isStrLowerCrossedUnderAtrLower = decisionConditions.x121Conditions.isStrLowerCrossedUnderAtrLower;
bool isStrLowerCrossedOverDonLowLower = decisionConditions.x121Conditions.isStrLowerCrossedOverDonLowLower;
bool isStrUpperCrossedOverDonHighUpper = decisionConditions.x121Conditions.isStrUpperCrossedOverDonHighUpper;
bool isStrLowerCrossedUnderDonLowLower = decisionConditions.x121Conditions.isStrLowerCrossedUnderDonLowLower;
bool isStrUpperCrossedUnderDonHighUpper = decisionConditions.x121Conditions.isStrUpperCrossedUnderDonHighUpper;
//
XPriceZones priceZones;
bool hasPriceZones = CalculatePriceInsideZones(
priceZones,
analyseState,
cBar //
);
double priceZonesUpper = 0;
double priceZonesLower = 0;
bool isPriceZoneValidForPeak = false;
bool isPriceZoneValidForVale = false;
if (hasPriceZones)
{
//
bool hasBoundary = priceZones.GetBoundary(
X_DIRECTION_ALL,
priceZonesUpper,
priceZonesLower //
);
//
isPriceZoneValidForPeak =
hasBoundary &&
peak <= priceZonesUpper &&
peak >= priceZonesLower;
//
isPriceZoneValidForVale =
hasBoundary &&
vale <= priceZonesUpper &&
vale >= priceZonesLower;
}
//
//
//
//
// Method 1 ...
// VWap Switch Start ...
//
bool bullishMethod1 =
//
isSarBullish &&
isStrBullish &&
isSlopesBullish &&
hasBullishTrend &&
cBar.IsBullish() &&
isAtrBullishSlope &&
isPVBullishFormed &&
isRsiBullishFormed &&
isVWapBullishFormed
//
;
//
bool bearishMethod1 =
//
isSarBearish &&
isStrBearish &&
isSlopesBearish &&
hasBearishTrend &&
cBar.IsBearish() &&
isAtrBearishSlope &&
isPVBearishFormed &&
isRsiBearishFormed &&
isVWapBearishFormed
//
;
//
// Method 2 ...
// PV Start ...
//
bool bullishMethod2 =
//
false
// isStrCrossedOverVale
//
;
//
bool bearishMethod2 =
//
!isNewVale &&
(
//
isStrCrossedUnderPeak
//
||
//
(isPrevSarBreakedDown &&
isStrSwitchedToBearish)
//
)
//
;
//
//
// Summarize Conditions ...
//
isBullish =
//
// bullishMethod1
// //
// ||
//
bullishMethod2
//
;
//
isBearish =
//
// bearishMethod1
// //
// ||
//
bearishMethod2
//
;
//
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
conditions.point =
isBullish
? vale
: peak;
conditions.setupTime = cTime;
conditions.dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
double point = GetEntry(
conditions.symbol,
conditions.dir //
);
conditions.point = point;
//
return result;
}
//
// Detect Trigger Conditions ...
bool DetectX121SMCXSTRPVSiganlTrigger(
//
X121SMCStrategyXSTRPVSignalConditions &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 ...
//
// SAR ...
double sar = decisionConditions.x121Conditions.sarBuffer[1];
//
// STR ...
double str = decisionConditions.x121Conditions.strBuffer[1];
//
// ATR ...
double atrUpper = decisionConditions.x121Conditions.atrUpperBuffer[1];
double atrLower = decisionConditions.x121Conditions.atrLowerBuffer[1];
//
// PV ...
double peak = decisionConditions.x121Conditions.peaksBuffer[1];
double vale = decisionConditions.x121Conditions.valesBuffer[1];
//
int higherPeakIDX = -1;
double higherPeak = decisionCycleHelper
.mX121Helper
.xpvHelper.GetHigherPeak(
higherPeakIDX,
peak //
);
//
int lowerValeIDX = -1;
double lowerVale = decisionCycleHelper
.mX121Helper
.xpvHelper.GetLowerVale(
lowerValeIDX,
vale //
);
//
double point = conditions.point;
bool isPointBreak = IsBarBreak(
point,
setupDir,
cBar //
);
//
// Detect Bullish Conditions ...
isBullish =
//
isBullish &&
isPointBreak &&
cBar.IsBullish()
//
// &&
// //
// false
//
;
//
// Detect Bearish Conditions ...
isBearish =
//
isBearish &&
isPointBreak &&
cBar.IsBearish()
//
// &&
// //
// false
//
;
//
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,
decisionState,
setupDir //
);
if (target == 0)
{
//
target = CalculateTarget(
cBar,
analyseState,
setupDir //
);
//
if (target == 0)
{
//
target = CalculateTarget(
cBar,
verificationState,
setupDir //
);
}
}
target = 0;
//
double entry = GetEntry(
conditions.symbol,
setupDir //
);
//
// Filling SL Candidates ...
double momentumBarPointsDif = 30 * points;
//
// Bullish Momentum Bar Selection ...
XOHCL bullishMomentumBar;
int bullishMomentumBarsCount = decisionState.CountBullishMomentumBars();
if (IsValidSize(bullishMomentumBarsCount))
{
//
for (int i = 0; i < bullishMomentumBarsCount; i++)
{
//
XCMomentumBar *iMomentum = decisionState.bullishMomentumBars[i];
//
XOHCL iBar;
bool isFilled = iMomentum.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isValidDistane = (MathAbs(iBar.low) - entry) >= momentumBarPointsDif;
if (!isValidDistane)
{
continue;
}
//
bool isIndexPassed = iBar.Index() <= 5;
if (!isIndexPassed)
{
continue;
}
//
bool canSet =
!bullishMomentumBar.IsValid() ||
(bullishMomentumBar.IsValid() &&
bullishMomentumBar.low < entry &&
bullishMomentumBar.Index() > iBar.Index());
if (canSet)
{
bullishMomentumBar = iBar;
}
}
}
//
// Bearish Momentum Bar Selection ...
XOHCL bearishMomentumBar;
int bearishMomentumBarsCount = decisionState.CountBearishMomentumBars();
if (IsValidSize(bearishMomentumBarsCount))
{
//
for (int i = 0; i < bearishMomentumBarsCount; i++)
{
//
XCMomentumBar *iMomentum = decisionState.bearishMomentumBars[i];
//
XOHCL iBar;
bool isFilled = iMomentum.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isValidDistane = (MathAbs(iBar.high) - entry) >= momentumBarPointsDif;
if (!isValidDistane)
{
continue;
}
//
bool isIndexPassed = iBar.Index() <= 5;
if (!isIndexPassed)
{
continue;
}
//
bool canSet =
!bearishMomentumBar.IsValid() ||
(bearishMomentumBar.IsValid() &&
bearishMomentumBar.high > entry &&
bearishMomentumBar.Index() > iBar.Index());
if (canSet)
{
bearishMomentumBar = iBar;
}
}
}
//
double sls[];
Add(
sar,
sls //
);
Add(
str,
sls //
);
//
if (isBullish)
{
//
Add(
atrLower,
sls //
);
//
Add(
vale,
sls //
);
//
if (bullishMomentumBar.IsValid())
{
//
Add(
bullishMomentumBar.low,
sls //
);
}
//
if (IsValidIndex(lowerValeIDX))
{
//
Add(
lowerVale,
sls //
);
}
}
else
{
//
Add(
atrUpper,
sls //
);
//
Add(
peak,
sls //
);
//
if (bearishMomentumBar.IsValid())
{
//
Add(
bearishMomentumBar.high,
sls //
);
}
//
if (IsValidIndex(higherPeakIDX))
{
//
Add(
higherPeak,
sls //
);
}
}
//
double iAtr = decisionConditions.x121Conditions.atrBuffer[1];
//
double slsMin = GetMin(sls);
double slsMax = GetMax(sls);
//
double sl = isBullish
? slsMin - iAtr
: slsMax + iAtr;
double risk = MathAbs(entry - sl);
double riskInPoints = risk / points;
if (riskInPoints >= 150)
{
//
target =
isBullish
? entry + (points * 200)
: entry - (points * 200);
//
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 AddX121SMCXSTRPVConditionsIfNotExists(
X121SMCStrategyXSTRPVSignalConditions &item,
X121SMCStrategyXSTRPVSignalConditions &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 ...
X121SMCStrategyXSTRPVSignalConditions tmpItems[];
Copy(
items,
tmpItems //
);
//
// Prese Item Data ...
bool isBullish = IsBullish(item.dir);
//
for (int i = 0; i < count; i++)
{
//
X121SMCStrategyXSTRPVSignalConditions 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;
}
//