Last Works on Validating Order Blocks ...
This commit is contained in:
@@ -747,26 +747,6 @@ class XCBarZone : public XCZone
|
||||
return result;
|
||||
}
|
||||
|
||||
ENUM_TIMEFRAMES GetPeriod()
|
||||
{
|
||||
//
|
||||
ENUM_TIMEFRAMES result = NULL;
|
||||
|
||||
//
|
||||
XOHCL bar;
|
||||
bool isFilled = FillBar(bar);
|
||||
if (!isFilled)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = bar.period;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set From Date ...
|
||||
*
|
||||
@@ -817,6 +797,52 @@ class XCBarZone : public XCZone
|
||||
return mBar.time;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Symbol ...
|
||||
*
|
||||
* @return ( string )
|
||||
*/
|
||||
string GetSymbol()
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
if (!mBar.IsValid())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
return mBar.symbol;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Period ...
|
||||
*
|
||||
* @return ( int )
|
||||
*/
|
||||
ENUM_TIMEFRAMES GetPeriod()
|
||||
{
|
||||
//
|
||||
ENUM_TIMEFRAMES result = NULL;
|
||||
|
||||
//
|
||||
if (!mBar.IsValid())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
return mBar.period;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Overrides ...
|
||||
|
||||
@@ -1097,21 +1123,47 @@ class XCTwoBarZone : public XCZone
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Symbol ...
|
||||
*
|
||||
* @return ( string )
|
||||
*/
|
||||
string GetSymbol()
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
if (!mStartBar.IsValid())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
return mStartBar.symbol;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Period ...
|
||||
*
|
||||
* @return ( int )
|
||||
*/
|
||||
ENUM_TIMEFRAMES GetPeriod()
|
||||
{
|
||||
//
|
||||
ENUM_TIMEFRAMES result = NULL;
|
||||
|
||||
//
|
||||
XOHCL bar;
|
||||
bool isFilled = FillStartBar(bar);
|
||||
if (!isFilled)
|
||||
if (!mStartBar.IsValid())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = bar.period;
|
||||
return mStartBar.period;
|
||||
|
||||
//
|
||||
return result;
|
||||
@@ -2071,6 +2123,163 @@ class XCOrderBlock : public XCBarZone
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect Order Blocks Breaker Bar ...
|
||||
*
|
||||
* @param breakerBar: XOHCL instance Reference ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool DetectBreakerBar(XOHCL &breakerBar)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
breakerBar.Clean();
|
||||
|
||||
//
|
||||
result = IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL fromBar;
|
||||
result = FillBar(fromBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int fromIndex = fromBar.Index();
|
||||
result = fromIndex > 0;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isBullish = IsBullish();
|
||||
ENUM_X_DIRECTION dir =
|
||||
isBullish
|
||||
? X_DIRECTION_BULLISH
|
||||
: X_DIRECTION_BEARISH;
|
||||
double value =
|
||||
isBullish
|
||||
? Upper()
|
||||
: Lower();
|
||||
|
||||
//
|
||||
for (int i = fromIndex - 1; i >= 0; i--)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
bool isInited = iBar.Init(
|
||||
fromBar.symbol,
|
||||
fromBar.period,
|
||||
i //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
isInited = IsBarBreak(
|
||||
value,
|
||||
dir,
|
||||
iBar //
|
||||
);
|
||||
if (isInited)
|
||||
{
|
||||
//
|
||||
breakerBar = iBar;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = breakerBar.IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Order Block is Hunted or not ...
|
||||
*
|
||||
* @param huntedBar: XOHCL instance Reference ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsHunted(XOHCL &huntedBar)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
huntedBar.Clean();
|
||||
|
||||
//
|
||||
result = IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL breakerBar;
|
||||
result = DetectBreakerBar(breakerBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isBullish = IsBullish();
|
||||
|
||||
//
|
||||
int breakerIndex = breakerBar.Index();
|
||||
for (int i = breakerIndex - 1; i >= 0; i--)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
result = iBar.Init(
|
||||
breakerBar.symbol,
|
||||
breakerBar.period,
|
||||
i //
|
||||
);
|
||||
|
||||
//
|
||||
double price =
|
||||
isBullish
|
||||
? iBar.low
|
||||
: iBar.high;
|
||||
|
||||
//
|
||||
result = IsPriceInsideZone(
|
||||
price,
|
||||
Upper(),
|
||||
Lower() //
|
||||
);
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
huntedBar = iBar;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = huntedBar.IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Overrides ...
|
||||
|
||||
@@ -8208,6 +8417,48 @@ bool IsPriceInsideZone(
|
||||
//
|
||||
return result;
|
||||
}
|
||||
bool IsPriceInsideZone(
|
||||
XOHCL &bar,
|
||||
double upper,
|
||||
double lower //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
upper > 0 &&
|
||||
lower > 0 &&
|
||||
upper > lower &&
|
||||
bar.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double ask = GetAsk(bar.symbol);
|
||||
double bid = GetBid(bar.symbol);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
ask <= upper &&
|
||||
bid <= upper &&
|
||||
bar.low <= upper
|
||||
//
|
||||
&&
|
||||
//
|
||||
ask >= lower &&
|
||||
bid >= lower &&
|
||||
bar.low >= lower
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Price Inside Specified Zone ...
|
||||
@@ -8246,6 +8497,40 @@ bool IsPriceInsideZone(
|
||||
//
|
||||
return result;
|
||||
}
|
||||
bool IsPriceInsideZone(
|
||||
double price,
|
||||
double upper,
|
||||
double lower //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
price > 0 &&
|
||||
upper > 0 &&
|
||||
lower > 0 &&
|
||||
upper > lower;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
price <= upper
|
||||
//
|
||||
&&
|
||||
//
|
||||
price >= lower
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate Target for Specified Direction ...
|
||||
|
||||
Reference in New Issue
Block a user