645 lines
13 KiB
Plaintext
645 lines
13 KiB
Plaintext
|
|
//
|
|
// Check Bar has Strong Body or Not ...
|
|
bool HasStrongBody()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
if (!IsValid())
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double body = GetBody();
|
|
double shadow = GetShadows();
|
|
|
|
//
|
|
result = body > shadow * 1.5;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Bar Must Open Below Prce
|
|
// and Close Above it ...
|
|
bool IsBreakUp(
|
|
double price // a Price to Check Breake
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = HasStrongBody();
|
|
if (!result || price <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Select required Prices ...
|
|
|
|
//
|
|
result =
|
|
//
|
|
close > price &&
|
|
open < price;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Bar Must Open Above Prce
|
|
// and Close Below it ...
|
|
bool IsBreakDown(
|
|
double price // a Price to Check Breake
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = HasStrongBody();
|
|
if (!result || price <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Select required Prices ...
|
|
|
|
//
|
|
result =
|
|
//
|
|
open > price &&
|
|
close < price;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool IsBreakOut(
|
|
double price, // a Price to Check Breake
|
|
bool useHighLow = true // if true using High and Low price for Breakeouts, if not use Open Close
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = HasStrongBody();
|
|
if (!result || price <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Select required Prices ...
|
|
|
|
//
|
|
double selectedUp =
|
|
useHighLow
|
|
? high
|
|
: GetUp();
|
|
double selectedDown =
|
|
useHighLow
|
|
? low
|
|
: GetDown();
|
|
|
|
//
|
|
result =
|
|
//
|
|
selectedUp > price &&
|
|
selectedDown < price;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check a Support Line Rejected or not ...
|
|
bool IsSupportRejected(
|
|
double price // Support Price
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// this is zBar ...
|
|
// so we are try to Recieve CBar ...
|
|
XOHCL cBar;
|
|
result = this.GetPreviousBar(cBar);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Now we are going to Recieve PBar ...
|
|
XOHCL pBar;
|
|
result = cBar.GetPreviousBar(pBar);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// We Have this (0) Bar, cBar (1) and pBar (2) ...
|
|
|
|
//
|
|
// pBar Down Shadow must break Price Line ...
|
|
// cBar and zBar Close must be Above Price Line ...
|
|
// also zBar Open must be Above Price Line ...
|
|
result =
|
|
//
|
|
pBar.high > price &&
|
|
pBar.low < price &&
|
|
cBar.close > price &&
|
|
this.close > price &&
|
|
this.open > price
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check a Support Line Breaked or not ...
|
|
bool IsSupportBreaked(
|
|
double price // Support Price
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// this is zBar ...
|
|
// so we are try to Recieve CBar ...
|
|
XOHCL cBar;
|
|
result = this.GetPreviousBar(cBar);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Now we are going to Recieve PBar ...
|
|
XOHCL pBar;
|
|
result = cBar.GetPreviousBar(pBar);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// We Have this (0) Bar, cBar (1) and pBar (2) ...
|
|
|
|
//
|
|
// pBar Down Shadow must break Price Line ...
|
|
// cBar and zBar Close must be Below Price Line ...
|
|
// also zBar Open must be Below Price Line ...
|
|
result =
|
|
//
|
|
pBar.high > price &&
|
|
pBar.low < price &&
|
|
cBar.close < price &&
|
|
this.close < price &&
|
|
this.open < price
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check a Resistance Line Rejected or not ...
|
|
bool IsResistanceRejected(
|
|
double price // Resistance Price
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// this is zBar ...
|
|
// so we are try to Recieve CBar ...
|
|
XOHCL cBar;
|
|
result = this.GetPreviousBar(cBar);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Now we are going to Recieve PBar ...
|
|
XOHCL pBar;
|
|
result = cBar.GetPreviousBar(pBar);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// We Have this (0) Bar, cBar (1) and pBar (2) ...
|
|
|
|
//
|
|
// pBar Up Shadow must break Price Line ...
|
|
// cBar and zBar Close must be Under Price Line ...
|
|
// also zBar Open must be Under Price Line ...
|
|
result =
|
|
//
|
|
pBar.high > price &&
|
|
pBar.low < price &&
|
|
cBar.close < price &&
|
|
this.close < price &&
|
|
this.open < price
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check a Resistance Line Breaked or not ...
|
|
bool IsResistanceBreaked(
|
|
double price // Support Price
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// this is zBar ...
|
|
// so we are try to Recieve CBar ...
|
|
XOHCL cBar;
|
|
result = this.GetPreviousBar(cBar);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Now we are going to Recieve PBar ...
|
|
XOHCL pBar;
|
|
result = cBar.GetPreviousBar(pBar);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// We Have this (0) Bar, cBar (1) and pBar (2) ...
|
|
|
|
//
|
|
// pBar Up Shadow must break Price Line ...
|
|
// cBar and zBar Close must be Over Price Line ...
|
|
// also zBar Open must be Pver Price Line ...
|
|
result =
|
|
//
|
|
pBar.low < price &&
|
|
pBar.high > price &&
|
|
cBar.close > price &&
|
|
this.close > price &&
|
|
this.open > price
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bar is Inside Previus Bar ...
|
|
bool IsInsideBar(
|
|
double threshold = 5 // Points Distance between Up and Down
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
if (threshold < 0)
|
|
{
|
|
threshold = 0;
|
|
}
|
|
|
|
//
|
|
XOHCL pBar;
|
|
result = GetPreviousBar(pBar);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double offset = PointToPrice(threshold, this.symbol);
|
|
|
|
//
|
|
result =
|
|
//
|
|
pBar.high > this.high &&
|
|
pBar.low < this.low &&
|
|
MathAbs(pBar.low - this.low) > offset &&
|
|
MathAbs(pBar.high - this.high) > offset
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bar has Strongest Body in a Range ...
|
|
bool HasStrongestBody(
|
|
int mLoopback = 3 // loopback candles to compare it ...
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = IsValid();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double body = GetBody();
|
|
XOHCL prev = this;
|
|
for (int i = 0; i < mLoopback; i++)
|
|
{
|
|
//
|
|
bool isValid = prev.GetPreviousBar(prev);
|
|
if (!isValid)
|
|
{
|
|
//
|
|
result = false;
|
|
break;
|
|
}
|
|
|
|
//
|
|
result =
|
|
//
|
|
result &&
|
|
body > prev.GetBody()
|
|
//
|
|
;
|
|
if (!result)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bar has Weakest Body in a Range ...
|
|
bool HasWeakestBody(
|
|
int mLoopback = 3 // loopback candles to compare it ...
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = IsValid();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double body = GetBody();
|
|
XOHCL prev = this;
|
|
for (int i = 0; i < mLoopback; i++)
|
|
{
|
|
//
|
|
bool isValid = prev.GetPreviousBar(prev);
|
|
if (!isValid)
|
|
{
|
|
//
|
|
result = false;
|
|
break;
|
|
}
|
|
|
|
//
|
|
result =
|
|
//
|
|
result &&
|
|
body < prev.GetBody()
|
|
//
|
|
;
|
|
if (!result)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
// Determines Swings based On this Bar ...
|
|
// Calculates Based on atleast 3 Bars Prev ...
|
|
ENUM_X_SWING_TYPE GetSwingType()
|
|
{
|
|
//
|
|
ENUM_X_SWING_TYPE result = X_NO_SWING;
|
|
|
|
//
|
|
// Find Current Index of Bar ...
|
|
int barIndex = Index();
|
|
if (barIndex <= -1)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// First we have to Retrieve atleast 3 Bars before this bar ...
|
|
XOHCL bars[];
|
|
int barsCount = GetBars(
|
|
bars,
|
|
symbol,
|
|
period,
|
|
barIndex + 1,
|
|
3
|
|
//
|
|
);
|
|
if (barsCount < 3)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Swing Start Candle has Strong Body ...
|
|
bool isStrongBodyCandle = bars[2].HasStrongBody();
|
|
if (!isStrongBodyCandle)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Swing Low Conditions ...
|
|
bool isSwingLowOrderBlock =
|
|
bars[2].low < bars[1].low &&
|
|
bars[1].low < bars[0].low &&
|
|
bars[2].low < bars[0].low;
|
|
if (isSwingLowOrderBlock)
|
|
{
|
|
result = X_SWING_LOW;
|
|
}
|
|
|
|
//
|
|
// Check Swing High Conditions ...
|
|
bool isSwingHighOrderBlock =
|
|
bars[2].high > bars[1].high &&
|
|
bars[1].high > bars[0].high &&
|
|
bars[2].high > bars[0].high;
|
|
if (isSwingHighOrderBlock)
|
|
{
|
|
result = X_SWING_HIGH;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
// Check Bar Is Hammer Pattern ...
|
|
bool IsHammer()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
double fib382 = GetFibonacciLevel(
|
|
high,
|
|
low,
|
|
0.382,
|
|
-1 //
|
|
);
|
|
|
|
//
|
|
result = GetDown() > fib382;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bar Is Shooting Star Pattern ...
|
|
bool IsShootingStar()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
double fib382 = GetFibonacciLevel(
|
|
high,
|
|
low,
|
|
0.382,
|
|
1 //
|
|
);
|
|
|
|
//
|
|
result = GetUp() < fib382;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bar Bullish Engulfing Pattern ...
|
|
bool IsBullishEngulf()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Current Bar Must be Bullish ...
|
|
result = IsBullish();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Retrieve Previous Bar ...
|
|
XOHCL pBar;
|
|
result = GetPreviousBar(pBar);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result =
|
|
//
|
|
pBar.IsBearish() &&
|
|
open < pBar.close && close > pBar.open &&
|
|
high >= pBar.high && low <= pBar.low
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check Bar Bearish Engulfing Pattern ...
|
|
bool IsBearishEngulf()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Current Bar Must be Bearish ...
|
|
result = IsBearish();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Retrieve Previous Bar ...
|
|
XOHCL pBar;
|
|
result = GetPreviousBar(pBar);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result =
|
|
//
|
|
pBar.IsBullish() &&
|
|
open > pBar.close && close < pBar.open &&
|
|
high >= pBar.high && low <= pBar.low
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|