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

3069 lines
83 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 ...
// X_121_SMC_PROVIDER_SMPV ...
// result = DetectSamePeaksAndValesSignal(conditions);
// if (!result)
// {
// //
// // Detect VWAPC ...
// // X_121_SMC_PROVIDER_VWAPC ...
// result = DetectVWAPCSignal(conditions);
// }
result = DetectRJBPVSignal(conditions);
// result = DetectVWAPCSignal(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 ...
double selectedSLRJ = SelectSL(
conditions,
conditions.signalDir,
X_121_SMC_SL_TYPE_REJECTION //
);
double selectedSLMN = SelectSL(
conditions,
conditions.signalDir,
X_121_SMC_SL_TYPE_MOMENTUM //
);
double selectedSLSW = SelectSL(
conditions,
conditions.signalDir,
X_121_SMC_SL_TYPE_SWING //
);
double selectedSLSR = SelectSL(
conditions,
conditions.signalDir,
X_121_SMC_SL_TYPE_CURRENT_SAR //
);
//
double slCandidates[4] = {
selectedSLRJ,
selectedSLMN,
selectedSLSW,
selectedSLSR //
};
selectedSL = isBullish
? GetMin(slCandidates)
: GetMax(slCandidates);
//
// Normalizing SL ...
double entry = GetEntry(
symbol,
conditions.signalDir //
);
double pip = GetPipPrice(symbol);
double spread = GetSpread(symbol);
double points = GetPoints(symbol);
//
if (isBullish && selectedSL <= entry)
{
selectedSL -= (points * 30) - spread;
}
else if (isBearish && selectedSL >= entry)
{
selectedSL += (points * 30) + spread;
}
//
// Detect SL and TP ...
conditions.sl = selectedSL;
//
return result;
}
/**
* Detect and Parse Market Conditions for Signalling ...
*
* @param conditions: X121SMCStrategyConditions instance Reference ...
*
* @return ( bool )
*/
// TODO: Required Calibrate ...
bool DetectVWAPCSignal(
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;
}
//
bool isBullish =
//
IsBullish(sarDir) &&
IsBullish(vwapDir) &&
IsBullish(candlesticDir)
//
;
//
bool isBearish =
//
IsBearish(sarDir) &&
IsBearish(vwapDir) &&
IsBearish(candlesticDir)
//
;
//
result =
//
isBullish ||
isBearish
//
;
//
Print("VWap Signal ...");
//
if (!result)
{
return result;
}
//
return result;
}
bool DetectRJBPVSignal(
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;
}
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
return result;
}
//
string msg = NULL;
//
double bid = GetBid(symbol);
datetime cTime = TimeCurrent();
//
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_RJBPV;
string providerStr = ToString(provider);
//
// Bar High Eqauls to Peaks or Vale ...
double peak = conditions.triggerConditions.x121Conditions.peaksBuffer[2];
double vale = conditions.triggerConditions.x121Conditions.valesBuffer[2];
bool isNewPeak = conditions.triggerConditions.x121Conditions.peaksBuffer[2] != conditions.triggerConditions.x121Conditions.peaksBuffer[3];
bool isNewVale = conditions.triggerConditions.x121Conditions.valesBuffer[2] != conditions.triggerConditions.x121Conditions.valesBuffer[3];
bool isClosedUnderDonCloseUpper = cBar.close <
conditions.triggerConditions.x121Conditions.donCloseUpperBuffer[1];
bool isClosedOverDonCloseLower = cBar.close >
conditions.triggerConditions.x121Conditions.donCloseLowerBuffer[1];
bool isSarBullish =
zBar.low > conditions.triggerConditions.x121Conditions.sarBuffer[0];
bool isSarBearish =
zBar.high < conditions.triggerConditions.x121Conditions.sarBuffer[0];
//
// XPVPivot orderFlow[];
// ENUM_X_DIRECTION orderFlowDir;
// mTriggerCycleHelper
// .DetectOrderFlow(
// zIndex,
// orderFlow,
// orderFlowDir //
// );
// int pivotsCount = ArraySize(orderFlow);
// result = IsValidSize(pivotsCount);
// if (!result)
// {
// return result;
// }
// XPVPivot lastPivot = orderFlow[pivotsCount - 1];
//
bool isPeakInsideSupplyZone = false;
bool isValeInsideDemandZone = false;
//
XPOIState state = conditions.consolidationConditions.state;
//
XCSupplyZone *supplyZone;
int supplyCount = state.CountSupplyZones();
if (IsValidSize(supplyCount))
{
//
for (int i = 0; i < supplyCount; i++)
{
//
XCSupplyZone *iZone = state.supplyZones[i];
isPeakInsideSupplyZone = peak >= iZone.Lower() &&
peak <= iZone.Upper() &&
bid >= iZone.Lower() + ((iZone.Upper() - iZone.Lower()) / 2);
if (isPeakInsideSupplyZone)
{
//
supplyZone = iZone;
break;
}
}
}
//
XCDemandZone *demandZone;
int demandCount = state.CountDemandZones();
if (IsValidSize(demandCount))
{
//
for (int i = 0; i < demandCount; i++)
{
//
XCDemandZone *iZone = state.demandZones[i];
isValeInsideDemandZone = vale >= iZone.Lower() &&
vale <= iZone.Upper() &&
bid <= iZone.Lower() + ((iZone.Upper() - iZone.Lower()) / 2);
if (isValeInsideDemandZone)
{
//
demandZone = iZone;
break;
}
}
}
//
bool isPeakAttacked =
isNewPeak &&
isSarBearish &&
pBar.high == peak &&
isPeakInsideSupplyZone &&
isClosedUnderDonCloseUpper;
//
bool isValeAttacked =
isNewVale &&
isSarBullish &&
pBar.low == vale &&
isValeInsideDemandZone &&
isClosedOverDonCloseLower;
//
result = isPeakAttacked ||
isValeAttacked;
if (!result)
{
return result;
}
// //
// if (isPeakAttacked)
// {
// //
// supplyZone.To(TimeCurrent());
// XCSupplyZoneObject *iObj;
// bool isCreated = mPOIDrawer.CreateSupplyZone(
// supplyZone,
// iObj //
// );
// if (isCreated)
// {
// AddObjectIfNotExists(iObj);
// }
// }
// else
// {
// //
// demandZone.To(TimeCurrent());
// XCDemandZoneObject *iObj;
// bool isCreated = mPOIDrawer.CreateDemandZone(
// demandZone,
// iObj //
// );
// if (isCreated)
// {
// AddObjectIfNotExists(iObj);
// }
// }
//
bool isBullish =
//
isValeAttacked
//
;
//
bool isBearish =
//
isPeakAttacked
//
;
//
result =
//
isBullish ||
isBearish
//
;
if (!result)
{
return result;
}
//
// Set SL, Provider and Direction ...
conditions.signalDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
conditions.provider = providerStr;
//
conditions.sl =
isBullish
? demandZone.Lower()
: supplyZone.Upper();
//
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_RJBPV)
{
//
isBullish =
//
// Trigger, Decision and Analyse must be Directional ...
conditions.triggerConditions.x121Conditions.isSarBullish &&
conditions.decisionConditions.x121Conditions.isSarBullish &&
conditions.analyseConditions.x121Conditions.isSarBullish
//
;
//
isBearish =
//
// Trigger, Decision and Analyse must be Directional ...
conditions.triggerConditions.x121Conditions.isSarBearish &&
conditions.decisionConditions.x121Conditions.isSarBearish &&
conditions.analyseConditions.x121Conditions.isSarBearish
//
;
}
//
if (forProvider == X_121_SMC_PROVIDER_VWAPC)
{
//
isBullish =
//
// All Cycles Sars Must be Directional exept Vision ...
conditions.triggerConditions.x121Conditions.isSarBullish &&
conditions.decisionConditions.x121Conditions.isSarBullish &&
conditions.analyseConditions.x121Conditions.isSarBullish &&
conditions.verificationConditions.x121Conditions.isSarBullish &&
conditions.consolidationConditions.x121Conditions.isSarBullish
//
;
//
isBearish =
//
// All Cycles Sars Must be Directional exept Vision ...
conditions.triggerConditions.x121Conditions.isSarBearish &&
conditions.decisionConditions.x121Conditions.isSarBearish &&
conditions.analyseConditions.x121Conditions.isSarBearish &&
conditions.verificationConditions.x121Conditions.isSarBearish &&
conditions.consolidationConditions.x121Conditions.isSarBearish
//
;
}
//
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)
{
//
isBullish =
//
// All Cycles Must be State and Ordered Directional Except Vision ...
// State ...
conditions.triggerConditions.x121Conditions.isVWapBullishState &&
conditions.decisionConditions.x121Conditions.isVWapBullishState &&
conditions.analyseConditions.x121Conditions.isVWapBullishState &&
conditions.verificationConditions.x121Conditions.isVWapBullishState &&
conditions.consolidationConditions.x121Conditions.isVWapBullishState
//
&&
// Order ...
conditions.triggerConditions.x121Conditions.isVWapBullishOrdered &&
conditions.decisionConditions.x121Conditions.isVWapBullishOrdered &&
conditions.analyseConditions.x121Conditions.isVWapBullishOrdered &&
conditions.verificationConditions.x121Conditions.isVWapBullishOrdered &&
conditions.consolidationConditions.x121Conditions.isVWapBullishOrdered
//
;
//
isBearish =
//
// All Cycles Must be State and Ordered Directional Except Vision ...
// State ...
conditions.triggerConditions.x121Conditions.isVWapBearishState &&
conditions.decisionConditions.x121Conditions.isVWapBearishState &&
conditions.analyseConditions.x121Conditions.isVWapBearishState &&
conditions.verificationConditions.x121Conditions.isVWapBearishState &&
conditions.consolidationConditions.x121Conditions.isVWapBearishState
//
&&
// Order ...
conditions.triggerConditions.x121Conditions.isVWapBearishOrdered &&
conditions.decisionConditions.x121Conditions.isVWapBearishOrdered &&
conditions.analyseConditions.x121Conditions.isVWapBearishOrdered &&
conditions.verificationConditions.x121Conditions.isVWapBearishOrdered &&
conditions.consolidationConditions.x121Conditions.isVWapBearishOrdered
//
;
}
//
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))
//
)
//
)
//
;
}
//
if (forProvider == X_121_SMC_PROVIDER_RJBPV)
{
//
isBullish =
//
// CBar is Pin, Engulf, Momentum or Rejection ...
(
// //
// (isCBarMomentum &&
// IsBullish(cBarMomentumDir))
// //
// ||
// //
(isCBarRejection &&
IsBullish(cBarRejectionDir))
// //
// ||
// //
// (isCBarEngulf &&
// IsBullish(cBarEngulfDir))
//
||
//
(isCBarPin &&
IsBullish(cBarPinDir))
//
)
//
;
//
isBearish =
//
// CBar is Pin, Engulf, Momentum or Rejection ...
(
//
// (isCBarMomentum &&
// IsBearish(cBarMomentumDir))
// //
// ||
// //
(isCBarRejection &&
IsBearish(cBarRejectionDir))
// //
// ||
// //
// (isCBarEngulf &&
// IsBearish(cBarEngulfDir))
//
||
//
(isCBarPin &&
IsBearish(cBarPinDir))
//
)
//
;
}
//
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;
}
//
// Drawing Functions ...
/**
* Draw Pivot ...
*
* @param pivot: XPVPivot instance Reference ...
*/
void DrawPivot(XPVPivot &pivot)
{
//
if (!pivot.IsValid())
{
return;
}
//
XCXPVPivotObject *iObj;
iObj = new XCXPVPivotObject();
bool isCreated = iObj.Create(
mPOIDrawer.ChartIdentification(),
mPOIDrawer.SubWindowIdentification(),
pivot //
);
if (isCreated)
{
//
if (pivot.IsPeak())
{
//
iObj.PivotWidth(1);
iObj.PivotFill(false);
iObj.PivotColor(clrAqua);
iObj.PivotStyle(STYLE_SOLID);
}
//
if (pivot.IsVale())
{
//
iObj.PivotWidth(1);
iObj.PivotFill(false);
iObj.PivotStyle(STYLE_SOLID);
iObj.PivotColor(clrMagenta);
}
//
AddObjectIfNotExists(iObj);
}
}
/**
* Custom Drawing State ...
*
* @param state: XPOIState instance reference, Specified Which state to Draw ...
* @param forceDrawSamePeriod: Boolean ...
*/
void CustomStateDrawing(
XPOIState &state,
bool forceDrawSamePeriod = false,
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE,
//
// Ignores List ...
bool ignoreSwingHighs = false,
bool ignoreSwingLows = false,
bool ignoreSupportZones = false,
bool ignoreResistanceZones = false,
bool ignoreSupplyZones = false,
bool ignoreDemandZones = false,
bool ignoreBullishOrderBlocks = false,
bool ignoreBearishOrderBlocks = false,
bool ignoreBullishFairValueGaps = false,
bool ignoreBearishFairValueGaps = false,
bool ignoreBullishRejectionBars = false,
bool ignoreBearishRejectionBars = false,
bool ignoreBullishMomentumBars = false,
bool ignoreBearishMomentumBars = false //
)
{
//
XPOIState tmpState = state;
if (forceDrawSamePeriod)
{
//
int count = 0;
ENUM_TIMEFRAMES period = GetPeriod();
//
count = state.CountSwingHighs();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCSwing iSwing = state.swingHighs[i];
//
XOHCL iBar;
bool isFilled = iSwing.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.swingHighs,
i,
1 //
);
}
}
}
//
count = state.CountSwingLows();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCSwing iSwing = state.swingLows[i];
//
XOHCL iBar;
bool isFilled = iSwing.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.swingLows,
i,
1 //
);
}
}
}
//
count = state.CountBullishMomentumBars();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCMomentumBar iMomentum = state.bullishMomentumBars[i];
//
XOHCL iBar;
bool isFilled = iMomentum.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.bullishMomentumBars,
i,
1 //
);
}
}
}
//
count = state.CountBearishMomentumBars();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCMomentumBar iMomentum = state.bearishMomentumBars[i];
//
XOHCL iBar;
bool isFilled = iMomentum.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.bearishMomentumBars,
i,
1 //
);
}
}
}
//
count = state.CountBullishRejectionBars();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCRejectionBar iRejection = state.bullishRejectionBars[i];
//
XOHCL iBar;
bool isFilled = iRejection.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.bullishRejectionBars,
i,
1 //
);
}
}
}
//
count = state.CountBearishRejectionBars();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCRejectionBar iRejection = state.bearishRejectionBars[i];
//
XOHCL iBar;
bool isFilled = iRejection.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.bearishRejectionBars,
i,
1 //
);
}
}
}
//
count = state.CountSupportZones();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCSupportZone iZone = state.supportZones[i];
//
XOHCL iBar;
bool isFilled = iZone.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.supportZones,
i,
1 //
);
}
}
}
//
count = state.CountResistanceZones();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCResistanceZone iZone = state.resistanceZones[i];
//
XOHCL iBar;
bool isFilled = iZone.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.resistanceZones,
i,
1 //
);
}
}
}
//
count = state.CountSupplyZones();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCSupplyZone iZone = state.supplyZones[i];
//
XOHCL iBar;
bool isFilled = iZone.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.supplyZones,
i,
1 //
);
}
}
}
//
count = state.CountDemandZones();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCDemandZone iZone = state.demandZones[i];
//
XOHCL iBar;
bool isFilled = iZone.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.demandZones,
i,
1 //
);
}
}
}
//
count = state.CountBullishOrderBlocks();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCOrderBlock iZone = state.bullishOrderBlocks[i];
//
XOHCL iBar;
bool isFilled = iZone.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.bullishOrderBlocks,
i,
1 //
);
}
}
}
//
count = state.CountBearishOrderBlocks();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCOrderBlock iZone = state.bearishOrderBlocks[i];
//
XOHCL iBar;
bool isFilled = iZone.FillBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.bearishOrderBlocks,
i,
1 //
);
}
}
}
//
count = state.CountBullishFairValueGaps();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCFVG iZone = state.bullishFairValueGaps[i];
//
XOHCL iBar;
bool isFilled = iZone.FillStartBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.bullishFairValueGaps,
i,
1 //
);
}
}
}
//
count = state.CountBearishFairValueGaps();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XCFVG iZone = state.bearishFairValueGaps[i];
//
XOHCL iBar;
bool isFilled = iZone.FillStartBar(iBar);
if (!isFilled)
{
continue;
}
//
bool isSamePeriod = iBar.period == period;
if (!isSamePeriod)
{
//
ArrayRemove(
tmpState.bearishFairValueGaps,
i,
1 //
);
}
}
}
//
}
//
bool drawSwingHighs = true;
bool drawSwingLows = true;
bool drawSupportZones = true;
bool drawResistanceZones = true;
bool drawSupplyZones = true;
bool drawDemandZones = true;
bool drawBullishOrderBlocks = true;
bool drawBearishOrderBlocks = true;
bool drawBullishFairValueGaps = true;
bool drawBearishFairValueGaps = true;
bool drawBullishRejectionBars = true;
bool drawBearishRejectionBars = true;
bool drawBullishMomentumBars = true;
bool drawBearishMomentumBars = true;
//
// Change Drawing Specs Conditions based on
// Provided Direction ...
if (forDir == X_DIRECTION_BULLISH)
{
//
drawSwingLows = true;
drawDemandZones = true;
drawSupportZones = true;
drawBullishOrderBlocks = true;
drawBullishFairValueGaps = true;
drawBullishRejectionBars = true;
drawBullishMomentumBars = true;
//
drawSwingHighs = false;
drawSupplyZones = false;
drawResistanceZones = false;
drawBearishOrderBlocks = false;
drawBearishFairValueGaps = false;
drawBearishRejectionBars = false;
drawBearishMomentumBars = false;
}
else if (forDir == X_DIRECTION_BEARISH)
{
//
drawSwingLows = false;
drawDemandZones = false;
drawSupportZones = false;
drawBullishOrderBlocks = false;
drawBullishFairValueGaps = false;
drawBullishRejectionBars = false;
drawBullishMomentumBars = false;
//
drawSwingHighs = true;
drawSupplyZones = true;
drawResistanceZones = true;
drawBearishOrderBlocks = true;
drawBearishFairValueGaps = true;
drawBearishRejectionBars = true;
drawBearishMomentumBars = true;
}
//
// Apply Ignore List ...
//
if (ignoreSwingHighs)
{
drawSwingHighs = false;
}
//
if (ignoreSwingLows)
{
drawSwingLows = false;
}
//
if (ignoreSupportZones)
{
drawSupportZones = false;
}
//
if (ignoreResistanceZones)
{
drawResistanceZones = false;
}
//
if (ignoreSupplyZones)
{
drawSupplyZones = false;
}
//
if (ignoreDemandZones)
{
drawDemandZones = false;
}
//
if (ignoreBullishOrderBlocks)
{
drawBullishOrderBlocks = false;
}
//
if (ignoreBearishOrderBlocks)
{
drawBearishOrderBlocks = false;
}
//
if (ignoreBullishFairValueGaps)
{
drawBullishFairValueGaps = false;
}
//
if (ignoreBearishFairValueGaps)
{
drawBearishFairValueGaps = false;
}
//
if (ignoreBullishRejectionBars)
{
drawBullishRejectionBars = false;
}
//
if (ignoreBearishRejectionBars)
{
drawBearishRejectionBars = false;
}
//
if (ignoreBullishMomentumBars)
{
drawBullishMomentumBars = false;
}
//
if (ignoreBearishMomentumBars)
{
drawBearishMomentumBars = false;
}
//
DrawState(
tmpState, // State ...
true, // Update To of all Drawings Till now ...
drawSwingHighs, // Draw SwingHighs ..
drawSwingLows, // Draw SwingLows ..
drawSupportZones, // Draw SupportZones ..
drawResistanceZones, // Draw ResistanceZones ..
drawSupplyZones, // Draw SupplyZones ..
drawDemandZones, // Draw DemandZones ..
drawBullishOrderBlocks, // Draw BullishOrderBlocks ..
drawBearishOrderBlocks, // Draw BearishOrderBlocks ..
drawBullishFairValueGaps, // Draw BullishFairValueGaps ..
drawBearishFairValueGaps, // Draw BearishFairValueGaps ..
drawBullishRejectionBars, // Draw BullishRejectionBars ..
drawBearishRejectionBars, // Draw BearishRejectionBars ..
drawBullishMomentumBars, // Draw BullishMomentumBars ..
drawBearishMomentumBars, // Draw BearishMomentumBars ..
true // Draw Ticks Zone ...
);
}
//
};
//