Files
xMQL5/BKPS/14031206/Classes/x-saherelm.x-poi.class.mq5
T
2025-02-24 19:20:10 +03:30

4218 lines
87 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XPOI
// Description: Provides Point of Interests ...
// - Swing Highs;
// - Swing Lows;
//
// 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-saherelm.x-alert.class.mq5"
#include "../Classes/x-saherelm.x-bar.analyser.class.mq5"
#include "../Classes/x-saherelm.x-poi.drawer.class.mq5"
#include "../Libraries/x-saherelm.x-poi.lib.mq5"
//
#include <Arrays/ArrayObj.mqh>
//
// Implementation ...
//
// POI Detector Class ...
class XCPOIDetector : public XCBaseAlert
{
//
public:
//
XCPOIDrawer *mDrawer;
//
// Constructors ...
/**
* Create an Instance ...
*
* @param symbol: String ...
* @param period: ENUM_TIMEFRAMES member ...
*/
void XCPOIDetector(
string symbol,
ENUM_TIMEFRAMES period //
)
{
//
// Attach Required Properties ...
mSymbol = symbol;
mPeriod = period;
//
// Initialize Bar Tracker ...
mBarTracker.Init(
mSymbol,
mPeriod //
);
//
// Create Default Drawer Instance ...
mDrawer = new XCPOIDrawer();
//
// Apply Default Configurations ...
Default();
}
//
// Deconstructor ...
void ~XCPOIDetector()
{
Destroy();
}
//
// Getter(s) / Setter(s) ...
/**
* Retrieve Detector Symbol ...
*
* @return ( string )
*/
string GetSymbol()
{
return mSymbol;
}
/**
* Retrieve Detector Period ...
*
* @return ( ENUM_TIMEFRAMES )
*/
ENUM_TIMEFRAMES GetPeriod()
{
return mPeriod;
}
/**
* Get Max Number of POIs which holds ...
*
* @return ( int )
*/
int MaxNumberOfPOIs()
{
return mMaxNumberOfPOIs;
}
/**
* Set Max Number of POIs which holds ...
* 0 => Infinity ...
*
* @param value: Integer ...
*/
void MaxNumberOfPOIs(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mMaxNumberOfPOIs = value;
}
/**
* Get Number of POI(s) which must Find at Initializations ...
*
* @return ( int )
*/
int MaxNumberOfRequiredPOIs()
{
return mMaxNumberOfRequiredPOIs;
}
/**
* Set Number of POI(s) which must Find at Initializations ...
* 2 is Default ...
*
* @param value: Integer ...
*/
void MaxNumberOfRequiredPOIs(int value)
{
//
if (value < 2)
{
value = 2;
}
//
mMaxNumberOfRequiredPOIs = value;
}
/**
* Check Is Locked or not ...
*
* @return ( bool )
*/
bool IsLocked()
{
return mLock;
}
//
// POI(s) Configs ...
//
// Swings ...
/**
* Get Swing Verification Range Length ...
*
* @return ( int )
*/
int SwingRange()
{
return mSwingRange;
}
/**
* Set Swing Verification Range Length ...
*
* @param value: Integer ...
*/
void SwingRange(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mSwingRange = value;
}
//
// Momentum Bars ...
/**
* Get Momentum Bars must Extends Range ...
*
* @return ( int )
*/
int MomentumBarExtendRange()
{
return mMomentumBarExtendRange;
}
/**
* Set Momentum Bars must Extends Range ...
*
* @param value: Integer ...
*/
void MomentumBarExtendRange(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mMomentumBarExtendRange = value;
}
/**
* Get Momentum Bars Body Percent ...
*
* @return ( double )
*/
double MomentumBarBodyPercent()
{
return mMomentumBarBodyPercent;
}
/**
* Set Momentum Bars Body Percent ...
*
* @param value: Double ...
*/
void MomentumBarBodyPercent(double value)
{
//
if (value < 50)
{
value = 50;
}
//
mMomentumBarBodyPercent = value;
}
//
// Rejection Bars ...
/**
* Get Rejection Bars must Extends Range ...
*
* @return ( int )
*/
int RejectionBarExtendRange()
{
return mRejectionBarExtendRange;
}
/**
* Set Rejection Bars must Extends Range ...
*
* @param value: Integer ...
*/
void RejectionBarExtendRange(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mRejectionBarExtendRange = value;
}
/**
* Get Rejection Bars Shadow Percent ...
*
* @return ( double )
*/
double RejectionBarShadowPercent()
{
return mRejectionBarShadowPercent;
}
/**
* Set Rejection Bars Shadow Percent ...
*
* @param value: Double ...
*/
void RejectionBarShadowPercent(double value)
{
//
if (value < 50)
{
value = 50;
}
//
mRejectionBarShadowPercent = value;
}
//
// Support and Resistance Zone(s) ...
/**
* Get Support and Resistance Range for Verification ...
*
* @return ( int )
*/
int SupportAndResistanceRange()
{
return mSupportAndResistanceRange;
}
/**
* Set Support and Resistance Range for Verification ...
*
* @param value: Integer ...
*/
void SupportAndResistanceRange(int value)
{
//
if (value < 2)
{
value = 2;
}
//
mSupportAndResistanceRange = value;
}
//
// Supply and Demand Zone(s) ...
/**
* Get Supply and Demand Range Verifications ...
*
* @return ( int )
*/
int SupplyAndDemandRange()
{
return mSupplyAndDemandRange;
}
/**
* Set Supply and Demand Range Verifications ...
*
* @param value: Integer ...
*/
void SupplyAndDemandRange(int value)
{
//
if (value < 2)
{
value = 2;
}
//
mSupplyAndDemandRange = value;
}
//
// Order Blocks ...
/**
* Get Order Blocks Detection Bars ...
*
* @return ( int )
*/
int OrderBlocksSameBars()
{
return mOrderBlocksSameBars;
}
/**
* Set Order Blocks Detection Bars ...
*
* @param value: Argument 1
*/
void OrderBlocksSameBars(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mOrderBlocksSameBars = value;
}
//
// Fair Value Gaps ...
/**
* Get Fair Value Gaps Detection Same Bars ...
*
* @return ( int )
*/
int FairValueGapsSameBars()
{
return mFairValueGapsSameBars;
}
/**
* Set Fair Value Gaps Detection Same Bars ...
*
* @param value: Integer ...
*/
void FairValueGapsSameBars(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mFairValueGapsSameBars = value;
}
//
// Ticks Zone ...
/**
* Get Ticks Range Levels ...
*
* @return ( int )
*/
int TicksRangeZoneLevel()
{
return mTicksRangeZoneLevel;
}
/**
* Set Ticks Range Levels ...
*
* @param value: Integer ...
*/
void TicksRangeZoneLevel(int value)
{
//
if (value < 2)
{
value = 2;
}
//
mTicksRangeZoneLevel = value;
}
/**
* Get Ticks Range Zone Loopback Period ...
*
* @return ( int )
*/
int TicksRangeZoneRange()
{
return mTicksRangeZoneRange;
}
/**
* Set Ticks Range Zone Loopback Period ...
*
* @param value: Integer ...
*/
void TicksRangeZoneRange(int value)
{
//
if (value < 7)
{
value = 7;
}
//
mTicksRangeZoneRange = value;
}
//
// Actions ...
/**
* Initialize POI Detector ...
*/
void Init()
{
DetectRequiredPOIs();
}
/**
* Update POI(s) ...
*
* @param state: an Array Refrence of ENUM_XPOI_EVENTS members ...
*/
int Update(
ENUM_XPOI_EVENTS &state[] //
)
{
//
int result = 0;
//
Clean(state);
//
// Check Bar Tracker if Waits ...
if (!mBarTracker.IsNewBar())
{
return result;
}
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
datetime cTime = TimeCurrent();
//
XOHCL zBar;
bool isInited = zBar.Init(
symbol,
period,
zIndex //
);
if (!isInited)
{
return result;
}
//
XOHCL cBar;
isInited = cBar.Init(
symbol,
period,
cIndex //
);
if (!isInited)
{
return result;
}
//
// POI Detecting ...
bool isDetected = false;
//
// Swings ...
int iSwingRange = SwingRange();
if (iSwingRange > 0)
{
//
XOHCL swingBar;
isInited = swingBar.Init(
symbol,
period,
zIndex + iSwingRange //
);
if (isInited)
{
//
// Swing High ...
isDetected = DetectSwingHigh(swingBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_SWING_HIGH_DETECTED;
XCSwing *param;
bool hasItem = GetLastItem(
param,
mSwingHighs //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Swing Low ...
isDetected = DetectSwingLow(swingBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_SWING_LOW_DETECTED;
XCSwing *param;
bool hasItem = GetLastItem(
param,
mSwingLows //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
}
}
//
// Bullish Momentum Bars ...
isDetected = DetectBullishMomentumBar(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BULLISH_MOMENTUM_BAR_DETECTED;
XCMomentumBar *param;
bool hasItem = GetLastItem(
param,
mBullishMomentumBars //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Bearish Momentum Bars ...
isDetected = DetectBearishMomentumBar(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BEARISH_MOMENTUM_BAR_DETECTED;
XCMomentumBar *param;
bool hasItem = GetLastItem(
param,
mBearishMomentumBars //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Bullish Rejection Bars ...
isDetected = DetectBullishRejectionBar(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BULLISH_REJECTION_BAR_DETECTED;
XCRejectionBar *param;
bool hasItem = GetLastItem(
param,
mBullishRejectionBars //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Bearish Rejection Bars ...
isDetected = DetectBearishRejectionBar(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BEARISH_REJECTION_BAR_DETECTED;
XCRejectionBar *param;
bool hasItem = GetLastItem(
param,
mBearishRejectionBars //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Support and Resistance Zones ...
int supResRange = SupportAndResistanceRange();
if (supResRange > 0)
{
//
XOHCL supResBar;
isInited = supResBar.Init(
symbol,
period,
zIndex + supResRange //
);
if (isInited)
{
//
// Support Zones ...
isDetected = DetectSupportZone(supResBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_SUPPORT_ZONE_DETECTED;
XCSupportZone *param;
bool hasItem = GetLastItem(
param,
mSupportZones //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Resistance Zones ...
isDetected = DetectResistanceZone(supResBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_RESISTANCE_ZONE_DETECTED;
XCResistanceZone *param;
bool hasItem = GetLastItem(
param,
mResistanceZones //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
}
}
//
// Supply And Demand Zones ...
int supDemRange = SupplyAndDemandRange();
if (supDemRange > 0)
{
//
// Supply Zone ...
isDetected = DetectSupplyZone(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_SUPPLY_ZONE_DETECTED;
XCSupplyZone *param;
bool hasItem = GetLastItem(
param,
mSupplyZones //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Demand Zone ...
isDetected = DetectDemandZone(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_DEMAND_ZONE_DETECTED;
XCDemandZone *param;
bool hasItem = GetLastItem(
param,
mDemandZones //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
}
//
// Order Blocks ...
int obSameBars = OrderBlocksSameBars();
if (obSameBars > 0)
{
//
// Bullish Order Block ...
isDetected = DetectBullishOrderBlock(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BULLISH_ORDERBLOCK_DETECTED;
XCOrderBlock *param;
bool hasItem = GetLastItem(
param,
mBullishOrderBlocks //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Bearish Order Block ...
isDetected = DetectBearishOrderBlock(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BEARISH_ORDERBLOCK_DETECTED;
XCOrderBlock *param;
bool hasItem = GetLastItem(
param,
mBearishOrderBlocks //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
}
//
// Fair Value Gaps ...
int fvgSameBars = FairValueGapsSameBars();
if (fvgSameBars > 0)
{
//
// Bullish Fair Value Gap ...
isDetected = DetectBullishFairValueGap(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BULLISH_FVG_DETECTED;
XCFVG *param;
bool hasItem = GetLastItem(
param,
mBullishFairValueGaps //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Bearish Fair Value Gap ...
isDetected = DetectBearishFairValueGap(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BEARISH_FVG_DETECTED;
XCFVG *param;
bool hasItem = GetLastItem(
param,
mBearishFairValueGaps //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
}
//
// Ticks Range Zone ...
int ticksLevels = TicksRangeZoneLevel();
int ticksRange = TicksRangeZoneRange();
if (ticksLevels > 0 &&
ticksRange > 0)
{
//
isDetected = DetectTicksZoneRange(cBar);
if (isDetected)
{
}
}
//
ValidatePOIs(cBar);
//
CleanupUnusedPOIs();
//
mBarTracker.Waits();
//
result = ArraySize(state);
//
return result;
}
/**
* Destroy Class ...
*/
void Destroy()
{
//
DestroyPOIs();
DestroySessions();
DestroyEventListeners();
//
delete mDrawer;
delete mTicksZone;
//
ZeroMemory(mDrawer);
ZeroMemory(mTicksZone);
}
//
// Retrievers ...
/**
* Get Current State of POIs ...
*
* @param state: XPOIState instance ...
*/
void GetState(
XPOIState &state //
)
{
//
state.Clean();
//
state.symbol = mSymbol;
state.period = mPeriod;
state.time = TimeCurrent();
//
Copy(
mSwingHighs,
state.swingHighs //
);
//
Copy(
mSwingLows,
state.swingLows //
);
//
Copy(
mBullishMomentumBars,
state.bullishMomentumBars //
);
//
Copy(
mBearishMomentumBars,
state.bearishMomentumBars //
);
//
Copy(
mBullishRejectionBars,
state.bullishRejectionBars //
);
//
Copy(
mBearishRejectionBars,
state.bearishRejectionBars //
);
//
Copy(
mSupportZones,
state.supportZones //
);
//
Copy(
mResistanceZones,
state.resistanceZones //
);
//
Copy(
mSupplyZones,
state.supplyZones //
);
//
Copy(
mDemandZones,
state.demandZones //
);
//
Copy(
mBullishOrderBlocks,
state.bullishOrderBlocks //
);
//
Copy(
mBearishOrderBlocks,
state.bearishOrderBlocks //
);
//
Copy(
mBullishFairValueGaps,
state.bullishFairValueGaps //
);
//
Copy(
mBearishFairValueGaps,
state.bearishFairValueGaps //
);
//
state.ticksZone = mTicksZone;
//
}
//
// Event Listeners ...
/**
* Add Event Listener ...
*
* @param listener: TOnPOIEvent instance ...
*/
void AddEventListener(TOnPOIEvent listener)
{
//
Add(
listener,
mEventListeners //
);
}
//
// Destroy ...
/**
* Destroy Detected POI(s) ...
*/
void DestroyPOIs()
{
//
Clean(mSwingHighs);
Clean(mSwingLows);
//
Clean(mBullishMomentumBars);
Clean(mBearishMomentumBars);
//
Clean(mBullishRejectionBars);
Clean(mBearishRejectionBars);
//
Clean(mSupportZones);
Clean(mResistanceZones);
//
Clean(mSupplyZones);
Clean(mDemandZones);
//
Clean(mBullishOrderBlocks);
Clean(mBearishOrderBlocks);
//
Clean(mBullishFairValueGaps);
Clean(mBearishFairValueGaps);
}
/**
* Destroy Added Sessions ...
*/
void DestroySessions()
{
}
/**
* Destroy Rejistered Event Handlers ...
*/
void DestroyEventListeners()
{
Clean(mEventListeners);
}
//
// Virtual Actions ...
/**
* Apply Default Configurations ...
*/
virtual void Default()
{
//
// Common ...
//
MaxNumberOfPOIs(10);
MaxNumberOfRequiredPOIs(2);
//
SwingRange(2);
//
MomentumBarExtendRange(2);
MomentumBarBodyPercent(70);
//
RejectionBarExtendRange(0);
RejectionBarShadowPercent(55);
//
SupportAndResistanceRange(7);
//
SupplyAndDemandRange(144);
//
OrderBlocksSameBars(3);
//
FairValueGapsSameBars(3);
//
TicksRangeZoneLevel(10);
TicksRangeZoneRange(144);
}
//
// Detector Functions ...
/**
* Detect Swing High ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectSwingHigh(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int range = SwingRange();
int barIndex = bar.Index();
result = range > 0 &&
barIndex >= range;
if (!result)
{
return result;
}
//
result = mBarAnalyser.IsSwingHigh(
bar,
range //
);
if (result)
{
//
XCSwing *swing;
swing = new XCSwing();
result = swing.Init(
bar,
X_POI_SWING_HIGH //
);
//
if (result)
{
//
Add(
swing,
mSwingHighs //
);
}
}
//
return result;
}
/**
* Detect Swing Low ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectSwingLow(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int range = SwingRange();
int barIndex = bar.Index();
result = range > 0 &&
barIndex >= range;
if (!result)
{
return result;
}
//
result = mBarAnalyser.IsSwingLow(
bar,
range //
);
if (result)
{
//
XCSwing *swing;
swing = new XCSwing();
result = swing.Init(
bar,
X_POI_SWING_LOW //
);
//
if (result)
{
//
Add(
swing,
mSwingLows //
);
}
}
//
return result;
}
/**
* Detect Bullish Momentum Bar ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBullishMomentumBar(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid() &&
bar.Index() > 0;
if (!result)
{
return result;
}
//
int extendRange = MomentumBarExtendRange();
double bodyPercent = MomentumBarBodyPercent();
ENUM_X_DIRECTION dir;
result = mBarAnalyser.IsMomentumBar(
bar,
dir,
extendRange,
bodyPercent //
);
result =
result &&
dir == X_DIRECTION_BULLISH;
if (result)
{
//
XCMomentumBar *momentumBar;
momentumBar = new XCMomentumBar();
result = momentumBar.Init(bar);
//
if (result)
{
//
Add(
momentumBar,
mBullishMomentumBars //
);
}
}
//
return result;
}
/**
* Detect Bearish Momentum Bar ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBearishMomentumBar(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid() &&
bar.Index() > 0;
if (!result)
{
return result;
}
//
int extendRange = MomentumBarExtendRange();
double bodyPercent = MomentumBarBodyPercent();
ENUM_X_DIRECTION dir;
result = mBarAnalyser.IsMomentumBar(
bar,
dir,
extendRange,
bodyPercent //
);
result =
result &&
dir == X_DIRECTION_BEARISH;
if (result)
{
//
XCMomentumBar *momentumBar;
momentumBar = new XCMomentumBar();
result = momentumBar.Init(bar);
//
if (result)
{
//
Add(
momentumBar,
mBearishMomentumBars //
);
}
}
//
return result;
}
/**
* Detect Bullish Rejection Bar ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBullishRejectionBar(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid() &&
bar.Index() > 0;
if (!result)
{
return result;
}
//
int extendRange = RejectionBarExtendRange();
double shadowPercent = RejectionBarShadowPercent();
ENUM_X_DIRECTION dir;
result = mBarAnalyser.IsRejectionBar(
bar,
dir,
extendRange,
shadowPercent //
);
result =
result &&
dir == X_DIRECTION_BULLISH;
if (result)
{
//
XCRejectionBar *rejectionBar;
rejectionBar = new XCRejectionBar();
result = rejectionBar.Init(bar);
//
if (result)
{
//
Add(
rejectionBar,
mBullishRejectionBars //
);
}
}
//
return result;
}
/**
* Detect Bearish Rejection Bar ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBearishRejectionBar(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid() &&
bar.Index() > 0;
if (!result)
{
return result;
}
//
int extendRange = RejectionBarExtendRange();
double shadowPercent = RejectionBarShadowPercent();
ENUM_X_DIRECTION dir;
result = mBarAnalyser.IsRejectionBar(
bar,
dir,
extendRange,
shadowPercent //
);
result =
result &&
dir == X_DIRECTION_BEARISH;
if (result)
{
//
XCRejectionBar *rejectionBar;
rejectionBar = new XCRejectionBar();
result = rejectionBar.Init(bar);
//
if (result)
{
//
Add(
rejectionBar,
mBearishRejectionBars //
);
}
}
//
return result;
}
/**
* Detect Support Zone ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectSupportZone(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int range = SupportAndResistanceRange();
int barIndex = bar.Index();
result = range > 0 &&
barIndex >= range;
if (!result)
{
return result;
}
//
result = mBarAnalyser.IsSupport(
bar,
range //
);
if (result)
{
//
XCSupportZone *support;
support = new XCSupportZone();
result = support.Init(
bar,
range //
);
//
if (result)
{
//
datetime cTime = TimeCurrent();
support.To(cTime);
//
Add(
support,
mSupportZones //
);
}
}
//
return result;
}
/**
* Detect Resistance Zone ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectResistanceZone(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int range = SupportAndResistanceRange();
int barIndex = bar.Index();
result = range > 0 &&
barIndex >= range;
if (!result)
{
return result;
}
//
result = mBarAnalyser.IsResistance(
bar,
range //
);
if (result)
{
//
XCResistanceZone *resistance;
resistance = new XCResistanceZone();
result = resistance.Init(
bar,
range //
);
//
if (result)
{
//
Add(
resistance,
mResistanceZones //
);
}
}
//
return result;
}
/**
* Detect Supply Zone ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectSupplyZone(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int range = SupplyAndDemandRange();
result = range > 0;
if (!result)
{
return result;
}
//
int hhIDX = -1;
double hh = -1;
//
int llIDX = -1;
double ll = -1;
//
result = mBarAnalyser
.CalculateLoopbackHLData(
hhIDX,
hh,
llIDX,
ll,
bar,
range //
);
if (!result)
{
return result;
}
//
XOHCL supplyBar;
result = supplyBar.Init(
bar.symbol,
bar.period,
hhIDX //
);
if (result)
{
//
XCSupplyZone *supply;
supply = new XCSupplyZone();
result = supply.Init(
supplyBar,
range //
);
//
if (result)
{
//
datetime cTime = TimeCurrent();
supply.To(cTime);
//
Add(
supply,
mSupplyZones //
);
}
}
//
return result;
}
/**
* Detect Demand Zone ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectDemandZone(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int range = SupplyAndDemandRange();
result = range > 0;
if (!result)
{
return result;
}
//
int hhIDX = -1;
double hh = -1;
//
int llIDX = -1;
double ll = -1;
//
result = mBarAnalyser
.CalculateLoopbackHLData(
hhIDX,
hh,
llIDX,
ll,
bar,
range //
);
if (!result)
{
return result;
}
//
XOHCL demandBar;
result = demandBar.Init(
bar.symbol,
bar.period,
llIDX //
);
if (result)
{
//
XCDemandZone *demand;
demand = new XCDemandZone();
result = demand.Init(
demandBar,
range //
);
//
if (result)
{
//
datetime cTime = TimeCurrent();
demand.To(cTime);
//
Add(
demand,
mDemandZones //
);
}
}
//
return result;
}
/**
* Detect Bullish Order Block ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBullishOrderBlock(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int sameBars = OrderBlocksSameBars();
result = sameBars > 0;
if (!result)
{
return result;
}
//
XOHCL obBar;
ENUM_X_DIRECTION dir;
result = mBarAnalyser
.HasOrderBlock(
bar,
obBar,
dir,
sameBars //
);
result =
result &&
dir == X_DIRECTION_BULLISH;
if (!result)
{
return result;
}
//
if (result)
{
//
XCOrderBlock *ob;
ob = new XCOrderBlock();
result = ob.Init(
obBar,
dir //
);
//
if (result)
{
//
datetime cTime = TimeCurrent();
ob.To(cTime);
//
Add(
ob,
mBullishOrderBlocks //
);
}
}
//
return result;
}
/**
* Detect Bullish Order Block ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBullishOrderBlock(
XOHCL &bar,
XCOrderBlock *&ob //
)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int sameBars = OrderBlocksSameBars();
result = sameBars > 0;
if (!result)
{
return result;
}
//
XOHCL obBar;
ENUM_X_DIRECTION dir;
result = mBarAnalyser
.HasOrderBlock(
bar,
obBar,
dir,
sameBars //
);
result =
result &&
dir == X_DIRECTION_BULLISH;
if (!result)
{
return result;
}
//
if (result)
{
//
ob = new XCOrderBlock();
result = ob.Init(
obBar,
dir //
);
//
if (result)
{
//
datetime cTime = TimeCurrent();
ob.To(cTime);
}
}
//
return result;
}
/**
* Detect Bearish Order Block ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBearishOrderBlock(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int sameBars = OrderBlocksSameBars();
result = sameBars > 0;
if (!result)
{
return result;
}
//
XOHCL obBar;
ENUM_X_DIRECTION dir;
result = mBarAnalyser
.HasOrderBlock(
bar,
obBar,
dir,
sameBars //
);
result =
result &&
dir == X_DIRECTION_BEARISH;
if (!result)
{
return result;
}
//
if (result)
{
//
XCOrderBlock *ob;
ob = new XCOrderBlock();
result = ob.Init(
obBar,
dir //
);
//
if (result)
{
//
datetime cTime = TimeCurrent();
ob.To(cTime);
//
Add(
ob,
mBearishOrderBlocks //
);
}
}
//
return result;
}
/**
* Detect Bearish Order Block ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBearishOrderBlock(
XOHCL &bar,
XCOrderBlock *&ob //
)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int sameBars = OrderBlocksSameBars();
result = sameBars > 0;
if (!result)
{
return result;
}
//
XOHCL obBar;
ENUM_X_DIRECTION dir;
result = mBarAnalyser
.HasOrderBlock(
bar,
obBar,
dir,
sameBars //
);
result =
result &&
dir == X_DIRECTION_BEARISH;
if (!result)
{
return result;
}
//
if (result)
{
//
ob = new XCOrderBlock();
result = ob.Init(
obBar,
dir //
);
//
if (result)
{
//
datetime cTime = TimeCurrent();
ob.To(cTime);
}
}
//
return result;
}
/**
* Detect Bullish Fair Value Gap ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBullishFairValueGap(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int sameBars = FairValueGapsSameBars();
result = sameBars > 0;
if (!result)
{
return result;
}
//
XOHCL prevBar;
XOHCL nextBar;
ENUM_X_DIRECTION dir;
result = mBarAnalyser
.HasFairValueGap(
bar,
prevBar,
nextBar,
dir,
sameBars //
);
result =
result &&
dir == X_DIRECTION_BULLISH;
if (!result)
{
return result;
}
//
if (result)
{
//
XCFVG *fvg;
fvg = new XCFVG();
result = fvg.Init(
prevBar,
nextBar,
dir //
);
//
if (result)
{
//
datetime cTime = TimeCurrent();
fvg.To(cTime);
//
Add(
fvg,
mBullishFairValueGaps //
);
}
}
//
return result;
}
/**
* Detect Bearish Fair Value Gap ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBearishFairValueGap(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int sameBars = FairValueGapsSameBars();
result = sameBars > 0;
if (!result)
{
return result;
}
//
XOHCL prevBar;
XOHCL nextBar;
ENUM_X_DIRECTION dir;
result = mBarAnalyser
.HasFairValueGap(
bar,
prevBar,
nextBar,
dir,
sameBars //
);
result =
result &&
dir == X_DIRECTION_BEARISH;
if (!result)
{
return result;
}
//
if (result)
{
//
XCFVG *fvg;
fvg = new XCFVG();
result = fvg.Init(
prevBar,
nextBar,
dir //
);
//
if (result)
{
//
datetime cTime = TimeCurrent();
fvg.To(cTime);
//
Add(
fvg,
mBearishFairValueGaps //
);
}
}
//
return result;
}
//
protected:
//
//
// Actions ...
/**
* Lock ...
*/
void Lock()
{
mLock = true;
}
/**
* Unlock ...
*/
void Unlock()
{
mLock = false;
}
/**
* Detect Required POI(s) ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*/
void DetectRequiredPOIs(int barIndex = 0)
{
//
// Validate Reuired POI(s) ...
int requiredPOIs = MaxNumberOfRequiredPOIs();
if (requiredPOIs <= 0)
{
return;
}
//
// Locking Detector ...
Lock();
//
// Normalize Bar Index ...
if (barIndex < 0)
{
barIndex = 0;
}
//
int swingLowsCount = 0;
int swingHighsCount = 0;
//
int bullishMomentumBarsCount = 0;
int bearishMomentumBarsCount = 0;
//
int bullishRejectionBarsCount = 0;
int bearishRejectionBarsCount = 0;
//
int supportZonesCount = 0;
int resistanceZonesCount = 0;
//
int supplyZonesCount = 0;
int demandZonesCount = 0;
//
int bullishOrderBlocksCount = 0;
int bearishOrderBlocksCount = 0;
//
int bullishFairValueGapsCount = 0;
int bearishFairValueGapsCount = 0;
//
bool canContinue = true;
//
while (canContinue)
{
//
// Swings ...
int iSwingRange = SwingRange();
if (iSwingRange > 0)
{
//
// Swing Highs ...
swingHighsCount = DetectRequiredSwingHighs(barIndex);
if (swingHighsCount == requiredPOIs)
{
ArrayReverse(mSwingHighs);
}
//
// Swing Lows ...
swingLowsCount = DetectRequiredSwingLows(barIndex);
if (swingLowsCount == requiredPOIs)
{
ArrayReverse(mSwingLows);
}
}
//
bool canLookupMomentumBars =
MomentumBarExtendRange() >= 0 &&
MomentumBarBodyPercent() > 0;
if (canLookupMomentumBars)
{
//
//
// Bullish Momentum Bars ...
bullishMomentumBarsCount = DetectRequiredBullishMomentumBars(barIndex);
if (bullishMomentumBarsCount == requiredPOIs)
{
ArrayReverse(mBullishMomentumBars);
}
//
// Bearish Momentum Bars ...
bearishMomentumBarsCount = DetectRequiredBearishMomentumBars(barIndex);
if (bearishMomentumBarsCount == requiredPOIs)
{
ArrayReverse(mBearishMomentumBars);
}
}
//
bool canLookupRejectionBars =
RejectionBarExtendRange() >= 0 &&
RejectionBarShadowPercent() > 0;
if (canLookupRejectionBars)
{
//
//
// Bullish Rejection Bars ...
bullishRejectionBarsCount = DetectRequiredBullishRejectionBars(barIndex);
if (bullishRejectionBarsCount == requiredPOIs)
{
ArrayReverse(mBullishRejectionBars);
}
//
// Bearish Rejection Bars ...
bearishRejectionBarsCount = DetectRequiredBearishRejectionBars(barIndex);
if (bearishRejectionBarsCount == requiredPOIs)
{
ArrayReverse(mBearishRejectionBars);
}
}
//
// Support and Resistance Zones ...
int supResRange = SupportAndResistanceRange();
if (supResRange > 0)
{
//
// Support Zone(s) ...
supportZonesCount = DetectRequiredSupportZones(barIndex);
if (supportZonesCount == requiredPOIs)
{
ArrayReverse(mSupportZones);
}
//
// Resistance Zone(s) ...
resistanceZonesCount = DetectRequiredResistanceZones(barIndex);
if (resistanceZonesCount == requiredPOIs)
{
ArrayReverse(mResistanceZones);
}
}
//
// Supply and Demand Zones ...
int supDemRange = SupplyAndDemandRange();
if (supDemRange > 0)
{
//
supplyZonesCount = DetectRequiredSupplyZones(barIndex);
if (supplyZonesCount == requiredPOIs)
{
ArrayReverse(mSupplyZones);
}
//
demandZonesCount = DetectRequiredDemandZones(barIndex);
if (demandZonesCount == requiredPOIs)
{
ArrayReverse(mDemandZones);
}
}
//
// Oder Blocks ...
int obSameBars = OrderBlocksSameBars();
if (obSameBars > 0)
{
//
// Bullish Order Blocks ...
bullishOrderBlocksCount = DetectRequiredBullishOrderBlocks(barIndex);
if (bullishOrderBlocksCount == requiredPOIs)
{
ArrayReverse(mBullishOrderBlocks);
}
//
// Bearish Order Blocks ...
bearishOrderBlocksCount = DetectRequiredBearishOrderBlocks(barIndex);
if (bearishOrderBlocksCount == requiredPOIs)
{
ArrayReverse(mBearishOrderBlocks);
}
}
//
// Fair Value Gaps ...
int fvgSameBars = FairValueGapsSameBars();
if (fvgSameBars > 0)
{
//
// Bullish Fair Value Gaps ...
bullishFairValueGapsCount = DetectRequiredBullishFairValueGaps(barIndex);
if (bullishFairValueGapsCount == requiredPOIs)
{
ArrayReverse(mBullishFairValueGaps);
}
//
// Bearish Fair Value Gaps ...
bearishFairValueGapsCount = DetectRequiredBearishFairValueGaps(barIndex);
if (bearishFairValueGapsCount == requiredPOIs)
{
ArrayReverse(mBearishFairValueGaps);
}
}
//
// Swings ...
bool canContinueSwingHighs =
iSwingRange > 0
? swingHighsCount < requiredPOIs
: false;
bool canContinueSwingLows =
iSwingRange > 0
? swingLowsCount < requiredPOIs
: false;
//
// Support and Resistance Zones ...
bool canContinueSupportZones =
supResRange > 0
? supportZonesCount < requiredPOIs
: false;
bool canContinueResistanceZones =
supResRange > 0
? resistanceZonesCount < requiredPOIs
: false;
//
// Supply and Demand Zones ...
bool canContinueSupplyZones =
supDemRange > 0
? supplyZonesCount < requiredPOIs
: false;
bool canContinueDemandZones =
supDemRange > 0
? demandZonesCount < requiredPOIs
: false;
//
// Order Blocks ...
bool canContinueBullishOrderBlocks =
obSameBars > 0
? bullishOrderBlocksCount < requiredPOIs
: false;
bool canContinueBearishOrderBlocks =
obSameBars > 0
? bearishOrderBlocksCount < requiredPOIs
: false;
//
// Fair Value Gaps ...
bool canContinueBullishFairValueGaps =
fvgSameBars > 0
? bullishFairValueGapsCount < requiredPOIs
: false;
bool canContinueBearishFairValueGaps =
fvgSameBars > 0
? bearishFairValueGapsCount < requiredPOIs
: false;
//
// Rejection Bars ...
bool canContinueBullishRejectionBars =
canLookupRejectionBars
? bullishRejectionBarsCount < requiredPOIs
: false;
bool canContinueBearishRejectionBars =
canLookupRejectionBars
? bearishRejectionBarsCount < requiredPOIs
: false;
//
// Momentum Bars ...
bool canContinueBullishMomentumBars =
canLookupMomentumBars
? bullishMomentumBarsCount < requiredPOIs
: false;
bool canContinueBearishMomentumBars =
canLookupMomentumBars
? bearishMomentumBarsCount < requiredPOIs
: false;
//
canContinue =
//
// Swings ...
canContinueSwingHighs ||
canContinueSwingLows ||
//
// Support and Resistance Zones ...
canContinueSupportZones ||
canContinueResistanceZones ||
//
// Supply and Demand Zones ...
canContinueSupplyZones ||
canContinueDemandZones ||
//
// Order Blocks ...
canContinueBullishOrderBlocks ||
canContinueBearishOrderBlocks ||
//
// Fair Value Gaps ...
canContinueBullishFairValueGaps ||
canContinueBearishFairValueGaps ||
//
// Rejection Bars ...
canContinueBullishRejectionBars ||
canContinueBearishRejectionBars ||
//
// Momentum Bars ...
canContinueBullishMomentumBars ||
canContinueBearishMomentumBars
//
;
if (canContinue)
{
barIndex++;
}
}
//
// Unlocking Detector ...
Unlock();
}
/**
* Validate Founded POI(s) ...
*
* @param bar: XOHCL instance ...
*/
void ValidatePOIs(XOHCL &bar)
{
}
/**
* Cleanup Unused Objects ...
*/
void CleanupUnusedPOIs()
{
//
int maxAllowed = MaxNumberOfPOIs();
if (!IsValidSize(maxAllowed))
{
return;
}
//
int swingHighsCount = ArraySize(mSwingHighs);
int swingLowsCount = ArraySize(mSwingLows);
// int tradingDaysCount = ArraySize(mTradingDays);
// int marketSessionsCount = ArraySize(mMarketSessions);
// int momentumBarsCount = ArraySize(mMomentumBars);
// int rejectionBarsCount = ArraySize(mRejectionBars);
// int supportZonesCount = ArraySize(mSupportZones);
// int resistanceZonesCount = ArraySize(mResistanceZones);
// int supplyZonesCount = ArraySize(mSupplyZones);
// int demandZonesCount = ArraySize(mDemandZones);
// int bullishOBsCount = ArraySize(mBullishOrderBlocks);
// int bearishOBsCount = ArraySize(mBearishOrderBlocks);
// int bullishFVGsCount = ArraySize(mBullishFVGs);
// int bearishFVGsCount = ArraySize(mBearishFVGs);
//
int from = 0;
int requiredPOIs = MaxNumberOfRequiredPOIs();
int count = maxAllowed - requiredPOIs;
int to = count - 1;
//
// Swings ...
// //
// // Swing Highs ...
// if (swingHighsCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mSwingHighs,
// from,
// count //
// );
// }
// //
// // Swing Lows ...
// if (swingLowsCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mSwingLows,
// from,
// count //
// );
// }
// //
// // Trading Days ...
// if (tradingDaysCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mTradingDays,
// from,
// count //
// );
// //
// mTradingDayObjects.DeleteRange(
// from,
// to //
// );
// }
// //
// // Market Sessions ...
// if (marketSessionsCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mMarketSessions,
// from,
// count //
// );
// //
// mMarketSessionObjects.DeleteRange(
// from,
// to //
// );
// }
// //
// // Momentum Bars ...
// if (momentumBarsCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mMomentumBars,
// from,
// count //
// );
// //
// mMomentumBarObjects.DeleteRange(
// from,
// to //
// );
// }
// //
// // Rejection Bars ...
// if (rejectionBarsCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mRejectionBars,
// from,
// count //
// );
// //
// mRejectionBarObjects.DeleteRange(
// from,
// to //
// );
// }
// //
// // Support and Resistance Zones ...
// //
// // Support Zones ...
// if (supportZonesCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mSupportZones,
// from,
// count //
// );
// //
// mSupportZoneObjects.DeleteRange(
// from,
// to //
// );
// }
// //
// // Resistance Zones ...
// if (resistanceZonesCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mResistanceZones,
// from,
// count //
// );
// //
// mResistanceZoneObjects.DeleteRange(
// from,
// to //
// );
// }
// //
// // Supply and Demand Zones ...
// //
// // Supply Zones ...
// if (supplyZonesCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mSupplyZones,
// from,
// count //
// );
// //
// mSupplyZoneObjects.DeleteRange(
// from,
// to //
// );
// }
// //
// // Demand Zones ...
// if (demandZonesCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mDemandZones,
// from,
// count //
// );
// //
// mDemandZoneObjects.DeleteRange(
// from,
// to //
// );
// }
// //
// // Order Blocks ...
// //
// // Bullish Order Blocks ...
// if (bullishOBsCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mBullishOrderBlocks,
// from,
// count //
// );
// //
// mBullishOrderBlockObjects.DeleteRange(
// from,
// to //
// );
// }
// //
// // Bearish Order Blocks ...
// if (bearishOBsCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mBearishOrderBlocks,
// from,
// count //
// );
// //
// mBearishOrderBlockObjects.DeleteRange(
// from,
// to //
// );
// }
// //
// // Fair Vakue Gaps ...
// //
// // Bullish FVGs ...
// if (bullishFVGsCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mBullishFVGs,
// from,
// count //
// );
// //
// mBullishFVGObjects.DeleteRange(
// from,
// to //
// );
// }
// //
// // Bearish FVGs ...
// if (bearishFVGsCount >= maxAllowed)
// {
// //
// ArrayRemove(
// mBearishFVGs,
// from,
// count //
// );
// //
// mBearishFVGObjects.DeleteRange(
// from,
// to //
// );
// }
//
}
/**
* Notify Event Listeners ...
*
* @param event: ENUM_XPOI_EVENTS member, Specified Occured Event ...
* @param param: XCBasePOI implementation, Specified Event Object ...
*/
void NotifyEventListeners(
ENUM_XPOI_EVENTS event,
XCBasePOI *param //
)
{
//
int count = ArraySize(mEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
mEventListeners[i](
event,
param //
);
}
}
void AddObjectIfNotExists(XCBaseObject *object)
{
//
string name = object.ObjName();
//
bool canAdd = true;
int count = mDrawnObjects.Total();
if (IsValidSize(count))
{
//
for (int i = 0; i < count; i++)
{
//
string iName = ((XCBaseObject *)mDrawnObjects.At(i)).ObjName();
//
if (name == iName)
{
//
canAdd = false;
break;
}
}
}
//
if (canAdd)
{
mDrawnObjects.Add(object);
}
}
//
private:
//
//
// Props ...
//
bool mLock; // Lock State ...
string mSymbol; // Market Symbol ...
ENUM_TIMEFRAMES mPeriod; // Market Period ...
int mMaxNumberOfPOIs; // Max Allowed Number of POI(s) which Can Holds ...
int mMaxNumberOfRequiredPOIs; // Max Allowed Number of POI(s) which Must Find at Initializion Time ...
//
CArrayObj mDrawnObjects; // Drawn Objects ...
XBarTracker mBarTracker; // Market Bar Tracker ...
XCBarAnalyser mBarAnalyser; // Bar Analyser ...
//
TOnPOIEvent mEventListeners[]; // Event Listeners ...
//
// POI Props ...
//
// XDay ...
//
// XSession ...
//
// XSwing ...
int mSwingRange; // Swing Verification Range Length ...
//
// Swing High ...
//
XCSwing *mSwingHighs[]; // Holds Founded Swing Highs ...
/**
* Detect Required Swing Highs ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredSwingHighs(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mSwingHighs);
if (count >= required)
{
//
result = count;
return result;
}
//
int range = SwingRange();
if (range < 0 || barIndex < range)
{
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectSwingHigh(bar);
//
result = ArraySize(mSwingHighs);
//
return result;
}
//
// Swing Low ...
//
XCSwing *mSwingLows[]; // Holds Founded Swing Lows ...
/**
* Detect Required Swing Lows ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredSwingLows(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mSwingLows);
if (count >= required)
{
//
result = count;
return result;
}
//
int range = SwingRange();
if (range < 0 || barIndex < range)
{
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectSwingLow(bar);
//
result = ArraySize(mSwingLows);
//
return result;
}
//
// Momentum Bars ...
int mMomentumBarExtendRange; // Momentum Bars must Extends Range ...
double mMomentumBarBodyPercent; // Momentum Bars Body Percent ...
//
// Bullish ...
XCMomentumBar *mBullishMomentumBars[]; // Holds Founded Bullish Momentum Bars ...
/**
* Detect Required Bullish Momentum Bars ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBullishMomentumBars(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBullishMomentumBars);
if (count >= required)
{
//
result = count;
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBullishMomentumBar(bar);
//
result = ArraySize(mBullishMomentumBars);
//
return result;
}
//
// Bearish ...
XCMomentumBar *mBearishMomentumBars[]; // Holds Founded Bearish Momentum Bars ...
/**
* Detect Required Bearish Momentum Bars ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBearishMomentumBars(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBearishMomentumBars);
if (count >= required)
{
//
result = count;
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBearishMomentumBar(bar);
//
result = ArraySize(mBearishMomentumBars);
//
return result;
}
//
// Rejection Bars ...
int mRejectionBarExtendRange; // Rejection Bars must Extends Range ...
double mRejectionBarShadowPercent; // Rejection Bars Shadow Percent ...
//
// Bullish ...
XCRejectionBar *mBullishRejectionBars[]; // Holds Founded Bullish Rejection Bars ...
/**
* Detect Required Bullish Rejection Bars ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBullishRejectionBars(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBullishRejectionBars);
if (count >= required)
{
//
result = count;
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBullishRejectionBar(bar);
//
result = ArraySize(mBullishRejectionBars);
//
return result;
}
//
// Bearish ...
XCRejectionBar *mBearishRejectionBars[]; // Holds Founded Bearish Rejection Bars ...
/**
* Detect Required Bearish Rejection Bars ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBearishRejectionBars(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBearishRejectionBars);
if (count >= required)
{
//
result = count;
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBearishRejectionBar(bar);
//
result = ArraySize(mBearishRejectionBars);
//
return result;
}
//
// Support and Resistance Zone ...
int mSupportAndResistanceRange; // Support and Resistance Range for Verification ...
//
// Support Zone(s) ...
XCSupportZone *mSupportZones[]; // Holds Founded Support Zones ...
/**
* Detect Required Support Zones ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredSupportZones(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mSupportZones);
if (count >= required)
{
//
result = count;
return result;
}
//
int range = SupportAndResistanceRange();
if (range < 0 || barIndex < range)
{
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectSupportZone(bar);
//
result = ArraySize(mSupportZones);
//
return result;
}
//
// Resistance Zone(s) ...
XCResistanceZone *mResistanceZones[]; // Holds Founded Resistance Zones ...
/**
* Detect Required Resistance Zones ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredResistanceZones(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mResistanceZones);
if (count >= required)
{
//
result = count;
return result;
}
//
int range = SupportAndResistanceRange();
if (range < 0 || barIndex < range)
{
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectResistanceZone(bar);
//
result = ArraySize(mResistanceZones);
//
return result;
}
//
// Supply and Demand Zones ...
int mSupplyAndDemandRange; // Supply and Demand Range Verifications ...
//
// Supply Zone(s) ...
XCSupplyZone *mSupplyZones[]; // Holds Founded Supply Zones ...
/**
* Detect Required Supply Zones ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredSupplyZones(int barIndex)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mSupplyZones);
if (count >= required)
{
//
result = count;
return result;
}
//
int range = SupplyAndDemandRange();
if (range < 0)
{
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectSupplyZone(bar);
//
result = ArraySize(mSupplyZones);
//
return result;
}
//
// Demand Zone(s) ...
XCDemandZone *mDemandZones[]; // Holds Founded Demand Zones ...
/**
* Detect Required Demand Zones ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredDemandZones(int barIndex)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mDemandZones);
if (count >= required)
{
//
result = count;
return result;
}
//
int range = SupplyAndDemandRange();
if (range < 0)
{
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectDemandZone(bar);
//
result = ArraySize(mDemandZones);
//
return result;
}
//
// Order Blocks ...
int mOrderBlocksSameBars; // Order Blocks Detection Bars ...
//
// Bullish OB ...
XCOrderBlock *mBullishOrderBlocks[]; // Holds Founded Bullish Order Blocks ...
/**
* Detect Required Bullish Order Blocks ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBullishOrderBlocks(int barIndex)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBullishOrderBlocks);
if (count >= required)
{
//
result = count;
return result;
}
//
int sameBars = OrderBlocksSameBars();
if (sameBars < 0)
{
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBullishOrderBlock(bar);
//
result = ArraySize(mBullishOrderBlocks);
//
return result;
}
//
// Bearish OB ...
XCOrderBlock *mBearishOrderBlocks[]; // Holds Founded Bearish Order Blocks ...
/**
* Detect Required Bearish Order Blocks ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBearishOrderBlocks(int barIndex)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBearishOrderBlocks);
if (count >= required)
{
//
result = count;
return result;
}
//
int sameBars = OrderBlocksSameBars();
if (sameBars < 0)
{
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBearishOrderBlock(bar);
//
result = ArraySize(mBearishOrderBlocks);
//
return result;
}
//
// Fair Value Gaps ...
int mFairValueGapsSameBars; // Fair Value Gaps Detection Same Bars ...
//
// Bullish FVG ...
XCFVG *mBullishFairValueGaps[]; // Holds Founded Bullish Fair Value Gaps ...
/**
* Detect Required Bullish Fair Value Gaps ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBullishFairValueGaps(int barIndex)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBullishFairValueGaps);
if (count >= required)
{
//
result = count;
return result;
}
//
int sameBars = FairValueGapsSameBars();
if (sameBars < 0)
{
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBullishFairValueGap(bar);
//
result = ArraySize(mBullishFairValueGaps);
//
return result;
}
//
// Bearish FVG ...
XCFVG *mBearishFairValueGaps[]; // Holds Founded Bearish Fair Value Gaps ...
/**
* Detect Required Bearish Fair Value Gaps ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBearishFairValueGaps(int barIndex)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBearishFairValueGaps);
if (count >= required)
{
//
result = count;
return result;
}
//
int sameBars = FairValueGapsSameBars();
if (sameBars < 0)
{
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBearishFairValueGap(bar);
//
result = ArraySize(mBearishFairValueGaps);
//
return result;
}
//
// Ticks Range Zones ...
int mTicksRangeZoneLevel; // Ticks Range Levels ...
int mTicksRangeZoneRange; // Ticks Range Zone Loopback Period ...
//
XCTicksZone *mTicksZone; // Ticks Zone ...
// XCTicksZoneObject *mTicksZoneObject; // Ticks Zone Object ...
/**
* Detect Ticks Zone Range ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectTicksZoneRange(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int ticksLevels = TicksRangeZoneLevel();
int ticksRange = TicksRangeZoneRange();
result = ticksLevels > 0 &&
ticksRange > 0;
if (!result)
{
return result;
}
//
int startBarIndex = bar.Index() + ticksRange;
XOHCL startBar;
result = startBar.Init(
bar.symbol,
bar.period,
startBarIndex //
);
if (!result)
{
return result;
}
//
mTicksZone = new XCTicksZone();
result = mTicksZone.Init(
startBar,
bar //
);
if (!result)
{
//
mTicksZone = NULL;
return result;
}
//
return result;
}
//
// Liquidity Zones ...
//
// Sell Side ...
//
// Buy Side ...
//
};
//