Files
xMQL5/BKPS/14030923/Documents/BKP/x-121.smc.test.strategy.class copy 2.mq5
T
2024-12-19 01:33:40 +03:30

2793 lines
76 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 ...
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
double points = GetPoints(symbol);
double pip = GetPipPrice(symbol);
double pip2 = 2 * pip;
//
// Detect Conditions ...
result = DetectConditions(conditions);
if (!result)
{
conditions.Clean();
return result;
}
//
// Check Spread ...
bool isSpreadPassed = IsSpreadPass();
result = isSpreadPassed;
if (!result)
{
//
// string message = "Spread is not Passed for Analysing ...";
// LogAlert(message);
//
return result;
}
//
// Combine all Signals Conditions ...
selectedSL = conditions.sl;
provider = conditions.provider;
//
hasLong =
//
IsBullish(conditions.marketStructureDir)
//
;
//
hasShort =
//
IsBearish(conditions.marketStructureDir)
//
;
//
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 //
);
//
sl =
hasLong
? selectedSL - pip2
: selectedSL + pip2;
//
// 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);
//
ENUM_X_DIRECTION forDir = ToDirection(signal.type);
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;
if (IsBullish(forDir))
{
//
ignoreSwingLows = false;
ignoreDemandZones = false;
ignoreSupportZones = false;
ignoreBullishOrderBlocks = false;
ignoreBullishFairValueGaps = false;
ignoreBullishRejectionBars = false;
ignoreBullishMomentumBars = false;
}
else
{
//
ignoreSwingHighs = true;
ignoreSupplyZones = true;
ignoreResistanceZones = true;
ignoreBearishOrderBlocks = true;
ignoreBearishFairValueGaps = false;
ignoreBearishRejectionBars = true;
ignoreBearishMomentumBars = true;
}
//
RedrawOrderFlow(
true, // Force Clean ...
false, // Same Period ...
true, // Order Flow ...
true, // Order Flow State ...
false, // Only Last Order Flow ...
true, // Only Last Order Flow State ...
//
forDir, // Direction Force ...
ignoreSwingHighs,
ignoreSwingLows,
ignoreSupportZones,
ignoreResistanceZones,
ignoreSupplyZones,
ignoreDemandZones,
ignoreBullishOrderBlocks,
ignoreBearishOrderBlocks,
ignoreBullishFairValueGaps,
ignoreBearishFairValueGaps,
ignoreBullishRejectionBars,
ignoreBearishRejectionBars,
ignoreBullishMomentumBars,
ignoreBearishMomentumBars //
);
DrawSignal(signal);
ClearDraws();
//
ResetOrderFlow();
}
//
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;
//
XC121SMCCycleHelper *mTriggerCycleHelper;
XC121SMCCycleHelper *mDecisionCycleHelper;
XC121SMCCycleHelper *mAnalyseCycleHelper;
XC121SMCCycleHelper *mVerificationCycleHelper;
XC121SMCCycleHelper *mConsolidationCycleHelper;
XC121SMCCycleHelper *mVisionCycleHelper;
//
// Actions ...
/**
* Detect and Parse Market Conditions ...
*
* @return ( bool )
*/
bool DetectConditions(
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();
//
conditions.time = cTime;
conditions.symbol = symbol;
conditions.period = period;
//
int conditionsLoopback = 7;
//
// Fill Cycles Conditions ...
//
// Trigger ...
mTriggerCycleHelper.GetConditions(
conditions.triggerConditions,
zIndex,
conditionsLoopback //
);
conditions.triggerConditions.state = mTriggerState;
//
// Decision ...
mDecisionCycleHelper.GetConditions(
conditions.decisionConditions,
zIndex,
conditionsLoopback //
);
conditions.decisionConditions.state = mDecisionState;
//
// Analyse ...
mAnalyseCycleHelper.GetConditions(
conditions.analyseConditions,
zIndex,
conditionsLoopback //
);
conditions.analyseConditions.state = mAnalyseState;
//
// Verification ...
mVerificationCycleHelper.GetConditions(
conditions.verificationConditions,
zIndex,
conditionsLoopback //
);
conditions.verificationConditions.state = mVerificationState;
//
// Consolidation ...
mConsolidationCycleHelper.GetConditions(
conditions.consolidationConditions,
zIndex,
conditionsLoopback //
);
conditions.consolidationConditions.state = mConsolidationState;
//
// Vision ...
mVisionCycleHelper.GetConditions(
conditions.visionConditions,
zIndex,
conditionsLoopback //
);
conditions.visionConditions.state = mVisionState;
//
// Detect and Store Parabolic Sar Changes ...
XSarChange sarChange;
bool isSarChanged = mTriggerCycleHelper
.IsSarChanged(
sarChange,
cTime //
);
//
// Detect and Store Pivots ...
XPVPivot pivot;
bool isPivotDetected = mTriggerCycleHelper
.DetectPivot(pivot);
if (isPivotDetected) {
//
Print("Pivot Detected ...");
//
ClearDraws();
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);
}
}
//
if (!result)
{
//
conditions.Clean();
return result;
}
//
return result;
}
/**
* Detect XPV Based POI(s) ...
*
* @param barIndex: Start Bar Index ...
* @param minRepetition: minimum Repeate of POI for Validation ...
* @param requiredPivots: Number of Min Requirement POI(s) ...
* @param pivotHelper: XC121SMCCycleHelper instance Pointer ...
* @param orderFlow: XPVPivot instance Array Reference ...
* @param orderFlowDirection: ENUM_X_DIRECTION member Reference which represents OrderFlow Direction ...
* @param maxAllowedLoopbackBars: Integer, Max Allowed Loopback Bars ...
*
* @return ( bool )
*/
bool DetectOrderFlow(
int barIndex,
int minRepetition,
int requiredPivots,
XC121SMCCycleHelper *pivotHelper, // XPV Helper ...
XPVPivot &orderFlow[], // OrderFlows ...
ENUM_X_DIRECTION &orderFlowDirection, // Order Flow Direction ...
//
bool useVisionState = true, // Use Vision State ...
bool useConsolidationState = true, // Use Consolidation State ...
bool useVerificationState = true, // Use Verification State ...
bool useAnalyseState = true, // Use Analyse State ...
bool useDecisionState = true, // Use Decision State ...
bool useTriggerState = true, // Use Trigger State ...
//
int maxAllowedLoopbackBars = 576 //
)
{
//
bool result = false;
//
orderFlowDirection = X_DIRECTION_NONE;
//
if (maxAllowedLoopbackBars <= 0)
{
maxAllowedLoopbackBars = 1000;
}
//
int start = barIndex;
int end = start + maxAllowedLoopbackBars;
//
Clean(orderFlow);
//
result = minRepetition > 0 &&
requiredPivots > 0 &&
pivotHelper != NULL;
if (!result)
{
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
double peak = 0;
XPVPivot peaks[];
int peakRepeate = 0;
int peakToBarIndex = 0;
int peakFromBarIndex = 0;
//
double vale = 0;
XPVPivot vales[];
int valeRepeate = 0;
int valeToBarIndex = 0;
int valeFromBarIndex = 0;
//
bool canLookupPeak = true;
bool canLookupVale = true;
bool canLookup = true;
while (canLookup)
{
//
// Check Peak ...
double iPeak = pivotHelper.mXPVHelper.GetPeak(barIndex);
if (iPeak != peak)
{
//
if (peak != 0 &&
peakRepeate >= minRepetition)
{
//
bool isExists = false;
int count = ArraySize(peaks);
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XPVPivot iPivot = peaks[i];
//
if (iPivot.upper == iPeak)
{
//
isExists = true;
break;
}
}
}
if (!isExists)
{
//
XPVPivot iPivot;
//
iPivot.lower = 0;
iPivot.upper = peak;
iPivot.symbol = symbol;
iPivot.period = period;
iPivot.type = XPV_PEAK;
iPivot.repetition = peakRepeate;
iPivot.to = iTime(
symbol,
period,
peakToBarIndex //
);
iPivot.from = iTime(
symbol,
period,
peakFromBarIndex //
);
//
iPivot.lower = iPivot.CalculateLower();
//
bool isValid = iPivot.IsValid();
if (isValid)
{
//
AddRef(
iPivot,
peaks //
);
}
}
}
//
peak = iPeak;
peakRepeate = 0;
peakFromBarIndex = 0;
peakToBarIndex = barIndex;
}
else if (iPeak == peak)
{
//
peakRepeate++;
peakFromBarIndex = barIndex;
}
//
// Check Vale ...
double iVale = pivotHelper.mXPVHelper.GetVale(barIndex);
if (iVale != vale)
{
//
if (vale != 0 &&
valeRepeate >= minRepetition)
{
//
bool isExists = false;
int count = ArraySize(vales);
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
XPVPivot iPivot = vales[i];
//
if (iPivot.lower == iVale)
{
//
isExists = true;
break;
}
}
}
if (!isExists)
{
//
XPVPivot iPivot;
//
iPivot.upper = 0;
iPivot.lower = vale;
iPivot.symbol = symbol;
iPivot.period = period;
iPivot.type = XPV_VALE;
iPivot.repetition = valeRepeate;
iPivot.to = iTime(
symbol,
period,
valeToBarIndex //
);
iPivot.from = iTime(
symbol,
period,
valeFromBarIndex //
);
//
iPivot.upper = iPivot.CalculateUpper();
//
bool isValid = iPivot.IsValid();
if (isValid)
{
//
AddRef(
iPivot,
vales //
);
}
}
}
//
vale = iVale;
valeRepeate = 0;
valeFromBarIndex = 0;
valeToBarIndex = barIndex;
}
else if (iVale == vale)
{
//
valeRepeate++;
valeFromBarIndex = barIndex;
}
//
canLookupPeak = ArraySize(peaks) < requiredPivots;
canLookupVale = ArraySize(vales) < requiredPivots;
canLookup = barIndex < end &&
(canLookupPeak ||
canLookupVale);
if (canLookup)
{
barIndex++;
}
}
//
result = IsValidSize(ArraySize(peaks)) ||
IsValidSize(ArraySize(vales));
if (!result)
{
return result;
}
//
// Detect Order Flow ...
Copy(
peaks,
orderFlow,
false //
);
Copy(
vales,
orderFlow,
false //
);
int count = ArraySize(orderFlow);
result = IsValidSize(orderFlow);
if (!result)
{
return result;
}
//
// Sort Pivots ...
SortPivots(orderFlow);
//
// Filter Broken Order Flows ...
FilterBrokenPivots(orderFlow);
//
// Detect Order Flow Direction ...
result = DetectPivotDirection(
orderFlow,
orderFlowDirection //
);
if (!result)
{
return result;
}
//
// Find State Inside Pivots and Attached Them to Pivot ...
int orderFlowCount = ArraySize(mOrderFlow);
if (IsValidSize(orderFlowCount))
{
//
// Loop Through Order Flow ...
for (int i = 0; i < orderFlowCount; i++)
{
//
FillPivotSate(
i,
useVisionState, // Use Vision State ...
useConsolidationState, // Use Consolidation State ...
useVerificationState, // Use Verification State ...
useAnalyseState, // Use Analyse State ...
useDecisionState, // Use Decision State ...
useTriggerState // Use Trigger State ...
);
}
}
//
return result;
}
/**
* Filling Specified Orer Flow Index ...
*
* @param pivotIDX: Integer ...
* @param lookupSwingHighs: Boolean ...
* @param lookupSwingLows: Boolean ...
* @param lookupSupportZones: Boolean ...
* @param lookupResistanceZones: Boolean ...
* @param lookupSupplyZones: Boolean ...
* @param lookupDemandZones: Boolean ...
* @param lookupBullishOrderBlocks: Boolean ...
* @param lookupBearishOrderBlocks: Boolean ...
* @param lookupBullishFairValueGaps: Boolean ...
* @param lookupBearishFairValueGaps: Boolean ...
* @param lookupBullishRejectionBars: Boolean ...
* @param lookupBearishRejectionBars: Boolean ...
* @param lookupBullishMomentumBars: Boolean ...
* @param lookupBearishMomentumBars: Boolean ...
*/
void FillPivotSate(
int pivotIDX, //
bool useVisionState = true, // Use Vision State ...
bool useConsolidationState = true, // Use Consolidation State ...
bool useVerificationState = true, // Use Verification State ...
bool useAnalyseState = true, // Use Analyse State ...
bool useDecisionState = true, // Use Decision State ...
bool useTriggerState = true, // Use Trigger State ...
bool lookupSwingHighs = true,
bool lookupSwingLows = true,
bool lookupSupportZones = true,
bool lookupResistanceZones = true,
bool lookupSupplyZones = true,
bool lookupDemandZones = true,
bool lookupBullishOrderBlocks = true,
bool lookupBearishOrderBlocks = true,
bool lookupBullishFairValueGaps = true,
bool lookupBearishFairValueGaps = true,
bool lookupBullishRejectionBars = true,
bool lookupBearishRejectionBars = true,
bool lookupBullishMomentumBars = true,
bool lookupBearishMomentumBars = true //
)
{
//
CalculatePivotTickZone(pivotIDX);
//
// Trigger ...
XPOIState mPivotTriggerState;
if (useTriggerState &&
mTriggerState.HasChild())
{
//
DetectPivotPOIs(
mOrderFlow[pivotIDX],
mTriggerState,
mPivotTriggerState,
lookupSwingHighs,
lookupSwingLows,
lookupSupportZones,
lookupResistanceZones,
lookupSupplyZones,
lookupDemandZones,
lookupBullishOrderBlocks,
lookupBearishOrderBlocks,
lookupBullishFairValueGaps,
lookupBearishFairValueGaps,
lookupBullishRejectionBars,
lookupBearishRejectionBars,
lookupBullishMomentumBars,
lookupBearishMomentumBars //
);
//
if (mPivotTriggerState.HasChild())
{
mPivotTriggerState.Fill(mOrderFlow[pivotIDX].state);
}
}
//
// Decision ...
XPOIState mPivotDecisionState;
if (useDecisionState &&
mDecisionState.HasChild())
{
//
DetectPivotPOIs(
mOrderFlow[pivotIDX],
mDecisionState,
mPivotDecisionState,
lookupSwingHighs,
lookupSwingLows,
lookupSupportZones,
lookupResistanceZones,
lookupSupplyZones,
lookupDemandZones,
lookupBullishOrderBlocks,
lookupBearishOrderBlocks,
lookupBullishFairValueGaps,
lookupBearishFairValueGaps,
lookupBullishRejectionBars,
lookupBearishRejectionBars,
lookupBullishMomentumBars,
lookupBearishMomentumBars //
);
//
if (mPivotDecisionState.HasChild())
{
mPivotDecisionState.Fill(mOrderFlow[pivotIDX].state);
}
}
//
// Analyse ...
XPOIState mPivotAnalyseState;
if (useAnalyseState &&
mAnalyseState.HasChild())
{
//
DetectPivotPOIs(
mOrderFlow[pivotIDX],
mAnalyseState,
mPivotAnalyseState,
lookupSwingHighs,
lookupSwingLows,
lookupSupportZones,
lookupResistanceZones,
lookupSupplyZones,
lookupDemandZones,
lookupBullishOrderBlocks,
lookupBearishOrderBlocks,
lookupBullishFairValueGaps,
lookupBearishFairValueGaps,
lookupBullishRejectionBars,
lookupBearishRejectionBars,
lookupBullishMomentumBars,
lookupBearishMomentumBars //
);
//
if (mPivotAnalyseState.HasChild())
{
mPivotAnalyseState.Fill(mOrderFlow[pivotIDX].state);
}
}
//
// Verification ...
XPOIState mPivotVerificationState;
if (useVerificationState &&
mVerificationState.HasChild())
{
//
DetectPivotPOIs(
mOrderFlow[pivotIDX],
mVerificationState,
mPivotVerificationState,
lookupSwingHighs,
lookupSwingLows,
lookupSupportZones,
lookupResistanceZones,
lookupSupplyZones,
lookupDemandZones,
lookupBullishOrderBlocks,
lookupBearishOrderBlocks,
lookupBullishFairValueGaps,
lookupBearishFairValueGaps,
lookupBullishRejectionBars,
lookupBearishRejectionBars,
lookupBullishMomentumBars,
lookupBearishMomentumBars //
);
//
if (mPivotVerificationState.HasChild())
{
mPivotVerificationState.Fill(mOrderFlow[pivotIDX].state);
}
}
//
// Consolidation ...
XPOIState mPivotConsolidationState;
if (useConsolidationState &&
mConsolidationState.HasChild())
{
//
DetectPivotPOIs(
mOrderFlow[pivotIDX],
mConsolidationState,
mPivotConsolidationState,
lookupSwingHighs,
lookupSwingLows,
lookupSupportZones,
lookupResistanceZones,
lookupSupplyZones,
lookupDemandZones,
lookupBullishOrderBlocks,
lookupBearishOrderBlocks,
lookupBullishFairValueGaps,
lookupBearishFairValueGaps,
lookupBullishRejectionBars,
lookupBearishRejectionBars,
lookupBullishMomentumBars,
lookupBearishMomentumBars //
);
//
if (mPivotConsolidationState.HasChild())
{
mPivotConsolidationState.Fill(mOrderFlow[pivotIDX].state);
}
}
//
// Vision ...
XPOIState mPivotVisionState;
if (useVisionState &&
mVisionState.HasChild())
{
//
DetectPivotPOIs(
mOrderFlow[pivotIDX],
mVisionState,
mPivotVisionState,
lookupSwingHighs,
lookupSwingLows,
lookupSupportZones,
lookupResistanceZones,
lookupSupplyZones,
lookupDemandZones,
lookupBullishOrderBlocks,
lookupBearishOrderBlocks,
lookupBullishFairValueGaps,
lookupBearishFairValueGaps,
lookupBullishRejectionBars,
lookupBearishRejectionBars,
lookupBullishMomentumBars,
lookupBearishMomentumBars //
);
//
if (mPivotVisionState.HasChild())
{
mPivotVisionState.Fill(mOrderFlow[pivotIDX].state);
}
}
}
/**
* When a BOS Happens ...
* we have to Update Order Flow ...
*/
void UpdateOrderFlow()
{
ResetOrderFlow();
}
/**
* Fill Pivot Tick Zone ...
*
* @param pivotIDX: Integer ...
*/
void CalculatePivotTickZone(int pivotIDX)
{
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
bool isInited = false;
//
datetime from = mOrderFlow[pivotIDX].from;
XOHCL iFromBar;
int iFromBarIndex = iBarShift(
symbol,
period,
from //
);
isInited = iFromBar.Init(
symbol,
period,
iFromBarIndex //
);
if (!isInited)
{
return;
}
//
datetime to = mOrderFlow[pivotIDX].to;
XOHCL iToBar;
int iToBarIndex = iBarShift(
symbol,
period,
to //
);
isInited = iToBar.Init(
symbol,
period,
iToBarIndex //
);
if (!isInited)
{
return;
}
//
XCTicksZone *iZone;
iZone = new XCTicksZone();
//
int ticksLevels = mTriggerDetector.TicksRangeZoneLevel();
int ticksRange = mTriggerDetector.TicksRangeZoneRange();
isInited = ticksLevels > 0 &&
ticksRange > 0;
if (!isInited)
{
return;
}
//
isInited = iZone.Init(
iFromBar,
iToBar //
);
if (!isInited)
{
return;
}
//
mOrderFlow[pivotIDX].state.ticksZone = iZone;
}
/**
* Validate Order Flow ...
*
* @return ( bool )
*/
bool HasValidOrderFlow()
{
//
bool result = false;
//
int orderFlowCount = ArraySize(mOrderFlow);
result =
IsValidSize(orderFlowCount) &&
mOrderFlowDir != X_DIRECTION_ALL &&
mOrderFlowDir != X_DIRECTION_NONE;
//
return result;
}
/**
* Reset Order Flow ...
*/
void ResetOrderFlow()
{
//
Clean(mOrderFlow);
mOrderFlowDir = X_DIRECTION_NONE;
//
ClearDraws();
}
/**
* Detect Breaker Bar ...
*
* @param bar: XOHCL instance ...
* @param breakerBar: XOHCL instance, Breaker Bar ...
* @param pivot: XPVPivot instance ...
* @param forDir: ENUM_X_DIRECTION member, Market Structure Direction ...
*
* @return ( bool )
*/
bool DetectLastBreakerBar(
XOHCL &bar,
XOHCL &breakerBar,
XPVPivot &pivot,
ENUM_X_DIRECTION forDir //
)
{
//
bool result = false;
//
result =
bar.IsValid() &&
pivot.IsValid() &&
forDir != X_DIRECTION_ALL &&
forDir != X_DIRECTION_NONE;
if (!result)
{
return result;
}
//
// FVG ...
result = DetectLastFVGBreakerBar(
bar,
breakerBar,
pivot,
forDir //
);
if (result)
{
return result;
}
//
// Order Block ...
// result = DetectLastOBBreakerBar(
// bar,
// breakerBar,
// pivot,
// forDir //
// );
// if (result)
// {
// return result;
// }
//
return result;
}
bool DetectLastFVGBreakerBar(
XOHCL &bar,
XOHCL &breakerBar,
XPVPivot &pivot,
ENUM_X_DIRECTION forDir //
)
{
//
bool result = false;
//
result =
bar.IsValid() &&
pivot.IsValid() &&
forDir != X_DIRECTION_ALL &&
forDir != X_DIRECTION_NONE;
if (!result)
{
return result;
}
//
bool isBullishDir = IsBullish(forDir);
//
int fvgsCount =
isBullishDir
? pivot.state.CountBullishFairValueGaps()
: pivot.state.CountBearishFairValueGaps();
result = IsValidSize(fvgsCount);
if (!result)
{
return result;
}
//
int idx = -1;
XCFVG *zone = NULL;
for (int i = 0; i < fvgsCount; i++)
{
//
if (isBullishDir)
{
//
// Bullish FVG ...
if (zone == NULL)
{
//
zone = pivot.state.bullishFairValueGaps[i];
//
bool isBreaked = CheckZoneBreak(
forDir,
bar,
breakerBar,
zone //
);
if (isBreaked)
{
idx = i;
}
}
else
{
//
bool isNewer = ((int)zone.From() - (int)bar.time) > ((int)pivot.state.bullishFairValueGaps[i].From() - (int)bar.time);
if (isNewer)
{
//
zone = pivot.state.bullishFairValueGaps[i];
//
bool isBreaked = CheckZoneBreak(
forDir,
bar,
breakerBar,
zone //
);
if (isBreaked)
{
idx = i;
}
}
}
}
else
{
//
// Bearish FVG ...
if (zone == NULL)
{
//
zone = pivot.state.bearishFairValueGaps[i];
//
bool isBreaked = CheckZoneBreak(
forDir,
bar,
breakerBar,
zone //
);
if (isBreaked)
{
idx = i;
}
}
else
{
//
bool isNewer = ((int)zone.From() - (int)bar.time) > ((int)pivot.state.bearishFairValueGaps[i].From() - (int)bar.time);
if (isNewer)
{
//
zone = pivot.state.bearishFairValueGaps[i];
//
bool isBreaked = CheckZoneBreak(
forDir,
bar,
breakerBar,
zone //
);
if (isBreaked)
{
idx = i;
}
}
}
}
}
//
result =
breakerBar.IsValid() &&
IsValidIndex(idx) &&
zone.IsValid();
if (!result)
{
return result;
}
//
return result;
}
/**
* Check an FVG is Breaked or not ...
*
* @param forDir: ENUM_X_DIRECTION member, Market Structure Direction ...
* @param bar: XOHCL instance ...
* @param breakerBar: XOHCL instance, Breaker Bar ...
*
* @return ( bool )
*/
bool CheckZoneBreak(
ENUM_X_DIRECTION forDir,
XOHCL &bar,
XOHCL &breakerBar,
XCFVG *&zone //
)
{
//
bool result = false;
//
breakerBar.Clean();
//
result = bar.IsValid() &&
zone.IsValid() &&
forDir != X_DIRECTION_ALL &&
forDir != X_DIRECTION_NONE;
if (!result)
{
return result;
}
//
int start = bar.Index();
int end = iBarShift(
bar.symbol,
bar.period,
zone.From());
for (int i = start; i < end; i++)
{
//
XOHCL iBar;
result = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!result)
{
break;
}
//
if (IsBullish(forDir))
{
//
// Bullish Break ...
result = iBar.low < zone.Upper() &&
iBar.high > zone.Upper() &&
iBar.GetDown() < zone.Upper() &&
iBar.GetUp() > zone.Upper() &&
iBar.IsBullish();
}
else
{
//
// Bearish Break ...
result = iBar.low < zone.Lower() &&
iBar.high > zone.Lower() &&
iBar.GetDown() < zone.Lower() &&
iBar.GetUp() > zone.Lower() &&
iBar.IsBearish();
}
//
if (result)
{
//
breakerBar = iBar;
break;
}
}
//
result = breakerBar.IsValid();
//
return result;
}
/**
* Detect most Upper and Lower Order Blocks ...
*
* @return ( bool )
*/
bool DetectOrderBlocks(
XCOrderBlock *bullOBBoundary,
XCOrderBlock *bearOBBoundary,
XCOrderBlock *&bullOB,
XCOrderBlock *&bearOB,
XOHCL &bar,
XPOIState &state //
)
{
//
bool result = false;
//
result = bar.IsValid() &&
state.IsValid();
if (!result)
{
return result;
}
//
XCOrderBlock *mBullOB = NULL;
if (bullOB == NULL)
{
//
for (int i = 0; i < state.CountBullishOrderBlocks(); i++)
{
//
XCOrderBlock *ob = state.bullishOrderBlocks[i];
bool isPricePassed = bar.low > ob.Upper();
if (isPricePassed)
{
//
bool isBoundaryPassed =
bullOBBoundary == NULL
? true
: ob.Lower() < bullOBBoundary.Upper();
if (isBoundaryPassed)
{
//
if (mBullOB == NULL)
{
mBullOB = ob;
}
else
{
//
bool isRefined =
mBullOB.Upper() < ob.Upper();
if (isRefined)
{
mBullOB = ob;
}
}
}
}
}
//
if (mBullOB != NULL)
{
bullOB = mBullOB;
}
}
//
XCOrderBlock *mBearOB = NULL;
if (bearOB == NULL)
{
//
for (int i = 0; i < state.CountBearishOrderBlocks(); i++)
{
//
XCOrderBlock *ob = state.bearishOrderBlocks[i];
bool isPricePassed = bar.high < ob.Lower();
if (isPricePassed)
{
//
bool isBoundaryPassed =
bearOBBoundary == NULL
? true
: ob.Upper() > bearOBBoundary.Lower();
if (isBoundaryPassed)
{
//
if (mBearOB == NULL)
{
mBearOB = ob;
}
else
{
//
bool isRefined =
mBearOB.Lower() > ob.Lower();
if (isRefined)
{
mBearOB = ob;
}
}
}
}
}
//
if (mBearOB != NULL)
{
bearOB = mBearOB;
}
}
//
result = bullOB != NULL &&
bearOB != NULL;
//
return result;
}
//
// Drawings ...
/**
* Draw Order Flow ...
*/
void RedrawOrderFlow(
bool forceClearDraws = true,
bool forceDrawSamePeriod = true,
bool drawOrderFlow = true,
bool drawOrderFlowState = true,
bool drawOnlyLastOrderFlow = false,
bool drawOnlyLastOrderFlowState = true,
//
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,
//
// States Drawing ...
bool drawVisionState = false,
bool drawConsolidationState = false,
bool drawVerificationState = false,
bool drawAnalyseState = false,
bool drawDecisionState = false,
bool drawTriggerState = false //
)
{
//
if (forceClearDraws)
{
ClearDraws();
}
//
if (!drawOrderFlow ||
!HasValidOrderFlow())
{
return;
}
//
int orderFlowCount = ArraySize(mOrderFlow);
for (int i = 0; i < orderFlowCount; i++)
{
//
bool isLast = i == orderFlowCount - 1;
bool canDraw =
!drawOnlyLastOrderFlow ||
(isLast &&
drawOnlyLastOrderFlow);
if (!canDraw)
{
continue;
}
//
XPVPivot iPivot = mOrderFlow[i];
//
XCXPVPivotObject *iObj;
iObj = new XCXPVPivotObject();
bool isCreated = iObj.Create(
mPOIDrawer.ChartIdentification(),
mPOIDrawer.SubWindowIdentification(),
iPivot //
);
if (isCreated)
{
//
bool canDrawState =
drawOrderFlowState &&
(!drawOnlyLastOrderFlowState ||
(isLast &&
drawOnlyLastOrderFlowState));
if (canDrawState)
{
//
CustomStateDrawing(
iPivot.state,
forceDrawSamePeriod,
forDir,
ignoreSwingHighs,
ignoreSwingLows,
ignoreSupportZones,
ignoreResistanceZones,
ignoreSupplyZones,
ignoreDemandZones,
ignoreBullishOrderBlocks,
ignoreBearishOrderBlocks,
ignoreBullishFairValueGaps,
ignoreBearishFairValueGaps,
ignoreBullishRejectionBars,
ignoreBearishRejectionBars,
ignoreBullishMomentumBars,
ignoreBearishMomentumBars //
);
}
//
if (iPivot.IsPeak())
{
//
iObj.PivotWidth(1);
iObj.PivotFill(false);
iObj.PivotColor(clrAqua);
iObj.PivotStyle(STYLE_SOLID);
}
//
if (iPivot.IsVale())
{
//
iObj.PivotWidth(1);
iObj.PivotFill(false);
iObj.PivotStyle(STYLE_SOLID);
iObj.PivotColor(clrMagenta);
}
//
AddObjectIfNotExists(iObj);
}
}
//
// Draw States ...
//
// Vision ...
if (drawVisionState)
{
//
CustomStateDrawing(
mVisionState,
false,
forDir,
ignoreSwingHighs,
ignoreSwingLows,
ignoreSupportZones,
ignoreResistanceZones,
ignoreSupplyZones,
ignoreDemandZones,
ignoreBullishOrderBlocks,
ignoreBearishOrderBlocks,
ignoreBullishFairValueGaps,
ignoreBearishFairValueGaps,
ignoreBullishRejectionBars,
ignoreBearishRejectionBars,
ignoreBullishMomentumBars,
ignoreBearishMomentumBars //
);
}
//
// Consolidation ...
if (drawConsolidationState)
{
//
CustomStateDrawing(
mConsolidationState,
false,
forDir,
ignoreSwingHighs,
ignoreSwingLows,
ignoreSupportZones,
ignoreResistanceZones,
ignoreSupplyZones,
ignoreDemandZones,
ignoreBullishOrderBlocks,
ignoreBearishOrderBlocks,
ignoreBullishFairValueGaps,
ignoreBearishFairValueGaps,
ignoreBullishRejectionBars,
ignoreBearishRejectionBars,
ignoreBullishMomentumBars,
ignoreBearishMomentumBars //
);
}
//
// Verification ...
if (drawVerificationState)
{
//
CustomStateDrawing(
mVerificationState,
false,
forDir,
ignoreSwingHighs,
ignoreSwingLows,
ignoreSupportZones,
ignoreResistanceZones,
ignoreSupplyZones,
ignoreDemandZones,
ignoreBullishOrderBlocks,
ignoreBearishOrderBlocks,
ignoreBullishFairValueGaps,
ignoreBearishFairValueGaps,
ignoreBullishRejectionBars,
ignoreBearishRejectionBars,
ignoreBullishMomentumBars,
ignoreBearishMomentumBars //
);
}
//
// Analyse ...
if (drawAnalyseState)
{
//
CustomStateDrawing(
mAnalyseState,
false,
forDir,
ignoreSwingHighs,
ignoreSwingLows,
ignoreSupportZones,
ignoreResistanceZones,
ignoreSupplyZones,
ignoreDemandZones,
ignoreBullishOrderBlocks,
ignoreBearishOrderBlocks,
ignoreBullishFairValueGaps,
ignoreBearishFairValueGaps,
ignoreBullishRejectionBars,
ignoreBearishRejectionBars,
ignoreBullishMomentumBars,
ignoreBearishMomentumBars //
);
}
//
// Decision ...
if (drawDecisionState)
{
//
CustomStateDrawing(
mDecisionState,
false,
forDir,
ignoreSwingHighs,
ignoreSwingLows,
ignoreSupportZones,
ignoreResistanceZones,
ignoreSupplyZones,
ignoreDemandZones,
ignoreBullishOrderBlocks,
ignoreBearishOrderBlocks,
ignoreBullishFairValueGaps,
ignoreBearishFairValueGaps,
ignoreBullishRejectionBars,
ignoreBearishRejectionBars,
ignoreBullishMomentumBars,
ignoreBearishMomentumBars //
);
}
//
// Trigger ...
if (drawTriggerState)
{
//
CustomStateDrawing(
mTriggerState,
false,
forDir,
ignoreSwingHighs,
ignoreSwingLows,
ignoreSupportZones,
ignoreResistanceZones,
ignoreSupplyZones,
ignoreDemandZones,
ignoreBullishOrderBlocks,
ignoreBearishOrderBlocks,
ignoreBullishFairValueGaps,
ignoreBearishFairValueGaps,
ignoreBullishRejectionBars,
ignoreBearishRejectionBars,
ignoreBullishMomentumBars,
ignoreBearishMomentumBars //
);
}
}
/**
* 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 ...
);
}
//
// 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 ...
XPVInputs xpvInputs;
//
xpvInputs.Default();
//
xpvInputs.scMethod = scMethod;
xpvInputs.scPeriod = scPeriod;
xpvInputs.mcMethod = mcMethod;
xpvInputs.mcPeriod = mcPeriod;
xpvInputs.lcMethod = lcMethod;
xpvInputs.lcPeriod = lcPeriod;
xpvInputs.hcMethod = hcMethod;
xpvInputs.hcPeriod = hcPeriod;
//
xpvInputs.showPeaksAndVales = true;
xpvInputs.showLevels = false;
xpvInputs.showConsolidations = false;
xpvInputs.showFibo1Levels = false;
xpvInputs.showFibo2Levels = false;
xpvInputs.showFibo3Levels = false;
xpvInputs.showFibo4Levels = false;
xpvInputs.showFibo5Levels = false;
//
// X3MA ...
X3MAInputs x3maInputs;
//
x3maInputs.Default();
//
// x3maInputs.fastLength = 10;
// x3maInputs.midLength = 25;
// x3maInputs.slowLength = 50;
//
x3maInputs.showFast = true;
x3maInputs.showMid = false;
x3maInputs.showSlow = false;
//
// X3VWAP ...
X3VWAPInputs x3vwapInputs;
//
x3vwapInputs.Default();
//
// x3vwapInputs.fastLength = 10;
// x3vwapInputs.midLength = 25;
// x3vwapInputs.slowLength = 50;
//
x3vwapInputs.showFast = true;
x3vwapInputs.showMid = true;
x3vwapInputs.showSlow = true;
//
// XCHSAR ...
XCHSARInputs xchsarInputs;
//
xchsarInputs.Default();
//
xchsarInputs.scMethod = scMethod;
xchsarInputs.scPeriod = scPeriod;
xchsarInputs.mcMethod = mcMethod;
xchsarInputs.mcPeriod = mcPeriod;
xchsarInputs.lcMethod = lcMethod;
xchsarInputs.lcPeriod = lcPeriod;
xchsarInputs.hcMethod = hcMethod;
xchsarInputs.hcPeriod = hcPeriod;
//
xchsarInputs.showCurrent = true;
xchsarInputs.showShort = false;
xchsarInputs.showMedium = false;
xchsarInputs.showLong = false;
xchsarInputs.showHind = false;
//
// Initialize Cycle Helpers ...
//
mTriggerCycleHelper = new XC121SMCCycleHelper();
mTriggerCycleHelper.Init(
symbol,
PERIOD_M1,
xpvInputs,
x3maInputs,
x3vwapInputs,
xchsarInputs //
);
//
mDecisionCycleHelper = new XC121SMCCycleHelper();
mDecisionCycleHelper.Init(
symbol,
PERIOD_M5,
xpvInputs,
x3maInputs,
x3vwapInputs,
xchsarInputs //
);
//
mAnalyseCycleHelper = new XC121SMCCycleHelper();
mAnalyseCycleHelper.Init(
symbol,
PERIOD_M15,
xpvInputs,
x3maInputs,
x3vwapInputs,
xchsarInputs //
);
//
mVerificationCycleHelper = new XC121SMCCycleHelper();
mVerificationCycleHelper.Init(
symbol,
PERIOD_M30,
xpvInputs,
x3maInputs,
x3vwapInputs,
xchsarInputs //
);
//
mConsolidationCycleHelper = new XC121SMCCycleHelper();
mConsolidationCycleHelper.Init(
symbol,
PERIOD_H1,
xpvInputs,
x3maInputs,
x3vwapInputs,
xchsarInputs //
);
//
mVisionCycleHelper = new XC121SMCCycleHelper();
mVisionCycleHelper.Init(
symbol,
PERIOD_H4,
xpvInputs,
x3maInputs,
x3vwapInputs,
xchsarInputs //
);
}
//
};
//