Files
MQL5Data/Documents/BKP/detect.block.base.trigger.mq5
T
2025-05-11 23:40:52 +03:30

219 lines
5.0 KiB
Plaintext

//
// Detect Block Based Trigger ...
XBoxZone ob;
XOHCL swing;
XOHCL breaker;
XOHCL outSide;
ENUM_X_DIRECTION passedDir;
bool isPassed = helper.IsBlockBasedTriggerBar(
ob,
swing,
breaker,
outSide,
passedDir,
1, // Bar Index ...
50, // Loopback ...
3 // Swing Length ...
);
if (isPassed)
{
//
// Draw Block Based Trigger ...
//
// Draw OB ...
XCBoxObject *obObject;
has = helper.poiDrawer.DrawBox(
ob,
obObject //
);
if (has)
{
//
obObject.BoxWidth(2);
obObject.BoxStyle(STYLE_SOLID);
//
color obColor =
ob.IsBullish()
? clrAqua
: clrMagenta;
obObject.BoxColor(obColor);
//
mObjects.Add(obObject);
//
ZeroMemory(obObject);
}
//
double breakPrice =
ob.IsBullish()
? swing.high
: swing.low;
//
// Draw Swing and Breake ...
CChartObjectTrend *tObj;
tObj = new CChartObjectTrend();
string tName = "Swing_For_" + ToString(ob.dir) + "_" + ToString(breakPrice);
has = tObj.Create(
0,
tName,
0,
swing.time,
breakPrice,
breaker.time,
breakPrice //
);
if (has)
{
//
tObj.Width(2);
tObj.Style(STYLE_SOLID);
//
color tColor = ob.IsBullish()
? clrRed
: clrLime;
tObj.Color(tColor);
//
mObjects.Add(tObj);
//
ZeroMemory(tObj);
}
//
Print("Passed Bar ...");
}
ob.Clean();
swing.Clean();
breaker.Clean();
outSide.Clean();
//////////////////////////////////////////////////////////
/**
* Check Specified Bar is Swing or not ...
*
* @param bar: XOHCL instance reference, Specified Swing Bar ...
* @param forDir: ENUM_X_DIRECTION member, Specified Direction of Swing ...
* @param barIndex: int, Specified Bar Index to Check ...
* @param loopback: int, Specified Loopback for BothSide Checking ...
*
* @return ( bool )
*/
bool IsSwingSide(
XOHCL &bar,
ENUM_X_DIRECTION forDir,
int loopback = 7 //
)
{
//
bool result = false;
//
result = bar.IsValid() &&
HasDirection(forDir);
if (!result)
{
return result;
}
//
bool isSwingLow = IsBullish(forDir);
bool isSwingHigh = IsBearish(forDir);
//
string symbol = bar.symbol;
ENUM_TIMEFRAMES period = bar.period;
//
int totalBars = iBars(
symbol,
period //
);
int barIndex = bar.Index();
loopback = NormalizeInt(loopback, 3);
result =
barIndex - loopback > 0 &&
barIndex + 1 + loopback <= totalBars;
if (!result)
{
return result;
}
//
for (int i = 0; i < loopback; i++)
{
//
XOHCL iPBar;
XOHCL iNBar;
result = iPBar.Init(
symbol,
period,
barIndex + i //
);
result =
result &&
iNBar.Init(
symbol,
period,
barIndex - i //
);
if (!result)
{
//
iPBar.Clean();
iNBar.Clean();
//
break;
}
//
isSwingLow =
isSwingLow &&
bar.low < iPBar.low &&
bar.low < iNBar.low;
//
isSwingHigh =
isSwingHigh &&
bar.high > iPBar.high &&
bar.high > iNBar.high;
//
result = isSwingLow ||
isSwingHigh;
if (!result)
{
//
iPBar.Clean();
iNBar.Clean();
//
break;
}
//
iPBar.Clean();
iNBar.Clean();
}
//
if (!result)
{
bar.Clean();
}
//
return result;
}