Files
MQL5Data/X121SMCEA/Strategy/x-121.smc.test.strategy.class.mq5
T
2024-12-13 04:19:15 +03:30

1892 lines
49 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XCX121SMCTestStrategy
// Description: provides all based classes for use ...
//
//
// 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.base.strategy.class.mq5"
#include "../Classes/x-121.smc.market.cycle.helper.class.mq5"
//
// Definitions ...
//
// XStrategy Class Implementation(s) ...
class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
{
//
// Public ...
public:
//
//
// Constructor(s) ...
void XCX121SMCTestStrategy(
//
// Base ...
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _period // Trading TimeFrame
)
: XCX121SMCBaseStrategy(_symbol, _period)
{
InitialHelpers();
}
//
// Deconstructur ...
void ~XCX121SMCTestStrategy()
{
}
//
// Overrides Actions ...
/**
* Destroy All Class Implementations ...
*/
void Destroy() override
{
//
delete mTriggerCycleHelper;
delete mDecisionCycleHelper;
delete mAnalyseCycleHelper;
delete mVerificationCycleHelper;
delete mConsolidationCycleHelper;
delete mVisionCycleHelper;
}
/**
* Check Conditions For Signal ...
*/
bool HasSignal(
XSignal &signal,
X121SMCStrategyConditions &conditions //
) override
{
//
bool result = false;
//
signal.Clean();
conditions.Clean();
//
int pushers = 0;
//
double sl = 0;
double tp = 0;
double risk = 0;
double entry = 0;
double reward = 0;
double r2r = R2R();
string provider = "";
double volume = Volume();
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
//
bool hasLong = false;
bool hasShort = false;
//
double selectedSL = 0;
//
// Start Calculations ...
//
// Retrieve Common Data ...
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
// Required Value For SL/TP Calculations ...
double points = GetPoints(symbol);
double pip = GetPipPrice(symbol);
double pip2 = 2 * pip;
//
// Retrieve and Fill Cycle Conditions ...
result = GetCyclesConditions(conditions);
if (!result)
{
//
conditions.Clean();
return result;
}
//
// Check Spread for Signalling Conditions ...
bool isSpreadPassed = IsSpreadPass();
result = isSpreadPassed;
if (!result)
{
//
conditions.Clean();
return result;
}
//
// Detect Signal Conditions ...
result = DetectSamePeaksAndValesSignal(conditions);
if (!result)
{
//
// TODO: Enable this ...
// result = DetectVWAPSignal(conditions);
}
//
if (!result)
{
//
conditions.Clean();
return result;
}
//
// Combine all Signals Conditions ...
selectedSL = conditions.sl;
provider = conditions.provider;
//
hasLong =
//
IsBullish(conditions.signalDir)
//
;
//
hasShort =
//
IsBearish(conditions.signalDir)
//
;
//
result = hasLong ||
hasShort;
//
// Rmove Signal Condition ...
if (result)
{
//
// TYPE ...
type =
hasLong
? POSITION_TYPE_BUY
: POSITION_TYPE_SELL;
ENUM_X_POSITION_TYPES xType =
hasLong
? X_POSITION_TYPE_LONG
: X_POSITION_TYPE_SHORT;
//
entry = GetEntry(
conditions.symbol,
type //
);
//
double slAddition = 0;
sl =
hasLong
? selectedSL - slAddition
: selectedSL + slAddition;
//
// RISK Reward ...
risk =
hasLong
? entry - sl
: sl - entry;
reward = risk * r2r;
tp =
hasLong
? entry + reward
: entry - reward;
//
signal.sl = sl;
signal.tp = tp;
signal.type = type;
signal.mode = mode;
signal.entry = entry;
signal.volume = volume;
signal.symbol = symbol;
signal.period = period;
signal.pushers = pushers;
signal.provider = provider;
signal.time = TimeCurrent();
//
result = PrepareSignal(signal);
if (result)
{
//
// Print("PRV: ", provider);
// DrawSignal(signal);
}
//
hasLong = false;
hasShort = false;
}
//
return result;
}
/**
* Customize Strategy Identifier ...
*/
string GetTag() override
{
return X121SMCStrategyToken;
}
//
// Protected ...
protected:
//
//
// Props ...
//
// Trigger Order Flow ...
XPVPivot mOrderFlow[];
ENUM_X_DIRECTION mOrderFlowDir;
//
ENUM_X_CYCLE_EVENTS mTriggerCycleEvents[];
XC121SMCCycleHelper *mTriggerCycleHelper;
//
ENUM_X_CYCLE_EVENTS mDecisionCycleEvents[];
XC121SMCCycleHelper *mDecisionCycleHelper;
//
ENUM_X_CYCLE_EVENTS mAnalyseCycleEvents[];
XC121SMCCycleHelper *mAnalyseCycleHelper;
//
ENUM_X_CYCLE_EVENTS mVerificationCycleEvents[];
XC121SMCCycleHelper *mVerificationCycleHelper;
//
ENUM_X_CYCLE_EVENTS mConsolidationCycleEvents[];
XC121SMCCycleHelper *mConsolidationCycleHelper;
//
ENUM_X_CYCLE_EVENTS mVisionCycleEvents[];
XC121SMCCycleHelper *mVisionCycleHelper;
//
// Actions ...
/**
* Retrieve Cycles Conditions ...
*
* @param conditions: X121SMCStrategyConditions instance Reference ...
*
* @return ( bool )
*/
bool GetCyclesConditions(
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
datetime cTime = TimeCurrent();
//
conditions.time = cTime;
conditions.symbol = symbol;
conditions.period = period;
//
int conditionsLoopback = 7;
//
// Fill Cycles Conditions ...
//
// Trigger ...
result = mTriggerCycleHelper.GetConditions(
mTriggerCycleEvents,
conditions.triggerConditions,
zIndex,
conditionsLoopback //
);
if (!result)
{
//
conditions.Clean();
return result;
}
conditions.triggerConditions.state = mTriggerState;
//
// Decision ...
result = mDecisionCycleHelper.GetConditions(
mDecisionCycleEvents,
conditions.decisionConditions,
zIndex,
conditionsLoopback //
);
if (!result)
{
//
conditions.Clean();
return result;
}
conditions.decisionConditions.state = mDecisionState;
//
// Analyse ...
result = mAnalyseCycleHelper.GetConditions(
mAnalyseCycleEvents,
conditions.analyseConditions,
zIndex,
conditionsLoopback //
);
if (!result)
{
//
conditions.Clean();
return result;
}
conditions.analyseConditions.state = mAnalyseState;
//
// Verification ...
result = mVerificationCycleHelper.GetConditions(
mVerificationCycleEvents,
conditions.verificationConditions,
zIndex,
conditionsLoopback //
);
if (!result)
{
//
conditions.Clean();
return result;
}
conditions.verificationConditions.state = mVerificationState;
//
// Consolidation ...
result = mConsolidationCycleHelper.GetConditions(
mConsolidationCycleEvents,
conditions.consolidationConditions,
zIndex,
conditionsLoopback //
);
if (!result)
{
//
conditions.Clean();
return result;
}
conditions.consolidationConditions.state = mConsolidationState;
//
// Vision ...
result = mVisionCycleHelper.GetConditions(
mVisionCycleEvents,
conditions.visionConditions,
zIndex,
conditionsLoopback //
);
if (!result)
{
//
conditions.Clean();
return result;
}
conditions.visionConditions.state = mVisionState;
//
return result;
}
//
// Signalling Functions ...
/**
* Detect and Parse Market Conditions for Signalling ...
*
* @param conditions: X121SMCStrategyConditions instance Reference ...
*
* @return ( bool )
*/
bool DetectSamePeaksAndValesSignal(
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_SMPV;
string providerStr = ToString(provider);
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
XOHCL zBar;
result = zBar.Init(
symbol,
period,
zIndex //
);
if (!result)
{
return result;
}
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
string msg = NULL;
//
double bid = GetBid(symbol);
datetime cTime = TimeCurrent();
//
double selectedSL = 0;
//
// Here We Select Cycles For Conditions Check ...
ENUM_X_CYCLES cycles[5] = {
X_CYCLE_TRIGGER,
X_CYCLE_DECISION,
X_CYCLE_ANALYSE,
X_CYCLE_VERIFICATION,
X_CYCLE_CONSOLIDATION //
};
bool hasSamePeaks = DetectSamePeaks(
cycles,
conditions //
);
bool hasSameVales = DetectSameVales(
cycles,
conditions //
);
result =
hasSamePeaks ||
hasSameVales;
if (!result)
{
return result;
}
//
// Check Peaks And Vales Order ...
bool hasPeakBreak = false;
bool hasValeBreak = false;
//
// Retrieve Last Sar Change ...
XOHCL cSarChangeBar;
XOHCL pSarChangeBar;
XValueChange cSarChange; // Current Sar Change (IsDirect) ...
XValueChange pSarChange; // Prev Sar Change (Direct) ...
XValueChange sarChanges[];
int sarChangesCount = mTriggerCycleHelper
.FillSarChanges(sarChanges);
if (IsValidSize(sarChangesCount) &&
sarChangesCount > 2)
{
//
cSarChange = sarChanges[sarChangesCount - 1];
pSarChange = sarChanges[sarChangesCount - 2];
//
result = cSarChange.FillBar(
cSarChangeBar,
symbol,
period //
);
if (!result)
{
return result;
}
//
result = pSarChange.FillBar(
pSarChangeBar,
symbol,
period //
);
if (!result)
{
return result;
}
//
int start = cSarChangeBar.Index();
int end = pSarChangeBar.Index();
for (int i = start; i < end; i++)
{
//
ENUM_X_CYCLE_EVENTS iEvents[];
X121SMCCycleConditions iConditions;
result = mTriggerCycleHelper.GetConditions(
iEvents,
iConditions,
i //
);
if (!result)
{
continue;
}
//
hasPeakBreak =
iConditions.x121Conditions.isNewPeakOverLast;
hasValeBreak =
iConditions.x121Conditions.isNewValeUnderLast;
result = hasPeakBreak ||
hasValeBreak;
if (result)
{
break;
}
}
}
if (!result)
{
return result;
}
//
// Check Sar State ...
ENUM_X_DIRECTION sarDir;
result = DetectSarState(
provider,
sarDir,
conditions //
);
if (!result)
{
return result;
}
//
// Check VWAP State ...
ENUM_X_DIRECTION vwapDir;
result = DetectVWapState(
provider,
vwapDir,
conditions //
);
if (!result)
{
return result;
}
//
bool isBullish =
//
hasSamePeaks &&
hasPeakBreak &&
IsBullish(sarDir) &&
IsBullish(vwapDir)
//
;
//
bool isBearish =
//
hasSameVales &&
hasValeBreak &&
IsBearish(sarDir) &&
IsBearish(vwapDir)
//
;
//
result =
isBullish ||
isBearish;
if (!result)
{
return result;
}
//
// Set SL, Provider and Direction ...
conditions.signalDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
conditions.provider = providerStr;
//
// Selectiong SL ...
selectedSL = SelectSL(
conditions,
conditions.signalDir,
X_121_SMC_SL_TYPE_SWING //
);
//
// Detect SL and TP ...
conditions.sl = selectedSL;
//
return result;
}
/**
* Detect and Parse Market Conditions for Signalling ...
*
* @param conditions: X121SMCStrategyConditions instance Reference ...
*
* @return ( bool )
*/
bool DetectVWAPSignal(
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
XOHCL zBar;
result = zBar.Init(
symbol,
period,
zIndex //
);
if (!result)
{
return result;
}
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
string msg = NULL;
//
double bid = GetBid(symbol);
datetime cTime = TimeCurrent();
//
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_VWAPC;
string providerStr = ToString(provider);
//
// Check Candlestic State ...
ENUM_X_DIRECTION candlesticDir;
result = DetectCandlestic(
provider,
candlesticDir,
conditions //
);
if (!result)
{
return result;
}
//
// Check Sar State ...
ENUM_X_DIRECTION sarDir;
result = DetectSarState(
provider,
sarDir,
conditions //
);
if (!result)
{
return result;
}
//
// Check VWAP State ...
ENUM_X_DIRECTION vwapDir;
result = DetectVWapState(
provider,
vwapDir,
conditions //
);
if (!result)
{
return result;
}
//
Print("VWap Signal ...");
//
if (!result)
{
return result;
}
//
return result;
}
//
// Helper Functions ...
/**
* Detect Where Cycles has Same Peaks ...
*
* @param cycles: ENUM_X_CYCLES members, Array ...
* @param conditions: X121SMCStrategyConditions instance, Reference ...
*
* @return ( bool )
*/
bool DetectSamePeaks(
ENUM_X_CYCLES &cycles[],
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
int count = ArraySize(cycles);
result = IsValidSize(count);
if (!result)
{
return result;
}
//
double value = -1;
for (int i = 0; i < count; i++)
{
//
ENUM_X_CYCLES iCycle = cycles[i];
//
double iValue = -1;
switch (iCycle)
{
//
case X_CYCLE_TRIGGER:
iValue = conditions.triggerConditions.x121Conditions.peaksBuffer[0];
break;
//
case X_CYCLE_DECISION:
iValue = conditions.decisionConditions.x121Conditions.peaksBuffer[0];
break;
//
case X_CYCLE_ANALYSE:
iValue = conditions.analyseConditions.x121Conditions.peaksBuffer[0];
break;
//
case X_CYCLE_VERIFICATION:
iValue = conditions.verificationConditions.x121Conditions.peaksBuffer[0];
break;
//
case X_CYCLE_CONSOLIDATION:
iValue = conditions.consolidationConditions.x121Conditions.peaksBuffer[0];
break;
//
case X_CYCLE_VISION:
iValue = conditions.visionConditions.x121Conditions.peaksBuffer[0];
break;
}
//
if (iValue > 0)
{
//
if (value <= 0)
{
value = iValue;
}
//
result = value == iValue;
if (!result)
{
break;
}
}
}
//
return result;
}
/**
* Detect Where Cycles has Same Vales ...
*
* @param cycles: ENUM_X_CYCLES members, Array ...
* @param conditions: X121SMCStrategyConditions instance, Reference ...
*
* @return ( bool )
*/
bool DetectSameVales(
ENUM_X_CYCLES &cycles[],
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
int count = ArraySize(cycles);
result = IsValidSize(count);
if (!result)
{
return result;
}
//
double value = -1;
for (int i = 0; i < count; i++)
{
//
ENUM_X_CYCLES iCycle = cycles[i];
//
double iValue = -1;
switch (iCycle)
{
//
case X_CYCLE_TRIGGER:
iValue = conditions.triggerConditions.x121Conditions.valesBuffer[0];
break;
//
case X_CYCLE_DECISION:
iValue = conditions.decisionConditions.x121Conditions.valesBuffer[0];
break;
//
case X_CYCLE_ANALYSE:
iValue = conditions.analyseConditions.x121Conditions.valesBuffer[0];
break;
//
case X_CYCLE_VERIFICATION:
iValue = conditions.verificationConditions.x121Conditions.valesBuffer[0];
break;
//
case X_CYCLE_CONSOLIDATION:
iValue = conditions.consolidationConditions.x121Conditions.valesBuffer[0];
break;
//
case X_CYCLE_VISION:
iValue = conditions.visionConditions.x121Conditions.valesBuffer[0];
break;
}
//
if (iValue > 0)
{
//
if (value <= 0)
{
value = iValue;
}
//
result = value == iValue;
if (!result)
{
break;
}
}
}
//
return result;
}
/**
* Detect Sar State for Signalling ...
*
* @param forProvider: ENUM_X_121_SMC_PROVIDERS member ...
* @param dir: ENUM_X_DIRECTION member Reference ...
* @param conditions: X121SMCStrategyConditions instance, Reference ...
*
* @return ( bool )
*/
bool DetectSarState(
ENUM_X_121_SMC_PROVIDERS forProvider,
ENUM_X_DIRECTION &dir,
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
dir = X_DIRECTION_NONE;
//
bool isBullish = false;
bool isBearish = false;
//
if (forProvider == X_121_SMC_PROVIDER_SMPV)
{
//
isBullish =
//
// Check One of Verification or Consolidation Cycles Must be Sar Bullish ...
(conditions.verificationConditions.x121Conditions.isSarBullish ||
conditions.consolidationConditions.x121Conditions.isSarBullish)
//
&&
//
// Decision and Analyse Cycles Must be Bullish ...
(conditions.decisionConditions.x121Conditions.isSarBullish &&
conditions.analyseConditions.x121Conditions.isSarBullish)
//
&&
//
// Trigger State Must be Bearish ...
conditions.triggerConditions.x121Conditions.isSarBearish
//
;
//
isBearish =
//
// Check One of Verification or Consolidation Cycles Must be Sar Bearish ...
(conditions.verificationConditions.x121Conditions.isSarBearish ||
conditions.consolidationConditions.x121Conditions.isSarBearish)
//
&&
//
// Decision and Analyse Cycles Must be Bearish ...
(conditions.decisionConditions.x121Conditions.isSarBearish &&
conditions.analyseConditions.x121Conditions.isSarBearish)
//
&&
//
// Trigger State Must be Bullish ...
conditions.triggerConditions.x121Conditions.isSarBullish
//
;
}
//
if (forProvider == X_121_SMC_PROVIDER_VWAPC)
{
}
//
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
return result;
}
/**
* Detect Sar State for Signalling ...
*
* @param forProvider: ENUM_X_121_SMC_PROVIDERS member ...
* @param dir: ENUM_X_DIRECTION member Reference ...
* @param conditions: X121SMCStrategyConditions instance, Reference ...
*
* @return ( bool )
*/
bool DetectVWapState(
ENUM_X_121_SMC_PROVIDERS forProvider,
ENUM_X_DIRECTION &dir,
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
dir = X_DIRECTION_NONE;
//
bool isBullish = false;
bool isBearish = false;
//
if (forProvider == X_121_SMC_PROVIDER_SMPV)
{
//
isBullish =
//
// Trigger, Decision and Analyse Cycles Must be in Direction Order and State ...
//
// Orders ...
(conditions.triggerConditions.x121Conditions.isVWapBullishOrdered &&
conditions.decisionConditions.x121Conditions.isVWapBullishOrdered &&
conditions.analyseConditions.x121Conditions.isVWapBullishOrdered)
//
&&
//
// State ...
(conditions.triggerConditions.x121Conditions.isVWapBullishState &&
conditions.decisionConditions.x121Conditions.isVWapBullishState &&
conditions.analyseConditions.x121Conditions.isVWapBullishState)
//
&&
//
// One of Verification and Consolidation must Be in Direction State ...
(conditions.verificationConditions.x121Conditions.isVWapBullishState ||
conditions.consolidationConditions.x121Conditions.isVWapBullishState)
//
;
//
isBearish =
//
// Trigger, Decision and Analyse Cycles Must be in Direction Order and State ...
//
// Orders ...
(conditions.triggerConditions.x121Conditions.isVWapBearishOrdered &&
conditions.decisionConditions.x121Conditions.isVWapBearishOrdered &&
conditions.analyseConditions.x121Conditions.isVWapBearishOrdered)
//
&&
//
// State ...
(conditions.triggerConditions.x121Conditions.isVWapBearishState &&
conditions.decisionConditions.x121Conditions.isVWapBearishState &&
conditions.analyseConditions.x121Conditions.isVWapBearishState)
//
&&
//
// One of Verification and Consolidation must Be in Direction State ...
(conditions.verificationConditions.x121Conditions.isVWapBearishState ||
conditions.consolidationConditions.x121Conditions.isVWapBearishState)
//
;
}
//
if (forProvider == X_121_SMC_PROVIDER_VWAPC)
{
}
//
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
return result;
}
/**
* Detect Candlestic Patters for Signalling ...
*
* @param forProvider: ENUM_X_121_SMC_PROVIDERS member ...
* @param dir: ENUM_X_DIRECTION member Reference ...
* @param conditions: X121SMCStrategyConditions instance, Reference ...
*
* @return ( bool )
*/
bool DetectCandlestic(
ENUM_X_121_SMC_PROVIDERS forProvider,
ENUM_X_DIRECTION &dir,
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
dir = X_DIRECTION_NONE;
//
int cIndex = 1;
int pIndex = cIndex + 1;
//
// Select Specified Cycle Helper ...
XC121SMCCycleHelper *cycleHelper = mTriggerCycleHelper;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = cycleHelper.GetPeriod();
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
// Momentum Bar ...
ENUM_X_DIRECTION cBarMomentumDir;
bool isCBarMomentum = cycleHelper.mBarAnalyser.IsMomentumBar(
cBar,
cBarMomentumDir //
);
//
// Rejection Bar ...
ENUM_X_DIRECTION cBarRejectionDir;
bool isCBarRejection = cycleHelper.mBarAnalyser.IsRejectionBar(
cBar,
cBarRejectionDir //
);
//
// Engulf Bar ...
ENUM_X_DIRECTION cBarEngulfDir;
bool isCBarEngulf = cycleHelper.mBarAnalyser.IsEngulfBar(
cBar,
cBarEngulfDir //
);
//
// Pin Bar ...
ENUM_X_DIRECTION cBarPinDir;
bool isCBarPin = cycleHelper.mBarAnalyser.IsPinBar(
cBar,
cBarPinDir //
);
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
return result;
}
//
// Momentum Bar ...
ENUM_X_DIRECTION pBarMomentumDir;
bool isPBarMomentum = cycleHelper.mBarAnalyser.IsMomentumBar(
pBar,
pBarMomentumDir //
);
//
// Rejection Bar ...
ENUM_X_DIRECTION pBarRejectionDir;
bool isPBarRejection = cycleHelper.mBarAnalyser.IsRejectionBar(
pBar,
pBarRejectionDir //
);
//
// Engulf Bar ...
ENUM_X_DIRECTION pBarEngulfDir;
bool isPBarEngulf = cycleHelper.mBarAnalyser.IsEngulfBar(
pBar,
pBarEngulfDir //
);
//
// Pin Bar ...
ENUM_X_DIRECTION pBarPinDir;
bool isPBarPin = cycleHelper.mBarAnalyser.IsPinBar(
pBar,
pBarPinDir //
);
//
bool isBullish = false;
bool isBearish = false;
//
if (forProvider == X_121_SMC_PROVIDER_VWAPC)
{
//
isBullish =
//
// pBar is Pin and cBar is Momentum or Rejection or Engulf
(
//
(isPBarPin &&
IsBullish(pBarPinDir) &&
(
//
(isCBarMomentum &&
IsBullish(cBarMomentumDir))
//
||
//
(isCBarRejection &&
IsBullish(cBarRejectionDir))
//
||
//
(isCBarEngulf &&
IsBullish(cBarEngulfDir))
//
)
//
)
//
||
//
// pBar is Engulf and cBar is Momentum or Rejection or Pin ...
(isPBarEngulf &&
IsBullish(pBarEngulfDir) &&
(
//
(isCBarMomentum &&
IsBullish(cBarMomentumDir))
//
||
//
(isCBarRejection &&
IsBullish(cBarRejectionDir))
//
||
//
(isCBarPin &&
IsBullish(cBarPinDir))
//
)
//
)
//
||
//
// pBar is Rejection and cBar is Momentum or Engulf or Pin ...
(isPBarRejection &&
IsBullish(pBarRejectionDir) &&
(
//
(isCBarMomentum &&
IsBullish(cBarMomentumDir))
//
||
//
(isCBarEngulf &&
IsBullish(cBarEngulfDir))
//
||
//
(isCBarPin &&
IsBullish(cBarPinDir))
//
)
//
)
//
||
//
// pBar is Momentum and cBar is Rejection or Engulf or Pin ...
(isPBarMomentum &&
IsBullish(pBarMomentumDir) &&
(
//
(isCBarRejection &&
IsBullish(cBarRejectionDir))
//
||
//
(isCBarEngulf &&
IsBullish(cBarEngulfDir))
//
||
//
(isCBarPin &&
IsBullish(cBarPinDir))
//
)
//
)
//
||
//
// cBar is Pin and Momentum and Rejection and Engulf ...
(
//
(isCBarPin &&
IsBullish(cBarPinDir))
//
&&
//
(isCBarMomentum &&
IsBullish(cBarMomentumDir))
//
&&
//
(isCBarRejection &&
IsBullish(cBarRejectionDir))
//
&&
//
(isCBarEngulf &&
IsBullish(cBarEngulfDir))
//
)
//
)
//
;
//
isBearish =
//
// pBar is Pin and cBar is Momentum or Rejection or Engulf
(
//
(isPBarPin &&
IsBearish(pBarPinDir) &&
(
//
(isCBarMomentum &&
IsBearish(cBarMomentumDir))
//
||
//
(isCBarRejection &&
IsBearish(cBarRejectionDir))
//
||
//
(isCBarEngulf &&
IsBearish(cBarEngulfDir))
//
)
//
)
//
||
//
// pBar is Engulf and cBar is Momentum or Rejection or Pin ...
(isPBarEngulf &&
IsBearish(pBarEngulfDir) &&
(
//
(isCBarMomentum &&
IsBearish(cBarMomentumDir))
//
||
//
(isCBarRejection &&
IsBearish(cBarRejectionDir))
//
||
//
(isCBarPin &&
IsBearish(cBarPinDir))
//
)
//
)
//
||
//
// pBar is Rejection and cBar is Momentum or Engulf or Pin ...
(isPBarRejection &&
IsBearish(pBarRejectionDir) &&
(
//
(isCBarMomentum &&
IsBearish(cBarMomentumDir))
//
||
//
(isCBarEngulf &&
IsBearish(cBarEngulfDir))
//
||
//
(isCBarPin &&
IsBearish(cBarPinDir))
//
)
//
)
//
||
//
// pBar is Momentum and cBar is Rejection or Engulf or Pin ...
(isPBarMomentum &&
IsBearish(pBarMomentumDir) &&
(
//
(isCBarRejection &&
IsBearish(cBarRejectionDir))
//
||
//
(isCBarEngulf &&
IsBearish(cBarEngulfDir))
//
||
//
(isCBarPin &&
IsBearish(cBarPinDir))
//
)
//
)
//
||
//
// cBar is Pin and Momentum and Rejection and Engulf ...
(
//
(isCBarPin &&
IsBearish(cBarPinDir))
//
&&
//
(isCBarMomentum &&
IsBearish(cBarMomentumDir))
//
&&
//
(isCBarRejection &&
IsBearish(cBarRejectionDir))
//
&&
//
(isCBarEngulf &&
IsBearish(cBarEngulfDir))
//
)
//
)
//
;
}
//
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
return result;
}
//
// Private ...
private:
//
// Props ...
/**
* Initial Required Indicators Helper ...
*/
void InitialHelpers()
{
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
// Short ...
ENUM_X_PERIOD_METHOD scMethod = X_PERIOD_AUTO; // How to Find Period
ENUM_TIMEFRAMES scPeriod = NULL; // Time Period
//
// Medium ...
ENUM_X_PERIOD_METHOD mcMethod = X_PERIOD_AUTO; // How to Find Period
ENUM_TIMEFRAMES mcPeriod = NULL; // Time Period
//
// Long ...
ENUM_X_PERIOD_METHOD lcMethod = X_PERIOD_AUTO; // How to Find Period
ENUM_TIMEFRAMES lcPeriod = NULL; // Time Period
//
// Hind ...
ENUM_X_PERIOD_METHOD hcMethod = X_PERIOD_AUTO; // How to Find Period
ENUM_TIMEFRAMES hcPeriod = NULL; // Time Period
//
// XPV ...
X121Inputs x121Inputs;
//
x121Inputs.Default();
//
x121Inputs.scMethod = scMethod;
x121Inputs.scPeriod = scPeriod;
x121Inputs.mcMethod = mcMethod;
x121Inputs.mcPeriod = mcPeriod;
x121Inputs.lcMethod = lcMethod;
x121Inputs.lcPeriod = lcPeriod;
x121Inputs.hcMethod = hcMethod;
x121Inputs.hcPeriod = hcPeriod;
//
// Initialize Cycle Helpers ...
//
mTriggerCycleHelper = new XC121SMCCycleHelper();
mTriggerCycleHelper.Init(
symbol,
PERIOD_M1,
x121Inputs //
);
//
mDecisionCycleHelper = new XC121SMCCycleHelper();
mDecisionCycleHelper.Init(
symbol,
PERIOD_M5,
x121Inputs //
);
//
mAnalyseCycleHelper = new XC121SMCCycleHelper();
mAnalyseCycleHelper.Init(
symbol,
PERIOD_M15,
x121Inputs //
);
//
mVerificationCycleHelper = new XC121SMCCycleHelper();
mVerificationCycleHelper.Init(
symbol,
PERIOD_M30,
x121Inputs //
);
//
mConsolidationCycleHelper = new XC121SMCCycleHelper();
mConsolidationCycleHelper.Init(
symbol,
PERIOD_H1,
x121Inputs //
);
//
mVisionCycleHelper = new XC121SMCCycleHelper();
mVisionCycleHelper.Init(
symbol,
PERIOD_H4,
x121Inputs //
);
}
//
// SL Selector Methods ...
/**
* Select Specified Type of Stop Loss ...
*
* @param conditions: X121SMCStrategyConditions instance Reference ...
* @param forDir: ENUM_X_DIRECTION member, Signal Direction ...
* @param type: ENUM_X_121_SMC_SL_TYPES member, Specified Required SL Type ...
*
* @return ( double )
*/
double SelectSL(
X121SMCStrategyConditions &conditions,
ENUM_X_DIRECTION forDir,
ENUM_X_121_SMC_SL_TYPES type //
)
{
//
double result = 0;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
bool isValid =
//
HasDirection(forDir) &&
conditions.IsValid() &&
type != X_121_SMC_SL_TYPE_NONE
//
;
if (!isValid)
{
return result;
}
//
XOHCL zBar;
bool isInited = zBar.Init(
symbol,
period,
0 //
);
if (!isInited)
{
return result;
}
//
bool isBullish = IsBullish(forDir);
//
if (type == X_121_SMC_SL_TYPE_FIBO_LEVEL_3)
{
result = conditions.triggerConditions.x121Conditions.fl3Buffer[0];
}
else if (type == X_121_SMC_SL_TYPE_FIBO_LEVEL_1_5)
{
//
result =
isBullish
? conditions.triggerConditions.x121Conditions.fl1Buffer[0]
: conditions.triggerConditions.x121Conditions.fl5Buffer[0];
}
else if (type == X_121_SMC_SL_TYPE_DON_CLOSE_BOX)
{
//
result =
isBullish
? conditions.triggerConditions.x121Conditions.donCloseLowerBuffer[0]
: conditions.triggerConditions.x121Conditions.donCloseUpperBuffer[0];
}
else if (type == X_121_SMC_SL_TYPE_SWING)
{
//
int swingLowsCount = conditions.triggerConditions.state.CountSwingLows();
int swingHighsCount = conditions.triggerConditions.state.CountSwingHighs();
result =
isBullish
? conditions.triggerConditions.state.swingLows[swingLowsCount - 1].GetValue()
: conditions.triggerConditions.state.swingHighs[swingHighsCount - 1].GetValue();
}
else if (type == X_121_SMC_SL_TYPE_REJECTION)
{
//
result =
isBullish
? conditions.triggerConditions.state.bullishRejectionBars[conditions.triggerConditions.state.CountBullishRejectionBars() - 1].Lower()
: conditions.triggerConditions.state.bearishRejectionBars[conditions.triggerConditions.state.CountBearishRejectionBars() - 1].Upper();
}
else if (type == X_121_SMC_SL_TYPE_MOMENTUM)
{
//
result =
isBullish
? conditions.triggerConditions.state.bullishMomentumBars[conditions.triggerConditions.state.CountBullishMomentumBars() - 1].Lower()
: conditions.triggerConditions.state.bearishMomentumBars[conditions.triggerConditions.state.CountBearishMomentumBars() - 1].Upper();
}
else if (type == X_121_SMC_SL_TYPE_VWAP_FAST)
{
result = conditions.triggerConditions.x121Conditions.vwapFastBuffer[0];
}
else if (type == X_121_SMC_SL_TYPE_VWAP_MID)
{
result = conditions.triggerConditions.x121Conditions.vwapMidBuffer[0];
}
else if (type == X_121_SMC_SL_TYPE_VWAP_SLOW)
{
result = conditions.triggerConditions.x121Conditions.vwapSlowBuffer[0];
}
else if (type == X_121_SMC_SL_TYPE_CURRENT_SAR)
{
result = conditions.triggerConditions.x121Conditions.sarBuffer[0];
}
else if (type == X_121_SMC_SL_TYPE_CURRENT_SAR_BOX ||
type == X_121_SMC_SL_TYPE_LAST_SAR_CHANGED_BAR ||
type == X_121_SMC_SL_TYPE_LAST_DIRECTIONAL_SAR)
{
//
XOHCL cSarChangeBar;
XOHCL pSarChangeBar;
XValueChange cSarChange; // Current Sar Change (IsDirect) ...
XValueChange pSarChange; // Prev Sar Change (Direct) ...
XValueChange sarChanges[];
int sarChangesCount = mTriggerCycleHelper
.FillSarChanges(sarChanges);
if (!IsValidSize(sarChangesCount) || sarChangesCount < 2)
{
return result;
}
//
//
cSarChange = sarChanges[sarChangesCount - 1];
pSarChange = sarChanges[sarChangesCount - 2];
//
bool isFilled = cSarChange.FillBar(
cSarChangeBar,
symbol,
period //
);
if (!isFilled)
{
return result;
}
//
isFilled = pSarChange.FillBar(
pSarChangeBar,
symbol,
period //
);
if (!isFilled)
{
return result;
}
//
if (type == X_121_SMC_SL_TYPE_LAST_SAR_CHANGED_BAR)
{
//
result = isBullish
? pSarChangeBar.low
: pSarChangeBar.high;
}
else if (type == X_121_SMC_SL_TYPE_CURRENT_SAR_BOX)
{
//
result =
isBullish
? zBar.FindLowest(
MathAbs(cSarChangeBar.Index() - 1),
MODE_LOW //
)
: zBar.FindHighest(
MathAbs(cSarChangeBar.Index() - 1),
MODE_HIGH //
);
}
else if (type == X_121_SMC_SL_TYPE_LAST_DIRECTIONAL_SAR)
{
//
XOHCL prevBar;
bool isInited = cSarChangeBar.GetPreviousBar(prevBar);
if (!isInited)
{
return result;
}
//
result = isBullish
? prevBar.low
: prevBar.high;
}
}
//
return result;
}
//
};
//