Complete Rejection Bars ...

This commit is contained in:
2024-11-12 12:37:00 +03:30
parent 40f97468fd
commit 43ee49b32f
5 changed files with 1870 additions and 78 deletions
+164
View File
@@ -566,6 +566,170 @@ class XCBarAnalyser : public XCBase
return result; return result;
} }
/**
* Check a Bar is Momentum Bar or not ...
*
* @param bar: XOHCL instance ...
* @param dir: ENUM_X_DIRECTION member ...
* @param extend: Integer ...
* @param bodyPercent: Double ...
*
* @return ( bool )
*/
bool IsMomentumBar(
XOHCL &bar,
ENUM_X_DIRECTION &dir,
int extend = 1,
double bodyPercent = 70 //
)
{
//
bool result = false;
//
if (extend < 0)
{
extend = 0;
}
//
if (bodyPercent < 50)
{
bodyPercent = 50;
}
//
dir = X_DIRECTION_NONE;
//
result = bar.IsValid() &&
bar.Index() > 0;
if (!result)
{
return result;
}
//
if (extend > 0)
{
//
result = IsExtended(
bar,
extend //
);
//
if (!result)
{
return result;
}
}
//
double body = bar.GetBody();
double rp = GetBarRangePercent(bar);
//
result = body >= rp * bodyPercent;
//
if (result)
{
//
dir =
bar.IsBullish()
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
}
//
return result;
}
/**
* Check a Bar is Rejection Bar or not ...
*
* @param bar: XOHCL instance ...
* @param dir: ENUM_X_DIRECTION member ...
* @param extend: Integer ...
* @param bodyPercent: Double ...
*
* @return ( bool )
*/
bool IsRejectionBar(
XOHCL &bar,
ENUM_X_DIRECTION &dir,
int extend = 1,
double shadowPercent = 60 //
)
{
//
bool result = false;
//
if (extend < 0)
{
extend = 0;
}
//
if (shadowPercent < 50)
{
shadowPercent = 50;
}
//
dir = X_DIRECTION_NONE;
//
result = bar.IsValid() &&
bar.Index() > 0;
if (!result)
{
return result;
}
//
if (extend > 0)
{
//
result = IsExtended(
bar,
extend //
);
//
if (!result)
{
return result;
}
}
//
double body = bar.GetBody();
double range = bar.GetRange();
double shadows = bar.GetShadows();
double lowShadow = bar.GetLowShadow();
double highShadow = bar.GetHighShadow();
double rp = GetBarRangePercent(bar);
//
result = shadows >= rp * shadowPercent;
//
if (result)
{
//
dir =
lowShadow > highShadow
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
}
//
return result;
}
// //
protected: protected:
// //
+519 -24
View File
@@ -121,9 +121,7 @@ class XCBaseObject : public CChartObject
// //
}; };
// class XCBarArrowObject : public XCBaseObject
// Swing ...
class XCSwingObject : public XCBaseObject
{ {
// //
public: public:
@@ -133,16 +131,19 @@ class XCSwingObject : public XCBaseObject
* Creator ... * Creator ...
* *
* @param chart_id: Long, Specified Chart ID ... * @param chart_id: Long, Specified Chart ID ...
* @param name: String, Specified Object ID ...
* @param window: Integer, Specified Chart Window ID ... * @param window: Integer, Specified Chart Window ID ...
* @param swing: XCSwing instance ... * @param swing: XCSwing instance ...
* *
* @return ( bool ) * @return ( bool )
*/ */
bool CreateBySwing( bool CreateByBar(
long chart_id, long chart_id,
string name,
int window, int window,
int arrow, int arrow,
XCSwing &swing // XOHCL &bar,
ENUM_X_PRICE priceType //
) )
{ {
// //
@@ -151,7 +152,7 @@ class XCSwingObject : public XCBaseObject
// //
result = result =
// //
swing.IsValid() bar.IsValid()
// //
; ;
if (!result) if (!result)
@@ -159,22 +160,9 @@ class XCSwingObject : public XCBaseObject
return result; return result;
} }
//
string name = swing.GetTag();
//
XOHCL bar;
result = swing.FillBar(bar);
if (!result)
{
return result;
}
// //
datetime time = bar.time; datetime time = bar.time;
double price = swing.IsSwingHigh() double price = bar.GetPrice(priceType);
? bar.high
: bar.low;
// //
result = mArrow.Create( result = mArrow.Create(
@@ -240,6 +228,87 @@ class XCSwingObject : public XCBaseObject
// //
}; };
//
// Swing ...
class XCSwingObject : public XCBarArrowObject
{
//
public:
//
/**
* Creator ...
*
* @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ...
* @param swing: XCSwing instance ...
* @param prefix: String ...
*
* @return ( bool )
*/
bool CreateBySwing(
long chart_id,
int window,
int arrow,
XCSwing &swing,
string prefix = NULL //
)
{
//
bool result = false;
//
result =
//
swing.IsValid()
//
;
if (!result)
{
return result;
}
//
string name = swing.GetTag();
if (IsValid(prefix))
{
name = prefix + "_" + name;
}
//
XOHCL bar;
result = swing.FillBar(bar);
if (!result)
{
return result;
}
//
ENUM_X_PRICE price = swing.IsSwingHigh()
? X_PRICE_HIGH
: X_PRICE_LOW;
//
result = CreateByBar(
chart_id,
name,
window,
arrow,
bar,
price //
);
//
if (result)
{
ObjName(name);
}
//
return result;
}
};
// //
// Swing High ... // Swing High ...
class XCSwingHighObject : public XCSwingObject class XCSwingHighObject : public XCSwingObject
@@ -253,7 +322,9 @@ class XCSwingHighObject : public XCSwingObject
* *
* @param chart_id: Long, Specified Chart ID ... * @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ... * @param window: Integer, Specified Chart Window ID ...
* @param arrow: Integer, Specified Arrow Code ...
* @param swing: XCSwing instance ... * @param swing: XCSwing instance ...
* @param prefix: String ...
* *
* @return ( bool ) * @return ( bool )
*/ */
@@ -261,7 +332,8 @@ class XCSwingHighObject : public XCSwingObject
long chart_id, long chart_id,
int window, int window,
int arrow, int arrow,
XCSwing &swing // XCSwing &swing,
string prefix = NULL //
) )
{ {
// //
@@ -280,7 +352,8 @@ class XCSwingHighObject : public XCSwingObject
chart_id, chart_id,
window, window,
arrow, arrow,
swing // swing,
prefix //
); );
// //
@@ -313,7 +386,9 @@ class XCSwingLowObject : public XCSwingObject
* *
* @param chart_id: Long, Specified Chart ID ... * @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ... * @param window: Integer, Specified Chart Window ID ...
* @param arrow: Integer, Specified Arrow Code ...
* @param swing: XCSwing instance ... * @param swing: XCSwing instance ...
* @param prefix: String ...
* *
* @return ( bool ) * @return ( bool )
*/ */
@@ -321,7 +396,8 @@ class XCSwingLowObject : public XCSwingObject
long chart_id, long chart_id,
int window, int window,
int arrow, int arrow,
XCSwing &swing // XCSwing &swing,
string prefix = NULL //
) )
{ {
// //
@@ -340,7 +416,8 @@ class XCSwingLowObject : public XCSwingObject
chart_id, chart_id,
window, window,
arrow, arrow,
swing // swing,
prefix //
); );
// //
@@ -360,6 +437,424 @@ class XCSwingLowObject : public XCSwingObject
// //
}; };
//
// Momentum ...
class XCMomentumObject : public XCBarArrowObject
{
//
public:
//
/**
* Creator ...
*
* @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ...
* @param momentumBar: XCMomentumBar instance ...
* @param prefix: String ...
*
* @return ( bool )
*/
bool CreateByMomentum(
long chart_id,
int window,
int arrow,
XCMomentumBar &momentumBar,
string prefix = NULL //
)
{
//
bool result = false;
//
result =
//
momentumBar.IsValid()
//
;
if (!result)
{
return result;
}
//
string name = momentumBar.GetTag();
if (IsValid(prefix))
{
name = prefix + "_" + name;
}
//
XOHCL bar;
result = momentumBar.FillBar(bar);
if (!result)
{
return result;
}
//
ENUM_X_PRICE price = momentumBar.IsBullish()
? X_PRICE_LOW
: X_PRICE_HIGH;
//
result = CreateByBar(
chart_id,
name,
window,
arrow,
bar,
price //
);
//
if (result)
{
ObjName(name);
}
//
return result;
}
};
//
// Bullish Momentum Bar ...
class XCBullishMomentumObject : public XCMomentumObject
{
//
public:
//
/**
* Creator ...
*
* @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ...
* @param arrow: Integer, Specified Arrow Code ...
* @param momentumBar: XCMomentumBar instance ...
* @param prefix: String ...
*
* @return ( bool )
*/
bool Create(
long chart_id,
int window,
int arrow,
XCMomentumBar &momentumBar,
string prefix = NULL //
)
{
//
bool result = false;
//
result = momentumBar.IsValid() &&
momentumBar.IsBullish();
if (!result)
{
return result;
}
//
result = CreateByMomentum(
chart_id,
window,
arrow,
momentumBar,
prefix //
);
//
return result;
}
/**
* Retrieve Object Type ...
*
* @return ( ENUM_XCHARTOBJECTS )
*/
virtual ENUM_XCHARTOBJECTS Type()
{
return X_BULLISH_MOMENTUM_BAR_OBJ;
}
//
};
//
// Bearish Momentum Bar ...
class XCBearishMomentumObject : public XCMomentumObject
{
//
public:
//
/**
* Creator ...
*
* @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ...
* @param arrow: Integer, Specified Arrow Code ...
* @param momentumBar: XCMomentumBar instance ...
* @param prefix: String ...
*
* @return ( bool )
*/
bool Create(
long chart_id,
int window,
int arrow,
XCMomentumBar &momentumBar,
string prefix = NULL //
)
{
//
bool result = false;
//
result = momentumBar.IsValid() &&
momentumBar.IsBearish();
if (!result)
{
return result;
}
//
result = CreateByMomentum(
chart_id,
window,
arrow,
momentumBar,
prefix //
);
//
return result;
}
/**
* Retrieve Object Type ...
*
* @return ( ENUM_XCHARTOBJECTS )
*/
virtual ENUM_XCHARTOBJECTS Type()
{
return X_BEARISH_MOMENTUM_BAR_OBJ;
}
//
};
//
// Rejection ...
class XCRejectionObject : public XCBarArrowObject
{
//
public:
//
/**
* Creator ...
*
* @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ...
* @param rejectionBar: XCRejectionBar instance ...
* @param prefix: String ...
*
* @return ( bool )
*/
bool CreateByRejection(
long chart_id,
int window,
int arrow,
XCRejectionBar &rejectionBar,
string prefix = NULL //
)
{
//
bool result = false;
//
result =
//
rejectionBar.IsValid()
//
;
if (!result)
{
return result;
}
//
string name = rejectionBar.GetTag();
if (IsValid(prefix))
{
name = prefix + "_" + name;
}
//
XOHCL bar;
result = rejectionBar.FillBar(bar);
if (!result)
{
return result;
}
//
ENUM_X_PRICE price = rejectionBar.IsBullish()
? X_PRICE_LOW
: X_PRICE_HIGH;
//
result = CreateByBar(
chart_id,
name,
window,
arrow,
bar,
price //
);
//
if (result)
{
ObjName(name);
}
//
return result;
}
};
//
// Bullish Rejection Bar ...
class XCBullishRejectionObject : public XCRejectionObject
{
//
public:
//
/**
* Creator ...
*
* @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ...
* @param arrow: Integer, Specified Arrow Code ...
* @param rejectionBar: XCRejectionBar instance ...
* @param prefix: String ...
*
* @return ( bool )
*/
bool Create(
long chart_id,
int window,
int arrow,
XCRejectionBar &rejectionBar,
string prefix = NULL //
)
{
//
bool result = false;
//
result = rejectionBar.IsValid() &&
rejectionBar.IsBullish();
if (!result)
{
return result;
}
//
result = CreateByRejection(
chart_id,
window,
arrow,
rejectionBar,
prefix //
);
//
return result;
}
/**
* Retrieve Object Type ...
*
* @return ( ENUM_XCHARTOBJECTS )
*/
virtual ENUM_XCHARTOBJECTS Type()
{
return X_BULLISH_REJECTION_BAR_OBJ;
}
//
};
//
// Bearish Rejection Bar ...
class XCBearishRejectionObject : public XCRejectionObject
{
//
public:
//
/**
* Creator ...
*
* @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ...
* @param arrow: Integer, Specified Arrow Code ...
* @param rejectionBar: XCRejectionBar instance ...
* @param prefix: String ...
*
* @return ( bool )
*/
bool Create(
long chart_id,
int window,
int arrow,
XCRejectionBar &rejectionBar,
string prefix = NULL //
)
{
//
bool result = false;
//
result = rejectionBar.IsValid() &&
rejectionBar.IsBearish();
if (!result)
{
return result;
}
//
result = CreateByRejection(
chart_id,
window,
arrow,
rejectionBar,
prefix //
);
//
return result;
}
/**
* Retrieve Object Type ...
*
* @return ( ENUM_XCHARTOBJECTS )
*/
virtual ENUM_XCHARTOBJECTS Type()
{
return X_BEARISH_REJECTION_BAR_OBJ;
}
//
};
// //
// XCZoneObject ... // XCZoneObject ...
class XCZoneObject : public XCBaseObject class XCZoneObject : public XCBaseObject
+856 -28
View File
@@ -71,7 +71,7 @@ class XCPOIDetector : public XCBaseAlert
// //
// Apply Default Configurations ... // Apply Default Configurations ...
ApplyDefaultConfig(); Default();
} }
// //
@@ -203,6 +203,120 @@ class XCPOIDetector : public XCBaseAlert
mSwingRange = value; mSwingRange = value;
} }
//
// Momentum Bars ...
/**
* Get Momentum Bars must Extends Range ...
*
* @return ( int )
*/
int MomentumBarExtendRange()
{
return mMomentumBarExtendRange;
}
/**
* Set Momentum Bars must Extends Range ...
*
* @param value: Integer ...
*/
void MomentumBarExtendRange(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mMomentumBarExtendRange = value;
}
/**
* Get Momentum Bars Body Percent ...
*
* @return ( double )
*/
double MomentumBarBodyPercent()
{
return mMomentumBarBodyPercent;
}
/**
* Set Momentum Bars Body Percent ...
*
* @param value: Double ...
*/
void MomentumBarBodyPercent(double value)
{
//
if (value < 50)
{
value = 50;
}
//
mMomentumBarBodyPercent = value;
}
//
// Rejection Bars ...
/**
* Get Rejection Bars must Extends Range ...
*
* @return ( int )
*/
int RejectionBarExtendRange()
{
return mRejectionBarExtendRange;
}
/**
* Set Rejection Bars must Extends Range ...
*
* @param value: Integer ...
*/
void RejectionBarExtendRange(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mRejectionBarExtendRange = value;
}
/**
* Get Rejection Bars Shadow Percent ...
*
* @return ( double )
*/
double RejectionBarShadowPercent()
{
return mRejectionBarShadowPercent;
}
/**
* Set Rejection Bars Shadow Percent ...
*
* @param value: Double ...
*/
void RejectionBarShadowPercent(double value)
{
//
if (value < 50)
{
value = 50;
}
//
mRejectionBarShadowPercent = value;
}
// //
// Actions ... // Actions ...
@@ -274,7 +388,7 @@ class XCPOIDetector : public XCBaseAlert
// //
// POI Detecting ... // POI Detecting ...
bool isDetect = false; bool isDetected = false;
// //
// Swings ... // Swings ...
@@ -292,8 +406,8 @@ class XCPOIDetector : public XCBaseAlert
{ {
// //
// Swing High ... // Swing High ...
isDetect = DetectSwingHigh(swingBar); isDetected = DetectSwingHigh(swingBar);
if (isDetect) if (isDetected)
{ {
// //
ENUM_XPOI_EVENTS event = X_SWING_HIGH_DETECTED; ENUM_XPOI_EVENTS event = X_SWING_HIGH_DETECTED;
@@ -320,8 +434,8 @@ class XCPOIDetector : public XCBaseAlert
// //
// Swing Low ... // Swing Low ...
isDetect = DetectSwingLow(swingBar); isDetected = DetectSwingLow(swingBar);
if (isDetect) if (isDetected)
{ {
// //
ENUM_XPOI_EVENTS event = X_SWING_LOW_DETECTED; ENUM_XPOI_EVENTS event = X_SWING_LOW_DETECTED;
@@ -348,6 +462,118 @@ class XCPOIDetector : public XCBaseAlert
} }
} }
//
// Bullish Momentum Bars ...
isDetected = DetectBullishMomentumBar(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BULLISH_MOMENTUM_BAR_DETECTED;
XCMomentumBar *param;
bool hasItem = GetLastItem(
param,
mBullishMomentumBars //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Bearish Momentum Bars ...
isDetected = DetectBearishMomentumBar(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BEARISH_MOMENTUM_BAR_DETECTED;
XCMomentumBar *param;
bool hasItem = GetLastItem(
param,
mBearishMomentumBars //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Bullish Rejection Bars ...
isDetected = DetectBullishRejectionBar(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BULLISH_REJECTION_BAR_DETECTED;
XCRejectionBar *param;
bool hasItem = GetLastItem(
param,
mBullishRejectionBars //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
//
// Bearish Rejection Bars ...
isDetected = DetectBearishRejectionBar(cBar);
if (isDetected)
{
//
ENUM_XPOI_EVENTS event = X_BEARISH_REJECTION_BAR_DETECTED;
XCRejectionBar *param;
bool hasItem = GetLastItem(
param,
mBearishRejectionBars //
);
if (hasItem)
{
//
NotifyEventListeners(
event,
param //
);
}
//
Add(
event,
state //
);
}
// //
CleanupUnusedPOIs(); CleanupUnusedPOIs();
@@ -424,6 +650,14 @@ class XCPOIDetector : public XCBaseAlert
// //
Clean(mSwingHighs); Clean(mSwingHighs);
Clean(mSwingLows); Clean(mSwingLows);
//
Clean(mBullishMomentumBars);
Clean(mBearishMomentumBars);
//
Clean(mBullishRejectionBars);
Clean(mBearishRejectionBars);
} }
/** /**
@@ -447,7 +681,7 @@ class XCPOIDetector : public XCBaseAlert
/** /**
* Apply Default Configurations ... * Apply Default Configurations ...
*/ */
virtual void ApplyDefaultConfig() virtual void Default()
{ {
// //
// Common ... // Common ...
@@ -460,6 +694,12 @@ class XCPOIDetector : public XCBaseAlert
SwingRange(2); SwingRange(2);
// //
MomentumBarExtendRange(2);
MomentumBarBodyPercent(70);
//
RejectionBarExtendRange(0);
RejectionBarShadowPercent(55);
} }
// //
@@ -516,6 +756,14 @@ class XCPOIDetector : public XCBaseAlert
int swingLowsCount = 0; int swingLowsCount = 0;
int swingHighsCount = 0; int swingHighsCount = 0;
//
int bullishMomentumBarsCount = 0;
int bearishMomentumBarsCount = 0;
//
int bullishRejectionBarsCount = 0;
int bearishRejectionBarsCount = 0;
// //
bool canContinue = true; bool canContinue = true;
@@ -538,6 +786,38 @@ class XCPOIDetector : public XCBaseAlert
ArrayReverse(mSwingLows); ArrayReverse(mSwingLows);
} }
//
// Bullish Momentum Bars ...
bullishMomentumBarsCount = DetectRequiredBullishMomentumBars(barIndex);
if (bullishMomentumBarsCount == requiredPOIs)
{
ArrayReverse(mBullishMomentumBars);
}
//
// Bearish Momentum Bars ...
bearishMomentumBarsCount = DetectRequiredBearishMomentumBars(barIndex);
if (bearishMomentumBarsCount == requiredPOIs)
{
ArrayReverse(mBearishMomentumBars);
}
//
// Bullish Rejection Bars ...
bullishRejectionBarsCount = DetectRequiredBullishRejectionBars(barIndex);
if (bullishRejectionBarsCount == requiredPOIs)
{
ArrayReverse(mBullishRejectionBars);
}
//
// Bearish Rejection Bars ...
bearishRejectionBarsCount = DetectRequiredBearishRejectionBars(barIndex);
if (bearishRejectionBarsCount == requiredPOIs)
{
ArrayReverse(mBearishRejectionBars);
}
// //
canContinue = canContinue =
// //
@@ -549,6 +829,26 @@ class XCPOIDetector : public XCBaseAlert
// Swing Lows ... // Swing Lows ...
swingLowsCount < requiredPOIs swingLowsCount < requiredPOIs
// //
||
//
// Bullish Momentum Bars ...
bullishMomentumBarsCount < requiredPOIs
//
||
//
// Bearish Momentum Bars ...
bearishMomentumBarsCount < requiredPOIs
//
||
//
// Bullish Rejection Bars ...
bullishRejectionBarsCount < requiredPOIs
//
||
//
// Bearish Rejection Bars ...
bearishRejectionBarsCount < requiredPOIs
//
; ;
if (canContinue) if (canContinue)
{ {
@@ -930,8 +1230,8 @@ class XCPOIDetector : public XCBaseAlert
int mMaxNumberOfRequiredPOIs; // Max Allowed Number of POI(s) which Must Find at Initializion Time ... int mMaxNumberOfRequiredPOIs; // Max Allowed Number of POI(s) which Must Find at Initializion Time ...
// //
CArrayObj mDrawnObjects; // Drawn Objects ... CArrayObj mDrawnObjects; // Drawn Objects ...
XBarTracker mBarTracker; // Market Bar Tracker ... XBarTracker mBarTracker; // Market Bar Tracker ...
XCBarAnalyser mBarAnalyser; // Bar Analyser ... XCBarAnalyser mBarAnalyser; // Bar Analyser ...
// //
@@ -1010,15 +1310,15 @@ class XCPOIDetector : public XCBaseAlert
); );
// //
XCSwingHighObject *iObj; // XCSwingHighObject *iObj;
bool isCreated = mDrawer.CreateSwingHigh( // bool isCreated = mDrawer.CreateSwingHigh(
swing, // swing,
iObj // // iObj //
); // );
if (isCreated) // if (isCreated)
{ // {
AddObjectIfNotExists(iObj); // AddObjectIfNotExists(iObj);
} // }
} }
} }
@@ -1153,16 +1453,16 @@ class XCPOIDetector : public XCBaseAlert
mSwingHighs // mSwingHighs //
); );
// // //
XCSwingLowObject *iObj; // XCSwingLowObject *iObj;
bool isCreated = mDrawer.CreateSwingLow( // bool isCreated = mDrawer.CreateSwingLow(
swing, // swing,
iObj // // iObj //
); // );
if (isCreated) // if (isCreated)
{ // {
AddObjectIfNotExists(iObj); // AddObjectIfNotExists(iObj);
} // }
} }
} }
@@ -1240,9 +1540,537 @@ class XCPOIDetector : public XCBaseAlert
// //
// Momentum Bars ... // Momentum Bars ...
int mMomentumBarExtendRange; // Momentum Bars must Extends Range ...
double mMomentumBarBodyPercent; // Momentum Bars Body Percent ...
//
// Bullish ...
XCMomentumBar *mBullishMomentumBars[]; // Holds Founded Bullish Momentum Bars ...
/**
* Detect Bullish Momentum Bar ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBullishMomentumBar(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid() &&
bar.Index() > 0;
if (!result)
{
return result;
}
//
int extendRange = MomentumBarExtendRange();
double bodyPercent = MomentumBarBodyPercent();
ENUM_X_DIRECTION dir;
result = mBarAnalyser.IsMomentumBar(
bar,
dir,
extendRange,
bodyPercent //
);
result =
result &&
dir == X_DIRECTION_BULLISH;
if (result)
{
//
XCMomentumBar *momentumBar;
momentumBar = new XCMomentumBar();
result = momentumBar.Init(bar);
//
if (result)
{
//
Add(
momentumBar,
mBullishMomentumBars //
);
//
// XCBullishMomentumObject *iObj;
// bool isCreated = mDrawer.CreateBullishMomentumBar(
// momentumBar,
// iObj //
// );
// if (isCreated)
// {
// AddObjectIfNotExists(iObj);
// }
}
}
//
return result;
}
/**
* Detect Required Bullish Momentum Bars ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBullishMomentumBars(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBullishMomentumBars);
if (count >= required)
{
//
result = count;
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBullishMomentumBar(bar);
//
result = ArraySize(mBullishMomentumBars);
//
return result;
}
//
// Bearish ...
XCMomentumBar *mBearishMomentumBars[]; // Holds Founded Bearish Momentum Bars ...
/**
* Detect Bearish Momentum Bar ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBearishMomentumBar(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid() &&
bar.Index() > 0;
if (!result)
{
return result;
}
//
int extendRange = MomentumBarExtendRange();
double bodyPercent = MomentumBarBodyPercent();
ENUM_X_DIRECTION dir;
result = mBarAnalyser.IsMomentumBar(
bar,
dir,
extendRange,
bodyPercent //
);
result =
result &&
dir == X_DIRECTION_BEARISH;
if (result)
{
//
XCMomentumBar *momentumBar;
momentumBar = new XCMomentumBar();
result = momentumBar.Init(bar);
//
if (result)
{
//
Add(
momentumBar,
mBearishMomentumBars //
);
//
// XCBearishMomentumObject *iObj;
// bool isCreated = mDrawer.CreateBearishMomentumBar(
// momentumBar,
// iObj //
// );
// if (isCreated)
// {
// AddObjectIfNotExists(iObj);
// }
}
}
//
return result;
}
/**
* Detect Required Bearish Momentum Bars ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBearishMomentumBars(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBearishMomentumBars);
if (count >= required)
{
//
result = count;
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBearishMomentumBar(bar);
//
result = ArraySize(mBearishMomentumBars);
//
return result;
}
// //
// Rejection Bars ... // Rejection Bars ...
int mRejectionBarExtendRange; // Rejection Bars must Extends Range ...
double mRejectionBarShadowPercent; // Rejection Bars Shadow Percent ...
//
// Bullish ...
XCRejectionBar *mBullishRejectionBars[]; // Holds Founded Bullish Rejection Bars ...
/**
* Detect Bullish Rejection Bar ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBullishRejectionBar(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid() &&
bar.Index() > 0;
if (!result)
{
return result;
}
//
int extendRange = RejectionBarExtendRange();
double shadowPercent = RejectionBarShadowPercent();
ENUM_X_DIRECTION dir;
result = mBarAnalyser.IsRejectionBar(
bar,
dir,
extendRange,
shadowPercent //
);
result =
result &&
dir == X_DIRECTION_BULLISH;
if (result)
{
//
XCRejectionBar *rejectionBar;
rejectionBar = new XCRejectionBar();
result = rejectionBar.Init(bar);
//
if (result)
{
//
Add(
rejectionBar,
mBullishRejectionBars //
);
//
XCBullishRejectionObject *iObj;
bool isCreated = mDrawer.CreateBullishRejectionBar(
rejectionBar,
iObj //
);
if (isCreated)
{
AddObjectIfNotExists(iObj);
}
}
}
//
return result;
}
/**
* Detect Required Bullish Rejection Bars ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBullishRejectionBars(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBullishRejectionBars);
if (count >= required)
{
//
result = count;
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBullishRejectionBar(bar);
//
result = ArraySize(mBullishRejectionBars);
//
return result;
}
//
// Bearish ...
XCRejectionBar *mBearishRejectionBars[]; // Holds Founded Bearish Rejection Bars ...
/**
* Detect Bearish Rejection Bar ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool DetectBearishRejectionBar(XOHCL &bar)
{
//
bool result = false;
//
result = bar.IsValid() &&
bar.Index() > 0;
if (!result)
{
return result;
}
//
int extendRange = RejectionBarExtendRange();
double shadowPercent = RejectionBarShadowPercent();
ENUM_X_DIRECTION dir;
result = mBarAnalyser.IsRejectionBar(
bar,
dir,
extendRange,
shadowPercent //
);
result =
result &&
dir == X_DIRECTION_BEARISH;
if (result)
{
//
XCRejectionBar *rejectionBar;
rejectionBar = new XCRejectionBar();
result = rejectionBar.Init(bar);
//
if (result)
{
//
Add(
rejectionBar,
mBearishRejectionBars //
);
//
XCBearishRejectionObject *iObj;
bool isCreated = mDrawer.CreateBearishRejectionBar(
rejectionBar,
iObj //
);
if (isCreated)
{
AddObjectIfNotExists(iObj);
}
}
}
//
return result;
}
/**
* Detect Required Bearish Rejection Bars ...
*
* @param barIndex: Integer Start bar index ...
* 0 is Default ...
*
* @return ( int )
*/
int DetectRequiredBearishRejectionBars(int barIndex = 0)
{
//
int result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int required = MaxNumberOfRequiredPOIs();
if (required <= 0)
{
return result;
}
//
int count = ArraySize(mBearishRejectionBars);
if (count >= required)
{
//
result = count;
return result;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
XOHCL bar;
bool isInited = bar.Init(
symbol,
period,
barIndex //
);
if (!isInited)
{
return result;
}
//
DetectBearishRejectionBar(bar);
//
result = ArraySize(mBearishRejectionBars);
//
return result;
}
// //
// Support Zone(s) ... // Support Zone(s) ...
+278 -14
View File
@@ -1278,7 +1278,8 @@ class XCPOIDrawer : public XCBase
/** /**
* Create Swing High Object ... * Create Swing High Object ...
* *
* @param swing: XOHCL instance ... * @param swing: XCSwing instance ...
* @param object: XCSwingHighObject pointer ...
* *
* @return ( bool ) * @return ( bool )
*/ */
@@ -1303,6 +1304,7 @@ class XCPOIDrawer : public XCBase
} }
// //
string prefix = Prefix();
long chartID = ChartIdentification(); long chartID = ChartIdentification();
int window = SubWindowIdentification(); int window = SubWindowIdentification();
@@ -1317,7 +1319,8 @@ class XCPOIDrawer : public XCBase
chartID, chartID,
window, window,
arrow, arrow,
swing // swing,
prefix //
); );
// //
@@ -1338,7 +1341,8 @@ class XCPOIDrawer : public XCBase
/** /**
* Create Swing Low Object ... * Create Swing Low Object ...
* *
* @param swing: XOHCL instance ... * @param swing: XCSwing instance ...
* @param object: XCSwingLowObject pointer ...
* *
* @return ( bool ) * @return ( bool )
*/ */
@@ -1363,6 +1367,7 @@ class XCPOIDrawer : public XCBase
} }
// //
string prefix = Prefix();
long chartID = ChartIdentification(); long chartID = ChartIdentification();
int window = SubWindowIdentification(); int window = SubWindowIdentification();
@@ -1377,7 +1382,8 @@ class XCPOIDrawer : public XCBase
chartID, chartID,
window, window,
arrow, arrow,
swing // swing,
prefix //
); );
// //
@@ -1395,6 +1401,264 @@ class XCPOIDrawer : public XCBase
return result; return result;
} }
//
// Momentum Bars ...
/**
* Create Bullish Momentum Bar Object ...
*
* @param momentumBar: XCMomentumBar instance ...
* @param object: XCBullishMomentumObject pointer ...
*
* @return ( bool )
*/
bool CreateBullishMomentumBar(
XCMomentumBar &momentumBar,
XCBullishMomentumObject *&object //
)
{
//
bool result = false;
//
object = NULL;
//
result =
momentumBar.IsValid() &&
momentumBar.IsBullish();
if (!result)
{
return result;
}
//
string prefix = Prefix();
long chartID = ChartIdentification();
int window = SubWindowIdentification();
//
int arrow = BullishMomentumBarArrow();
int width = BullishMomentumBarWidth();
color crl = BullishMomentumBarColor();
//
object = new XCBullishMomentumObject();
result = object.Create(
chartID,
window,
arrow,
momentumBar,
prefix //
);
//
if (!result)
{
return result;
}
//
object.ArrowColor(crl);
object.ArrowWidth(width);
object.ArrowAnchor(ANCHOR_TOP);
//
return result;
}
/**
* Create Bearish Momentum Bar Object ...
*
* @param momentumBar: XCMomentumBar instance ...
* @param object: XCBearishMomentumObject pointer ...
*
* @return ( bool )
*/
bool CreateBearishMomentumBar(
XCMomentumBar &momentumBar,
XCBearishMomentumObject *&object //
)
{
//
bool result = false;
//
object = NULL;
//
result =
momentumBar.IsValid() &&
momentumBar.IsBearish();
if (!result)
{
return result;
}
//
string prefix = Prefix();
long chartID = ChartIdentification();
int window = SubWindowIdentification();
//
int arrow = BearishMomentumBarArrow();
int width = BearishMomentumBarWidth();
color crl = BearishMomentumBarColor();
//
object = new XCBearishMomentumObject();
result = object.Create(
chartID,
window,
arrow,
momentumBar,
prefix //
);
//
if (!result)
{
return result;
}
//
object.ArrowColor(crl);
object.ArrowWidth(width);
object.ArrowAnchor(ANCHOR_BOTTOM);
//
return result;
}
//
// Rejection Bars ...
/**
* Create Bullish Rejection Bar Object ...
*
* @param momentumBar: XCRejectionBar instance ...
* @param object: XCBullishRejectionObject pointer ...
*
* @return ( bool )
*/
bool CreateBullishRejectionBar(
XCRejectionBar &rejectionBar,
XCBullishRejectionObject *&object //
)
{
//
bool result = false;
//
object = NULL;
//
result =
rejectionBar.IsValid() &&
rejectionBar.IsBullish();
if (!result)
{
return result;
}
//
string prefix = Prefix();
long chartID = ChartIdentification();
int window = SubWindowIdentification();
//
int arrow = BullishRejectionBarArrow();
int width = BullishRejectionBarWidth();
color crl = BullishRejectionBarColor();
//
object = new XCBullishRejectionObject();
result = object.Create(
chartID,
window,
arrow,
rejectionBar,
prefix //
);
//
if (!result)
{
return result;
}
//
object.ArrowColor(crl);
object.ArrowWidth(width);
object.ArrowAnchor(ANCHOR_TOP);
//
return result;
}
/**
* Create Bearish Rejection Bar Object ...
*
* @param rejectionBar: XCRejectionBar instance ...
* @param object: XCBearishRejectionObject pointer ...
*
* @return ( bool )
*/
bool CreateBearishRejectionBar(
XCRejectionBar &rejectionBar,
XCBearishRejectionObject *&object //
)
{
//
bool result = false;
//
object = NULL;
//
result =
rejectionBar.IsValid() &&
rejectionBar.IsBearish();
if (!result)
{
return result;
}
//
string prefix = Prefix();
long chartID = ChartIdentification();
int window = SubWindowIdentification();
//
int arrow = BearishRejectionBarArrow();
int width = BearishRejectionBarWidth();
color crl = BearishRejectionBarColor();
//
object = new XCBearishRejectionObject();
result = object.Create(
chartID,
window,
arrow,
rejectionBar,
prefix //
);
//
if (!result)
{
return result;
}
//
object.ArrowColor(crl);
object.ArrowWidth(width);
object.ArrowAnchor(ANCHOR_BOTTOM);
//
return result;
}
// //
protected: protected:
// //
@@ -1411,34 +1675,34 @@ class XCPOIDrawer : public XCBase
SubWindowIdentification(0); SubWindowIdentification(0);
// //
SwingLowWidth(2); SwingLowWidth(3);
SwingLowArrow(108); SwingLowArrow(108);
SwingLowColor(clrAqua); SwingLowColor(clrAqua);
// //
SwingHighWidth(2); SwingHighWidth(3);
SwingHighArrow(108); SwingHighArrow(108);
SwingHighColor(clrMagenta); SwingHighColor(clrMagenta);
// //
BullishMomentumBarWidth(1); BullishMomentumBarWidth(3);
BullishMomentumBarArrow(225); BullishMomentumBarArrow(225);
BullishMomentumBarColor(clrLime); BullishMomentumBarColor(clrAqua);
// //
BearishMomentumBarWidth(1); BearishMomentumBarWidth(3);
BearishMomentumBarArrow(226); BearishMomentumBarArrow(226);
BearishMomentumBarColor(clrRed); BearishMomentumBarColor(clrMagenta);
// //
BullishRejectionBarWidth(1); BullishRejectionBarWidth(3);
BullishRejectionBarArrow(217); BullishRejectionBarArrow(217);
BullishRejectionBarColor(clrLime); BullishRejectionBarColor(clrAqua);
// //
BearishRejectionBarWidth(1); BearishRejectionBarWidth(3);
BearishRejectionBarArrow(218); BearishRejectionBarArrow(218);
BearishRejectionBarColor(clrRed); BearishRejectionBarColor(clrMagenta);
// //
SupportZoneFill(true); SupportZoneFill(true);
+53 -12
View File
@@ -75,18 +75,20 @@ enum ENUM_XPOI_EVENTS
{ {
// //
// Trading Days ... // Trading Days ...
X_TRADE_DAY_FIRST_BAR, // Trading Day Start ... X_TRADE_DAY_FIRST_BAR, // Trading Day First Bar ...
X_TRADE_DAY_LAST_BAR, // Trading Day End ... X_TRADE_DAY_LAST_BAR, // Trading Day Last Bar ...
// //
// Session ... // Session ...
X_SESSION_FIRST_BAR, // Session First Bar ... X_SESSION_FIRST_BAR, // Session First Bar ...
X_SESSION_LAST_BAR, // Session Last Bar ... X_SESSION_LAST_BAR, // Session Last Bar ...
// //
// Momentum Bar ... // Momentum Bar ...
X_MOMENTUM_BAR_DETECTED, // Momentum Bar ... X_BULLISH_MOMENTUM_BAR_DETECTED,
X_BEARISH_MOMENTUM_BAR_DETECTED,
// //
// Rejection Bar ... // Rejection Bar ...
X_REJECTION_BAR_DETECTED, // Rejection Bar ... X_BULLISH_REJECTION_BAR_DETECTED,
X_BEARISH_REJECTION_BAR_DETECTED,
// //
// Swings ... // Swings ...
X_SWING_HIGH_DETECTED, X_SWING_HIGH_DETECTED,
@@ -643,6 +645,35 @@ class XCBarZone : public XCZone
// //
// Getter(s) / Setter(s) ... // Getter(s) / Setter(s) ...
/**
* Fill Bar as XOHCL struct ...
*
* @param bar: XOHCL instance ...
*
* @return ( bool )
*/
bool FillBar(
XOHCL &bar //
)
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
bar = mBar;
result = mBar.IsValid();
//
return result;
}
// //
// Overrides ... // Overrides ...
@@ -1045,7 +1076,7 @@ class XCSwing : public XCBasePOI
// Getter(s) / Setter(s) ... // Getter(s) / Setter(s) ...
/** /**
* Fill Swing Bar as XOHCLstruct ... * Fill Bar as XOHCL struct ...
* *
* @param bar: XOHCL instance ... * @param bar: XOHCL instance ...
* *
@@ -1872,7 +1903,7 @@ class XCRejectionBar : public XCBarZone
// //
// Momentum Bar ... // Momentum Bar ...
class XMomentumBar : public XCBarZone class XCMomentumBar : public XCBarZone
{ {
// //
public: public:
@@ -1880,13 +1911,13 @@ class XMomentumBar : public XCBarZone
// //
// Constructor ... // Constructor ...
void XMomentumBar() void XCMomentumBar()
{ {
} }
// //
// Deconstructor ... // Deconstructor ...
void ~XMomentumBar() void ~XCMomentumBar()
{ {
} }
@@ -2491,13 +2522,23 @@ string ToString(ENUM_XPOI_EVENTS value)
break; break;
// //
case X_MOMENTUM_BAR_DETECTED: case X_BULLISH_MOMENTUM_BAR_DETECTED:
result = "Momentum Bar Detected"; result = "Bullish Momentum Bar Detected";
break; break;
// //
case X_REJECTION_BAR_DETECTED: case X_BEARISH_MOMENTUM_BAR_DETECTED:
result = "Rejection Bar Detected"; result = "Bearish Momentum Bar Detected";
break;
//
case X_BULLISH_REJECTION_BAR_DETECTED:
result = "Bullish Rejection Bar Detected";
break;
//
case X_BEARISH_REJECTION_BAR_DETECTED:
result = "Bearish Rejection Bar Detected";
break; break;
// //