Files
MQL5Data/Documents/BKP/1/signals/tmp.codes.signals.mq5
T
2025-02-04 03:33:59 +03:30

2996 lines
68 KiB
Plaintext

#include "../Signals/x-121.smc.xhkpv.signal.lib.mq5"
#include "../Signals/x-121.smc.xiobpv.signal.lib.mq5"
#include "../Signals/x-121.smc.xobpv.signal.lib.mq5"
/////////////////////////////////////////////////////////////////////
bool useXHKPVSignal;
bool useXOBPVSignal;
bool useXIOBPVSignal;
Clean(mXHKPVConditionsCollection);
Clean(mXOBPVConditionsCollection);
Clean(mXIOBPVConditionsCollection);
bool hasXHKPVSignal = false;
bool hasXOBPVSignal = false;
bool hasXIOBPVSignal = false;
useXHKPVSignal = false;
useXOBPVSignal = false;
useXIOBPVSignal = false;
//
// XHKPV Signal ...
if (useXHKPVSignal && !hasSignal)
{
//
hasXHKPVSignal = DetectXHKPVSignal(conditions);
hasSignal = hasXHKPVSignal;
}
//
// XOBPV Signal ...
if (useXOBPVSignal && !hasSignal)
{
//
hasXOBPVSignal = DetectXOBPVSignal(conditions);
hasSignal = hasXOBPVSignal;
}
//
// XIOBPV Signal ...
if (useXIOBPVSignal && !hasSignal)
{
//
hasXIOBPVSignal = DetectXIOBPVSignal(conditions);
hasSignal = hasXIOBPVSignal;
}
//
// XHKPV Guard Detection ...
if (useXHKPVSignal)
{
//
bool hasGuard = DetectX121SMCXHKPVGuards(
guards,
positions,
mTriggerCycleHelper,
mDecisionCycleHelper,
mAnalyseCycleHelper,
mVerificationCycleHelper,
mConsolidationCycleHelper,
mVisionCycleHelper //
);
}
//
// XOBPV Guard Detection ...
if (useXOBPVSignal)
{
//
bool hasGuard = DetectX121SMCXOBPVGuards(
guards,
positions,
mTriggerCycleHelper,
mDecisionCycleHelper,
mAnalyseCycleHelper,
mVerificationCycleHelper,
mConsolidationCycleHelper,
mVisionCycleHelper //
);
}
//
// XIOBPV Guard Detection ...
if (useXIOBPVSignal)
{
//
bool hasGuard = DetectX121SMCXIOBPVGuards(
guards,
positions,
mTriggerCycleHelper,
mDecisionCycleHelper,
mAnalyseCycleHelper,
mVerificationCycleHelper,
mConsolidationCycleHelper,
mVisionCycleHelper //
);
}
//
// XHKPV Signal ...
bool DetectXHKPVSignal(
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
bool isBullish = false;
bool isBearish = false;
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL zBar;
result = zBar.Init(
symbol,
period,
zIndex //
);
if (!result)
{
return result;
}
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
return result;
}
//
double cLL = cBar.FindLowest(7, MODE_LOW);
double cHH = cBar.FindHighest(7, MODE_HIGH);
//
datetime cTime = TimeCurrent();
//
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_XHKPV;
string providerStr = ToString(provider);
//
// Detect Setup Conditions ...
datetime setupTime = mXHKPVConditions.setupTime;
bool isSetuped = mXHKPVConditions.IsSetuped();
ENUM_X_DIRECTION setupDir = mXHKPVConditions.dir;
if (!isSetuped)
{
//
// Detect Signal Setup ...
isSetuped = DetectX121SMCXHKPVSignalSetup(
symbol,
period,
mXHKPVConditions,
mTriggerCycleHelper,
mDecisionCycleHelper,
mAnalyseCycleHelper,
mVerificationCycleHelper,
mConsolidationCycleHelper,
mVisionCycleHelper //
);
//
setupDir = mXHKPVConditions.dir;
setupTime = mXHKPVConditions.setupTime;
//
if (isSetuped)
{
//
int items = AddX121SMCXHKPVConditionsIfNotExists(
mXHKPVConditions,
mXHKPVConditionsCollection //
);
//
mXHKPVConditions.Clean();
}
}
//
int conditionsCount = ArraySize(mXHKPVConditionsCollection);
result = IsValidSize(conditionsCount);
if (!result)
{
return result;
}
//
// Looking For Conditions ...
int selectedIndex = 0;
X121SMCStrategyXHKPVSignalConditions mTmpConditions[];
Copy(
mXHKPVConditionsCollection,
mTmpConditions //
);
X121SMCStrategyXHKPVSignalConditions mConditions;
for (int i = 0; i < conditionsCount; i++)
{
//
// Check Triggers ...
bool canTrigger = mTmpConditions[i].CanTrigger();
datetime triggerTime = mTmpConditions[i].triggerTime;
if (!canTrigger)
{
//
// Detect Signal Trigger ...
canTrigger = DetectX121SMCXHKPVSignalTrigger(
mTmpConditions[i],
symbol,
period,
mTriggerCycleHelper,
mDecisionCycleHelper,
mAnalyseCycleHelper,
mVerificationCycleHelper,
mConsolidationCycleHelper,
mVisionCycleHelper //
);
//
result = canTrigger;
if (!result)
{
//
bool isISetuped = mTmpConditions[i].IsSetuped();
if (!isISetuped)
{
//
ArrayRemove(
mXHKPVConditionsCollection,
i,
1 //
);
}
continue;
}
//
triggerTime = mTmpConditions[i].triggerTime;
}
//
if (canTrigger)
{
//
selectedIndex = i;
mConditions = mTmpConditions[i];
break;
}
}
//
result = IsValid(mConditions.setupTime) &&
HasDirection(mConditions.dir);
if (!result)
{
return result;
}
//
// Remove Selected Index from Main Collection ...
ArrayRemove(
mXHKPVConditionsCollection,
selectedIndex,
1 //
);
//
// Check Signal Direction ...
isBullish = IsBullish(mConditions.dir);
isBearish = IsBearish(mConditions.dir);
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
// Issues Signal on Conditions ...
conditions.sl = mConditions.sl;
conditions.provider = providerStr;
conditions.signalDir = mConditions.dir;
conditions.target = mConditions.target;
//
return result;
}
//
// XOBPV Signal ...
bool DetectXOBPVSignal(
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
bool isBullish = false;
bool isBearish = false;
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL zBar;
result = zBar.Init(
symbol,
period,
zIndex //
);
if (!result)
{
return result;
}
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
return result;
}
//
double cLL = cBar.FindLowest(7, MODE_LOW);
double cHH = cBar.FindHighest(7, MODE_HIGH);
//
datetime cTime = TimeCurrent();
//
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_XOBPV;
string providerStr = ToString(provider);
//
// Detect Setup Conditions ...
datetime setupTime = mXOBPVConditions.setupTime;
bool isSetuped = mXOBPVConditions.IsSetuped();
ENUM_X_DIRECTION setupDir = mXOBPVConditions.dir;
if (!isSetuped)
{
//
// Detect Signal Setup ...
isSetuped = DetectX121SMCXOBPVSignalSetup(
symbol,
period,
mXOBPVConditions,
mTriggerCycleHelper,
mDecisionCycleHelper,
mAnalyseCycleHelper,
mVerificationCycleHelper,
mConsolidationCycleHelper,
mVisionCycleHelper //
);
//
setupDir = mXOBPVConditions.dir;
setupTime = mXOBPVConditions.setupTime;
//
if (isSetuped)
{
//
int items = AddX121SMCXOBPVConditionsIfNotExists(
mXOBPVConditions,
mXOBPVConditionsCollection //
);
//
mXOBPVConditions.Clean();
}
}
//
int conditionsCount = ArraySize(mXOBPVConditionsCollection);
result = IsValidSize(conditionsCount);
if (!result)
{
return result;
}
//
// Looking For Conditions ...
int selectedIndex = 0;
X121SMCStrategyXOBPVSignalConditions mTmpConditions[];
Copy(
mXOBPVConditionsCollection,
mTmpConditions //
);
X121SMCStrategyXOBPVSignalConditions mConditions;
for (int i = 0; i < conditionsCount; i++)
{
//
// Check Triggers ...
bool canTrigger = mTmpConditions[i].CanTrigger();
datetime triggerTime = mTmpConditions[i].triggerTime;
if (!canTrigger)
{
//
// Detect Signal Trigger ...
canTrigger = DetectX121SMCXOBPVSignalTrigger(
mTmpConditions[i],
symbol,
period,
mTriggerCycleHelper,
mDecisionCycleHelper,
mAnalyseCycleHelper,
mVerificationCycleHelper,
mConsolidationCycleHelper,
mVisionCycleHelper //
);
//
result = canTrigger;
if (!result)
{
//
bool isISetuped = mTmpConditions[i].IsSetuped();
if (!isISetuped)
{
//
ArrayRemove(
mXOBPVConditionsCollection,
i,
1 //
);
}
continue;
}
//
triggerTime = mTmpConditions[i].triggerTime;
}
//
if (canTrigger)
{
//
selectedIndex = i;
mConditions = mTmpConditions[i];
break;
}
}
//
result = IsValid(mConditions.setupTime) &&
HasDirection(mConditions.dir);
if (!result)
{
return result;
}
//
// Remove Selected Index from Main Collection ...
ArrayRemove(
mXOBPVConditionsCollection,
selectedIndex,
1 //
);
//
// Check Signal Direction ...
isBullish = IsBullish(mConditions.dir);
isBearish = IsBearish(mConditions.dir);
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
// Issues Signal on Conditions ...
conditions.sl = mConditions.sl;
conditions.provider = providerStr;
conditions.signalDir = mConditions.dir;
conditions.target = mConditions.target;
//
return result;
}
//
// XIOBPV Signal ...
bool DetectXIOBPVSignal(
X121SMCStrategyConditions &conditions //
)
{
//
bool result = false;
//
bool isBullish = false;
bool isBearish = false;
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL zBar;
result = zBar.Init(
symbol,
period,
zIndex //
);
if (!result)
{
return result;
}
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
return result;
}
//
double cLL = cBar.FindLowest(7, MODE_LOW);
double cHH = cBar.FindHighest(7, MODE_HIGH);
//
datetime cTime = TimeCurrent();
//
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_XIOBPV;
string providerStr = ToString(provider);
//
// Detect Setup Conditions ...
datetime setupTime = mXIOBPVConditions.setupTime;
bool isSetuped = mXIOBPVConditions.IsSetuped();
ENUM_X_DIRECTION setupDir = mXIOBPVConditions.dir;
if (!isSetuped)
{
//
// Detect Signal Setup ...
isSetuped = DetectX121SMCXIOBPVSignalSetup(
symbol,
period,
mXIOBPVConditions,
mTriggerCycleHelper,
mDecisionCycleHelper,
mAnalyseCycleHelper,
mVerificationCycleHelper,
mConsolidationCycleHelper,
mVisionCycleHelper //
);
//
setupDir = mXIOBPVConditions.dir;
setupTime = mXIOBPVConditions.setupTime;
//
if (isSetuped)
{
//
int items = AddX121SMCXIOBPVConditionsIfNotExists(
mXIOBPVConditions,
mXIOBPVConditionsCollection //
);
//
mXIOBPVConditions.Clean();
}
}
//
int conditionsCount = ArraySize(mXIOBPVConditionsCollection);
result = IsValidSize(conditionsCount);
if (!result)
{
return result;
}
//
// Looking For Conditions ...
int selectedIndex = 0;
X121SMCStrategyXIOBPVSignalConditions mTmpConditions[];
Copy(
mXIOBPVConditionsCollection,
mTmpConditions //
);
X121SMCStrategyXIOBPVSignalConditions mConditions;
for (int i = 0; i < conditionsCount; i++)
{
//
// Check Triggers ...
bool canTrigger = mTmpConditions[i].CanTrigger();
datetime triggerTime = mTmpConditions[i].triggerTime;
if (!canTrigger)
{
//
// Detect Signal Trigger ...
canTrigger = DetectX121SMCXIOBPVSignalTrigger(
mTmpConditions[i],
symbol,
period,
mTriggerCycleHelper,
mDecisionCycleHelper,
mAnalyseCycleHelper,
mVerificationCycleHelper,
mConsolidationCycleHelper,
mVisionCycleHelper //
);
//
result = canTrigger;
if (!result)
{
//
bool isISetuped = mTmpConditions[i].IsSetuped();
if (!isISetuped)
{
//
ArrayRemove(
mXIOBPVConditionsCollection,
i,
1 //
);
}
continue;
}
//
triggerTime = mTmpConditions[i].triggerTime;
}
//
if (canTrigger)
{
//
selectedIndex = i;
mConditions = mTmpConditions[i];
break;
}
}
//
result = IsValid(mConditions.setupTime) &&
HasDirection(mConditions.dir);
if (!result)
{
return result;
}
//
// Remove Selected Index from Main Collection ...
ArrayRemove(
mXIOBPVConditionsCollection,
selectedIndex,
1 //
);
//
// Check Signal Direction ...
isBullish = IsBullish(mConditions.dir);
isBearish = IsBearish(mConditions.dir);
result = isBullish ||
isBearish;
if (!result)
{
return result;
}
//
// Issues Signal on Conditions ...
conditions.sl = mConditions.sl;
conditions.provider = providerStr;
conditions.signalDir = mConditions.dir;
conditions.target = mConditions.target;
//
return result;
}
/////////////////////////////////////////////////////////////////////
const string X121SMCXHKPVToken = "X121XHKPV";
const string X121SMCXOBPVToken = "X121XOBPV";
const string X121SMCXIOBPVToken = "X121XIOBPV";
X_121_SMC_PROVIDER_XHKPV,
X_121_SMC_PROVIDER_XOBPV,
X_121_SMC_PROVIDER_XIOBPV,
//
case X_121_SMC_PROVIDER_XHKPV:
result = X121SMCXHKPVToken;
break;
//
case X_121_SMC_PROVIDER_XOBPV:
result = X121SMCXOBPVToken;
break;
//
case X_121_SMC_PROVIDER_XIOBPV:
result = X121SMCXIOBPVToken;
break;
else if (Contains(X121SMCXHKPVToken, value))
{
result = X_121_SMC_PROVIDER_XHKPV;
}
else if (Contains(X121SMCXOBPVToken, value))
{
result = X_121_SMC_PROVIDER_XOBPV;
}
else if (Contains(X121SMCXIOBPVToken, value))
{
result = X_121_SMC_PROVIDER_XIOBPV;
}
/////////////////////////////////////////////////////////////////////
/**
* Detect Market Structure Method 2 ...
*
* @param model: XMarketStructure instance Reference ...
*
* @return ( bool )
*/
bool DetectMarketStructure(
ENUM_X_DIRECTION &dir,
int pivotsCount = 3 //
)
{
//
bool result = false;
//
int barIndex = 0;
//
if (pivotsCount < 3)
{
pivotsCount = 3;
}
//
dir = X_DIRECTION_NONE;
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
int hpIndex = -1;
int hpIndexes[];
double hpValues[];
//
int lvIndex = -1;
int lvIndexes[];
double lvValues[];
//
for (int i = 0; i < pivotsCount; i++)
{
//
hpIndex = barIndex;
lvIndex = barIndex;
//
double lastHP = 0;
double lastLV = 0;
//
int hpCount = ArraySize(hpIndexes);
int lvCount = ArraySize(lvIndexes);
//
if (IsValidSize(hpCount))
{
//
lastHP = hpValues[hpCount - 1];
hpIndex = hpIndexes[hpCount - 1];
}
//
if (IsValidSize(lvCount))
{
//
lastLV = lvValues[lvCount - 1];
lvIndex = lvIndexes[lvCount - 1];
}
//
if (lastHP == 0)
{
//
lastHP = mX121Helper
.xpvHelper
.GetPeak(hpIndex);
}
//
if (lastLV == 0)
{
//
lastLV = mX121Helper
.xpvHelper
.GetVale(lvIndex);
}
//
int highestPeakIndex = -1;
double highesrPeak =
mX121Helper
.xpvHelper
.GetHigherPeak(
highestPeakIndex,
lastHP,
hpIndex //
);
if (IsValidIndex(highestPeakIndex))
{
//
Add(
highestPeakIndex,
hpIndexes //
);
//
Add(
highesrPeak,
hpValues //
);
}
//
int lowestValeIndex = -1;
double lowestVale =
mX121Helper
.xpvHelper
.GetLowerVale(
lowestValeIndex,
lastLV,
lvIndex //
);
if (IsValidIndex(lowestValeIndex))
{
//
Add(
lowestValeIndex,
lvIndexes //
);
//
Add(
lowestVale,
lvValues //
);
}
//
bool canBreak = ArraySize(hpIndexes) >= pivotsCount ||
ArraySize(lvIndexes) >= pivotsCount;
if (canBreak)
{
break;
}
}
//
ArrayReverse(hpValues);
ArrayReverse(hpIndexes);
int countHPs = ArraySize(hpIndexes);
//
ArrayReverse(lvValues);
ArrayReverse(lvIndexes);
int countLVs = ArraySize(lvIndexes);
//
bool isValidHPs = countHPs >= pivotsCount;
bool isValidLVs = countLVs >= pivotsCount;
//
result = isValidHPs ||
isValidLVs;
if (!result)
{
return result;
}
//
if (isValidHPs && isValidLVs)
{
//
hpIndex = hpIndexes[countHPs - 1];
lvIndex = lvIndexes[countLVs - 1];
}
//
dir =
!isValidHPs && isValidLVs
? X_DIRECTION_BULLISH
: !isValidLVs && isValidHPs
? X_DIRECTION_BEARISH
: hpIndex < lvIndex
? X_DIRECTION_BEARISH
: lvIndex < hpIndex
? X_DIRECTION_BULLISH
: X_DIRECTION_ALL;
//
return result;
}
/**
* Detect Order Blocks ...
*
* @return ( bool )
*/
bool DetectOrderBlocks(
XCOrderBlock *&bullishOrderBlocks[],
XCOrderBlock *&bearishOrderBlocks[] //
)
{
//
bool result = false;
//
Clean(bullishOrderBlocks);
Clean(bearishOrderBlocks);
//
XPOIState state;
mPOIDetector.GetState(state);
bool isValid = state.IsValid() &&
state.HasChild();
if (!isValid)
{
return result;
}
//
int bullOBsCount = DetectValidOrderBlocks(
X_DIRECTION_BULLISH,
state,
bullishOrderBlocks //
);
//
int bearOBsCount = DetectValidOrderBlocks(
X_DIRECTION_BEARISH,
state,
bearishOrderBlocks //
);
//
result = IsValidSize(bullOBsCount +
bearOBsCount);
//
return result;
}
/**
* Detect Fair Value Gaps ...
*
* @return ( bool )
*/
bool DetectFairValueGaps(
XCFVG *&bullishFairValueGaps[],
XCFVG *&bearishFairValueGaps[] //
)
{
//
bool result = false;
//
Clean(bullishFairValueGaps);
Clean(bearishFairValueGaps);
//
XPOIState state;
mPOIDetector.GetState(state);
bool isValid = state.IsValid() &&
state.HasChild();
if (!isValid)
{
return result;
}
//
int bullFVGsCount = DetectValidFairValueGaps(
X_DIRECTION_BULLISH,
state,
bullishFairValueGaps //
);
//
int bearFVGsCount = DetectValidFairValueGaps(
X_DIRECTION_BEARISH,
state,
bearishFairValueGaps //
);
//
result = IsValidSize(bullFVGsCount +
bearFVGsCount);
//
return result;
}
/**
* Detect Support Zones ...
*
* @return ( bool )
*/
bool DetectSupportZones(
XCOrderBlock *&bullishOrderBlocks[],
XCFVG *&bullishFairValueGaps[],
XCSupportZone *&supportZones[] //
)
{
//
bool result = false;
//
Clean(supportZones);
//
int obsCount = ArraySize(bullishOrderBlocks);
int fvgsCount = ArraySize(bullishFairValueGaps);
//
XPOIState state;
mPOIDetector.GetState(state);
bool isValid = state.IsValid() &&
state.HasChild() &&
IsValidSize(obsCount + fvgsCount);
if (!isValid)
{
return result;
}
//
int supportZonesCount = DetectValidSupportZones(
state,
bullishOrderBlocks,
bullishFairValueGaps,
supportZones //
);
//
result = IsValidSize(supportZonesCount);
//
return result;
}
/**
* Detect Resistance Zones ...
*
* @return ( bool )
*/
bool DetectResistanceZones(
XCOrderBlock *&bearishOrderBlocks[],
XCFVG *&bearishFairValueGaps[],
XCResistanceZone *&resistanceZones[] //
)
{
//
bool result = false;
//
Clean(resistanceZones);
//
int obsCount = ArraySize(bearishOrderBlocks);
int fvgsCount = ArraySize(bearishFairValueGaps);
//
XPOIState state;
mPOIDetector.GetState(state);
bool isValid = state.IsValid() &&
state.HasChild() &&
IsValidSize(obsCount + fvgsCount);
if (!isValid)
{
return result;
}
//
int resistanceZonesCount = DetectValidResistanceZones(
state,
bearishOrderBlocks,
bearishFairValueGaps,
resistanceZones //
);
//
result = IsValidSize(resistanceZonesCount);
//
return result;
}
/**
* Detect Demand Zones ...
*
* @return ( bool )
*/
bool DetectDemandZones(
XCOrderBlock *&bullishOrderBlocks[],
XCFVG *&bullishFairValueGaps[],
XCDemandZone *&demandZones[] //
)
{
//
bool result = false;
//
Clean(demandZones);
//
int obsCount = ArraySize(bullishOrderBlocks);
int fvgsCount = ArraySize(bullishFairValueGaps);
//
XPOIState state;
mPOIDetector.GetState(state);
bool isValid = state.IsValid() &&
state.HasChild() &&
IsValidSize(obsCount + fvgsCount);
if (!isValid)
{
return result;
}
//
int demandZonesCount = DetectValidDemandZones(
state,
bullishOrderBlocks,
bullishFairValueGaps,
demandZones //
);
//
result = IsValidSize(demandZonesCount);
//
return result;
}
/**
* Detect Supply Zones ...
*
* @return ( bool )
*/
bool DetectSupplyZones(
XCOrderBlock *&bearishOrderBlocks[],
XCFVG *&bearishFairValueGaps[],
XCSupplyZone *&supplyZones[] //
)
{
//
bool result = false;
//
Clean(supplyZones);
//
int obsCount = ArraySize(bearishOrderBlocks);
int fvgsCount = ArraySize(bearishFairValueGaps);
//
XPOIState state;
mPOIDetector.GetState(state);
bool isValid = state.IsValid() &&
state.HasChild() &&
IsValidSize(obsCount + fvgsCount);
if (!isValid)
{
return result;
}
//
int supplyZonesCount = DetectValidSupplyZones(
state,
bearishOrderBlocks,
bearishFairValueGaps,
supplyZones //
);
//
result = IsValidSize(supplyZonesCount);
//
return result;
}
/**
* Count Prev Peak Repetition ...
*
* @param barIndex: Integer ...
*
* @return ( int )
*/
int CountPrevPeakRepetition(
int barIndex = 0//
) {
//
int result = 0;
//
if (barIndex < 0) {
barIndex = 0;
}
//
int index = barIndex + 1;
double value = mX121Helper.xpvHelper.GetPeak(index);
index++;
//
bool canContinue = true;
while(canContinue) {
//
double iValue = mX121Helper.xpvHelper.GetPeak(index);
//
canContinue = iValue == value;
if (canContinue) {
//
index++;
result++;
}
}
//
return result;
}
/**
* Count Prev Vale Repetition ...
*
* @param barIndex: Integer ...
*
* @return ( int )
*/
int CountPrevValeRepetition(
int barIndex = 0//
) {
//
int result = 0;
//
if (barIndex < 0) {
barIndex = 0;
}
//
int index = barIndex + 1;
double value = mX121Helper.xpvHelper.GetVale(index);
index++;
//
bool canContinue = true;
while(canContinue) {
//
double iValue = mX121Helper.xpvHelper.GetVale(index);
//
canContinue = iValue == value;
if (canContinue) {
//
index++;
result++;
}
}
//
return result;
}
/**
* Get Cycle State and Update it ...
*
* @param state: X121SMCCycleState instance Reference ...
*
* @return ( bool )
*/
bool GetCycleState(X121SMCCycleState &state)
{
//
bool result = false;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
state.symbol = symbol;
state.period = period;
//
datetime cTime = TimeCurrent();
//
// Detect Order Block ...
//
bool hasBullishOBs = state.HasBullishOBs();
int bullishOBsCount = state.CountBullishOBs();
//
bool hasBearishOBs = state.HasBearishOBs();
int bearishOBsCount = state.CountBearishOBs();
//
bool hasOBs = hasBullishOBs &&
hasBearishOBs;
if (!hasOBs)
{
//
XCOrderBlock *bullishOBs[];
XCOrderBlock *bearishOBs[];
hasOBs = DetectOrderBlocks(
bullishOBs,
bearishOBs //
);
//
if (hasOBs &&
!hasBullishOBs)
{
//
Copy(
bullishOBs,
state.bullishOBs //
);
}
//
if (hasOBs &&
!hasBearishOBs)
{
//
Copy(
bearishOBs,
state.bearishOBs //
);
}
//
hasBullishOBs = state.HasBullishOBs();
bullishOBsCount = state.CountBullishOBs();
//
hasBearishOBs = state.HasBearishOBs();
bearishOBsCount = state.CountBearishOBs();
}
//
// Update Order Blocks Time ...
if (hasOBs)
{
//
if (hasBullishOBs)
{
//
for (int i = 0; i < bullishOBsCount; i++)
{
state.bullishOBs[i].To(cTime);
}
}
//
if (hasBearishOBs)
{
//
for (int i = 0; i < bearishOBsCount; i++)
{
state.bearishOBs[i].To(cTime);
}
}
}
//
// Detect Fair Value Gap ...
//
bool hasBullishFVGs = state.HasBullishFVGs();
int bullishFVGsCount = state.CountBullishFVGs();
//
bool hasBearishFVGs = state.HasBearishFVGs();
int bearishFVGsCount = state.CountBearishFVGs();
//
bool hasFVGs = hasBullishFVGs &&
hasBearishFVGs;
if (!hasFVGs)
{
//
XCFVG *bullishFVGs[];
XCFVG *bearishFVGs[];
hasFVGs = DetectFairValueGaps(
bullishFVGs,
bearishFVGs //
);
//
if (hasFVGs &&
!hasBullishFVGs)
{
//
Copy(
bullishFVGs,
state.bullishFVGs //
);
}
//
if (hasFVGs &&
!hasBearishFVGs)
{
//
Copy(
bearishFVGs,
state.bearishFVGs //
);
}
//
hasBullishFVGs = state.HasBullishFVGs();
bullishFVGsCount = state.CountBullishFVGs();
//
hasBearishFVGs = state.HasBearishFVGs();
bearishFVGsCount = state.CountBearishFVGs();
}
//
// Update Fair Value Gaps Time ...
if (hasFVGs)
{
//
if (hasBullishFVGs)
{
//
for (int i = 0; i < bullishFVGsCount; i++)
{
state.bullishFVGs[i].To(cTime);
}
}
//
if (hasBearishFVGs)
{
//
for (int i = 0; i < bearishFVGsCount; i++)
{
state.bearishFVGs[i].To(cTime);
}
}
}
//
// Detect Support Zones ...
//
bool hasSupportZones = state.HasSupportZones();
int supportZonesCount = state.CountSupportZones();
//
if (!hasSupportZones)
{
//
XCSupportZone *supportZones[];
hasSupportZones = DetectSupportZones(
state.bullishOBs,
state.bullishFVGs,
supportZones //
);
//
if (hasSupportZones)
{
//
Copy(
supportZones,
state.supportZones //
);
//
supportZonesCount = state.CountSupportZones();
}
}
//
// Update Support Zones Time ...
if (hasSupportZones)
{
//
for (int i = 0; i < supportZonesCount; i++)
{
state.supportZones[i].To(cTime);
}
}
//
// Detect Demand Zones ...
//
bool hasDemandZones = state.HasDemandZones();
int demandZonesCount = state.CountDemandZones();
//
if (!hasDemandZones)
{
//
XCDemandZone *demandZones[];
hasDemandZones = DetectDemandZones(
state.bullishOBs,
state.bullishFVGs,
demandZones //
);
//
if (hasDemandZones)
{
//
Copy(
demandZones,
state.demandZones //
);
//
demandZonesCount = state.CountDemandZones();
}
}
//
// Update Support Zones Time ...
if (hasDemandZones)
{
//
for (int i = 0; i < demandZonesCount; i++)
{
state.demandZones[i].To(cTime);
}
}
//
// Detect Resistance Zones ...
//
bool hasResistanceZones = state.HasResistanceZones();
int resistanceZonesCount = state.CountResistanceZones();
//
if (!hasResistanceZones)
{
//
XCResistanceZone *resistanceZones[];
hasResistanceZones = DetectResistanceZones(
state.bearishOBs,
state.bearishFVGs,
resistanceZones //
);
//
if (hasResistanceZones)
{
//
for (int i = 0; i < ArraySize(resistanceZones); i++)
{
resistanceZones[i].To(cTime);
}
//
Copy(
resistanceZones,
state.resistanceZones //
);
//
resistanceZonesCount = state.CountResistanceZones();
}
}
//
// Update Resistance Zones Time ...
if (hasResistanceZones)
{
//
for (int i = 0; i < resistanceZonesCount; i++)
{
state.resistanceZones[i].To(cTime);
}
}
//
// Detect Supply Zones ...
//
bool hasSupplyZones = state.HasSupplyZones();
int supplyZonesCount = state.CountSupplyZones();
//
if (!hasSupplyZones)
{
//
XCSupplyZone *supplyZones[];
hasSupplyZones = DetectSupplyZones(
state.bearishOBs,
state.bearishFVGs,
supplyZones //
);
//
if (hasSupplyZones)
{
//
Copy(
supplyZones,
state.supplyZones //
);
//
supplyZonesCount = state.CountSupplyZones();
}
}
//
// Update Resistance Zones Time ...
if (hasSupplyZones)
{
//
for (int i = 0; i < supplyZonesCount; i++)
{
state.supplyZones[i].To(cTime);
}
}
//
result = state.IsValid();
//
return result;
}
/////////////////////////////////////////////////////////////////////
//
// Model Cycle State ...
struct X121SMCCycleState
{
//
// Props ...
string symbol;
ENUM_TIMEFRAMES period;
//
// Bullish ...
XCFVG *bullishFVGs[];
XCOrderBlock *bullishOBs[];
XCDemandZone *demandZones[];
XCSupportZone *supportZones[];
//
// Bearish ...
XCFVG *bearishFVGs[];
XCOrderBlock *bearishOBs[];
XCSupplyZone *supplyZones[];
XCResistanceZone *resistanceZones[];
//
// Constructor ...
X121SMCCycleState()
{
Clean();
}
//
// Tools ...
/**
* Cleanup Model ...
*/
void Clean()
{
//
symbol = NULL;
period = NULL;
//
Clean(bullishFVGs);
Clean(bullishOBs);
Clean(demandZones);
Clean(supportZones);
//
Clean(bearishFVGs);
Clean(bearishOBs);
Clean(supplyZones);
Clean(resistanceZones);
//
ZeroMemory(this);
}
/**
* Validate Model ...
*
* @return ( bool )
*/
bool IsValid()
{
//
bool result = false;
//
result =
//
IsValid(symbol) &&
IsValid(period) &&
(
//
(HasBullishOBs() &&
(HasBullishFVGs() ||
HasSupportZones() ||
HasDemandZones()))
//
||
(HasBearishOBs() &&
(HasSupplyZones() ||
HasBearishFVGs() ||
HasResistanceZones()))
//
)
//
;
//
return result;
}
//
int CountBullishOBs()
{
return ArraySize(bullishOBs);
}
//
bool HasBullishOBs()
{
return IsValidSize(CountBullishOBs());
}
//
int CountBearishOBs()
{
return ArraySize(bearishOBs);
}
//
bool HasBearishOBs()
{
return IsValidSize(CountBearishOBs());
}
//
int CountSupportZones()
{
return ArraySize(supportZones);
}
//
bool HasSupportZones()
{
return IsValidSize(CountSupportZones());
}
//
int CountResistanceZones()
{
return ArraySize(resistanceZones);
}
//
bool HasResistanceZones()
{
return IsValidSize(CountResistanceZones());
}
//
int CountDemandZones()
{
return ArraySize(demandZones);
}
//
bool HasDemandZones()
{
return IsValidSize(CountDemandZones());
}
//
int CountSupplyZones()
{
return ArraySize(supplyZones);
}
//
bool HasSupplyZones()
{
return IsValidSize(CountSupplyZones());
}
//
int CountBullishFVGs()
{
return ArraySize(bullishFVGs);
}
//
bool HasBullishFVGs()
{
return IsValidSize(CountBullishFVGs());
}
//
int CountBearishFVGs()
{
return ArraySize(bearishFVGs);
}
//
bool HasBearishFVGs()
{
return IsValidSize(CountBearishFVGs());
}
//
bool GetOldestOB(
XCOrderBlock *&orderBlock //
)
{
//
bool result = false;
//
orderBlock = NULL;
//
bool hasBullishOB = HasBullishOBs();
bool hasBearishOB = HasBearishOBs();
result = hasBullishOB ||
hasBearishOB;
if (!result)
{
return result;
}
//
int iBullOBIDX = -1;
bool iHasBullOB = false;
XCOrderBlock *iBullOB = NULL;
if (hasBullishOB)
{
//
XCZone *iZones[];
ToZone(
bullishOBs,
iZones //
);
//
iBullOBIDX = GetOldest(
iZones //
);
//
iHasBullOB = IsValidIndex(iBullOBIDX);
if (iHasBullOB)
{
iBullOB = bullishOBs[iBullOBIDX];
}
}
//
int iBearOBIDX = -1;
bool iHasBearOB = false;
XCOrderBlock *iBearOB = NULL;
if (hasBearishOB)
{
//
XCZone *iZones[];
ToZone(
bearishOBs,
iZones //
);
//
iBearOBIDX = GetOldest(
iZones //
);
//
iHasBearOB = IsValidIndex(iBearOBIDX);
if (iHasBearOB)
{
iBearOB = bearishOBs[iBearOBIDX];
}
}
//
if (iHasBullOB)
{
orderBlock = iBullOB;
}
//
if (iHasBearOB)
{
//
bool canSet = orderBlock == NULL ||
orderBlock.From() > iBearOB.From();
if (canSet)
{
orderBlock = iBearOB;
}
}
//
result = orderBlock != NULL &&
orderBlock.IsValid();
//
return result;
}
//
bool GetYoungestOB(
XCOrderBlock *&orderBlock //
)
{
//
bool result = false;
//
orderBlock = NULL;
//
bool hasBullishOB = HasBullishOBs();
bool hasBearishOB = HasBearishOBs();
result = hasBullishOB ||
hasBearishOB;
if (!result)
{
return result;
}
//
int iBullOBIDX = -1;
bool iHasBullOB = false;
XCOrderBlock *iBullOB = NULL;
if (hasBullishOB)
{
//
XCZone *iZones[];
ToZone(
bullishOBs,
iZones //
);
//
iBullOBIDX = GetYoungest(
iZones //
);
//
iHasBullOB = IsValidIndex(iBullOBIDX);
if (iHasBullOB)
{
iBullOB = bullishOBs[iBullOBIDX];
}
}
//
int iBearOBIDX = -1;
bool iHasBearOB = false;
XCOrderBlock *iBearOB = NULL;
if (hasBearishOB)
{
//
XCZone *iZones[];
ToZone(
bearishOBs,
iZones //
);
//
iBearOBIDX = GetYoungest(
iZones //
);
//
iHasBearOB = IsValidIndex(iBearOBIDX);
if (iHasBearOB)
{
iBearOB = bearishOBs[iBearOBIDX];
}
}
//
if (iHasBullOB)
{
orderBlock = iBullOB;
}
//
if (iHasBearOB)
{
//
bool canSet = orderBlock == NULL ||
orderBlock.From() < iBearOB.From();
if (canSet)
{
orderBlock = iBearOB;
}
}
//
result = orderBlock != NULL &&
orderBlock.IsValid();
//
return result;
}
//
};
/**
* Detect Price inside Box ...
*
* @param box: XBoxZone instance Reference, Founded Price Inside Box ...
* @param orderBlock: XCOrderBlock pointer Reference, Founded Price Inside Order Block ...
* @param xConditions: X121Conditions instance Reference, provides Market Conditions ...
* @param state: X121SMCCycleState instance Reference ...
*
* @return ( bool )
*/
bool DetectPriceInsideBox(
XBoxZone &box, // Price Inside Bo ...
XCOrderBlock *&orderBlock, // Price Inside Order Block ...
X121Conditions &xConditions, // X121Conditions for Validation ...
X121SMCCycleState &state // Cycle State ...
)
{
//
bool result = false;
//
box.Clean();
//
string symbol = state.symbol;
ENUM_TIMEFRAMES period = state.period;
//
box.symbol = symbol;
box.period = period;
//
result = state.IsValid();
if (!result)
{
return result;
}
//
// Detect Price Inside Order Block ...
//
bool hasBullishOBs = state.HasBullishOBs();
int bullishOBsCount = state.CountBullishOBs();
//
bool hasBearishOBs = state.HasBearishOBs();
int bearishOBsCount = state.CountBearishOBs();
//
bool hasOBs =
//
hasBullishOBs ||
hasBearishOBs
//
;
result = hasOBs;
if (!result)
{
return result;
}
//
bool hasPriceInsideOB = false;
XCOrderBlock *priceInsideOB = NULL;
ENUM_X_DIRECTION boxDir = X_DIRECTION_NONE;
//
if (hasBullishOBs &&
!hasPriceInsideOB)
{
//
for (int i = 0; i < bullishOBsCount; i++)
{
//
XCOrderBlock *iOb = state.bullishOBs[i];
//
bool isInside = IsPriceInsideZone(
xConditions.valesBuffer[1],
(XCZone *)iOb //
);
if (isInside)
{
//
priceInsideOB = iOb;
hasPriceInsideOB = true;
boxDir = X_DIRECTION_BULLISH;
break;
}
}
}
//
if (hasBearishOBs &&
!hasPriceInsideOB)
{
//
for (int i = 0; i < bearishOBsCount; i++)
{
//
XCOrderBlock *iOb = state.bearishOBs[i];
//
bool isInside = IsPriceInsideZone(
xConditions.peaksBuffer[1],
(XCZone *)iOb //
);
if (isInside)
{
//
priceInsideOB = iOb;
hasPriceInsideOB = true;
boxDir = X_DIRECTION_BEARISH;
break;
}
}
}
//
if (hasPriceInsideOB)
{
//
orderBlock = priceInsideOB;
boxDir = priceInsideOB.IsBullish()
? X_DIRECTION_BULLISH
: priceInsideOB.IsBearish()
? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
}
//
bool hasBullishFVGs = state.HasBullishFVGs();
bool hasBearishFVGs = state.HasBearishFVGs();
bool hasDemandZones = state.HasDemandZones();
bool hasSupplyZones = state.HasSupplyZones();
bool hasSupportZones = state.HasSupportZones();
bool hasResistanceZones = state.HasResistanceZones();
//
bool hasBullishZones =
//
hasBullishFVGs ||
hasDemandZones ||
hasSupportZones
//
;
//
bool hasBearishZones =
//
hasBearishFVGs ||
hasSupplyZones ||
hasResistanceZones
//
;
//
bool hasPropperZones =
//
IsBullish(boxDir)
? hasBullishZones
: IsBearish(boxDir)
? hasBearishZones
: false
//
;
//
if (!hasPropperZones &&
hasPriceInsideOB)
{
//
// Use Price Inside OB as Box ...
box.dir = boxDir;
box.to = priceInsideOB.To();
box.from = priceInsideOB.From();
box.upper = priceInsideOB.Upper();
box.lower = priceInsideOB.Lower();
}
else if (hasPropperZones &&
hasPriceInsideOB)
{
//
// Detect Validate Zones ...
int count = 0;
XBoxZone boxes[];
double upper = 0;
double lower = 0;
double price = 0;
datetime to = NULL;
datetime from = NULL;
ENUM_X_DIRECTION dir = X_DIRECTION_NONE;
if (IsBullish(boxDir))
{
//
double price = xConditions.valesBuffer[1];
dir = X_DIRECTION_BULLISH;
//
// Bullish FVG ...
count = state.CountBullishFVGs();
for (int i = 0; i < count; i++)
{
//
XCFVG *iFVG = state.bullishFVGs[i];
//
to = iFVG.To();
from = iFVG.From();
upper = iFVG.Upper();
lower = iFVG.Lower();
//
bool isInside = IsPriceInsideZone(
price,
upper,
lower //
);
if (isInside)
{
//
XBoxZone iBox;
//
iBox.dir = dir;
iBox.symbol = symbol;
iBox.period = period;
//
iBox.to = to;
iBox.from = from;
iBox.upper = upper;
iBox.lower = lower;
//
if (iBox.IsValid())
{
//
AddRef(
iBox,
boxes //
);
}
}
}
//
// Demand Zones ...
count = state.CountDemandZones();
for (int i = 0; i < count; i++)
{
//
XCDemandZone *iDemand = state.demandZones[i];
//
to = iDemand.To();
from = iDemand.From();
upper = iDemand.Upper();
lower = iDemand.Lower();
//
bool isInside = IsPriceInsideZone(
price,
upper,
lower //
);
if (isInside)
{
//
XBoxZone iBox;
//
iBox.dir = dir;
iBox.symbol = symbol;
iBox.period = period;
//
iBox.to = to;
iBox.from = from;
iBox.upper = upper;
iBox.lower = lower;
//
if (iBox.IsValid())
{
//
AddRef(
iBox,
boxes //
);
}
}
}
//
// Support Zones ...
count = state.CountSupportZones();
for (int i = 0; i < count; i++)
{
//
XCSupportZone *iSupport = state.supportZones[i];
//
to = iSupport.To();
from = iSupport.From();
upper = iSupport.Upper();
lower = iSupport.Lower();
//
bool isInside = IsPriceInsideZone(
price,
upper,
lower //
);
if (isInside)
{
//
XBoxZone iBox;
//
iBox.dir = dir;
iBox.symbol = symbol;
iBox.period = period;
//
iBox.to = to;
iBox.from = from;
iBox.upper = upper;
iBox.lower = lower;
//
if (iBox.IsValid())
{
//
AddRef(
iBox,
boxes //
);
}
}
}
}
else
{
//
double price = xConditions.peaksBuffer[1];
dir = X_DIRECTION_BEARISH;
//
// Bearish FVG ...
count = state.CountBearishFVGs();
for (int i = 0; i < count; i++)
{
//
XCFVG *iFVG = state.bearishFVGs[i];
//
to = iFVG.To();
from = iFVG.From();
upper = iFVG.Upper();
lower = iFVG.Lower();
//
bool isInside = IsPriceInsideZone(
price,
upper,
lower //
);
if (isInside)
{
//
XBoxZone iBox;
//
iBox.dir = dir;
iBox.symbol = symbol;
iBox.period = period;
//
iBox.to = to;
iBox.from = from;
iBox.upper = upper;
iBox.lower = lower;
//
if (iBox.IsValid())
{
//
AddRef(
iBox,
boxes //
);
}
}
}
//
// Supply Zones ...
count = state.CountSupplyZones();
for (int i = 0; i < count; i++)
{
//
XCSupplyZone *iSupply = state.supplyZones[i];
//
to = iSupply.To();
from = iSupply.From();
upper = iSupply.Upper();
lower = iSupply.Lower();
//
bool isInside = IsPriceInsideZone(
price,
upper,
lower //
);
if (isInside)
{
//
XBoxZone iBox;
//
iBox.dir = dir;
iBox.symbol = symbol;
iBox.period = period;
//
iBox.to = to;
iBox.from = from;
iBox.upper = upper;
iBox.lower = lower;
//
if (iBox.IsValid())
{
//
AddRef(
iBox,
boxes //
);
}
}
}
//
// Demand Zones ...
count = state.CountResistanceZones();
for (int i = 0; i < count; i++)
{
//
XCResistanceZone *iResistance = state.resistanceZones[i];
//
to = iResistance.To();
from = iResistance.From();
upper = iResistance.Upper();
lower = iResistance.Lower();
//
bool isInside = IsPriceInsideZone(
price,
upper,
lower //
);
if (isInside)
{
//
XBoxZone iBox;
//
iBox.dir = dir;
iBox.symbol = symbol;
iBox.period = period;
//
iBox.to = to;
iBox.from = from;
iBox.upper = upper;
iBox.lower = lower;
//
if (iBox.IsValid())
{
//
AddRef(
iBox,
boxes //
);
}
}
}
}
//
int boxesCount = ArraySize(boxes);
bool hasBoxes = IsValidSize(boxes);
if (hasBoxes)
{
//
// Filter Boxes ...
for (int i = 0; i < boxesCount; i++)
{
//
XBoxZone iBox = boxes[i];
//
// Direction ...
if (!HasDirection(box.dir) || box.dir != iBox.dir)
{
box.dir = iBox.dir;
}
//
// Upper ...
if (box.upper == 0 || box.upper < iBox.upper)
{
box.upper = iBox.upper;
}
//
// Lower ...
if (box.lower == 0 || box.lower < iBox.lower)
{
box.lower = iBox.lower;
}
//
// To ...
if (!IsValid(box.to) || box.to < iBox.to)
{
box.to = iBox.to;
}
//
// From ...
if (!IsValid(box.from) || box.from > iBox.from)
{
box.from = iBox.from;
}
}
}
else
{
//
// Use Price Inside OB as Box ...
box.dir = boxDir;
box.to = priceInsideOB.To();
box.from = priceInsideOB.From();
box.upper = priceInsideOB.Upper();
box.lower = priceInsideOB.Lower();
}
}
//
result = box.IsValid();
//
return result;
}
/**
* Draw Cycle State ...
*
* @param state: X121SMCCyleState instance Reference ...
*
* @return ( int )
*/
int DrawCycleState(
X121SMCCycleState &state,
XCBaseObject *&drawnObjects[],
bool drawOrderBlocks = true,
bool drawFairValueGaps = true,
bool drawSupplyAndDemandZones = false,
bool drawSupportAndResistanceZones = false //
)
{
//
int result = 0;
//
// Order Blocks ...
if (drawOrderBlocks)
{
//
// Bullish ...
bool hasBullishOBs = state.HasBullishOBs();
int bullishOBsCount = state.CountBullishOBs();
if (hasBullishOBs)
{
//
for (int i = 0; i < bullishOBsCount; i++)
{
//
XCOrderBlock *iOb = state.bullishOBs[i];
//
XCBullishOrderBlockObject *iObObj;
bool isCreated = mPOIDrawer
.CreateBullishOrderBlock(
iOb,
iObObj //
);
if (isCreated)
{
//
Add(
(XCBaseObject *)iObObj,
drawnObjects //
);
}
}
}
//
// Bearish ...
bool hasBearishOBs = state.HasBearishOBs();
int bearishOBsCount = state.CountBearishOBs();
if (hasBearishOBs)
{
//
for (int i = 0; i < bearishOBsCount; i++)
{
//
XCOrderBlock *iOb = state.bearishOBs[i];
//
XCBearishOrderBlockObject *iObObj;
bool isCreated = mPOIDrawer
.CreateBearishOrderBlock(
iOb,
iObObj //
);
if (isCreated)
{
//
Add(
(XCBaseObject *)iObObj,
drawnObjects //
);
}
}
}
}
//
// Fair Value Gaps ...
if (drawFairValueGaps)
{
//
// Bullish ...
bool hasBullishFVGs = state.HasBullishFVGs();
int bullishFVGsCount = state.CountBullishFVGs();
if (hasBullishFVGs)
{
//
for (int i = 0; i < bullishFVGsCount; i++)
{
//
XCFVG *iFVG = state.bullishFVGs[i];
//
XCBullishFairValueGapObject *iFVGObj;
bool isCreated = mPOIDrawer
.CreateBullishFairValueGap(
iFVG,
iFVGObj //
);
if (isCreated)
{
//
iFVGObj.ZoneColor(clrLime);
//
Add(
(XCBaseObject *)iFVGObj,
drawnObjects //
);
}
}
}
//
// Bearish ...
bool hasBearishFVGs = state.HasBearishFVGs();
int bearishFVGsCount = state.CountBearishFVGs();
if (hasBearishFVGs)
{
//
for (int i = 0; i < bearishFVGsCount; i++)
{
//
XCFVG *iFVG = state.bearishFVGs[i];
//
XCBearishFairValueGapObject *iFVGObj;
bool isCreated = mPOIDrawer
.CreateBearishFairValueGap(
iFVG,
iFVGObj //
);
if (isCreated)
{
//
iFVGObj.ZoneColor(clrRed);
//
Add(
(XCBaseObject *)iFVGObj,
drawnObjects //
);
}
}
}
}
//
// Support and Resistance Zones ...
if (drawSupportAndResistanceZones)
{
//
// Support Zones ...
bool hasSupportZones = state.HasSupportZones();
int supportZonesCount = state.CountSupportZones();
if (hasSupportZones)
{
//
for (int i = 0; i < supportZonesCount; i++)
{
//
XCSupportZoneObject *iObj;
bool isCreated = mPOIDrawer
.CreateSupportZone(
state.supportZones[i],
iObj //
);
//
if (isCreated)
{
//
iObj.ZoneColor(clrDarkSeaGreen);
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
//
// Resistance Zones ...
bool hasResistanceZones = state.HasResistanceZones();
int resistanceZonesCount = state.CountResistanceZones();
if (hasResistanceZones)
{
//
for (int i = 0; i < resistanceZonesCount; i++)
{
//
XCResistanceZoneObject *iObj;
bool isCreated = mPOIDrawer
.CreateResistanceZone(
state.resistanceZones[i],
iObj //
);
//
if (isCreated)
{
//
iObj.ZoneColor(clrSaddleBrown);
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
}
//
// Supply and Demand Zones ...
if (drawSupplyAndDemandZones)
{
//
// Demand Zones ...
bool hasDemandZones = state.HasDemandZones();
int demandZonesCount = state.CountDemandZones();
if (hasDemandZones)
{
//
for (int i = 0; i < demandZonesCount; i++)
{
//
XCDemandZoneObject *iObj;
bool isCreated = mPOIDrawer
.CreateDemandZone(
state.demandZones[i],
iObj //
);
//
if (isCreated)
{
//
iObj.ZoneColor(clrDarkTurquoise);
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
//
// Supply Zones ...
bool hasSupplyZones = state.HasSupplyZones();
int supplyZonesCount = state.CountSupplyZones();
if (hasSupplyZones)
{
//
for (int i = 0; i < supplyZonesCount; i++)
{
//
XCSupplyZoneObject *iObj;
bool isCreated = mPOIDrawer
.CreateSupplyZone(
state.supplyZones[i],
iObj //
);
//
if (isCreated)
{
//
iObj.ZoneColor(clrChocolate);
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
}
//
result = ArraySize(drawnObjects);
//
return result;
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////