219 lines
5.0 KiB
Plaintext
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;
|
|
}
|