Files
MQL5Data/Classes/x-saherelm.x-poi.class.mq5
T

9109 lines
202 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////
//
// 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-chart-objects.class.mq5"
#include "../Classes/x-saherelm.xalert.class.mq5"
//
#include <Arrays/ArrayObj.mqh>
#include <ChartObjects/ChartObject.mqh>
#include <ChartObjects/ChartObjectsArrows.mqh>
#include <ChartObjects/ChartObjectsLines.mqh>
//
// Implementation ...
//
class XCPOI : public XSCBaseAlert
{
//
public:
//
//
// Constructors ...
/**
* Create an Instance ...
*
* @param symbol: String ...
* @param period: ENUM_TIMEFRAMES member ...
*/
void XCPOI(
string symbol,
ENUM_TIMEFRAMES period //
)
{
//
// Attach Required Properties ...
mSymbol = symbol;
mPeriod = period;
//
// Initialize Bar Tracker ...
mBarTracker.Init(
mSymbol,
mPeriod //
);
//
// Apply Default Configurations ...
ApplyDefaultConfig();
}
//
// Deconstructor ...
void ~XCPOI()
{
//
DestroyPOIs();
DestroyObjects();
DestroySessions();
DestroyEventListeners();
}
//
// Getter(s) / Setter(s) ...
/**
* Get Chart ID ...
*
* @return ( long )
*/
long ChartID()
{
return mChartID;
}
/**
* Set Chart ID ...
*
* @param value: Long
*/
void ChartID(long value)
{
//
if (value < 0)
{
value = 0;
}
//
mChartID = value;
}
/**
* Get Sub Window Number ...
*
* @return ( int )
*/
int Window()
{
return mWindow;
}
/**
* Get Sub Window Number ...
*
* @param value: Integer ...
*/
void Window(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mWindow = value;
}
/**
* 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 ...
//
// Trading Days ...
/**
* Get Detect Trading Days State ...
*
* @return ( bool )
*/
bool AllowTradingDays()
{
return mAllowTradingDays;
}
/**
* Set Detect Trading Days State ...
*
* @param value: Boolean ...
*/
void AllowTradingDays(bool value)
{
mAllowTradingDays = value;
}
/**
* Get Draw Trading Days State ...
*
* @return ( bool )
*/
bool AllowDrawTradingDays()
{
return mAllowDrawTradingDays;
}
/**
* Set Draw Trading Days State ...
*
* @param value: Boolean ...
*/
void AllowDrawTradingDays(bool value)
{
mAllowDrawTradingDays = value;
}
/**
* Get Trading Days Start Color ...
*
* @return ( color )
*/
color TradingDaysStartColor()
{
return mTradingDaysStartColor;
}
/**
* Set Trading Days Start Color ...
*
* @param value: Argument 1
*/
void TradingDaysStartColor(color value)
{
mTradingDaysStartColor = value;
}
/**
* Get Trading Days Start Style ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_LINE_STYLE TradingDaysStartStyle()
{
return mTradingDaysStartStyle;
}
/**
* Set Trading Days Start Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
void TradingDaysStartStyle(ENUM_LINE_STYLE value)
{
mTradingDaysStartStyle = value;
}
/**
* Get Trading Days End Color ...
*
* @return ( color )
*/
color TradingDaysEndColor()
{
return mTradingDaysEndColor;
}
/**
* Set Trading Days End Color ...
*
* @param value: Argument 1
*/
void TradingDaysEndColor(color value)
{
mTradingDaysEndColor = value;
}
/**
* Get Trading Days End Style ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_LINE_STYLE TradingDaysEndStyle()
{
return mTradingDaysEndStyle;
}
/**
* Set Trading Days End Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
void TradingDaysEndStyle(ENUM_LINE_STYLE value)
{
mTradingDaysEndStyle = value;
}
//
// Sessions ...
/**
* Get Detect Market Sessions State ...
*
* @return ( bool )
*/
bool AllowMarketSessions()
{
return mAllowMarketSessions;
}
/**
* Set Detect Market Sessions State ...
*
* @param value: Boolean ...
*/
void AllowMarketSessions(bool value)
{
mAllowMarketSessions = value;
}
/**
* Get Draw Market Sessions State ...
*
* @return ( bool )
*/
bool AllowDrawMarketSessions()
{
return mAllowDrawMarketSessions;
}
/**
* Set Draw Market Sessions State ...
*
* @param value: Boolean ...
*/
void AllowDrawMarketSessions(bool value)
{
mAllowDrawMarketSessions = value;
}
/**
* Get Session Working Hors ...
*
* @return ( int )
*/
int SessionOpenHours()
{
return mSessionOpenHours;
}
/**
* Set Session Working Hors ...
*
* @param value: Integer ...
*/
void SessionOpenHours(int value)
{
//
if (value <= 0)
{
value = 9;
}
//
mSessionOpenHours = value;
}
//
// Swing High ...
/**
* Get Detect Swing Highs State ...
*
* @return ( bool )
*/
bool AllowSwingHighs()
{
return mAllowSwingHighs;
}
/**
* Set Detect Swing Highs State ...
*
* @param value: Boolean
*/
void AllowSwingHighs(bool value)
{
mAllowSwingHighs = value;
}
/**
* Get Draw Swing Highs State ...
*
* @return ( bool )
*/
bool AllowDrawSwingHighs()
{
return mAllowDrawSwingHighs;
}
/**
* Set Draw Swing Highs State ...
*
* @param value: Boolean
*/
void AllowDrawSwingHighs(bool value)
{
mAllowDrawSwingHighs = value;
}
/**
* Get Threshold Required for Swing High Detection ...
*
* @return ( double )
*/
double SwingHighThreshold()
{
return mSwingHighThreshold;
}
/**
* Set Threshold Required for Swing High Detection ...
*
* @param value: Double ...
*/
void SwingHighThreshold(double value)
{
//
if (value < 0)
{
value = 0;
}
//
mSwingHighThreshold = value;
}
/**
* Get Swing High Arrow Code ...
*
* @return ( char )
*/
char SwingHighArrowCode()
{
return mSwingHighArrowCode;
}
/**
* Set Swing High Arrow Code ...
*
* @param value: Char ...
*/
void SwingHighArrowCode(char value)
{
mSwingHighArrowCode = value;
}
/**
* Get Swing High Color ...
*
* @return ( color )
*/
color SwingHighColor()
{
return mSwingHighColor;
}
/**
* Get Swing High Color ...
*
* @param value: Color
*/
void SwingHighColor(color value)
{
mSwingHighColor = value;
}
/**
* Get Swing High Width ...
*
* @return ( int )
*/
int SwingHighWidth()
{
return mSwingHighWidth;
}
/**
* Set Swing High Width ...
*
* @param value: Integer ...
*/
void SwingHighWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mSwingHighWidth = value;
}
//
// Swing Low ...
/**
* Get Detect Swing Lows State ...
*
* @return ( bool )
*/
bool AllowSwingLows()
{
return mAllowSwingLows;
}
/**
* Set Detect Swing Lows State ...
*
* @param value: Boolean ...
*/
void AllowSwingLows(bool value)
{
mAllowSwingLows = value;
}
/**
* Get Draw Swing Lows State ...
*
* @return ( bool )
*/
bool AllowDrawSwingLows()
{
return mAllowDrawSwingLows;
}
/**
* Set Draw Swing Lows State ...
*
* @param value: Boolean
*/
void AllowDrawSwingLows(bool value)
{
mAllowDrawSwingLows = value;
}
/**
* Get Threshold Required for Swing Low Detection ...
*
* @return ( double )
*/
double SwingLowThreshold()
{
return mSwingLowThreshold;
}
/**
* Set Threshold Required for Swing Low Detection ...
*
* @param value: Double ...
*/
void SwingLowThreshold(double value)
{
//
if (value < 0)
{
value = 0;
}
//
mSwingLowThreshold = value;
}
/**
* Get Swing Low Arrow Code ...
*
* @return ( char )
*/
char SwingLowArrowCode()
{
return mSwingLowArrowCode;
}
/**
* Set Swing Low Arrow Code ...
*
* @param value: Char ...
*/
void SwingLowArrowCode(char value)
{
mSwingLowArrowCode = value;
}
/**
* Get Swing Low Color ...
*
* @return ( color )
*/
color SwingLowColor()
{
return mSwingLowColor;
}
/**
* Get Swing Low Color ...
*
* @param value: Color
*/
void SwingLowColor(color value)
{
mSwingLowColor = value;
}
/**
* Get Swing Low Width ...
*
* @return ( int )
*/
int SwingLowWidth()
{
return mSwingLowWidth;
}
/**
* Set Swing Low Width ...
*
* @param value: Integer ...
*/
void SwingLowWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mSwingLowWidth = value;
}
//
// Momentum Bars ...
/**
* Get Detect Momentum Bars State ...
*
* @return ( bool )
*/
bool AllowMomentumBars()
{
return mAllowMomentumBars;
}
/**
* Set Detect Momentum Bars State ...
*
* @param value: Boolean ...
*/
void AllowMomentumBars(bool value)
{
mAllowMomentumBars = value;
}
/**
* Get Draw Momentum Bars State ...
*
* @return ( bool )
*/
bool AllowDrawMomentumBars()
{
return mAllowDrawMomentumBars;
}
/**
* Set Draw Momentum Bars State ...
*
* @param value: Boolean
*/
void AllowDrawMomentumBars(bool value)
{
mAllowDrawMomentumBars = value;
}
/**
* Get Momentum Bar Percent ...
*
* @return ( int )
*/
int MomentumBarPercent()
{
return mMomentumBarPercent;
}
/**
* Set Momentum Bar Percent ...
*
* @param value: Integer
*/
void MomentumBarPercent(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mMomentumBarPercent = value;
}
/**
* Get Momentum Bar Sharp Ratio ...
*
* @return ( double )
*/
double MomentumBarSharpRatio()
{
return mMomentumBarSharpRatio;
}
/**
* Set Momentum Bar Sharp Ratio ...
*
* @param value: Double ...
*/
void MomentumBarSharpRatio(double value)
{
//
if (value < 0)
{
value = 0;
}
//
mMomentumBarSharpRatio = value;
}
/**
* Get Momentum Bar Loopback ...
*
* @return ( int )
*/
int MomentumBarLoopBack()
{
return mMomentumBarLoopBack;
}
/**
* Set Momentum Bar Loopback ...
*
* @param value: Integer ...
*/
void MomentumBarLoopBack(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mMomentumBarLoopBack = value;
}
/**
* Get Momentum Bar Width ...
*
* @return ( int )
*/
int MomentumBarWidth()
{
return mMomentumBarWidth;
}
/**
* Set Momentum Bar Width ...
*
* @param value: Integer ...
*/
void MomentumBarWidth(int value)
{
mMomentumBarWidth = value;
}
/**
* Get Bullish Momentum Bar Arrow Code ...
*
* @return ( char )
*/
char MomentumBarBullishArrowCode()
{
return mMomentumBarBullishArrowCode;
}
/**
* Set Bullish Momentum Bar Arrow Code ...
*
* @param value: Char ...
*/
void MomentumBarBullishArrowCode(char value)
{
mMomentumBarBullishArrowCode = value;
}
/**
* Get Bullish Momentum Bar Color ...
*
* @return ( char )
*/
char MomentumBarBearishArrowCode()
{
return mMomentumBarBearishArrowCode;
}
/**
* Set Bullish Momentum Bar Color ...
*
* @param value: Color ...
*/
void MomentumBarBearishArrowCode(char value)
{
mMomentumBarBearishArrowCode = value;
}
/**
* Get Bearish Momentum Bar Arrow Code ...
*
* @return ( color )
*/
color MomentumBarBullishColor()
{
return mMomentumBarBullishColor;
}
/**
* Set Bearish Momentum Bar Arrow Code ...
*
* @param value: Color ...
*/
void MomentumBarBullishColor(color value)
{
mMomentumBarBullishColor = value;
}
/**
* Get Bearish Momentum Bar Color ...
*
* @return ( color )
*/
color MomentumBarBearishColor()
{
return mMomentumBarBearishColor;
}
/**
* Set Bearish Momentum Bar Color ...
*
* @param value: Color ...
*/
void MomentumBarBearishColor(color value)
{
mMomentumBarBearishColor = value;
}
//
// Rejection Bars ...
/**
* Get Detect Rejection Bars State ...
*
* @return ( bool )
*/
bool AllowRejectionBars()
{
return mAllowRejectionBars;
}
/**
* Set Detect Rejection Bars State ...
*
* @param value: Boolean ...
*/
void AllowRejectionBars(bool value)
{
mAllowRejectionBars = value;
}
/**
* Get Draw Rejection Bars State ...
*
* @return ( bool )
*/
bool AllowDrawRejectionBars()
{
return mAllowDrawRejectionBars;
}
/**
* Set Draw Rejection Bars State ...
*
* @param value: Boolean ...
*/
void AllowDrawRejectionBars(bool value)
{
mAllowDrawRejectionBars = value;
}
/**
* Get Rejection Bar Percent ...
*
* @return ( int )
*/
int RejectionBarPercent()
{
return mRejectionBarPercent;
}
/**
* Set Rejection Bar Percent ...
*
* @param value: Integer
*/
void RejectionBarPercent(int value)
{
mRejectionBarPercent = value;
}
/**
* Get Rejection Bar Sharp Ratio ...
*
* @return ( double )
*/
double RejectionBarSharpRatio()
{
return mRejectionBarSharpRatio;
}
/**
* Set Rejection Bar Sharp Ratio ...
*
* @param value: Double ...
*/
void RejectionBarSharpRatio(double value)
{
mRejectionBarSharpRatio = value;
}
/**
* Get Rejection Bar Loopback ...
*
* @return ( int )
*/
int RejectionBarLoopBack()
{
return mRejectionBarLoopBack;
}
/**
* Set Rejection Bar Loopback ...
*
* @param value: Integer ...
*/
void RejectionBarLoopBack(int value)
{
mRejectionBarLoopBack = value;
}
/**
* Get Rejection Bar Width ...
*
* @return ( int )
*/
int RejectionBarWidth()
{
return mRejectionBarWidth;
}
/**
* Set Rejection Bar Width ...
*
* @param value: Integer ...
*/
void RejectionBarWidth(int value)
{
mRejectionBarWidth = value;
}
/**
* Get Bullish Rejection Bar Arrow Code ...
*
* @return ( char )
*/
char RejectionBarBullishArrowCode()
{
return mRejectionBarBullishArrowCode;
}
/**
* Set Bullish Rejection Bar Arrow Code ...
*
* @param value: Char ...
*/
void RejectionBarBullishArrowCode(char value)
{
mRejectionBarBullishArrowCode = value;
}
/**
* Get Bullish Rejection Bar Color ...
*
* @return ( char )
*/
char RejectionBarBearishArrowCode()
{
return mRejectionBarBearishArrowCode;
}
/**
* Set Bullish Rejection Bar Color ...
*
* @param value: Color ...
*/
void RejectionBarBearishArrowCode(char value)
{
mRejectionBarBearishArrowCode = value;
}
/**
* Get Bearish Rejection Bar Arrow Code ...
*
* @return ( color )
*/
color RejectionBarBullishColor()
{
return mRejectionBarBullishColor;
}
/**
* Set Bearish Rejection Bar Arrow Code ...
*
* @param value: Color ...
*/
void RejectionBarBullishColor(color value)
{
mRejectionBarBullishColor = value;
}
/**
* Get Bearish Rejection Bar Color ...
*
* @return ( color )
*/
color RejectionBarBearishColor()
{
return mRejectionBarBearishColor;
}
/**
* Set Bearish Rejection Bar Color ...
*
* @param value: Color ...
*/
void RejectionBarBearishColor(color value)
{
mRejectionBarBearishColor = value;
}
//
// Support Zone ...
/**
* Get Detect Support Zone State ...
*
* @return ( bool )
*/
bool AllowSupportZones()
{
return mAllowSupportZones;
}
/**
* Set Detect Support Zone State ...
*
* @param value: Boolean ...
*/
void AllowSupportZones(bool value)
{
mAllowSupportZones = value;
}
/**
* Get Draw Support Zone State ...
*
* @return ( bool )
*/
bool AllowDrawSupportZones()
{
return mAllowDrawSupportZones;
}
/**
* Set Draw Support Zone State ...
*
* @param value: Boolean ...
*/
void AllowDrawSupportZones(bool value)
{
mAllowDrawSupportZones = value;
}
/**
* Get Support Zone Loopback ...
*
* @return ( int )
*/
int SupportZoneLoopBack()
{
return mSupportZoneLoopBack;
}
/**
* Set Support Zone Loopback ...
*
* @param value: Integer ...
*/
void SupportZoneLoopBack(int value)
{
//
if (value < 10)
{
value = 10;
}
//
mSupportZoneLoopBack = value;
}
/**
* Get Support Zone Width ...
*
* @return ( int )
*/
int SupportZoneWidth()
{
return mSupportZoneWidth;
}
/**
* Set Support Zone Width ...
*
* @param value: Integer ...
*/
void SupportZoneWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mSupportZoneWidth = value;
}
/**
* Get Support Zone Color ...
*
* @return ( color )
*/
color SupportZoneColor()
{
return mSupportZoneColor;
}
/**
* Set Support Zone Color ...
*
* @param value: Color ...
*/
void SupportZoneColor(color value)
{
mSupportZoneColor = value;
}
/**
* Get Support Zone Style ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_LINE_STYLE SupportZoneStyle()
{
return mSupportZoneStyle;
}
/**
* Set Support Zone Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
void SupportZoneStyle(ENUM_LINE_STYLE value)
{
mSupportZoneStyle = value;
}
/**
* Get Support Zone Price Type ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_X_PRICE SupportZonePriceType()
{
return mSupportZonePriceType;
}
/**
* Set Support Zone Price Type ...
*
* @param value: ENUM_X_PRICE member ...
*/
void SupportZonePriceType(ENUM_X_PRICE value)
{
mSupportZonePriceType = value;
}
//
// Resistance Zone ...
/**
* Get Detect Resistance Zone State ...
*
* @return ( bool )
*/
bool AllowResistanceZones()
{
return mAllowResistanceZones;
}
/**
* Set Detect Resistance Zone State ...
*
* @param value: Boolean ...
*/
void AllowResistanceZones(bool value)
{
mAllowResistanceZones = value;
}
/**
* Get Draw Resistance Zone State ...
*
* @return ( bool )
*/
bool AllowDrawResistanceZones()
{
return mAllowDrawResistanceZones;
}
/**
* Set Draw Resistance Zone State ...
*
* @param value: Boolean ...
*/
void AllowDrawResistanceZones(bool value)
{
mAllowDrawResistanceZones = value;
}
/**
* Get Resistance Zone Loopback ...
*
* @return ( int )
*/
int ResistanceZoneLoopBack()
{
return mResistanceZoneLoopBack;
}
/**
* Set Resistance Zone Loopback ...
*
* @param value: Integer ...
*/
void ResistanceZoneLoopBack(int value)
{
//
if (value < 10)
{
value = 10;
}
//
mResistanceZoneLoopBack = value;
}
/**
* Get Resistance Zone Width ...
*
* @return ( int )
*/
int ResistanceZoneWidth()
{
return mResistanceZoneWidth;
}
/**
* Set Resistance Zone Width ...
*
* @param value: Integer ...
*/
void ResistanceZoneWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mResistanceZoneWidth = value;
}
/**
* Get Resistance Zone Color ...
*
* @return ( color )
*/
color ResistanceZoneColor()
{
return mResistanceZoneColor;
}
/**
* Set Resistance Zone Color ...
*
* @param value: Color ...
*/
void ResistanceZoneColor(color value)
{
mResistanceZoneColor = value;
}
/**
* Get Resistance Zone Style ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_LINE_STYLE ResistanceZoneStyle()
{
return mResistanceZoneStyle;
}
/**
* Set Resistance Zone Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
void ResistanceZoneStyle(ENUM_LINE_STYLE value)
{
mResistanceZoneStyle = value;
}
/**
* Get Resistance Zone Price Type ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_X_PRICE ResistanceZonePriceType()
{
return mResistanceZonePriceType;
}
/**
* Set Resistance Zone Price Type ...
*
* @param value: ENUM_X_PRICE member ...
*/
void ResistanceZonePriceType(ENUM_X_PRICE value)
{
mResistanceZonePriceType = value;
}
//
// Supply Zone ...
/**
* Get Detect Supply Zone State ...
*
* @return ( bool )
*/
bool AllowSupplyZones()
{
return mAllowSupplyZones;
}
/**
* Set Detect Supply Zone State ...
*
* @param value: Boolean ...
*/
void AllowSupplyZones(bool value)
{
mAllowSupplyZones = value;
}
/**
* Get Draw Supply Zone State ...
*
* @return ( bool )
*/
bool AllowDrawSupplyZones()
{
return mAllowDrawSupplyZones;
}
/**
* Set Draw Supply Zone State ...
*
* @param value: Boolean ...
*/
void AllowDrawSupplyZones(bool value)
{
mAllowDrawSupplyZones = value;
}
/**
* Get Supply Zone Width ...
*
* @return ( int )
*/
int SupplyZoneWidth()
{
return mSupplyZoneWidth;
}
/**
* Set Supply Zone Width ...
*
* @param value: Integer ...
*/
void SupplyZoneWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mSupplyZoneWidth = value;
}
/**
* Get Supply Zone Color ...
*
* @return ( color )
*/
color SupplyZoneColor()
{
return mSupplyZoneColor;
}
/**
* Set Supply Zone Color ...
*
* @param value: Color ...
*/
void SupplyZoneColor(color value)
{
mSupplyZoneColor = value;
}
/**
* Get Supply Zone Style ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_LINE_STYLE SupplyZoneStyle()
{
return mSupplyZoneStyle;
}
/**
* Set Supply Zone Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
void SupplyZoneStyle(ENUM_LINE_STYLE value)
{
mSupplyZoneStyle = value;
}
/**
* Get Supply Zone Detecting Period ...
*
* @return ( ENUM_TIMEFRAMES ) ...
*/
ENUM_TIMEFRAMES SupplyZonePeriod()
{
return mSupplyZonePeriod;
}
/**
* Set Supply Zone Detecting Period ...
*
* @param value: ENUM_TIMEFRAMES member ...
*/
void SupplyZonePeriod(ENUM_TIMEFRAMES value)
{
mSupplyZonePeriod = value;
}
//
// Demand Zone ...
/**
* Get Detect Demand Zone State ...
*
* @return ( bool )
*/
bool AllowDemandZones()
{
return mAllowDemandZones;
}
/**
* Set Detect Demand Zone State ...
*
* @param value: Boolean ...
*/
void AllowDemandZones(bool value)
{
mAllowDemandZones = value;
}
/**
* Get Draw Demand Zone State ...
*
* @return ( bool )
*/
bool AllowDrawDemandZones()
{
return mAllowDrawDemandZones;
}
/**
* Set Draw Demand Zone State ...
*
* @param value: Boolean ...
*/
void AllowDrawDemandZones(bool value)
{
mAllowDrawDemandZones = value;
}
/**
* Get Demand Zone Width ...
*
* @return ( int )
*/
int DemandZoneWidth()
{
return mDemandZoneWidth;
}
/**
* Set Demand Zone Width ...
*
* @param value: Integer ...
*/
void DemandZoneWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mDemandZoneWidth = value;
}
/**
* Get Demand Zone Color ...
*
* @return ( color )
*/
color DemandZoneColor()
{
return mDemandZoneColor;
}
/**
* Set Demand Zone Color ...
*
* @param value: Color ...
*/
void DemandZoneColor(color value)
{
mDemandZoneColor = value;
}
/**
* Get Demand Zone Style ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_LINE_STYLE DemandZoneStyle()
{
return mDemandZoneStyle;
}
/**
* Set Demand Zone Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
void DemandZoneStyle(ENUM_LINE_STYLE value)
{
mDemandZoneStyle = value;
}
/**
* Get Demand Zone Detecting Period ...
*
* @return ( ENUM_TIMEFRAMES ) ...
*/
ENUM_TIMEFRAMES DemandZonePeriod()
{
return mDemandZonePeriod;
}
/**
* Set Demand Zone Detecting Period ...
*
* @param value: ENUM_TIMEFRAMES member ...
*/
void DemandZonePeriod(ENUM_TIMEFRAMES value)
{
mDemandZonePeriod = value;
}
//
// Order Blocks ...
//
// Bullish Order Blocks ...
/**
* Get Detect Bullish Order Blocks State ...
*
* @return ( bool )
*/
bool AllowBullishOrderBlocks()
{
return mAllowBullishOrderBlocks;
}
/**
* Set Detect Bullish Order Blocks State ...
*
* @param value: Boolean ...
*/
void AllowBullishOrderBlocks(bool value)
{
mAllowBullishOrderBlocks = value;
}
/**
* Get Draw Bullish Order Blocks State ...
*
* @return ( bool )
*/
bool AllowDrawBullishOrderBlocks()
{
return mAllowDrawBullishOrderBlocks;
}
/**
* Set Draw Bullish Order Blocks State ...
*
* @param value: Boolean ...
*/
void AllowDrawBullishOrderBlocks(bool value)
{
mAllowDrawBullishOrderBlocks = value;
}
/**
* Get Bullish Order Block Width ...
*
* @return ( int )
*/
int BullishOrderBlockWidth()
{
return mBullishOrderBlockWidth;
}
/**
* Set Bullish Order Block Width ...
*
* @param value: Integer ...
*/
void BullishOrderBlockWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mBullishOrderBlockWidth = value;
}
/**
* Get Bullish Order Block Color ...
*
* @return ( color )
*/
color BullishOrderBlockColor()
{
return mBullishOrderBlockColor;
}
/**
* Set Bullish Order Block Color ...
*
* @param value: Color ...
*/
void BullishOrderBlockColor(color value)
{
mBullishOrderBlockColor = value;
}
/**
* Get Bullish Order Block Style ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_LINE_STYLE BullishOrderBlockStyle()
{
return mBullishOrderBlockStyle;
}
/**
* Set Bullish Order Block Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
void BullishOrderBlockStyle(ENUM_LINE_STYLE value)
{
mBullishOrderBlockStyle = value;
}
/**
* Get Minimum Required Same Bars for Bullish Order Blocks ...
*
* @return ( int )
*/
int RequiredBarsForBullishOrderBlock()
{
return mRequiredBarsForBullishOrderBlock;
}
/**
* Set Minimum Required Same Bars for Bullish Order Blocks ...
*
* @param value: Integer ...
*/
void RequiredBarsForBullishOrderBlock(int value)
{
//
if (value < 3)
{
value = 3;
}
//
mRequiredBarsForBullishOrderBlock = value;
}
//
// Bearish Order Blocks ...
/**
* Get Detect Bearish Order Blocks State ...
*
* @return ( bool )
*/
bool AllowBearishOrderBlocks()
{
return mAllowBearishOrderBlocks;
}
/**
* Set Detect Bearish Order Blocks State ...
*
* @param value: Boolean ...
*/
void AllowBearishOrderBlocks(bool value)
{
mAllowBearishOrderBlocks = value;
}
/**
* Get Draw Bearish Order Blocks State ...
*
* @return ( bool )
*/
bool AllowDrawBearishOrderBlocks()
{
return mAllowDrawBearishOrderBlocks;
}
/**
* Set Draw Bearish Order Blocks State ...
*
* @param value: Boolean ...
*/
void AllowDrawBearishOrderBlocks(bool value)
{
mAllowDrawBearishOrderBlocks = value;
}
/**
* Get Bearish Order Block Width ...
*
* @return ( int )
*/
int BearishOrderBlockWidth()
{
return mBearishOrderBlockWidth;
}
/**
* Set Bearish Order Block Width ...
*
* @param value: Integer ...
*/
void BearishOrderBlockWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mBearishOrderBlockWidth = value;
}
/**
* Get Bearish Order Block Color ...
*
* @return ( color )
*/
color BearishOrderBlockColor()
{
return mBearishOrderBlockColor;
}
/**
* Set Bearish Order Block Color ...
*
* @param value: Color ...
*/
void BearishOrderBlockColor(color value)
{
mBearishOrderBlockColor = value;
}
/**
* Get Bearish Order Block Style ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_LINE_STYLE BearishOrderBlockStyle()
{
return mBearishOrderBlockStyle;
}
/**
* Set Bearish Order Block Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
void BearishOrderBlockStyle(ENUM_LINE_STYLE value)
{
mBearishOrderBlockStyle = value;
}
/**
* Get Minimum Required Same Bars for Bearish Order Blocks ...
*
* @return ( int )
*/
int RequiredBarsForBearishOrderBlock()
{
return mRequiredBarsForBearishOrderBlock;
}
/**
* Set Minimum Required Same Bars for Bearish Order Blocks ...
*
* @param value: Integer ...
*/
void RequiredBarsForBearishOrderBlock(int value)
{
//
if (value < 3)
{
value = 3;
}
//
mRequiredBarsForBearishOrderBlock = value;
}
//
// Fair Value Gaps ...
//
// Bullis FVGs ...
/**
* Get Detect Bullish Fair Value Gaps State ...
*
* @return ( bool )
*/
bool AllowBullishFVGs()
{
return mAllowBullishFVGs;
}
/**
* Set Detect Bullish Fair Value Gaps State ...
*
* @param value: Boolean ...
*/
void AllowBullishFVGs(bool value)
{
mAllowBullishFVGs = value;
}
/**
* Get Draw Bullish Fair Value Gaps ...
*
* @return ( bool )
*/
bool AllowDrawBullishFVGs()
{
return mAllowDrawBullishFVGs;
}
/**
* Set Draw Bullish Fair Value Gaps ...
*
* @param value: Boolean ...
*/
void AllowDrawBullishFVGs(bool value)
{
mAllowDrawBullishFVGs = value;
}
/**
* Get Bullish FVG Force Middle Bar Check ...
*
* @return ( bool )
*/
bool BullishFVGForceMiddleBarCheck()
{
return mBullishFVGForceMiddleBarCheck;
}
/**
* Set Bullish FVG Force Middle Bar Check ...
*
* @param value: Boolean ...
*/
void BullishFVGForceMiddleBarCheck(bool value)
{
mBullishFVGForceMiddleBarCheck = value;
}
/**
* Get Bullish FVG Force Check Last Bar Direction ...
*
* @return ( bool )
*/
bool BullishFVGForceCheckLastBarDirection()
{
return mBullishFVGForceCheckLastBarDirection;
}
/**
* Set Bullish FVG Force Check Last Bar Direction ...
*
* @param value: Boolean ...
*/
void BullishFVGForceCheckLastBarDirection(bool value)
{
mBullishFVGForceCheckLastBarDirection = value;
}
/**
* Get Bullish FVG Width ...
*
* @return ( int )
*/
int BullishFVGWidth()
{
return mBullishFVGWidth;
}
/**
* Set Bullish FVG Width ...
*
* @param value: Integer ...
*/
void BullishFVGWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mBullishFVGWidth = value;
}
/**
* Get Bullish FVG Color ...
*
* @return ( color )
*/
color BullishFVGColor()
{
return mBullishFVGColor;
}
/**
* Set Bullish FVG Color ...
*
* @param value: Color ...
*/
void BullishFVGColor(color value)
{
mBullishFVGColor = value;
}
/**
* Get Bullish FVG Style ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_LINE_STYLE BullishFVGStyle()
{
return mBullishFVGStyle;
}
/**
* Set Bullish FVG Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
void BullishFVGStyle(ENUM_LINE_STYLE value)
{
mBullishFVGStyle = value;
}
//
// Bullis FVGs ...
/**
* Get Detect Bearish Fair Value Gaps State ...
*
* @return ( bool )
*/
bool AllowBearishFVGs()
{
return mAllowBearishFVGs;
}
/**
* Set Detect Bearish Fair Value Gaps State ...
*
* @param value: Boolean ...
*/
void AllowBearishFVGs(bool value)
{
mAllowBearishFVGs = value;
}
/**
* Get Draw Bearish Fair Value Gaps ...
*
* @return ( bool )
*/
bool AllowDrawBearishFVGs()
{
return mAllowDrawBearishFVGs;
}
/**
* Set Draw Bearish Fair Value Gaps ...
*
* @param value: Boolean ...
*/
void AllowDrawBearishFVGs(bool value)
{
mAllowDrawBearishFVGs = value;
}
/**
* Get Bearish FVG Force Middle Bar Check ...
*
* @return ( bool )
*/
bool BearishFVGForceMiddleBarCheck()
{
return mBearishFVGForceMiddleBarCheck;
}
/**
* Set Bearish FVG Force Middle Bar Check ...
*
* @param value: Boolean ...
*/
void BearishFVGForceMiddleBarCheck(bool value)
{
mBearishFVGForceMiddleBarCheck = value;
}
/**
* Get Bearish FVG Force Check Last Bar Direction ...
*
* @return ( bool )
*/
bool BearishFVGForceCheckLastBarDirection()
{
return mBearishFVGForceCheckLastBarDirection;
}
/**
* Set Bearish FVG Force Check Last Bar Direction ...
*
* @param value: Boolean ...
*/
void BearishFVGForceCheckLastBarDirection(bool value)
{
mBearishFVGForceCheckLastBarDirection = value;
}
/**
* Get Bearish FVG Width ...
*
* @return ( int )
*/
int BearishFVGWidth()
{
return mBearishFVGWidth;
}
/**
* Set Bearish FVG Width ...
*
* @param value: Integer ...
*/
void BearishFVGWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mBearishFVGWidth = value;
}
/**
* Get Bearish FVG Color ...
*
* @return ( color )
*/
color BearishFVGColor()
{
return mBearishFVGColor;
}
/**
* Set Bearish FVG Color ...
*
* @param value: Color ...
*/
void BearishFVGColor(color value)
{
mBearishFVGColor = value;
}
/**
* Get Bearish FVG Style ...
*
* @return ( ENUM_LINE_STYLE )
*/
ENUM_LINE_STYLE BearishFVGStyle()
{
return mBearishFVGStyle;
}
/**
* Set Bearish FVG Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
void BearishFVGStyle(ENUM_LINE_STYLE value)
{
mBearishFVGStyle = value;
}
//
// Actions ...
/**
* Initialize POI Detector ...
*/
void Init()
{
//
// Detect Previous POI(s) ...
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;
//
datetime cTime = TimeCurrent();
//
XOHCL zBar;
bool isInited = zBar.Init(
mSymbol,
mPeriod,
zIndex //
);
if (!isInited)
{
return result;
}
//
XOHCL cBar;
isInited = cBar.Init(
mSymbol,
mPeriod,
cIndex //
);
if (!isInited)
{
return result;
}
//
XOHCL pBar;
isInited = pBar.Init(
mSymbol,
mPeriod,
pIndex //
);
if (!isInited)
{
return result;
}
//
XOHCL zDayBar;
isInited = zDayBar.Init(
mSymbol,
PERIOD_D1,
zIndex //
);
if (!isInited)
{
return result;
}
//
// Trading Days ...
//
bool allowTradingDays = AllowTradingDays();
int tradingDaysCount = ArraySize(mTradingDays);
if (allowTradingDays)
{
//
int tradingDayIDX = HasTradeDay(zDayBar.time);
if (IsValidIndex(tradingDayIDX))
{
//
if (zBar.time == mTradingDays[tradingDayIDX].to)
{
//
ENUM_XPOI_EVENTS event = X_TRADE_DAY_LAST_BAR;
Add(
event,
state //
);
OnTradingDayEvent(event);
NotifyTradingDayEventListeners(event);
}
}
else
{
//
// there isn't any Trading Day ...
// create one ...
//
XTradeDay tradeDay;
tradeDay.from = zDayBar.time;
tradeDay.to = zDayBar.GetLastBarTimeOfPeriod(mPeriod);
//
AddRef(
tradeDay,
mTradingDays //
);
//
DrawTradingDays();
//
// Notfy Day Started ...
if (zBar.time == zDayBar.time)
{
//
Add(
X_TRADE_DAY_FIRST_BAR,
state //
);
OnTradingDayEvent(X_TRADE_DAY_FIRST_BAR);
NotifyTradingDayEventListeners(X_TRADE_DAY_FIRST_BAR);
}
}
}
//
// Market Session ...
//
bool allowMarketSessions = AllowMarketSessions();
int marketSessionsCount = ArraySize(mMarketSessions);
if (allowMarketSessions)
{
//
int sessionsCount = ArraySize(mSessions);
bool isSessionFound = false;
if (IsValidSize(sessionsCount))
{
//
for (int i = 0; i < sessionsCount; i++)
{
//
XSession iSession = mSessions[i];
int marketSessionIDX = HasMarketSessionByStartTime(
iSession.session,
zBar.time //
);
//
if (!IsValidIndex(marketSessionIDX))
{
//
datetime zTimeGMT = GetUTCTime(zBar.time);
string zTimeString = GetTimeString(zTimeGMT);
//
bool isStarted = iSession.start == zTimeString;
//
if (isStarted)
{
//
XMarketSession iMarketSession;
iMarketSession.session = iSession.session;
iMarketSession.from = zBar.time;
//
int iSessionWorkingHoure = SessionOpenHours();
int iSessionWorkingSeconds = iSessionWorkingHoure * 60 * 60;
iMarketSession.to = (datetime)((int)zBar.time + iSessionWorkingSeconds);
//
isSessionFound = AddRef(
iMarketSession,
mMarketSessions //
);
//
marketSessionsCount = ArraySize(mMarketSessions);
//
DrawMarketSessions();
//
Add(
X_SESSION_FIRST_BAR,
state //
);
OnMarketSessionEvent(
iMarketSession.session,
X_SESSION_FIRST_BAR //
);
NotifyMarketSessionEventListeners(
iMarketSession.session,
X_SESSION_FIRST_BAR //
);
}
}
//
// Check End Time for Last Bar ...
for (int i = 0; i < marketSessionsCount; i++)
{
//
XMarketSession iMarketSession = mMarketSessions[i];
//
// Calculate Last Bar Time ...
datetime endTime = iMarketSession.to;
datetime lastBarTime = (datetime)((int)endTime - PeriodSeconds(mPeriod));
if (zBar.time == lastBarTime)
{
//
ENUM_XPOI_EVENTS event = X_SESSION_LAST_BAR;
Add(
event,
state //
);
OnMarketSessionEvent(
iMarketSession.session,
event //
);
NotifyMarketSessionEventListeners(
iMarketSession.session,
event //
);
}
}
}
}
}
//
// Swing Highs and Lows ...
//
// Swing Highs ...
//
bool allowSwingHighs = AllowSwingHighs();
int swingHighsCount = ArraySize(mSwingHighs);
if (allowSwingHighs)
{
//
bool isSingHigh = pBar.IsSimpleSwingHigh(SwingHighThreshold());
if (isSingHigh)
{
//
bool isAdded = AddBar(
X_POI_SWING_HIGH,
pBar,
mSwingHighs //
);
//
if (isAdded)
{
//
swingHighsCount = ArraySize(mSwingHighs);
DrawSwingHighs();
//
ENUM_XPOI_EVENTS event = X_SWING_HIGH_DETECTED;
Add(
event,
state //
);
OnSwingHighEvent(event, pBar);
NotifySwingHighEventListeners(event, pBar);
}
}
}
//
// Swing Lows ...
//
bool allowSwingLows = AllowSwingLows();
int swingLowsCount = ArraySize(mSwingLows);
if (allowSwingLows)
{
//
bool isSingLow = pBar.IsSimpleSwingLow(SwingLowThreshold());
if (isSingLow)
{
//
bool isAdded = AddBar(
X_POI_SWING_LOW,
pBar,
mSwingLows //
);
//
if (isAdded)
{
//
swingLowsCount = ArraySize(mSwingLows);
DrawSwingLows();
//
ENUM_XPOI_EVENTS event = X_SWING_LOW_DETECTED;
Add(
event,
state //
);
OnSwingLowEvent(event, pBar);
NotifySwingLowEventListeners(event, pBar);
}
}
}
//
// Momentum Bars ...
//
bool allowMomentumBars = AllowMomentumBars();
int momentumBarsCount = ArraySize(mMomentumBars);
if (allowMomentumBars)
{
//
bool isStrongBar = cBar.IsStrong(MomentumBarPercent());
bool isSharpBullish = cBar.IsSharpBullish(
MomentumBarLoopBack(),
MomentumBarSharpRatio() //
);
bool isSharpBearish = cBar.IsSharpBearish(
MomentumBarLoopBack(),
MomentumBarSharpRatio() //
);
bool isMomentumBar =
isStrongBar &&
(isSharpBearish ||
isSharpBullish);
if (isMomentumBar)
{
//
bool isAdded = AddBar(
X_POI_MOMENTUM_BAR,
cBar,
mMomentumBars //
);
//
if (isAdded)
{
//
momentumBarsCount = ArraySize(mMomentumBars);
DrawMomentumBars();
//
ENUM_XPOI_EVENTS event = X_MOMENTUM_BAR_DETECTED;
Add(
event,
state //
);
OnMomentumBarEvent(event, cBar);
NotifyMomentumBarEventListeners(event, cBar);
}
}
}
//
// Rejection Bars ...
//
bool allowRejectionBars = AllowRejectionBars();
int rejectionBarsCount = ArraySize(mRejectionBars);
if (allowRejectionBars)
{
//
int rejectionBarLoopBackBarIndex = RejectionBarLoopBack() + 1;
XOHCL iRBar;
bool isIRBarInited = iRBar.Init(
Symbol(),
Period(),
rejectionBarLoopBackBarIndex //
);
if (isIRBarInited)
{
//
bool isRejectionBar =
iRBar.HasStrongLowShadow(
RejectionBarPercent(),
RejectionBarLoopBack(),
RejectionBarSharpRatio() //
) ||
iRBar.HasStrongHighShadow(
RejectionBarPercent(),
RejectionBarLoopBack(),
RejectionBarSharpRatio() //
);
if (isRejectionBar)
{
//
bool isAdded = AddBar(
X_POI_REJECTION_BAR,
iRBar,
mRejectionBars //
);
//
if (isAdded)
{
//
rejectionBarsCount = ArraySize(mRejectionBars);
DrawRejectionBars();
//
ENUM_XPOI_EVENTS event = X_REJECTION_BAR_DETECTED;
Add(
event,
state //
);
OnRejectionBarEvent(event, iRBar);
NotifyRejectionBarEventListeners(event, iRBar);
}
}
}
}
//
// Support and Resistance Zones ...
//
// Support Zones ...
//
bool allowSupportZones = AllowSupportZones();
int supportZonesCount = ArraySize(mSupportZones);
if (allowSupportZones)
{
//
XOHCL support;
bool hasSupport = cBar.HasSupport(
support,
SupportZonePriceType(),
SupportZoneLoopBack() //
);
if (hasSupport)
{
//
bool isAdded = AddBar(
X_POI_SUPPORT_ZONE,
support,
mSupportZones //
);
//
if (isAdded)
{
//
supportZonesCount = ArraySize(mSupportZones);
DrawSupportZones();
//
ENUM_XPOI_EVENTS event = X_SUPPORT_ZONE_DETECTED;
Add(
event,
state //
);
OnSupportZoneEvent(event, support);
NotifySupportZoneEventListeners(event, support);
}
}
}
//
// Resistance Zone ...
//
bool allowResistanceZones = AllowResistanceZones();
int resistanceZonesCount = ArraySize(mResistanceZones);
if (allowResistanceZones)
{
//
XOHCL resistance;
bool hasResistance = cBar.HasResistance(
resistance,
ResistanceZonePriceType(),
ResistanceZoneLoopBack() //
);
if (hasResistance)
{
//
bool isAdded = AddBar(
X_POI_RESISTANCE_ZONE,
resistance,
mResistanceZones //
);
//
if (isAdded)
{
//
resistanceZonesCount = ArraySize(mResistanceZones);
DrawResistanceZones();
//
ENUM_XPOI_EVENTS event = X_RESISTANCE_ZONE_DETECTED;
Add(
event,
state //
);
OnResistanceZoneEvent(event, resistance);
NotifyResistanceZoneEventListeners(event, resistance);
}
}
}
//
// Supply and Demand Zones ...
//
// Supply Zones ...
//
bool allowSupplyZones = AllowSupplyZones();
int supplyZonesCount = ArraySize(mSupplyZones);
if (allowSupplyZones)
{
//
datetime endTime = cBar.time;
XOHCL cSupplyBar;
bool isSupplyBarInited = cSupplyBar.Init(
Symbol(),
SupplyZonePeriod(),
0 //
);
if (isSupplyBarInited)
{
//
datetime lastSupplyBarTime = cSupplyBar
.GetLastBarTimeOfPeriod(Period());
if (zBar.time == lastSupplyBarTime)
{
//
datetime startTime = cSupplyBar.time;
int cSupplyZonePeriodIndex = iBarShift(
Symbol(),
Period(),
cSupplyBar.time //
);
//
// Find Swings ...
XOHCL swings[];
for (int i = 0; i < cSupplyZonePeriodIndex; i++)
{
//
XOHCL iBar;
bool isIBarInited = iBar.Init(
Symbol(),
Period(),
i //
);
if (!isIBarInited)
{
continue;
}
//
// Check is Bar Swing or not ...
bool isSwing = iBar.IsSimpleSwingHigh();
if (!isSwing)
{
continue;
}
//
AddRef(
iBar,
swings //
);
}
//
// Select Max Swing for Supply Zone ...
XOHCL selectedSwing;
int swingsCount = ArraySize(swings);
if (IsValidSize(swingsCount))
{
//
for (int i = 0; i < swingsCount; i++)
{
//
XOHCL iSwing = swings[i];
if (!selectedSwing.IsValid() ||
selectedSwing.high < iSwing.high)
{
selectedSwing = iSwing;
}
}
}
//
// Check Swing ...
if (selectedSwing.IsValid())
{
//
XZone zone;
bool isInited = zone.Init(
selectedSwing.high,
selectedSwing.low,
ToString(X_POI_SUPPLY_ZONE) + "_" + ToString(SupplyZonePeriod()),
startTime,
endTime //
);
if (isInited)
{
//
int zoneIDX = FindZoneIndex(
zone,
mSupplyZones //
);
//
if (!IsValidIndex(zoneIDX))
{
//
AddRef(
zone,
mSupplyZones //
);
//
supplyZonesCount = ArraySize(mSupplyZones);
DrawSupplyZones();
//
ENUM_XPOI_EVENTS event = X_SUPPLY_ZONE_DETECTED;
Add(
event,
state //
);
OnSupplyZoneEvent(event, zone);
NotifySupplyZoneEventListeners(event, zone);
}
}
}
}
}
}
//
// Demand Zones ...
//
bool allowDemandZones = AllowDemandZones();
int demandZonesCount = ArraySize(mDemandZones);
if (allowDemandZones)
{
//
endTime = cBar.time;
XOHCL cDemandBar;
bool isDemandBarInited = cDemandBar.Init(
Symbol(),
DemandZonePeriod(),
0 //
);
if (isDemandBarInited)
{
//
datetime lastDemandBarTime = cDemandBar
.GetLastBarTimeOfPeriod(Period());
if (zBar.time == lastDemandBarTime)
{
//
datetime startTime = cDemandBar.time;
int cDemandZonePeriodIndex = iBarShift(
Symbol(),
Period(),
cDemandBar.time //
);
//
// Find Swings ...
XOHCL swings[];
for (int i = 0; i < cDemandZonePeriodIndex; i++)
{
//
XOHCL iBar;
bool isIBarInited = iBar.Init(
Symbol(),
Period(),
i //
);
if (!isIBarInited)
{
continue;
}
//
// Check is Bar Swing or not ...
bool isSwing = iBar.IsSimpleSwingLow();
if (!isSwing)
{
continue;
}
//
AddRef(
iBar,
swings //
);
}
//
// Select Max Swing for Supply Zone ...
XOHCL selectedSwing;
int swingsCount = ArraySize(swings);
if (IsValidSize(swingsCount))
{
//
for (int i = 0; i < swingsCount; i++)
{
//
XOHCL iSwing = swings[i];
if (!selectedSwing.IsValid() ||
selectedSwing.low > iSwing.low)
{
selectedSwing = iSwing;
}
}
}
//
// Check Swing ...
if (selectedSwing.IsValid())
{
//
XZone zone;
bool isInited = zone.Init(
selectedSwing.high,
selectedSwing.low,
ToString(X_POI_DEMAND_ZONE) + "_" + ToString(SupplyZonePeriod()),
startTime,
endTime //
);
if (isInited)
{
//
int zoneIDX = FindZoneIndex(
zone,
mDemandZones //
);
//
if (!IsValidIndex(zoneIDX))
{
//
AddRef(
zone,
mDemandZones //
);
//
demandZonesCount = ArraySize(mDemandZones);
DrawDemandZones();
//
ENUM_XPOI_EVENTS event = X_DEMAND_ZONE_DETECTED;
Add(
event,
state //
);
OnDemandZoneEvent(event, zone);
NotifyDemandZoneEventListeners(event, zone);
}
}
}
}
}
}
//
// Order Blocks ...
//
// Bullish Order Blocks ...
//
bool allowBullishOrderBlocks = AllowBullishOrderBlocks();
int bullishOrderBlocksCount = ArraySize(mBullishOrderBlocks);
if (allowBullishOrderBlocks)
{
//
XOHCL bullOB;
bool hasBullOB = cBar.HasBullishOrderBlock(
bullOB,
RequiredBarsForBullishOrderBlock() //
);
if (hasBullOB)
{
//
XZone obZone;
bool isAdded = AddZone(
obZone, // Dest ...
bullOB,
cBar.time,
X_POI_BULLISH_ORDERBLOCK,
mBullishOrderBlocks //
);
if (isAdded)
{
//
bullishOrderBlocksCount = ArraySize(mBullishOrderBlocks);
DrawBullishOrderBlocks();
//
ENUM_XPOI_EVENTS event = X_BULLISH_ORDERBLOCK_DETECTED;
Add(
event,
state //
);
OnBullishOrderBlockEvent(event, obZone);
NotifyBullishOrderBlockEventListeners(event, obZone);
}
}
}
//
// Bearish Order Blocks ...
//
bool allowBearishOrderBlocks = AllowBearishOrderBlocks();
int bearishOrderBlocksCount = ArraySize(mBearishOrderBlocks);
if (allowBearishOrderBlocks)
{
//
XOHCL bearOB;
bool hasBearOB = cBar.HasBearishOrderBlock(
bearOB,
RequiredBarsForBearishOrderBlock() //
);
if (hasBearOB)
{
//
XZone zone;
bool isAdded = AddZone(
zone, //
bearOB,
cBar.time,
X_POI_BEARISH_ORDERBLOCK,
mBearishOrderBlocks //
);
if (isAdded)
{
//
bullishOrderBlocksCount = ArraySize(mBearishOrderBlocks);
DrawBearishOrderBlocks();
//
ENUM_XPOI_EVENTS event = X_BEARISH_ORDERBLOCK_DETECTED;
Add(
event,
state //
);
OnBullishOrderBlockEvent(event, zone);
NotifyBullishOrderBlockEventListeners(event, zone);
}
}
}
//
// Fair Value Gaps ...
double upper;
double lower;
datetime start;
datetime end;
//
// Bullish FVGs ...
bool allowBullishFVGs = AllowBullishFVGs();
int bullishFVGsCount = ArraySize(mBullishFVGs);
if (allowBullishFVGs)
{
//
bool hasBullishFVG = cBar.HasBullishFVG(
upper,
lower,
start,
end,
BullishFVGForceMiddleBarCheck(),
BullishFVGForceCheckLastBarDirection() //
);
if (hasBullishFVG)
{
//
XZone zone;
bool isAdded = AddZone(
zone,
upper,
lower,
start,
end,
X_POI_BULLISH_FVG,
mBullishFVGs //
);
if (isAdded)
{
//
bullishFVGsCount = ArraySize(mBullishFVGs);
DrawBullishFVGs();
//
ENUM_XPOI_EVENTS event = X_BULLISH_FVG_DETECTED;
Add(
event,
state //
);
OnBullishFVGEvent(event, zone);
NotifyBullishFVGEventListeners(event, zone);
}
}
}
//
// Bearish FVGs ...
bool allowBearishFVGs = AllowBearishFVGs();
int bearishFVGsCount = ArraySize(mBearishFVGs);
if (allowBearishFVGs)
{
//
bool hasBearishFVG = cBar.HasBearishFVG(
upper,
lower,
start,
end,
BearishFVGForceMiddleBarCheck(),
BearishFVGForceCheckLastBarDirection() //
);
if (hasBearishFVG)
{
//
XZone zone;
bool isAdded = AddZone(
zone,
upper,
lower,
start,
end,
X_POI_BEARISH_FVG,
mBearishFVGs //
);
if (isAdded)
{
//
bearishFVGsCount = ArraySize(mBearishFVGs);
DrawBearishFVGs();
//
ENUM_XPOI_EVENTS event = X_BEARISH_FVG_DETECTED;
Add(
event,
state //
);
OnBearishFVGEvent(event, zone);
NotifyBearishFVGEventListeners(event, zone);
}
}
}
//
// ...
//
CleanupUnusedPOIs();
//
mBarTracker.Waits();
//
result = ArraySize(state);
//
return result;
}
/**
* Enable All POIs Detection ...
*/
void EnablePOIs()
{
ChangePOIsState(true);
}
/**
* Disable All POIs Detection ...
*/
void DisablePOIs()
{
ChangePOIsState(false);
}
/**
* Set All POIs Detection States ...
*
* @param state: Argument 1
*/
void ChangePOIsState(bool state)
{
//
AllowSwingLows(state);
AllowSwingHighs(state);
AllowTradingDays(state);
AllowSupplyZones(state);
AllowDemandZones(state);
AllowBullishFVGs(state);
AllowBearishFVGs(state);
AllowMomentumBars(state);
AllowSupportZones(state);
AllowRejectionBars(state);
AllowMarketSessions(state);
AllowResistanceZones(state);
AllowBullishOrderBlocks(state);
AllowBearishOrderBlocks(state);
}
/**
* Enable Draw All POI(s) ...
*/
void EnableDrawPOIs()
{
ChangePOIsDrawState(true);
}
/**
* Disable Draw All POI(s) ...
*/
void DisableDrawPOIs()
{
ChangePOIsDrawState(false);
}
/**
* Set Drawing State of all POIs ...
*
* @param state: Boolean ...
*/
void ChangePOIsDrawState(bool state)
{
//
AllowDrawSwingLows(state);
AllowDrawSwingHighs(state);
AllowDrawTradingDays(state);
AllowDrawSupplyZones(state);
AllowDrawBullishFVGs(state);
AllowDrawBearishFVGs(state);
AllowDrawDemandZones(state);
AllowDrawSupportZones(state);
AllowDrawMomentumBars(state);
AllowDrawRejectionBars(state);
AllowDrawMarketSessions(state);
AllowDrawResistanceZones(state);
AllowDrawBullishOrderBlocks(state);
AllowDrawBearishOrderBlocks(state);
//
// Sessions ...
int sessionsCount = ArraySize(mSessions);
if (IsValidSize(sessionsCount))
{
//
for (int i = 0; i < sessionsCount; i++)
{
//
mSessions[i].allowDraw = state;
}
}
}
//
// Retrievers ...
/**
* Get Current State of POIs ...
*
* @param state: XPOIState instance ...
*/
void GetState(
XPOIState &state)
{
//
state.Clean();
//
state.symbol = Symbol();
state.period = Period();
state.reportedAt = TimeCurrent();
//
state.FillTradingDays(mTradingDays);
state.FillMarketSessions(mMarketSessions);
//
state.FillMomentumBars(mMomentumBars);
state.FillRejectionBars(mRejectionBars);
//
state.FillSwingHighs(mSwingHighs);
state.FillSwingLows(mSwingLows);
//
state.FillSupportZones(mSupportZones);
state.FillResistanceZones(mResistanceZones);
//
state.FillSupplyZones(mSupplyZones);
state.FillDemandZones(mDemandZones);
//
state.FillBullishOrderBlocks(mBullishOrderBlocks);
state.FillBearishOrderBlocks(mBearishOrderBlocks);
//
state.FillBullishFVGs(mBullishFVGs);
state.FillBearishFVGs(mBearishFVGs);
}
//
// Virtual Actions ...
/**
* Apply Default Configurations ...
*/
virtual void ApplyDefaultConfig()
{
//
// Common ...
//
ChartID(0);
Window(0);
//
MaxNumberOfPOIs(10);
MaxNumberOfRequiredPOIs(2);
//
EnablePOIs();
EnableDrawPOIs();
//
// Trading Days ...
TradingDaysStartColor(clrYellow);
TradingDaysStartStyle(STYLE_DASHDOT);
TradingDaysEndColor(clrGray);
TradingDaysEndStyle(STYLE_DASHDOT);
//
// Sessions ...
//
// SYDNEY ...
// Start: (UTC) 21:00
// End: (UTC) 06:00
XSession mSyndeySession;
mSyndeySession.Init(
X_SYDNEY,
"20:00", // Start ...
"05:00" // End Next Day ...
);
mSyndeySession.startColor = clrFireBrick;
mSyndeySession.endColor = clrFireBrick;
mSyndeySession.allowDraw = true;
AddSession(mSyndeySession);
//
// TOKYO ...
// Start: (UTC) 12:00
// End: (UTC) 09:00
XSession mTokyoSession;
mTokyoSession.Init(
X_TOKYO,
"00:00", // Start ...
"09:00" // End Next Day ...
);
mTokyoSession.startColor = clrBlueViolet;
mTokyoSession.endColor = clrBlueViolet;
mTokyoSession.allowDraw = true;
AddSession(mTokyoSession);
//
// LONDON ...
// Start: (UTC) 07:00
// End: (UTC) 16:00
XSession mLondonSession;
mLondonSession.Init(
X_LONDON,
"07:00", // Start ...
"16:00" // End ...
);
mLondonSession.startColor = clrLime;
mLondonSession.endColor = clrLime;
mLondonSession.allowDraw = true;
AddSession(mLondonSession);
//
// NEWYORK ...
// Start: (UTC) 13:00
// End: (UTC) 22:00
XSession mNewYorkSession;
mNewYorkSession.Init(
X_NEW_YORK,
"12:00", // Start ...
"21:00" // End ...
);
mNewYorkSession.startColor = clrAqua;
mNewYorkSession.endColor = clrAqua;
mNewYorkSession.allowDraw = true;
AddSession(mNewYorkSession);
//
SessionOpenHours(9);
//
// Swing High and Low (s) ...
//
// Swing Highs ...
SwingHighWidth(5);
SwingHighThreshold(3);
SwingHighArrowCode(108);
SwingHighColor(clrMagenta);
//
// Swing Lows ...
SwingLowWidth(5);
SwingLowThreshold(3);
SwingLowArrowCode(108);
SwingLowColor(clrAqua);
//
// Momentum Bars ...
MomentumBarPercent(55);
MomentumBarLoopBack(3);
MomentumBarSharpRatio(1.2);
MomentumBarWidth(5);
MomentumBarBullishArrowCode((char)225);
MomentumBarBearishArrowCode((char)226);
MomentumBarBullishColor(clrAqua);
MomentumBarBearishColor(clrMagenta);
//
// Rejection Bars ...
RejectionBarPercent(55);
RejectionBarLoopBack(5);
RejectionBarSharpRatio(1.5);
RejectionBarWidth(5);
RejectionBarBullishArrowCode((char)217);
RejectionBarBearishArrowCode((char)218);
RejectionBarBullishColor(clrAqua);
RejectionBarBearishColor(clrMagenta);
//
// Support and Resistance Zones ...
//
// Support Zones ...
SupportZoneLoopBack(52);
SupportZoneWidth(1);
SupportZoneColor(clrLime);
SupportZoneStyle(STYLE_DOT);
SupportZonePriceType(X_PRICE_CLOSE);
//
// Resistance Zones ...
ResistanceZoneLoopBack(52);
ResistanceZoneWidth(1);
ResistanceZoneColor(clrRed);
ResistanceZoneStyle(STYLE_DOT);
ResistanceZonePriceType(X_PRICE_CLOSE);
//
// Supply and Deman Zones ...
//
// Supply Zones ...
SupplyZoneWidth(1);
SupplyZoneColor(clrDarkRed);
SupplyZoneStyle(STYLE_DASH);
SupplyZonePeriod(GetHindMostPeriod(Period()));
//
// Demand Zones ...
DemandZoneWidth(1);
DemandZoneColor(clrDarkGreen);
DemandZoneStyle(STYLE_DASH);
DemandZonePeriod(GetHindMostPeriod(Period()));
//
// Order Blocks ...
//
// Bullish Order Block ...
BullishOrderBlockWidth(1);
BullishOrderBlockColor(clrAqua);
BullishOrderBlockStyle(STYLE_DASHDOT);
RequiredBarsForBullishOrderBlock(3);
//
// Bearish Order Block ...
BearishOrderBlockWidth(1);
BearishOrderBlockColor(clrMagenta);
BearishOrderBlockStyle(STYLE_DASHDOT);
RequiredBarsForBearishOrderBlock(3);
//
// Fair Value Gaps ...
//
// Bullish FVGs ...
BullishFVGWidth(1);
BullishFVGColor(clrAqua);
BullishFVGStyle(STYLE_DASHDOTDOT);
BullishFVGForceMiddleBarCheck(true);
BullishFVGForceCheckLastBarDirection(true);
//
// Bearish FVGs ...
BearishFVGWidth(1);
BearishFVGColor(clrMagenta);
BearishFVGStyle(STYLE_DASHDOTDOT);
BearishFVGForceMiddleBarCheck(true);
BearishFVGForceCheckLastBarDirection(true);
//
}
//
// Session Configurations ...
/**
* Add Sepcific Session to Supported Sessions ...
*
* @param session: XSession instance ...
*/
void AddSession(XSession &session)
{
//
if (!session.IsValid())
{
return;
}
//
AddRef(
session,
mSessions //
);
}
//
// Event Listeners ...
//
// Trading Days ...
/**
* Calls When new Trading Day Event Happens ...
*
* @param event: ENUM_XPOI_EVENTS member ...
*/
virtual void OnTradingDayEvent(
ENUM_XPOI_EVENTS event //
)
{
}
/**
* Register an Event Listener for New Trading Day Events ...
*
* @param listener: TXPOIEventHandler instance ...
*/
void AddTradingDayEventListener(TXPOIEventHandler listener)
{
//
Add(
listener,
mTradingDayEventListeners //
);
}
//
// Market Sessions ...
/**
* Calls When new Market Session Event Happens ...
*
* @param session: ENUM_XSESSION member ...
* @param event: ENUM_XPOI_EVENTS member ...
*/
virtual void OnMarketSessionEvent(
ENUM_XSESSION session,
ENUM_XPOI_EVENTS event //
)
{
}
/**
* Register an Event Listener for New Market Session Events ...
*
* @param listener: TXSessionEventHandler instance ...
*/
void AddMarketSessionEventListener(TXSessionEventHandler listener)
{
//
Add(
listener,
mMarketSessionEventListeners //
);
}
//
// Swings ...
//
// Swing Highs ...
/**
* Calls When new Swing High Event ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
virtual void OnSwingHighEvent(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
}
/**
* Register an Event Listener for New Swing High Event ...
*
* @param listener: TXOHCLEventHandler instance ...
*/
void AddSwingHighEventListener(TXOHCLEventHandler listener)
{
//
Add(
listener,
mSwingHighEventListeners //
);
}
//
// Swing Lows ...
/**
* Calls When new Swing Low Detected ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
virtual void OnSwingLowEvent(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
}
/**
* Register an Event Listener for New Swing Low Event ...
*
* @param listener: TXOHCLEventHandler instance ...
*/
void AddSwingLowEventListener(TXOHCLEventHandler listener)
{
//
Add(
listener,
mSwingLowEventListeners //
);
}
//
// Momentum Bar ...
/**
* Calls When new Momentum Bar Event ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
virtual void OnMomentumBarEvent(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
}
/**
* Register an Event Listener for New Momentum Bar Event ...
*
* @param listener: TXOHCLEventHandler instance ...
*/
void AddMomentumBarEventListener(TXOHCLEventHandler listener)
{
//
Add(
listener,
mMomentumBarEventListeners //
);
}
//
// Rejection Bar ...
/**
* Calls When new Rejection Bar Event ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
virtual void OnRejectionBarEvent(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
}
/**
* Register an Event Listener for New Rejection Bar Event ...
*
* @param listener: TXOHCLEventHandler instance ...
*/
void AddRejectionBarEventListener(TXOHCLEventHandler listener)
{
//
Add(
listener,
mRejectionBarEventListeners //
);
}
//
// Support and Resistance Zones ...
//
// Support Zones ...
/**
* Calls When new Support Zone Event ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
virtual void OnSupportZoneEvent(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
}
/**
* Register an Event Listener for New Support Zone Event ...
*
* @param listener: TXOHCLEventHandler instance ...
*/
void AddSupportZoneEventListener(TXOHCLEventHandler listener)
{
//
Add(
listener,
mSupportZoneEventListeners //
);
}
//
// Resistance Zones ...
/**
* Calls When new Resistance Zone Event ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
virtual void OnResistanceZoneEvent(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
}
/**
* Register an Event Listener for New Resistance Zone Event ...
*
* @param listener: TXOHCLEventHandler instance ...
*/
void AddResistanceZoneEventListener(TXOHCLEventHandler listener)
{
//
Add(
listener,
mResistanceZoneEventListeners //
);
}
//
// Supply and Demand Zones ...
//
// Supply Zones ...
/**
* Calls When new Supply Zone Event ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param zone: XZone instance ...
*/
virtual void OnSupplyZoneEvent(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
}
/**
* Register an Event Listener for New Supply Zone Event ...
*
* @param listener: TXZoneEventHandler instance ...
*/
void AddSupplyZoneEventListener(TXZoneEventHandler listener)
{
//
Add(
listener,
mSupplyZoneEventListeners //
);
}
//
// Demand Zones ...
/**
* Calls When new Demand Zone Event ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param zone: XZone instance ...
*/
virtual void OnDemandZoneEvent(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
}
/**
* Register an Event Listener for New Demand Zone Event ...
*
* @param listener: TXZoneEventHandler instance ...
*/
void AddDemandZoneEventListener(TXZoneEventHandler listener)
{
//
Add(
listener,
mDemandZoneEventListeners //
);
}
//
// Order Blocks ...
//
// Bullish Order Blocks ...
/**
* Calls When new Bullish Order Block Event ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param zone: XZone instance ...
*/
virtual void OnBullishOrderBlockEvent(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
}
/**
* Register an Event Listener for New Bullish Order Block Event ...
*
* @param listener: TXZoneEventHandler instance ...
*/
void AddBullishOrderBlockEventListener(TXZoneEventHandler listener)
{
//
Add(
listener,
mBullishOrderBlockEventListeners //
);
}
//
// Bearish Order Blocks ...
/**
* Calls When new Bearish Order Block Event ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param zone: XZone instance ...
*/
virtual void OnBearishOrderBlockEvent(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
}
/**
* Register an Event Listener for New Bearish Order Block Event ...
*
* @param listener: TXZoneEventHandler instance ...
*/
void AddBearishOrderBlockEventListener(TXZoneEventHandler listener)
{
//
Add(
listener,
mBearishOrderBlockEventListeners //
);
}
//
// Fai Value Gaps ...
//
// Bullish FVGs ...
/**
* Calls When new Bullish FVG Event ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param zone: XZone instance ...
*/
virtual void OnBullishFVGEvent(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
}
/**
* Register an Event Listener for New Bullish FVG Event ...
*
* @param listener: TXZoneEventHandler instance ...
*/
void AddBullishFVGEventListener(TXZoneEventHandler listener)
{
//
Add(
listener,
mBullishFVGEventListeners //
);
}
//
// Bearish FVGs ...
/**
* Calls When new Bearish FVG Event ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param zone: XZone instance ...
*/
virtual void OnBearishFVGEvent(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
}
/**
* Register an Event Listener for New Bearish FVG Event ...
*
* @param listener: TXZoneEventHandler instance ...
*/
void AddBearishFVGEventListener(TXZoneEventHandler listener)
{
//
Add(
listener,
mBearishFVGEventListeners //
);
}
//
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;
}
//
Lock();
//
// Normalize Bar Index ...
if (barIndex < 0)
{
barIndex = 0;
}
//
bool canContinue = true;
while (canContinue)
{
//
// Define Index of Bars ...
int zIndex = barIndex;
int cIndex = zIndex + 1;
//
datetime cTime = TimeCurrent();
//
XOHCL zBar;
bool isRetrieved = mBarTracker.GetBar(zBar, zIndex);
if (!isRetrieved)
{
break;
}
//
XOHCL cBar;
isRetrieved = mBarTracker.GetBar(cBar, cIndex);
if (!isRetrieved)
{
break;
}
//
// Detect POI(s) based On Current Bar ...
//
// Trade Days ...
bool allowTradingDays = AllowTradingDays();
int daysCount = ArraySize(mTradingDays);
if (allowTradingDays &&
daysCount < requiredPOIs)
{
//
XOHCL zDayBar;
isRetrieved = zDayBar.Init(
mSymbol,
PERIOD_D1,
zIndex //
);
if (!isRetrieved)
{
break;
}
//
XOHCL cDayBar;
isRetrieved = cDayBar.Init(
mSymbol,
PERIOD_D1,
cIndex //
);
if (!isRetrieved)
{
break;
}
//
XTradeDay tradeDay;
tradeDay.from = zDayBar.time;
//
datetime lastBarTime = zDayBar.GetLastBarTimeOfPeriod(mPeriod);
tradeDay.to = lastBarTime;
//
int idx = HasTradeDay(tradeDay.from);
if (!IsValidIndex(idx))
{
//
AddRef(
tradeDay,
mTradingDays //
);
//
daysCount = ArraySize(mTradingDays);
}
}
//
// Market Sessions ...
int sessionsCount = ArraySize(mSessions);
bool allowMarketSessions = AllowMarketSessions();
int marketSessionsCount = ArraySize(mMarketSessions);
if (allowMarketSessions &&
IsValidSize(sessionsCount) &&
marketSessionsCount < sessionsCount * requiredPOIs)
{
//
for (int i = 0; i < sessionsCount; i++)
{
//
XSession iSession = mSessions[i];
int iCount = CountMarketSessions(iSession.session);
if (iCount >= requiredPOIs)
{
continue;
}
//
datetime zTimeGMT = GetUTCTime(zBar.time);
string zTimeString = GetTimeString(zTimeGMT);
//
bool isStarted = iSession.start == zTimeString;
bool isEnded = iSession.end == zTimeString;
//
// Detect Sessions Based on Time ...
// Since All Session Close Times Related to Current Date and
// in Required POIs we Moving Back from Current Date ...
if (isEnded && iCount < requiredPOIs)
{
//
// Check Market Session Doesnt Exists by End Time ...
int iIDX = HasMarketSessionByEndTime(
iSession.session,
zBar.time //
);
if (!IsValidIndex(iIDX))
{
//
XMarketSession iMarketSession;
iMarketSession.session = iSession.session;
iMarketSession.to = zBar.time;
//
int iSessionWorkingHoure = SessionOpenHours();
int iSessionWorkingSeconds = iSessionWorkingHoure * 60 * 60;
iMarketSession.from = (datetime)((int)zBar.time - iSessionWorkingSeconds);
//
AddRef(
iMarketSession,
mMarketSessions //
);
//
marketSessionsCount = ArraySize(mMarketSessions);
}
}
//
}
}
//
// Swning Highs and Lows ...
//
// Swing Highs ...
bool allowSwingHighs = AllowSwingHighs();
int swingHighsCount = ArraySize(mSwingHighs);
if (allowSwingHighs &&
swingHighsCount < requiredPOIs)
{
//
bool isSwingHigh = cBar.IsSimpleSwingHigh(SwingHighThreshold());
if (isSwingHigh)
{
//
bool isAdded = AddBar(
X_POI_SWING_HIGH,
cBar,
mSwingHighs //
);
//
if (isAdded)
{
swingHighsCount = ArraySize(mSwingHighs);
}
}
}
//
// Swing Lows ...
bool allowSwingLows = AllowSwingLows();
int swingLowsCount = ArraySize(mSwingLows);
if (allowSwingLows &&
swingLowsCount < requiredPOIs)
{
//
bool isSwingLow = cBar.IsSimpleSwingLow(SwingLowThreshold());
if (isSwingLow)
{
//
bool isAdded = AddBar(
X_POI_SWING_LOW,
cBar,
mSwingLows //
);
//
if (isAdded)
{
swingLowsCount = ArraySize(mSwingLows);
}
}
}
//
// Momentum Bars ...
bool allowMomentumBars = AllowMomentumBars();
int momentumBarsCount = ArraySize(mMomentumBars);
if (allowMomentumBars &&
momentumBarsCount < requiredPOIs)
{
//
bool isStrongBar = cBar.IsStrong(MomentumBarPercent());
//
// Bullish ...
bool isSharpBullish = cBar.IsSharpBullish(
MomentumBarLoopBack(),
MomentumBarSharpRatio() //
);
//
// Bearish ...
bool isSharpBearish = cBar.IsSharpBearish(
MomentumBarLoopBack(),
MomentumBarSharpRatio() //
);
//
bool isMomentumBar =
isStrongBar &&
(isSharpBearish ||
isSharpBullish);
if (isMomentumBar)
{
//
bool isAdded = AddBar(
X_POI_MOMENTUM_BAR,
cBar,
mMomentumBars //
);
//
if (isAdded)
{
momentumBarsCount = ArraySize(mMomentumBars);
}
}
}
//
// Rejection Bars ...
bool allowRejectionBars = AllowRejectionBars();
int rejectionBarsCount = ArraySize(mRejectionBars);
if (allowRejectionBars &&
rejectionBarsCount < requiredPOIs)
{
//
bool isRejectionBar =
cBar.HasStrongLowShadow(
RejectionBarPercent(),
RejectionBarLoopBack(),
RejectionBarSharpRatio() //
) ||
cBar.HasStrongHighShadow(
RejectionBarPercent(),
RejectionBarLoopBack(),
RejectionBarSharpRatio() //
);
//
if (isRejectionBar)
{
//
bool isAdded = AddBar(
X_POI_REJECTION_BAR,
cBar,
mRejectionBars //
);
//
if (isAdded)
{
rejectionBarsCount = ArraySize(mRejectionBars);
}
}
}
//
// Support nad Resistance Zones ...
//
// Support Zones ...
bool allowSupportZones = AllowSupportZones();
int supportZonesCount = ArraySize(mSupportZones);
if (allowSupportZones &&
supportZonesCount < requiredPOIs)
{
//
XOHCL support;
bool hasSupport = cBar.HasSupport(
support,
SupportZonePriceType(),
SupportZoneLoopBack() //
);
//
if (hasSupport)
{
//
bool isAdded = AddBar(
X_POI_SUPPORT_ZONE,
support,
mSupportZones //
);
//
if (isAdded)
{
supportZonesCount = ArraySize(mSupportZones);
}
}
}
//
// Resistance Zones ...
bool allowResistanceZones = AllowResistanceZones();
int resistanceZonesCount = ArraySize(mResistanceZones);
if (allowResistanceZones &&
resistanceZonesCount < requiredPOIs)
{
//
XOHCL resistance;
bool hasResistance = cBar.HasResistance(
resistance,
ResistanceZonePriceType(),
ResistanceZoneLoopBack() //
);
//
if (hasResistance)
{
//
bool isAdded = AddBar(
X_POI_RESISTANCE_ZONE,
resistance,
mResistanceZones //
);
//
if (isAdded)
{
resistanceZonesCount = ArraySize(mResistanceZones);
}
}
}
//
// Supply and Demand Zones ...
//
// Supply Zones ...
bool allowSupplyZones = AllowSupplyZones();
int supplyZonesCount = ArraySize(mSupplyZones);
if (allowSupplyZones &&
supplyZonesCount < requiredPOIs)
{
//
datetime endTime = cBar.time;
//
datetime cSupplyZoneStartTime = iTime(
Symbol(),
SupplyZonePeriod(),
supplyZonesCount + 1 //
);
datetime startTime = cSupplyZoneStartTime;
//
int cSupplyZoneStartIndex = iBarShift(
Symbol(),
Period(),
cSupplyZoneStartTime //
);
//
XOHCL swings[];
for (int i = 0; i < cSupplyZoneStartIndex; i++)
{
//
XOHCL iBar;
bool isIBarInited = iBar.Init(
Symbol(),
Period(),
i //
);
if (!isIBarInited)
{
continue;
}
//
// Check is Bar Swing or not ...
bool isSwing = iBar.IsSimpleSwingHigh();
if (!isSwing)
{
continue;
}
//
AddRef(
iBar,
swings //
);
}
//
XOHCL selectedSwing;
int swingsCount = ArraySize(swings);
if (IsValidSize(swingsCount))
{
//
for (int i = 0; i < swingsCount; i++)
{
//
XOHCL iSwing = swings[i];
if (!selectedSwing.IsValid() ||
selectedSwing.high < iSwing.high)
{
selectedSwing = iSwing;
}
}
}
//
if (selectedSwing.IsValid())
{
//
XZone zone;
bool isInited = zone.Init(
selectedSwing.high,
selectedSwing.low,
ToString(X_POI_SUPPLY_ZONE) + "_" + ToString(SupplyZonePeriod()),
startTime,
endTime //
);
if (isInited)
{
//
AddRef(
zone,
mSupplyZones //
);
//
supplyZonesCount = ArraySize(mSupplyZones);
}
}
}
//
// Demand Zones ...
bool allowDemandZones = AllowDemandZones();
int demandZonesCount = ArraySize(mDemandZones);
if (allowDemandZones &&
demandZonesCount < requiredPOIs)
{
//
datetime endTime = cBar.time;
//
datetime cDemandZoneStartTime = iTime(
Symbol(),
DemandZonePeriod(),
demandZonesCount + 1 //
);
datetime startTime = cDemandZoneStartTime;
//
int cDemandZoneStartIndex = iBarShift(
Symbol(),
Period(),
cDemandZoneStartTime //
);
//
XOHCL swings[];
for (int i = 0; i < cDemandZoneStartIndex; i++)
{
//
XOHCL iBar;
bool isIBarInited = iBar.Init(
Symbol(),
Period(),
i //
);
if (!isIBarInited)
{
continue;
}
//
// Check is Bar Swing or not ...
bool isSwing = iBar.IsSimpleSwingLow();
if (!isSwing)
{
continue;
}
//
AddRef(
iBar,
swings //
);
}
//
XOHCL selectedSwing;
int swingsCount = ArraySize(swings);
if (IsValidSize(swingsCount))
{
//
for (int i = 0; i < swingsCount; i++)
{
//
XOHCL iSwing = swings[i];
if (!selectedSwing.IsValid() ||
selectedSwing.low > iSwing.low)
{
selectedSwing = iSwing;
}
}
}
//
if (selectedSwing.IsValid())
{
//
XZone zone;
bool isInited = zone.Init(
selectedSwing.high,
selectedSwing.low,
ToString(X_POI_DEMAND_ZONE) + "_" + ToString(SupplyZonePeriod()),
startTime,
endTime //
);
if (isInited)
{
//
AddRef(
zone,
mDemandZones //
);
//
demandZonesCount = ArraySize(mDemandZones);
}
}
}
//
// Order Blocks ...
//
// Bullish Order Blocks ...
bool allowBullishOrderBlocks = AllowBullishOrderBlocks();
int bullishOrderBlocksCount = ArraySize(mBullishOrderBlocks);
if (allowBullishOrderBlocks &&
bullishOrderBlocksCount < requiredPOIs)
{
//
XOHCL ob;
bool hasOB = cBar.HasBullishOrderBlock(
ob,
RequiredBarsForBullishOrderBlock() //
);
if (hasOB)
{
//
XZone zone;
bool isAdded = AddZone(
zone, //
ob,
cBar.time,
X_POI_BULLISH_ORDERBLOCK,
mBullishOrderBlocks //
);
if (isAdded)
{
bullishOrderBlocksCount = ArraySize(mBullishOrderBlocks);
}
}
}
//
// Bearish Order Blocks ...
bool allowBearishOrderBlocks = AllowBearishOrderBlocks();
int bearishOrderBlocksCount = ArraySize(mBearishOrderBlocks);
if (allowBearishOrderBlocks &&
bearishOrderBlocksCount < requiredPOIs)
{
//
XOHCL ob;
bool hasOB = cBar.HasBearishOrderBlock(
ob,
RequiredBarsForBearishOrderBlock() //
);
if (hasOB)
{
//
XZone zone;
bool isAdded = AddZone(
zone, //
ob,
cBar.time,
X_POI_BEARISH_ORDERBLOCK,
mBearishOrderBlocks //
);
if (isAdded)
{
bullishOrderBlocksCount = ArraySize(mBearishOrderBlocks);
}
}
}
//
// Fair Value Gaps ...
//
// Bullish FVGs ...
bool allowBullishFVGs = AllowBullishFVGs();
int bullishFVGsCount = ArraySize(mBullishFVGs);
if (allowBullishFVGs &&
bullishFVGsCount < requiredPOIs)
{
//
double upper;
double lower;
datetime start;
datetime end;
bool hasBullishFVG = cBar.HasBullishFVG(
upper,
lower,
start,
end,
BullishFVGForceMiddleBarCheck(),
BullishFVGForceCheckLastBarDirection() //
);
if (hasBullishFVG)
{
//
XZone zone;
bool isAdded = AddZone(
zone,
upper,
lower,
start,
end,
X_POI_BULLISH_FVG,
mBullishFVGs //
);
if (isAdded)
{
bullishFVGsCount = ArraySize(mBullishFVGs);
}
}
}
//
// Bearish FVGs ...
bool allowBearishFVGs = AllowBearishFVGs();
int bearishFVGsCount = ArraySize(mBearishFVGs);
if (allowBearishFVGs &&
bearishFVGsCount < requiredPOIs)
{
//
double upper;
double lower;
datetime start;
datetime end;
bool hasBearishFVG = cBar.HasBearishFVG(
upper,
lower,
start,
end,
BearishFVGForceMiddleBarCheck(),
BearishFVGForceCheckLastBarDirection() //
);
if (hasBearishFVG)
{
//
XZone zone;
bool isAdded = AddZone(
zone,
upper,
lower,
start,
end,
X_POI_BEARISH_FVG,
mBearishFVGs //
);
if (isAdded)
{
bearishFVGsCount = ArraySize(mBearishFVGs);
}
}
}
//
// Detect Required Conditions for Loop ...
//
//
// Market Sessions Requirements ...
bool isNeedMoreMarketSessions = (!IsValidSize(sessionsCount)
? true
: marketSessionsCount < (sessionsCount * requiredPOIs));
canContinue =
//
// Trade Days ...
(allowTradingDays &&
daysCount < requiredPOIs) ||
//
// Market Sessions ...
(allowMarketSessions &&
isNeedMoreMarketSessions) ||
//
// Swing High and Low (s) ...
(allowSwingHighs &&
swingHighsCount < requiredPOIs) ||
(allowSwingLows &&
swingLowsCount < requiredPOIs) ||
//
// Momentum Bars ...
(allowMomentumBars &&
momentumBarsCount < requiredPOIs) ||
//
// Rejection Bars ...
(allowRejectionBars &&
rejectionBarsCount < requiredPOIs) ||
//
// Support and Resistance Zones ...
(allowSupportZones &&
supportZonesCount < requiredPOIs) ||
(allowResistanceZones &&
resistanceZonesCount < requiredPOIs) ||
//
// Supply and Demand Zones ...
(allowSupplyZones &&
supplyZonesCount < requiredPOIs) ||
(allowDemandZones &&
demandZonesCount < requiredPOIs) ||
//
// Order Blocks ...
(allowBullishOrderBlocks &&
bullishOrderBlocksCount < requiredPOIs) ||
(allowBearishOrderBlocks &&
bearishOrderBlocksCount < requiredPOIs) ||
//
// Fair Value Gaps ...
(allowBullishFVGs &&
bullishFVGsCount < requiredPOIs) ||
(allowBearishFVGs &&
bearishFVGsCount < requiredPOIs)
//
;
if (canContinue)
{
barIndex++;
}
}
//
// int errorArr[];
// if (canContinue)
// {
// //
// int t = errorArr[5];
// }
//
// Complete Calculations ...
//
// Reverse Trading Days ...
XTradeDay tmpDays[];
Copy(
mTradingDays,
tmpDays //
);
Clean(mTradingDays);
ArrayReverse(tmpDays);
Copy(
tmpDays,
mTradingDays //
);
Clean(tmpDays);
//
// Reverse Market Sessions ...
XMarketSession tmpSessions[];
Copy(
mMarketSessions,
tmpSessions //
);
Clean(mMarketSessions);
ArrayReverse(tmpSessions);
Copy(
tmpSessions,
mMarketSessions //
);
//
XOHCL tmpBars[];
//
// Reverse Swing Highs ...
Copy(
mSwingHighs,
tmpBars //
);
Clean(mSwingHighs);
ArrayReverse(tmpBars);
Copy(
tmpBars,
mSwingHighs //
);
Clean(tmpBars);
//
// Reverse Swing Lows ...
Copy(
mSwingLows,
tmpBars //
);
Clean(mSwingLows);
ArrayReverse(tmpBars);
Copy(
tmpBars,
mSwingLows //
);
Clean(tmpBars);
//
// Reverse Momentum Bars ...
Copy(
mMomentumBars,
tmpBars //
);
Clean(mMomentumBars);
ArrayReverse(tmpBars);
Copy(
tmpBars,
mMomentumBars //
);
Clean(tmpBars);
//
// Reverse Rejection Bars ...
Copy(
mRejectionBars,
tmpBars //
);
Clean(mRejectionBars);
ArrayReverse(tmpBars);
Copy(
tmpBars,
mRejectionBars //
);
Clean(tmpBars);
//
// Reverse Support Zones ...
Copy(
mSupportZones,
tmpBars //
);
Clean(mSupportZones);
ArrayReverse(tmpBars);
Copy(
tmpBars,
mSupportZones //
);
Clean(tmpBars);
//
// Reverse Resistance Zones ...
Copy(
mResistanceZones,
tmpBars //
);
Clean(mResistanceZones);
ArrayReverse(tmpBars);
Copy(
tmpBars,
mResistanceZones //
);
Clean(tmpBars);
//
XZone tmpZones[];
//
// Supply and Demand Zones ...
//
Copy(
mSupplyZones,
tmpZones //
);
Clean(mSupplyZones);
ArrayReverse(tmpZones);
Copy(
tmpZones,
mSupplyZones //
);
Clean(tmpZones);
//
Copy(
mDemandZones,
tmpZones //
);
Clean(mDemandZones);
ArrayReverse(tmpZones);
Copy(
tmpZones,
mDemandZones //
);
Clean(tmpZones);
//
// Order Blocks ...
//
Copy(
mBullishOrderBlocks,
tmpZones //
);
Clean(mBullishOrderBlocks);
ArrayReverse(tmpZones);
Copy(
tmpZones,
mBullishOrderBlocks //
);
Clean(tmpZones);
//
Copy(
mBearishOrderBlocks,
tmpZones //
);
Clean(mBearishOrderBlocks);
ArrayReverse(tmpZones);
Copy(
tmpZones,
mBearishOrderBlocks //
);
Clean(tmpZones);
//
// Fair Value Gaps ...
//
Copy(
mBullishFVGs,
tmpZones //
);
Clean(mBullishFVGs);
ArrayReverse(tmpZones);
Copy(
tmpZones,
mBullishFVGs //
);
Clean(tmpZones);
//
Copy(
mBearishFVGs,
tmpZones //
);
Clean(mBearishFVGs);
ArrayReverse(tmpZones);
Copy(
tmpZones,
mBearishFVGs //
);
Clean(tmpZones);
//
// ...
//
Unlock();
DrawPOIs();
}
//
// Destroy POIs ...
/**
* Destroy All POI(s) ...
*/
void DestroyPOIs()
{
//
// Trading Days ...
DestroyTradingDays();
//
// Market Sessions ...
DestroyMarketSessions();
//
// Momentum Bars ...
DestroyMomentumBars();
//
// Rejection Bars ...
DestroyRejectionBars();
//
// Swing High and Zone (s) ...
DestroySwingHighs();
DestroySwingLows();
//
// Support and Resistance Zones ...
DestroySupportZones();
DestroyResistanceZones();
//
// Supply and Demand Zones ...
DestroySupplyZones();
DestroyDemandZones();
//
// Order Blocks ...
DestroyBullishOrderBlocks();
DestroyBearishOrderBlocks();
//
// Fai Value Gaps ...
DestroyBullishFVGs();
DestroyBearishFVGs();
}
/**
* Destroy Trading Days ...
*/
void DestroyTradingDays()
{
Clean(mTradingDays);
}
/**
* Destroy Swing Highs ...
*/
void DestroySwingHighs()
{
Clean(mSwingHighs);
}
/**
* Destroy Swing Lows ...
*/
void DestroySwingLows()
{
Clean(mSwingLows);
}
/**
* Destroy Momentum Bars ...
*/
void DestroyMomentumBars()
{
Clean(mMomentumBars);
}
/**
* Destroy Rejection Bars ...
*/
void DestroyRejectionBars()
{
Clean(mRejectionBars);
}
/**
* Destroy Market Sessions ...
*/
void DestroyMarketSessions()
{
Clean(mMarketSessions);
}
/**
* Destroy Support Zones ...
*/
void DestroySupportZones()
{
Clean(mSupportZones);
}
/**
* Destroy Resistance Zones ...
*/
void DestroyResistanceZones()
{
Clean(mResistanceZones);
}
/**
* Destroy Supply Zones ...
*/
void DestroySupplyZones()
{
Clean(mSupplyZones);
}
/**
* Destroy Demand Zones ...
*/
void DestroyDemandZones()
{
Clean(mDemandZones);
}
/**
* Destroy Bullish Order Blocks ...
*/
void DestroyBullishOrderBlocks()
{
Clean(mBullishOrderBlocks);
}
/**
* Destroy Bearish Order Blocks ...
*/
void DestroyBearishOrderBlocks()
{
Clean(mBearishOrderBlocks);
}
/**
* Destroy Bullish FVGs ...
*/
void DestroyBullishFVGs()
{
Clean(mBullishFVGs);
}
/**
* Destroy Bearish FVGs ...
*/
void DestroyBearishFVGs()
{
Clean(mBearishFVGs);
}
//
// Draw Actions ...
/**
* Draw All POI(s) ...
*/
void DrawPOIs()
{
//
// Trading Days ...
DrawTradingDays();
//
// Market Sessions ...
DrawMarketSessions();
//
// Momentum Bars ...
DrawMomentumBars();
//
// Rejection Bars ...
DrawRejectionBars();
//
// Swing High and Low (s) ...
DrawSwingHighs();
DrawSwingLows();
//
// Support and Resistance (s) ...
DrawSupportZones();
DrawResistanceZones();
//
// Supply and Demand Zones ...
DrawSupplyZones();
DrawDemandZones();
//
// Order Blocks ...
DrawBullishOrderBlocks();
DrawBearishOrderBlocks();
//
// Fair Value Gaps ...
DrawBullishFVGs();
DrawBearishFVGs();
}
/**
* Draw Trading Days ...
*/
void DrawTradingDays()
{
//
bool allow = AllowDrawTradingDays();
if (!allow)
{
return;
}
//
int count = ArraySize(mTradingDays);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XTradeDay iDay = mTradingDays[i];
//
string iName = iDay.GetTag();
int iIDX = HasTradingDayObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateTradingDayObject(iDay, iName);
}
}
/**
* Check a Trading Day is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasTradingDayObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mTradingDayObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((XCBaseObject *)mTradingDayObjects.At(i)).ObjName();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Swing Highs ...
*/
void DrawSwingHighs()
{
//
bool allow = AllowDrawSwingHighs();
if (!allow)
{
return;
}
//
int count = ArraySize(mSwingHighs);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XOHCL iSwing = mSwingHighs[i];
//
string iName = iSwing.GetTag(ToString(X_POI_SWING_HIGH));
int iIDX = HasSwingHighObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateSwingHighObject(iSwing, iName);
}
}
/**
* Check a Swing High is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasSwingHighObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mSwingHighObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((CChartObjectArrow *)mSwingHighObjects.At(i)).Name();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Swing Lows ...
*/
void DrawSwingLows()
{
//
bool allow = AllowDrawSwingLows();
if (!allow)
{
return;
}
//
int count = ArraySize(mSwingLows);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XOHCL iSwing = mSwingLows[i];
//
string iName = iSwing.GetTag(ToString(X_POI_SWING_LOW));
int iIDX = HasSwingLowObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateSwingLowObject(iSwing, iName);
}
}
/**
* Check a Swing Low is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasSwingLowObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mSwingLowObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((CChartObjectArrow *)mSwingLowObjects.At(i)).Name();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Momentum Bars ...
*/
void DrawMomentumBars()
{
//
bool allow = AllowDrawMomentumBars();
if (!allow)
{
return;
}
//
int count = ArraySize(mMomentumBars);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XOHCL iBar = mMomentumBars[i];
//
string iName = iBar.GetTag(ToString(X_POI_MOMENTUM_BAR));
int iIDX = HasMomentumBarObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateMomentumBarObject(iBar, iName);
}
}
/**
* Check a Momentum Bar is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasMomentumBarObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mMomentumBarObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((CChartObjectArrow *)mMomentumBarObjects.At(i)).Name();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Rejection Bars ...
*/
void DrawRejectionBars()
{
//
bool allow = AllowDrawRejectionBars();
if (!allow)
{
return;
}
//
int count = ArraySize(mRejectionBars);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XOHCL iBar = mRejectionBars[i];
//
string iName = iBar.GetTag(ToString(X_POI_REJECTION_BAR));
int iIDX = HasRejectionBarObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateRejectionBarObject(iBar, iName);
}
}
/**
* Check a Rejection Bar is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasRejectionBarObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mRejectionBarObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((CChartObjectArrow *)mRejectionBarObjects.At(i)).Name();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Market Sessions ...
*/
void DrawMarketSessions()
{
//
bool allow = AllowDrawMarketSessions();
if (!allow)
{
return;
}
//
int count = ArraySize(mMarketSessions);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XMarketSession iMarketSession = mMarketSessions[i];
//
string iName = iMarketSession.GetTag();
int iIDX = HasMarketessionObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateMarketSessionObject(iMarketSession, iName);
}
}
/**
* Check a Market Session is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasMarketessionObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mMarketSessionObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((XCMarketSessionObject *)mMarketSessionObjects.At(i)).ObjName();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Support Zones ...
*/
void DrawSupportZones()
{
//
bool allow = AllowDrawSupportZones();
if (!allow)
{
return;
}
//
int count = ArraySize(mSupportZones);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XOHCL iSupportZone = mSupportZones[i];
//
string iName = iSupportZone.GetTag(ToString(X_POI_SUPPORT_ZONE));
int iIDX = HasSupportZoneObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateSupportZoneObject(iSupportZone, iName);
}
}
/**
* Check a Suport Zone is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasSupportZoneObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mSupportZoneObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((XCSupportZoneObject *)mSupportZoneObjects.At(i)).ObjName();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Resistance Zones ...
*/
void DrawResistanceZones()
{
//
bool allow = AllowDrawResistanceZones();
if (!allow)
{
return;
}
//
int count = ArraySize(mResistanceZones);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XOHCL iResistanceZone = mResistanceZones[i];
//
string iName = iResistanceZone.GetTag(ToString(X_POI_RESISTANCE_ZONE));
int iIDX = HasResistanceZoneObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateResistanceZoneObject(iResistanceZone, iName);
}
}
/**
* Check a Resistance Zone is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasResistanceZoneObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mResistanceZoneObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((XCResistanceZoneObject *)mResistanceZoneObjects.At(i)).ObjName();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Supply Zones ...
*/
void DrawSupplyZones()
{
//
bool allow = AllowDrawSupplyZones();
if (!allow)
{
return;
}
//
int count = ArraySize(mSupplyZones);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XZone iSupplyZone = mSupplyZones[i];
//
string iName = iSupplyZone.GetTag();
int iIDX = HasSupplyZoneObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateSupplyZoneObject(iSupplyZone, iName);
}
}
/**
* Check a Supply Zone is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasSupplyZoneObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mSupplyZoneObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((XCSupplyZoneObject *)mSupplyZoneObjects.At(i)).ObjName();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Demand Zones ...
*/
void DrawDemandZones()
{
//
bool allow = AllowDrawDemandZones();
if (!allow)
{
return;
}
//
int count = ArraySize(mDemandZones);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XZone iDemandZone = mDemandZones[i];
//
string iName = iDemandZone.GetTag();
int iIDX = HasDemandZoneObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateDemandZoneObject(iDemandZone, iName);
}
}
/**
* Check a Demand Zone is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasDemandZoneObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mDemandZoneObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((XCDemandZoneObject *)mDemandZoneObjects.At(i)).ObjName();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Bullish Order Blocks ...
*/
void DrawBullishOrderBlocks()
{
//
bool allow = AllowDrawBullishOrderBlocks();
if (!allow)
{
return;
}
//
int count = ArraySize(mBullishOrderBlocks);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XZone iBullishOB = mBullishOrderBlocks[i];
//
string iName = iBullishOB.GetTag();
int iIDX = HasBullishOrderBlockObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateBullishOrderBlockObject(iBullishOB, iName);
}
}
/**
* Check a Bullish Order Block is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasBullishOrderBlockObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mBullishOrderBlockObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((XCBullishOrderBlockObject *)mBullishOrderBlockObjects.At(i)).ObjName();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Bearish Order Blocks ...
*/
void DrawBearishOrderBlocks()
{
//
bool allow = AllowDrawBearishOrderBlocks();
if (!allow)
{
return;
}
//
int count = ArraySize(mBearishOrderBlocks);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XZone iBearishOB = mBearishOrderBlocks[i];
//
string iName = iBearishOB.GetTag();
int iIDX = HasBearishOrderBlockObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateBearishOrderBlockObject(iBearishOB, iName);
}
}
/**
* Check a Bearish Order Block is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasBearishOrderBlockObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mBearishOrderBlockObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((XCBearishOrderBlockObject *)mBearishOrderBlockObjects.At(i)).ObjName();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Bullish FVGs ...
*/
void DrawBullishFVGs()
{
//
bool allow = AllowDrawBullishFVGs();
if (!allow)
{
return;
}
//
int count = ArraySize(mBullishFVGs);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XZone iFVG = mBullishFVGs[i];
//
string iName = iFVG.GetTag();
int iIDX = HasBullishFVGObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateBullishFVGObject(iFVG, iName);
}
}
/**
* Check a Bullish FVG is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasBullishFVGObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mBullishFVGObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((XCBullishFVGObject *)mBullishFVGObjects.At(i)).ObjName();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Draw Bearish FVGs ...
*/
void DrawBearishFVGs()
{
//
bool allow = AllowDrawBearishFVGs();
if (!allow)
{
return;
}
//
int count = ArraySize(mBearishFVGs);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
XZone iFVG = mBearishFVGs[i];
//
string iName = iFVG.GetTag();
int iIDX = HasBearishFVGObject(
iName //
);
if (IsValidIndex(iIDX))
{
continue;
}
//
CreateBearishFVGObject(iFVG, iName);
}
}
/**
* Check a Bearish FVG is Drawn Before or not ...
*
* @param name: String ...
*
* @return ( int )
*/
int HasBearishFVGObject(
string name //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = mBearishFVGObjects.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
string objName = ((XCBearishFVGObject *)mBearishFVGObjects.At(i)).ObjName();
if (objName == name)
{
//
result = i;
break;
}
}
//
return result;
}
//
/**
* Clean All Drawn Objects ...
*/
void DestroyObjects()
{
//
// Trading Days ...
DestroyTradingTradingDayObjects();
//
// Market Sessions ...
DestroyMarketSessionObjects();
//
// Momentum Bars ...
DestroyMomentumBarObjects();
//
// Rejection Bars ...
DestroyRejectionBarObjects();
//
// Swing High and Low (s) ...
DestroySwingLowObjects();
DestroySwingHighObjects();
//
// Support and Resistanc (s) ...
DestroySupportZoneObjects();
DestroyResistanceZoneObjects();
//
// Supply and Demand Zones ..
DestroySupplyZoneObjects();
DestroyDemandZoneObjects();
//
// Order Blocks ...
DestroyBullishOrderBlockObjects();
DestroyBearishOrderBlockObjects();
//
// Fair Value Gaps ...
DestroyBullishFVGObjects();
DestroyBearishFVGObjects();
}
/**
* Clean Swing Highs Drawn Objects ...
*/
void DestroySwingHighObjects()
{
mSwingHighObjects.Clear();
}
/**
* Clean Swing Lows Drawn Objects ...
*/
void DestroySwingLowObjects()
{
mSwingLowObjects.Clear();
}
/**
* Clean Momentum Bars Drawn Objects ...
*/
void DestroyMomentumBarObjects()
{
mMomentumBarObjects.Clear();
}
/**
* Clean Rejection Bars Drawn Objects ...
*/
void DestroyRejectionBarObjects()
{
mRejectionBarObjects.Clear();
}
/**
* Clean Trading Day Drawn Objects ...
*/
void DestroyTradingTradingDayObjects()
{
mTradingDayObjects.Clear();
}
/**
* Destroy Market Sessions Drawn Objects ...
*/
void DestroyMarketSessionObjects()
{
mMarketSessionObjects.Clear();
}
/**
* Destroy Support Zone Drawn Objects ...
*/
void DestroySupportZoneObjects()
{
mSupportZoneObjects.Clear();
}
/**
* Destroy Resistance Zone Drawn Objects ...
*/
void DestroyResistanceZoneObjects()
{
mResistanceZoneObjects.Clear();
}
/**
* Destroy Supply Zone Drawn Objects ...
*/
void DestroySupplyZoneObjects()
{
mSupplyZoneObjects.Clear();
}
/**
* Destroy Demand Zone Drawn Objects ...
*/
void DestroyDemandZoneObjects()
{
mDemandZoneObjects.Clear();
}
/**
* Destroy Bullish Order Block Drawn Objects ...
*/
void DestroyBullishOrderBlockObjects()
{
mBullishOrderBlockObjects.Clear();
}
/**
* Destroy Bearish Order Block Drawn Objects ...
*/
void DestroyBearishOrderBlockObjects()
{
mBearishOrderBlockObjects.Clear();
}
/**
* Destroy Bullish FVG Drawn Objects ...
*/
void DestroyBullishFVGObjects()
{
mBullishFVGObjects.Clear();
}
/**
* Destroy Bearish FVG Drawn Objects ...
*/
void DestroyBearishFVGObjects()
{
mBearishFVGObjects.Clear();
}
//
// ...
/**
* Detect an Object Exists in Array or not ...
*
* @param name: String ...
* @param array: CArrayObj instance ...
*
* @return ( int ): index of Object ...
*/
int HasObject(
string name,
CArrayObj &array //
)
{
//
int result = -1;
//
if (!IsValid(name))
{
return result;
}
//
int count = array.Total();
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
// XCBaseObject *iObj = ((XCBaseObject *)array.At(i));
// string objName = iObj.ObjName();
// if (objName == name)
// {
// //
// result = i;
// break;
// }
}
//
return result;
}
//
// Event Handler Notifiers ...
//
// Trading Days ...
/**
* Notify New Trading Day Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
*/
void NotifyTradingDayEventListeners(
ENUM_XPOI_EVENTS event //
)
{
//
int count = ArraySize(mTradingDayEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXPOIEventHandler iListener = mTradingDayEventListeners[i];
iListener(event);
}
}
//
// Market Sessions ...
/**
* Notify New Market Session Event Handlers ...
*
* @param session: ENUM_XSESSION member ...
* @param event: ENUM_XPOI_EVENTS member ...
*/
void NotifyMarketSessionEventListeners(
ENUM_XSESSION session,
ENUM_XPOI_EVENTS event //
)
{
//
int count = ArraySize(mMarketSessionEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXSessionEventHandler iListener = mMarketSessionEventListeners[i];
iListener(session, event);
}
}
//
// Swings ...
//
// Swing Highs ...
/**
* Notify New Swing High Point Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
void NotifySwingHighEventListeners(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
//
if (!bar.IsValid())
{
return;
}
//
int count = ArraySize(mSwingHighEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXOHCLEventHandler iListener = mSwingHighEventListeners[i];
iListener(event, bar);
}
}
//
// Swing Lows ...
/**
* Notify New Swing Low Point Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
void NotifySwingLowEventListeners(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
//
if (!bar.IsValid())
{
return;
}
//
int count = ArraySize(mSwingLowEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXOHCLEventHandler iListener = mSwingLowEventListeners[i];
iListener(event, bar);
}
}
//
// Momentum Bars ...
/**
* Notify New Momentum Bar Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
void NotifyMomentumBarEventListeners(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
//
if (!bar.IsValid())
{
return;
}
//
int count = ArraySize(mMomentumBarEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXOHCLEventHandler iListener = mMomentumBarEventListeners[i];
iListener(event, bar);
}
}
//
// Rejection Bars ...
/**
* Notify New Rejection Bar Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
void NotifyRejectionBarEventListeners(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
//
if (!bar.IsValid())
{
return;
}
//
int count = ArraySize(mRejectionBarEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXOHCLEventHandler iListener = mRejectionBarEventListeners[i];
iListener(event, bar);
}
}
//
// Support and Resistance Zones ...
//
// Support Zones ...
/**
* Notify New Support Zone Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
void NotifySupportZoneEventListeners(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
//
if (!bar.IsValid())
{
return;
}
//
int count = ArraySize(mSupportZoneEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXOHCLEventHandler iListener = mSupportZoneEventListeners[i];
iListener(event, bar);
}
}
//
// Resistance Zones ...
/**
* Notify New Resistance Zone Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XOHCL instance ...
*/
void NotifyResistanceZoneEventListeners(
ENUM_XPOI_EVENTS event,
XOHCL &bar //
)
{
//
if (!bar.IsValid())
{
return;
}
//
int count = ArraySize(mResistanceZoneEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXOHCLEventHandler iListener = mResistanceZoneEventListeners[i];
iListener(event, bar);
}
}
//
// Supply and Demand Zones ...
//
// Supply Zones ...
/**
* Notify New Supply Zone Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XZone instance ...
*/
void NotifySupplyZoneEventListeners(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
//
if (!zone.IsValid())
{
return;
}
//
int count = ArraySize(mSupplyZoneEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXZoneEventHandler iListener = mSupplyZoneEventListeners[i];
iListener(event, zone);
}
}
//
// Demand Zones ...
/**
* Notify New Demand Zone Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XZone instance ...
*/
void NotifyDemandZoneEventListeners(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
//
if (!zone.IsValid())
{
return;
}
//
int count = ArraySize(mDemandZoneEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXZoneEventHandler iListener = mDemandZoneEventListeners[i];
iListener(event, zone);
}
}
//
// Order Blocks ...
//
// Bullish Order Blocks ...
/**
* Notify New Bullish Order Block Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XZone instance ...
*/
void NotifyBullishOrderBlockEventListeners(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
//
if (!zone.IsValid())
{
return;
}
//
int count = ArraySize(mBullishOrderBlockEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXZoneEventHandler iListener = mBullishOrderBlockEventListeners[i];
iListener(event, zone);
}
}
//
// Bearish Order Blocks ...
/**
* Notify New Bearish Order Block Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XZone instance ...
*/
void NotifyBearishOrderBlockEventListeners(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
//
if (!zone.IsValid())
{
return;
}
//
int count = ArraySize(mBearishOrderBlockEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXZoneEventHandler iListener = mBearishOrderBlockEventListeners[i];
iListener(event, zone);
}
}
//
// Fair Value Gaps ...
/**
* Notify New Bullish FVG Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XZone instance ...
*/
void NotifyBullishFVGEventListeners(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
//
if (!zone.IsValid())
{
return;
}
//
int count = ArraySize(mBullishFVGEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXZoneEventHandler iListener = mBullishFVGEventListeners[i];
iListener(event, zone);
}
}
/**
* Notify New Bearish FVG Event Handlers ...
*
* @param event: ENUM_XPOI_EVENTS member ...
* @param bar: XZone instance ...
*/
void NotifyBearishFVGEventListeners(
ENUM_XPOI_EVENTS event,
XZone &zone //
)
{
//
if (!zone.IsValid())
{
return;
}
//
int count = ArraySize(mBearishFVGEventListeners);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
TXZoneEventHandler iListener = mBearishFVGEventListeners[i];
iListener(event, zone);
}
}
/**
* Destroy all Registered Event Listeners ...
*/
void DestroyEventListeners()
{
//
// Trading Days ...
Clean(mTradingDayEventListeners);
//
// Market Sessions ...
Clean(mMarketSessionEventListeners);
//
// Momentum Bars ...
Clean(mMomentumBarEventListeners);
//
// Rejection Bars ...
Clean(mRejectionBarEventListeners);
//
// Swing High and Low (s) ...
Clean(mSwingLowEventListeners);
Clean(mSwingHighEventListeners);
//
// Support and Resistance Zones ...
Clean(mSupportZoneEventListeners);
Clean(mResistanceZoneEventListeners);
//
// Supply and Demand Zones ...
Clean(mSupplyZoneEventListeners);
Clean(mDemandZoneEventListeners);
//
// Order Blocks ...
Clean(mBullishOrderBlockEventListeners);
Clean(mBearishOrderBlockEventListeners);
//
// Fair Value Gaps ...
Clean(mBullishFVGEventListeners);
Clean(mBearishFVGEventListeners);
}
//
// ...
//
//
// Session ...
/**
* Find Specific Session Index ...
*
* @param session: ENUM_XSESSION member ...
*
* @return ( int )
*/
int FindSession(ENUM_XSESSION session)
{
//
int result = -1;
//
int count = ArraySize(mSessions);
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
XSession iSession = mSessions[i];
//
if (iSession.session == session)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Destroy Sessions ...
*/
void DestroySessions()
{
Clean(mSessions);
}
/**
* Find Specified Trade Day based on Start Time ...
*
* @param start: DateTime ...
*
* @return ( int )
*/
int HasTradeDay(datetime start)
{
//
int result = -1;
//
if (!IsValid(start))
{
return result;
}
//
int count = ArraySize(mTradingDays);
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
XTradeDay iDay = mTradingDays[i];
//
if (iDay.from == start)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Find Specified Trade Day based on End Time ...
*
* @param start: DateTime ...
*
* @return ( int )
*/
int HasTradeDayBayEndTime(datetime end)
{
//
int result = -1;
//
if (!IsValid(end))
{
return result;
}
//
int count = ArraySize(mTradingDays);
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
XTradeDay iDay = mTradingDays[i];
//
if (iDay.to == end)
{
//
result = i;
break;
}
}
//
return result;
}
//
/**
* Find Market Session by Providing Start Time ...
*
* @param session: ENUM_XSESSION member ...
* @param start: DateTime ...
*
* @return ( int )
*/
int HasMarketSessionByStartTime(
ENUM_XSESSION session,
datetime start //
)
{
//
int result = -1;
//
if (!IsValid(start))
{
return result;
}
//
int count = ArraySize(mMarketSessions);
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
XMarketSession iMarketSession = mMarketSessions[i];
//
if (iMarketSession.session == session &&
iMarketSession.from == start)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Find Market Session by Providing Start Time ...
*
* @param session: ENUM_XSESSION member ...
* @param end: DateTime ...
*
* @return ( int )
*/
int HasMarketSessionByEndTime(
ENUM_XSESSION session,
datetime end //
)
{
//
int result = -1;
//
if (!IsValid(end))
{
return result;
}
//
int count = ArraySize(mMarketSessions);
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
XMarketSession iMarketSession = mMarketSessions[i];
//
if (iMarketSession.session == session &&
iMarketSession.to == end)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Count Specified Market Sessions ...
*
* @param session: ENUM_XSESSION member ...
*
* @return ( int )
*/
int CountMarketSessions(ENUM_XSESSION session)
{
//
int result = 0;
//
int count = ArraySize(mMarketSessions);
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
XMarketSession iMarketSession = mMarketSessions[i];
//
if (iMarketSession.session == session)
{
result++;
}
}
//
return result;
}
//
int FindBarIndex(
ENUM_XPOIS type,
XOHCL &bar,
XOHCL &list[] //
)
{
//
int result = -1;
//
bool isValidType =
type == X_POI_SWING_LOW ||
type == X_POI_SWING_HIGH ||
type == X_POI_SUPPORT_ZONE ||
type == X_POI_MOMENTUM_BAR ||
type == X_POI_REJECTION_BAR ||
type == X_POI_RESISTANCE_ZONE;
if (!isValidType)
{
return result;
}
//
int count = ArraySize(list);
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
XOHCL iBar = list[i];
//
bool isSameLow =
bar.low == iBar.low;
//
bool isSameHigh =
bar.high == iBar.high;
//
bool isSameUp =
bar.GetUp() == iBar.GetUp();
//
bool isSameDown =
bar.GetDown() == iBar.GetDown();
//
// Check Conditions Based On Type ...
bool canBreak = false;
if (type == X_POI_SWING_LOW ||
type == X_POI_SWING_HIGH ||
type == X_POI_MOMENTUM_BAR ||
type == X_POI_REJECTION_BAR)
{
//
canBreak =
isSameUp &&
isSameLow &&
isSameHigh &&
isSameDown;
}
else if (type == X_POI_SUPPORT_ZONE)
{
//
canBreak =
isSameLow &&
isSameDown;
}
else if (type == X_POI_RESISTANCE_ZONE)
{
//
canBreak =
isSameUp &&
isSameHigh;
}
//
if (canBreak)
{
//
result = i;
break;
}
}
//
return result;
}
//
bool AddBar(
ENUM_XPOIS type,
XOHCL &bar,
XOHCL &list[] //
)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
result =
type == X_POI_SWING_LOW ||
type == X_POI_SWING_HIGH ||
type == X_POI_SUPPORT_ZONE ||
type == X_POI_MOMENTUM_BAR ||
type == X_POI_REJECTION_BAR ||
type == X_POI_RESISTANCE_ZONE;
if (!result)
{
return result;
}
//
int idx = FindBarIndex(
type,
bar,
list //
);
result = !IsValidIndex(idx);
if (!result)
{
return result;
}
//
AddRef(
bar,
list //
);
//
return result;
}
//
/**
* Find Specified Zone Index ...
*
* @param zone: XZone instance
* @param list: XZone Collection ...
*
* @return ( int )
*/
int FindZoneIndex(
XZone &zone,
XZone &list[] //
)
{
//
int result = -1;
//
int count = ArraySize(list);
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
XZone iZone = list[i];
//
if (iZone.upper == zone.upper &&
iZone.lower == zone.lower)
{
//
result = i;
break;
}
}
//
return result;
}
/**
* Add Specific Zone to List ...
*
* @param ob: XOHCL ...
* @param endTime: Datetime ...
* @param type: ENUM_X_POI member ...
* @param list: XZone instance Collection ...
*
* @return ( bool )
*/
bool AddZone(
XZone &zone,
XOHCL &ob,
datetime endTime,
ENUM_XPOIS type,
XZone &list[] //
)
{
//
bool result = false;
//
result = type == X_POI_SUPPORT_ZONE ||
type == X_POI_RESISTANCE_ZONE ||
type == X_POI_BULLISH_ORDERBLOCK ||
type == X_POI_BEARISH_ORDERBLOCK;
if (!result)
{
return result;
}
//
NormalizeTime(endTime);
//
datetime startTime = (datetime)((int)ob.time - (PeriodSeconds(Period()) * 2));
//
result = zone.Init(
ob.high,
ob.low,
ToString(type),
startTime,
endTime //
);
if (!result)
{
return result;
}
//
int idx = FindZoneIndex(
zone,
list //
);
result = !IsValidIndex(idx);
if (!result)
{
return result;
}
//
AddRef(
zone,
list //
);
//
return result;
}
/**
* Initiate and Add Specific Zone to List ...
*
* @param zone: XZone instance ...
* @param upper: Double ...
* @param lower: Double ...
* @param start: DateTime ...
* @param end: DateTime ...
* @param type: ENUM_XPOIS member ...
* @param list: XZone instance Collection ...
*
* @return ( bool )
*/
bool AddZone(
XZone &zone,
double upper,
double lower,
datetime start,
datetime end,
ENUM_XPOIS type,
XZone &list[] //
)
{
//
bool result = false;
//
result = zone.Init(
upper,
lower,
ToString(type),
start,
end //
);
if (!result)
{
return result;
}
//
int idx = FindZoneIndex(
zone,
list //
);
result = !IsValidIndex(idx);
if (!result)
{
return result;
}
//
AddRef(
zone,
list //
);
//
return result;
}
/**
* Cleanup Unused Objects ...
*/
void CleanupUnusedPOIs()
{
//
int maxAllowed = MaxNumberOfPOIs();
if (!IsValidSize(maxAllowed))
{
return;
}
//
int tradingDaysCount = ArraySize(mTradingDays);
int marketSessionsCount = ArraySize(mMarketSessions);
int swingHighsCount = ArraySize(mSwingHighs);
int swingLowsCount = ArraySize(mSwingLows);
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;
//
// 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 //
);
}
//
// Swing High and Low (s) ...
//
// Swing Highs ...
if (swingHighsCount >= maxAllowed)
{
//
ArrayRemove(
mSwingHighs,
from,
count //
);
//
mSwingHighObjects.DeleteRange(
from,
to //
);
}
//
// Swing Lows ...
if (swingLowsCount >= maxAllowed)
{
//
ArrayRemove(
mSwingLows,
from,
count //
);
//
mSwingLowObjects.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 //
);
}
//
}
//
private:
//
//
// Props ...
//
bool mLock; // Lock State ...
string mSymbol; // Market Symbol ...
ENUM_TIMEFRAMES mPeriod; // Market Period ...
long mChartID; // Chart ID ...
int mWindow; // Window ID ...
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 ...
//
XBarTracker mBarTracker; // Market Bar Tracker ...
//
// POI Props ...
//
// Trading Days ...
//
bool mAllowTradingDays; // Detect Trading Days ...
bool mAllowDrawTradingDays; // Draw Trading Days ...
color mTradingDaysStartColor; // Trading Days Start Color ...
ENUM_LINE_STYLE mTradingDaysStartStyle; // Trading Days Start Style ...
color mTradingDaysEndColor; // Trading Days End Color ...
ENUM_LINE_STYLE mTradingDaysEndStyle; // Trading Days End Style ...
XTradeDay mTradingDays[]; // Trading Days ...
CArrayObj mTradingDayObjects; // Trading Day Chart Objects ...
TXPOIEventHandler mTradingDayEventListeners[]; // Trading Day Event Listeners ...
/**
* Create an Object to Represent Trading Day on Chart ...
*
* @param day: XTradeDay instance ...
* @param name: String ...
*/
void CreateTradingDayObject(
XTradeDay &day,
string name //
)
{
//
if (!day.IsValid() ||
!IsValid(name))
{
return;
}
//
XCTardeDayObject *iObj;
iObj = new XCTardeDayObject();
bool isCreated = iObj.CreateByDay(
ChartID(),
name,
Window(),
day //
);
if (!isCreated)
{
return;
}
//
iObj.FromColor(TradingDaysStartColor());
iObj.FromStyle(TradingDaysStartStyle());
//
iObj.ToColor(TradingDaysEndColor());
iObj.ToStyle(TradingDaysEndStyle());
//
mTradingDayObjects.Add(iObj);
}
//
// Market Sessions ...
//
bool mAllowMarketSessions; // Detect Market Sessions ...
bool mAllowDrawMarketSessions; // Draw Market Sessions ...
int mSessionOpenHours; // How many Hours a Session is Open
XSession mSessions[]; // Forex Sessions
XMarketSession mMarketSessions[]; // Founded Market Sessions ...
CArrayObj mMarketSessionObjects; // Founded Market Session Chart Ojects ...
TXSessionEventHandler mMarketSessionEventListeners[]; // Market Sessions Event Listeners ...
/**
* Create an Object to Represent Market Session on Chart ...
*
* @param session: XMarketSession instance ...
* @param name: String ...
*/
void CreateMarketSessionObject(
XMarketSession &session,
string name //
)
{
//
if (!session.IsValid() ||
!IsValid(name))
{
return;
}
//
// Find XSession Instance ...
int sessionIDX = FindSession(session.session);
if (!IsValidIndex(sessionIDX) ||
!mSessions[sessionIDX].allowDraw)
{
return;
}
//
XCMarketSessionObject *iObj;
iObj = new XCMarketSessionObject();
bool isCreated = iObj.CreateByMarketSession(
ChartID(),
name,
Window(),
session //
);
if (!isCreated)
{
return;
}
//
iObj.FromColor(mSessions[sessionIDX].startColor);
iObj.FromStyle(mSessions[sessionIDX].startStyle);
//
iObj.ToColor(mSessions[sessionIDX].endColor);
iObj.ToStyle(mSessions[sessionIDX].endStyle);
//
mMarketSessionObjects.Add(iObj);
}
//
// Swing High and Low(s) ...
//
// Swing Highs ...
//
bool mAllowSwingHighs; // Detect Swing Highs ...
bool mAllowDrawSwingHighs; // Draw Swing Highs ...
char mSwingHighArrowCode; // Swing High Arrow Code ...
color mSwingHighColor; // Swing High Color ...
int mSwingHighWidth; // Swing High Width ...
double mSwingHighThreshold; // Threshold Required for Swing High Detection ...
XOHCL mSwingHighs[]; // Swing Highs ...
CArrayObj mSwingHighObjects; // Swing High Chart Objects ...
TXOHCLEventHandler mSwingHighEventListeners[]; // Swing High Event Listeners ...
/**
* Create an Object to Represent Swing High on Chart ...
*
* @param bar: XOHCL instance ...
* @param name: String ...
*/
void CreateSwingHighObject(
XOHCL &bar,
string name //
)
{
//
if (!bar.IsValid() ||
!IsValid(name))
{
return;
}
//
CChartObjectArrow *iObj;
iObj = new CChartObjectArrow();
bool isCreated = iObj.Create(
ChartID(),
name,
Window(),
bar.time,
bar.high,
SwingHighArrowCode() //
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.Width(SwingHighWidth());
iObj.Color(SwingHighColor());
iObj.Anchor(ANCHOR_BOTTOM);
//
mSwingHighObjects.Add(iObj);
}
//
// Swing Lows ...
//
bool mAllowSwingLows; // Detect Swing Lows ...
bool mAllowDrawSwingLows; // Draw Swing Lows ...
char mSwingLowArrowCode; // Swing Low Arrow Code ...
color mSwingLowColor; // Swing Low Color ...
int mSwingLowWidth; // Swing Low Width ...
double mSwingLowThreshold; // Threshold Required for Swing Low Detection ...
XOHCL mSwingLows[]; // Swing Lows ...
CArrayObj mSwingLowObjects; // Swing Low Chart Objects ...
TXOHCLEventHandler mSwingLowEventListeners[]; // Swing Low Event Listeners ...
/**
* Create an Object to Represent Swing Low on Chart ...
*
* @param bar: XOHCL instance ...
* @param name: String ...
*/
void CreateSwingLowObject(
XOHCL &bar,
string name //
)
{
//
if (!bar.IsValid() ||
!IsValid(name))
{
return;
}
//
CChartObjectArrow *iObj;
iObj = new CChartObjectArrow();
bool isCreated = iObj.Create(
ChartID(),
name,
Window(),
bar.time,
bar.low,
SwingLowArrowCode() //
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.Width(SwingLowWidth());
iObj.Color(SwingLowColor());
iObj.Anchor(ANCHOR_TOP);
//
mSwingLowObjects.Add(iObj);
}
//
// Momentum Bars ...
//
bool mAllowMomentumBars; // Detect Momentum Bars ...
bool mAllowDrawMomentumBars; // Draw Momentum Bars ...
int mMomentumBarPercent; // Momentum Bar Percent ...
double mMomentumBarSharpRatio; // Momentum Bar Sharp Ratio ...
int mMomentumBarLoopBack; // Momentum Bar Loopback ...
int mMomentumBarWidth; // Momentum Bar Width ...
char mMomentumBarBullishArrowCode; // Bullish Momentum Bar Arrow Code ...
char mMomentumBarBearishArrowCode; // Bullish Momentum Bar Color ...
color mMomentumBarBullishColor; // Bearish Momentum Bar Arrow Code ...
color mMomentumBarBearishColor; // Bearish Momentum Bar Color ...
XOHCL mMomentumBars[]; // Momentum Bars ...
CArrayObj mMomentumBarObjects; // Momentm Bar Chart Objects ...
TXOHCLEventHandler mMomentumBarEventListeners[]; // Momentum Bars Event Listeners ...
/**
* Create an Object to Represent Momentum Bar on Chart ...
*
* @param bar: XOHCL instance ...
* @param name: String ...
*/
void CreateMomentumBarObject(
XOHCL &bar,
string name //
)
{
//
if (!bar.IsValid() ||
!IsValid(name))
{
return;
}
//
bool isBullish = bar.IsBullish();
double price =
isBullish
? bar.low
: bar.high;
char arrowCode =
isBullish
? MomentumBarBullishArrowCode()
: MomentumBarBearishArrowCode();
color clr =
isBullish
? MomentumBarBullishColor()
: MomentumBarBearishColor();
ENUM_ARROW_ANCHOR anchor =
isBullish
? ANCHOR_TOP
: ANCHOR_BOTTOM;
//
CChartObjectArrow *iObj;
iObj = new CChartObjectArrow();
bool isCreated = iObj.Create(
ChartID(),
name,
Window(),
bar.time,
price,
arrowCode //
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.Width(MomentumBarWidth());
iObj.Color(clr);
iObj.Anchor(anchor);
//
mMomentumBarObjects.Add(iObj);
}
//
// Rejection Bars ....
//
bool mAllowRejectionBars; // Detect Rejection Bars ...
bool mAllowDrawRejectionBars; // Draw Rejection Bars ...
int mRejectionBarPercent; // Rejection Bar Percent ...
double mRejectionBarSharpRatio; // Rejection Bar Sharp Ratio ...
int mRejectionBarLoopBack; // Rejection Bar Loopback ...
int mRejectionBarWidth; // Rejection Bar Width ...
char mRejectionBarBullishArrowCode; // Bullish Rejection Bar Arrow Code ...
char mRejectionBarBearishArrowCode; // Bullish Rejection Bar Color ...
color mRejectionBarBullishColor; // Bearish Rejection Bar Arrow Code ...
color mRejectionBarBearishColor; // Bearish Rejection Bar Color ...
XOHCL mRejectionBars[]; // Rejection Bars ...
CArrayObj mRejectionBarObjects; // Rejection Bar Chart Objects ...
TXOHCLEventHandler mRejectionBarEventListeners[]; // Rejection Bars Event Listeners ...
/**
* Create an Object to Represent Rejection Bar on Chart ...
*
* @param bar: XOHCL instance ...
* @param name: String ...
*/
void CreateRejectionBarObject(
XOHCL &bar,
string name //
)
{
//
if (!bar.IsValid() ||
!IsValid(name))
{
return;
}
//
bool isBullish = bar.GetLowShadow() > bar.GetHighShadow();
double price =
isBullish
? bar.low
: bar.high;
char arrowCode =
isBullish
? RejectionBarBullishArrowCode()
: RejectionBarBearishArrowCode();
color clr =
isBullish
? RejectionBarBullishColor()
: RejectionBarBearishColor();
ENUM_ARROW_ANCHOR anchor =
isBullish
? ANCHOR_TOP
: ANCHOR_BOTTOM;
//
CChartObjectArrow *iObj;
iObj = new CChartObjectArrow();
bool isCreated = iObj.Create(
ChartID(),
name,
Window(),
bar.time,
price,
arrowCode //
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.Width(RejectionBarWidth());
iObj.Color(clr);
iObj.Anchor(anchor);
//
mRejectionBarObjects.Add(iObj);
}
//
// Support and Resistance Zones ...
//
// Support Zones ...
//
bool mAllowSupportZones; // Detect Support Zone ...
bool mAllowDrawSupportZones; // Draw Support Zone ...
int mSupportZoneLoopBack; // Support Zone Loopback ...
int mSupportZoneWidth; // Support Zone Width ...
color mSupportZoneColor; // Support Zone Color ...
ENUM_LINE_STYLE mSupportZoneStyle; // Support Zone Style ...
ENUM_X_PRICE mSupportZonePriceType; // Support Zone Price Type ...
XOHCL mSupportZones[]; // Support Zones ...
CArrayObj mSupportZoneObjects; // Support Zone Chart Objects ...
TXOHCLEventHandler mSupportZoneEventListeners[]; // Support Zone Event Listeners ...
/**
* Create an Object to Represent Support Zones on Chart ...
* @param bar: XOHCL instance ...
* @param name: String ...
*/
void CreateSupportZoneObject(
XOHCL &bar,
string name //
)
{
//
if (!bar.IsValid() ||
!IsValid(name))
{
return;
}
//
datetime cBarTime = TimeCurrent();
if (bar.Index() > 0)
{
//
cBarTime = iTime(
Symbol(),
Period(),
bar.Index() - 10 //
);
}
//
XCSupportZoneObject *iObj;
iObj = new XCSupportZoneObject();
bool isCreated = iObj.CreateBySupport(
ChartID(),
name,
Window(),
bar,
cBarTime,
true // Force Draw Rect ...
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.ZoneColor(SupportZoneColor());
iObj.ZoneStyle(SupportZoneStyle());
iObj.ZoneWidth(SupportZoneWidth());
//
mSupportZoneObjects.Add(iObj);
}
//
// Resistance Zones ...
//
bool mAllowResistanceZones; // Detect Resistance Zone ...
bool mAllowDrawResistanceZones; // Draw Resistance Zone ...
int mResistanceZoneLoopBack; // Resistance Zone Loopback ...
int mResistanceZoneWidth; // Resistance Zone Width ...
color mResistanceZoneColor; // Resistance Zone Color ...
ENUM_LINE_STYLE mResistanceZoneStyle; // Resistance Zone Style ...
ENUM_X_PRICE mResistanceZonePriceType; // Resistance Zone Price Type ...
XOHCL mResistanceZones[]; // Resistance Zones ...
CArrayObj mResistanceZoneObjects; // Resistance Zone Chart Objects ...
TXOHCLEventHandler mResistanceZoneEventListeners[]; // Resistance Zone Event Listeners ...
/**
* Create an Object to Represent Resistance Zones on Chart ...
* @param bar: XOHCL instance ...
* @param name: String ...
*/
void CreateResistanceZoneObject(
XOHCL &bar,
string name //
)
{
//
if (!bar.IsValid() ||
!IsValid(name))
{
return;
}
//
datetime cBarTime = TimeCurrent();
if (bar.Index() > 0)
{
//
cBarTime = iTime(
Symbol(),
Period(),
bar.Index() - 10 //
);
}
//
XCResistanceZoneObject *iObj;
iObj = new XCResistanceZoneObject();
bool isCreated = iObj.CreateByResistance(
ChartID(),
name,
Window(),
bar,
cBarTime,
true // Force Draw Rect ...
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.ZoneColor(ResistanceZoneColor());
iObj.ZoneStyle(ResistanceZoneStyle());
iObj.ZoneWidth(ResistanceZoneWidth());
//
mResistanceZoneObjects.Add(iObj);
}
//
// Supply and Demand Zones ...
//
// Supply Zones ...
//
bool mAllowSupplyZones; // Detect Supply Zone ...
bool mAllowDrawSupplyZones; // Draw Supply Zone ...
int mSupplyZoneWidth; // Supply Zone Width ...
color mSupplyZoneColor; // Supply Zone Color ...
ENUM_LINE_STYLE mSupplyZoneStyle; // Supply Zone Style ...
ENUM_TIMEFRAMES mSupplyZonePeriod; // Supply Zone Detection Period ...
XZone mSupplyZones[]; // Supply Zones ...
CArrayObj mSupplyZoneObjects; // Supply Zone Chart Objects ...
TXZoneEventHandler mSupplyZoneEventListeners[]; // Supply Zone Event Listeners ...
/**
* Create an Object to Represent Supply Zones on Chart ...
* @param bar: XZone instance ...
* @param name: String ...
*/
void CreateSupplyZoneObject(
XZone &zone,
string name //
)
{
//
if (!zone.IsValid() ||
!IsValid(name))
{
return;
}
//
XCSupplyZoneObject *iObj;
iObj = new XCSupplyZoneObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
Window(),
zone,
NULL, // Object Prefix ...
true // Force Draw Rect ...
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.ZoneColor(SupplyZoneColor());
iObj.ZoneStyle(SupplyZoneStyle());
iObj.ZoneWidth(SupplyZoneWidth());
//
mSupplyZoneObjects.Add(iObj);
}
//
// Demand Zones ...
//
bool mAllowDemandZones; // Detect Demand Zone ...
bool mAllowDrawDemandZones; // Draw Demand Zone ...
int mDemandZoneWidth; // Demand Zone Width ...
color mDemandZoneColor; // Demand Zone Color ...
ENUM_LINE_STYLE mDemandZoneStyle; // Demand Zone Style ...
ENUM_TIMEFRAMES mDemandZonePeriod; // Demand Zone Detection Period ...
XZone mDemandZones[]; // Demand Zones ...
CArrayObj mDemandZoneObjects; // Demand Zone Chart Objects ...
TXZoneEventHandler mDemandZoneEventListeners[]; // Demand Zone Event Listeners ...
/**
* Create an Object to Represent Demand Zones on Chart ...
* @param bar: XZone instance ...
* @param name: String ...
*/
void CreateDemandZoneObject(
XZone &zone,
string name //
)
{
//
if (!zone.IsValid() ||
!IsValid(name))
{
return;
}
//
XCDemandZoneObject *iObj;
iObj = new XCDemandZoneObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
Window(),
zone,
NULL, // Object Prefix ...
true // Force Draw Rect ...
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.ZoneColor(DemandZoneColor());
iObj.ZoneStyle(DemandZoneStyle());
iObj.ZoneWidth(DemandZoneWidth());
//
mDemandZoneObjects.Add(iObj);
}
//
// Order Blocks ...
//
// Bullish Order Blocks ...
//
bool mAllowBullishOrderBlocks; // Detect Bullish Order Blocks ...
bool mAllowDrawBullishOrderBlocks; // Draw Bullish Order Blocks ...
int mBullishOrderBlockWidth; // Bullish Order Block Width ...
color mBullishOrderBlockColor; // Bullish Order Block Color ...
ENUM_LINE_STYLE mBullishOrderBlockStyle; // Bullish Order Block Style ...
int mRequiredBarsForBullishOrderBlock; // Minimum Required Same Bars for Bullish Order Blocks ...
XZone mBullishOrderBlocks[]; // Bullish Order Blocks ...
CArrayObj mBullishOrderBlockObjects; // Bullish Order Block Objects ...
TXZoneEventHandler mBullishOrderBlockEventListeners[]; // Bullish Order Block Event Listeners ...
/**
* Create an Object to Represent Bullish Order Block on Chart ...
* @param bar: XZone instance ...
* @param name: String ...
*/
void CreateBullishOrderBlockObject(
XZone &zone,
string name //
)
{
//
if (!zone.IsValid() ||
!IsValid(name))
{
return;
}
//
XCBullishOrderBlockObject *iObj;
iObj = new XCBullishOrderBlockObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
Window(),
zone,
NULL, // Object Prefix ...
true // Force Draw Rect ...
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.ZoneColor(BullishOrderBlockColor());
iObj.ZoneStyle(BullishOrderBlockStyle());
iObj.ZoneWidth(BullishOrderBlockWidth());
//
mBullishOrderBlockObjects.Add(iObj);
}
//
// Bearish Order Blocks ...
//
bool mAllowBearishOrderBlocks; // Detect Bearish Order Blocks ...
bool mAllowDrawBearishOrderBlocks; // Draw Bearish Order Blocks ...
int mBearishOrderBlockWidth; // Bearish Order Block Width ...
color mBearishOrderBlockColor; // Bearish Order Block Color ...
ENUM_LINE_STYLE mBearishOrderBlockStyle; // Bearish Order Block Style ...
int mRequiredBarsForBearishOrderBlock; // Minimum Required Same Bars for Bearish Order Blocks ...
XZone mBearishOrderBlocks[]; // Bearish Order Blocks ...
CArrayObj mBearishOrderBlockObjects; // Bearish Order Block Objects ...
TXZoneEventHandler mBearishOrderBlockEventListeners[]; // Bearish Order Block Event Listeners ...
/**
* Create an Object to Represent Bearish Order Block on Chart ...
* @param bar: XZone instance ...
* @param name: String ...
*/
void CreateBearishOrderBlockObject(
XZone &zone,
string name //
)
{
//
if (!zone.IsValid() ||
!IsValid(name))
{
return;
}
//
XCBearishOrderBlockObject *iObj;
iObj = new XCBearishOrderBlockObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
Window(),
zone,
NULL, // Object Prefix ...
true // Force Draw Rect ...
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.ZoneColor(BearishOrderBlockColor());
iObj.ZoneStyle(BearishOrderBlockStyle());
iObj.ZoneWidth(BearishOrderBlockWidth());
//
mBearishOrderBlockObjects.Add(iObj);
}
//
// Fair Value Gaps ...
//
// Bullish Fair Value Gaps ...
//
bool mAllowBullishFVGs; // Detect Bullish Fair Value Gaps ...
bool mAllowDrawBullishFVGs; // Draw Bullish Fair Value Gaps ...
bool mBullishFVGForceMiddleBarCheck; // Bullish FVG Force Middle Bar Check ...
bool mBullishFVGForceCheckLastBarDirection; // Bullish FVG Check Last Bar Direction ...
int mBullishFVGWidth; // Bullish FVG Width ...
color mBullishFVGColor; // Bullish FVG Color ...
ENUM_LINE_STYLE mBullishFVGStyle; // Bullish FVG Style ...
XZone mBullishFVGs[]; // Bullish FVGs ...
CArrayObj mBullishFVGObjects; // Bullish FVG Objects ...
TXZoneEventHandler mBullishFVGEventListeners[]; // Bullish FVG Event Listeners ...
/**
* Create an Object to Represent Bullish FVG on Chart ...
* @param bar: XZone instance ...
* @param name: String ...
*/
void CreateBullishFVGObject(
XZone &zone,
string name //
)
{
//
if (!zone.IsValid() ||
!IsValid(name))
{
return;
}
//
XCBullishFVGObject *iObj;
iObj = new XCBullishFVGObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
Window(),
zone,
NULL, // Object Prefix ...
true // Force Draw Rect ...
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.ZoneColor(BullishFVGColor());
iObj.ZoneStyle(BullishFVGStyle());
iObj.ZoneWidth(BullishFVGWidth());
//
mBullishFVGObjects.Add(iObj);
}
//
// Bearish Fair Value Gaps ...
//
bool mAllowBearishFVGs; // Detect Bearish Fair Value Gaps ...
bool mAllowDrawBearishFVGs; // Draw Bearish Fair Value Gaps ...
bool mBearishFVGForceMiddleBarCheck; // Bearish FVG Force Middle Bar Check ...
bool mBearishFVGForceCheckLastBarDirection; // Bearish FVG Check Last Bar Direction ...
int mBearishFVGWidth; // Bearish FVG Width ...
color mBearishFVGColor; // Bearish FVG Color ...
ENUM_LINE_STYLE mBearishFVGStyle; // Bearish FVG Style ...
XZone mBearishFVGs[]; // Bearish FVGs ...
CArrayObj mBearishFVGObjects; // Bearish FVG Objects ...
TXZoneEventHandler mBearishFVGEventListeners[]; // Bearish FVG Event Listeners ...
/**
* Create an Object to Represent Bearish FVG on Chart ...
* @param bar: XZone instance ...
* @param name: String ...
*/
void CreateBearishFVGObject(
XZone &zone,
string name //
)
{
//
if (!zone.IsValid() ||
!IsValid(name))
{
return;
}
//
XCBearishFVGObject *iObj;
iObj = new XCBearishFVGObject();
bool isCreated = iObj.CreateByZone(
ChartID(),
name,
Window(),
zone,
NULL, // Object Prefix ...
true // Force Draw Rect ...
);
if (!isCreated)
{
return;
}
//
// Configure Object ...
iObj.ZoneColor(BearishFVGColor());
iObj.ZoneStyle(BearishFVGStyle());
iObj.ZoneWidth(BearishFVGWidth());
//
mBearishFVGObjects.Add(iObj);
}
//
};
//