add order block finder and add some other tools and also test them ...

This commit is contained in:
2024-07-14 15:22:31 +03:30
parent 046f721b19
commit af6685f523
2 changed files with 807 additions and 2 deletions
+208 -2
View File
@@ -119,11 +119,11 @@ void OnTick()
//
// Find Morning Star Pattern ...
FindMorningStar();
// FindMorningStar();
//
// Find Evening Star Pattern ...
FindEveningStar();
// FindEveningStar();
//
// Find Swing High Pattern ...
@@ -156,6 +156,24 @@ void OnTick()
//
// Find Bearish Trend ...
// FindBearishTrend();
//
// Find Bullish Order Block ...
// FindBullishOrderBlock();
//
// Find Bearish Order Block ...
// FindBearishOrderBlock();
//
// Find Sharp Going Up Price Action ...
// FindSharpBullish();
//
// Find Sharp Going Down Price Action ...
// FindSharpBearish();
//
}
//
@@ -177,6 +195,64 @@ bool ValidateInputs()
//
// Custom Testing Functions ...
//
// Find Sharp Going Up Price Action ...
void FindSharpBullish()
{
//
XOHCL cBar;
bool isInited = cBar.Init(
_Symbol,
_Period,
1 //
);
if (!isInited)
{
return;
}
//
if (!cBar.IsSharpBullish())
{
return;
}
//
eaBarTracker.Waits();
//
Print("Detect Sharp Bullish Price Action ...");
}
//
// Find Sharp Going Down Price Action ...
void FindSharpBearish()
{
//
XOHCL cBar;
bool isInited = cBar.Init(
_Symbol,
_Period,
1 //
);
if (!isInited)
{
return;
}
//
if (!cBar.IsSharpBearish())
{
return;
}
//
eaBarTracker.Waits();
//
Print("Detect Sharp Bearish Price Action ...");
}
//
// Find Doji Pattern ...
void FindDoji()
@@ -1072,4 +1148,134 @@ void FindBearishTrend()
Print("Bearish Trend Detected ...");
}
//
// Find Bullish Order Block ...
void FindBullishOrderBlock() {
//
XOHCL cBar;
bool isInited = cBar.Init(
_Symbol,
_Period,
1 //
);
if (!isInited)
{
return;
}
//
XOHCL obBar;
bool hasOB = cBar.HasBullishOrderBlock(
obBar //
);
if (!hasOB) {
return;
}
//
eaBarTracker.Waits();
//
DrawTrendLine(
ChartID(),
"BULLOB-H-" + ToString((int) obBar.time),
0,
obBar.time,
obBar.high,
cBar.time,
obBar.high,
clrAqua,
STYLE_SOLID,
2,
false,
false,
true //
);
//
DrawTrendLine(
ChartID(),
"BULLOB-L-" + ToString((int) obBar.time),
0,
obBar.time,
obBar.low,
cBar.time,
obBar.low,
clrAqua,
STYLE_SOLID,
2,
false,
false,
true //
);
//
Print("Detect new Bullish Order Block ...");
}
//
// Find Bearish Order Block ...
void FindBearishOrderBlock() {
//
XOHCL cBar;
bool isInited = cBar.Init(
_Symbol,
_Period,
1 //
);
if (!isInited)
{
return;
}
//
XOHCL obBar;
bool hasOB = cBar.HasBearishOrderBlock(
obBar //
);
if (!hasOB) {
return;
}
//
eaBarTracker.Waits();
//
DrawTrendLine(
ChartID(),
"BEAROB-H-" + ToString((int) obBar.time),
0,
obBar.time,
obBar.high,
cBar.time,
obBar.high,
clrMagenta,
STYLE_SOLID,
2,
false,
false,
true //
);
//
DrawTrendLine(
ChartID(),
"BEAROB-L-" + ToString((int) obBar.time),
0,
obBar.time,
obBar.low,
cBar.time,
obBar.low,
clrMagenta,
STYLE_SOLID,
2,
false,
false,
true //
);
//
Print("Detect new Bearish Order Block ...");
}
//
+599
View File
@@ -593,6 +593,22 @@ struct XOHCL
return result;
}
//
int TotalBars()
{
//
int result = 0;
//
result = iBars(
symbol,
period //
);
//
return result;
}
//
// Calculate X_PRICE Specified Type ...
double GetPrice(ENUM_X_PRICE mPType)
@@ -695,6 +711,146 @@ struct XOHCL
return result;
}
//
// Find Specific Price ...
bool FindHigherPriceBar(
XOHCL &bar,
double price,
ENUM_X_PRICE _type = X_PRICE_HIGH //
)
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
int totalBars = TotalBars();
result = IsValidSize(totalBars);
if (!result)
{
return result;
}
//
int start = Index();
int maxAllowedLoopback = totalBars / 5;
for (int i = start; i < maxAllowedLoopback; i++)
{
//
result = bar.Init(
symbol,
period,
i //
);
//
if (!result)
{
break;
}
//
double iPrice = bar.GetPrice(_type);
//
result =
//
iPrice > 0 &&
iPrice > price
//
;
if (result)
{
break;
}
}
//
if (!result)
{
bar.Clean();
}
//
return result;
}
//
// Find Specific Price ...
bool FindLowerPriceBar(
XOHCL &bar,
double price,
ENUM_X_PRICE _type = X_PRICE_HIGH //
)
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
int totalBars = TotalBars();
result = IsValidSize(totalBars);
if (!result)
{
return result;
}
//
int start = Index();
int maxAllowedLoopback = totalBars / 5;
for (int i = start; i < maxAllowedLoopback; i++)
{
//
result = bar.Init(
symbol,
period,
i //
);
//
if (!result)
{
break;
}
//
double iPrice = bar.GetPrice(_type);
//
result =
//
iPrice > 0 &&
iPrice < price
//
;
if (result)
{
break;
}
}
//
if (!result)
{
bar.Clean();
}
//
return result;
}
//
// Calculate Bar Mid Line ...
double GetMid()
@@ -997,6 +1153,276 @@ struct XOHCL
idx + 1 //
);
//
if (!result)
{
bar.Clean();
}
//
return result;
}
//
bool IsSharpBullish(
int _loopback = 2,
double _sharpRatio = 2.5 //
)
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
if (_loopback < 0)
{
_loopback = 2;
}
//
if (_sharpRatio < 0)
{
_sharpRatio = 2.5;
}
//
int hIDX = FindHighestIndex(
_loopback,
MODE_HIGH //
);
int lIDX = FindLowestIndex(
_loopback,
MODE_LOW //
);
//
result =
//
hIDX >= 0 &&
lIDX >= 0 &&
MathAbs(hIDX - Index()) < 2
//
;
//
if (!result)
{
return result;
}
//
XOHCL hBar;
result = hBar.Init(
symbol,
period,
hIDX //
);
if (!result)
{
return result;
}
//
XOHCL lBar;
result = lBar.Init(
symbol,
period,
lIDX //
);
if (!result)
{
return result;
}
//
double lhDif = hBar.high - lBar.low;
//
int hhIDX = hBar.FindHighestIndex(
_loopback,
MODE_HIGH //
);
//
int llIDX = lBar.FindLowestIndex(
_loopback,
MODE_LOW //
);
//
XOHCL hhBar;
result = hhBar.Init(
symbol,
period,
hhIDX + hIDX //
);
if (!result)
{
return result;
}
//
XOHCL llBar;
result = llBar.Init(
symbol,
period,
llIDX + lIDX //
);
if (!result)
{
return result;
}
//
double llhhDif = hhBar.high - llBar.low;
//
result =
//
lBar.low > llBar.low &&
hBar.high > hhBar.high &&
lhDif >= llhhDif * _sharpRatio
//
;
//
return result;
}
//
bool IsSharpBearish(
int _loopback = 2,
double _sharpRatio = 2.5 //
)
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
if (_loopback < 0)
{
_loopback = 2;
}
//
if (_sharpRatio < 0)
{
_sharpRatio = 2.5;
}
//
int hIDX = FindHighestIndex(
_loopback,
MODE_HIGH //
);
int lIDX = FindLowestIndex(
_loopback,
MODE_LOW //
);
//
result =
//
hIDX >= 0 &&
lIDX >= 0 &&
MathAbs(hIDX - Index()) < 2
//
;
//
if (!result)
{
return result;
}
//
XOHCL hBar;
result = hBar.Init(
symbol,
period,
hIDX //
);
if (!result)
{
return result;
}
//
XOHCL lBar;
result = lBar.Init(
symbol,
period,
lIDX //
);
if (!result)
{
return result;
}
//
double lhDif = hBar.high - lBar.low;
//
int hhIDX = hBar.FindHighestIndex(
_loopback,
MODE_HIGH //
);
//
int llIDX = lBar.FindLowestIndex(
_loopback,
MODE_LOW //
);
//
XOHCL hhBar;
result = hhBar.Init(
symbol,
period,
hhIDX + hIDX //
);
if (!result)
{
return result;
}
//
XOHCL llBar;
result = llBar.Init(
symbol,
period,
llIDX + lIDX //
);
if (!result)
{
return result;
}
//
double llhhDif = hhBar.high - llBar.low;
//
result =
//
lBar.low < llBar.low &&
hBar.high < hhBar.high &&
lhDif >= llhhDif * _sharpRatio
//
;
//
return result;
}
@@ -3014,6 +3440,179 @@ struct XOHCL
//
// Order Blocks ...
//
// Find Bullish Order Block ...
bool HasBullishOrderBlock(
XOHCL &orderBlock,
int _minimumSameBars = 4 //
)
{
//
bool result = false;
//
orderBlock.Clean();
//
result = IsValid();
if (!result)
{
return result;
}
//
if (_minimumSameBars < 0)
{
_minimumSameBars = 4;
}
//
XOHCL cBar;
int founded = 0;
int cIDX = Index();
bool isEnough = false;
while (!isEnough)
{
//
bool isInited = cBar.Init(
symbol,
period,
cIDX //
);
//
result = cBar.IsBullish();
if (!result && cBar.IsBearish())
{
break;
}
//
cIDX++;
founded++;
}
//
// Here we have to check founded and if it's fill
// our requirements ...
// cIDX is Order Block Index ...
result =
//
cBar.IsValid() &&
high > cBar.high &&
founded >= _minimumSameBars
//
;
if (!result)
{
return result;
}
//
result = orderBlock.Init(
symbol,
period,
cIDX //
);
if (!result)
{
//
orderBlock.Clean();
return result;
}
//
return result;
}
//
// Find Bearish Order Block ...
bool HasBearishOrderBlock(
XOHCL &orderBlock,
int _minimumSameBars = 4 //
)
{
//
bool result = false;
//
orderBlock.Clean();
//
result = IsValid();
if (!result)
{
return result;
}
//
if (_minimumSameBars < 0)
{
_minimumSameBars = 4;
}
//
XOHCL cBar;
int founded = 0;
int cIDX = Index();
bool isEnough = false;
while (!isEnough)
{
//
bool isInited = cBar.Init(
symbol,
period,
cIDX //
);
//
result = cBar.IsBearish();
if (!result && cBar.IsBullish())
{
break;
}
//
cIDX++;
founded++;
}
//
// Here we have to check founded and if it's fill
// our requirements ...
// cIDX is Order Block Index ...
result =
//
cBar.IsValid() &&
high < cBar.low &&
founded >= _minimumSameBars
//
;
if (!result)
{
return result;
}
//
result = orderBlock.Init(
symbol,
period,
cIDX //
);
if (!result)
{
//
orderBlock.Clean();
return result;
}
//
return result;
}
//
// Order Blocks ...
//
// Supply and Demand ...