last works on pattern detector ...
This commit is contained in:
@@ -1268,6 +1268,194 @@ class XCMarketPatternDetector : public XCBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HasSupport(
|
||||||
|
XOHCL &bar,
|
||||||
|
XOHCL &support,
|
||||||
|
int validationLength = 21,
|
||||||
|
int maxAllowedLoopback = 1500 //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prepare ...
|
||||||
|
support.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalizing ...
|
||||||
|
validationLength = NormalizeInt(validationLength, 7);
|
||||||
|
maxAllowedLoopback = NormalizeInt(maxAllowedLoopback, 21, 1500);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
result = bar.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find Support Swing ...
|
||||||
|
int idx = -1;
|
||||||
|
bool has = false;
|
||||||
|
int lookupIDX = bar.Index();
|
||||||
|
while (!IsValidIndex(idx) &&
|
||||||
|
lookupIDX < maxAllowedLoopback)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Detect Swing ...
|
||||||
|
idx = FindXSwing(
|
||||||
|
X_SWING_LOW,
|
||||||
|
bar.symbol,
|
||||||
|
bar.period,
|
||||||
|
lookupIDX,
|
||||||
|
validationLength //
|
||||||
|
);
|
||||||
|
has = IsValidIndex(idx);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
lookupIDX++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Swing Bar ...
|
||||||
|
has = support.Init(
|
||||||
|
bar.symbol,
|
||||||
|
bar.period,
|
||||||
|
idx //
|
||||||
|
);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
idx = -1;
|
||||||
|
lookupIDX++;
|
||||||
|
support.Clean();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Suppor Low Shadow ...
|
||||||
|
has = support.GetDown() < bar.low;
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
idx = -1;
|
||||||
|
lookupIDX++;
|
||||||
|
support.Clean();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (IsValidIndex(idx))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = support.IsValid();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasResistance(
|
||||||
|
XOHCL &bar,
|
||||||
|
XOHCL &resistence,
|
||||||
|
int validationLength = 21,
|
||||||
|
int maxAllowedLoopback = 1500 //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prepare ...
|
||||||
|
resistence.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalizing ...
|
||||||
|
validationLength = NormalizeInt(validationLength, 7);
|
||||||
|
maxAllowedLoopback = NormalizeInt(maxAllowedLoopback, 21, 1500);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
result = bar.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find Support Swing ...
|
||||||
|
int idx = -1;
|
||||||
|
bool has = false;
|
||||||
|
int lookupIDX = bar.Index();
|
||||||
|
while (!IsValidIndex(idx) &&
|
||||||
|
lookupIDX < maxAllowedLoopback)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Detect Swing ...
|
||||||
|
idx = FindXSwing(
|
||||||
|
X_SWING_HIGH,
|
||||||
|
bar.symbol,
|
||||||
|
bar.period,
|
||||||
|
lookupIDX,
|
||||||
|
validationLength //
|
||||||
|
);
|
||||||
|
has = IsValidIndex(idx);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
lookupIDX++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Swing Bar ...
|
||||||
|
has = resistence.Init(
|
||||||
|
bar.symbol,
|
||||||
|
bar.period,
|
||||||
|
idx //
|
||||||
|
);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
idx = -1;
|
||||||
|
lookupIDX++;
|
||||||
|
resistence.Clean();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Resistance High Shadow ...
|
||||||
|
has = resistence.GetUp() > bar.high;
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
idx = -1;
|
||||||
|
lookupIDX++;
|
||||||
|
resistence.Clean();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (IsValidIndex(idx))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = resistence.IsValid();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Protected ...
|
// Protected ...
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -889,6 +889,95 @@ class XCPOIDrawer : public XCBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw Trend Line based on Swings Points ...
|
||||||
|
*
|
||||||
|
* @param swings: XOHCL, Specified Swings ...
|
||||||
|
* @param dir: ENUM_X_DIRECTION, Specified Trend Direction ...
|
||||||
|
* @param rayRight: Ray to Right ...
|
||||||
|
* @param rayLeft: Ray to Left ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool DrawSwingTrend(
|
||||||
|
XOHCL &swings[],
|
||||||
|
ENUM_X_DIRECTION dir,
|
||||||
|
CChartObjectTrend *&object,
|
||||||
|
bool rayRight = false,
|
||||||
|
bool rayLeft = false //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
int count = ArraySize(swings);
|
||||||
|
result = HasChild(swings) &&
|
||||||
|
count >= 2 &&
|
||||||
|
HasDirection(dir);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isBullish = IsSpecifiedBullish(dir);
|
||||||
|
|
||||||
|
//
|
||||||
|
double price1 =
|
||||||
|
isBullish
|
||||||
|
? swings[0].low
|
||||||
|
: swings[0].high;
|
||||||
|
datetime time1 = swings[0].time;
|
||||||
|
|
||||||
|
//
|
||||||
|
double price2 =
|
||||||
|
isBullish
|
||||||
|
? swings[count - 1].low
|
||||||
|
: swings[count - 1].high;
|
||||||
|
datetime time2 = swings[count - 1].time;
|
||||||
|
|
||||||
|
//
|
||||||
|
ulong chartId = ChartIdentification();
|
||||||
|
int subWindow = SubWindowIdentification();
|
||||||
|
string name = ToXString(dir) + "_Trend_" + ToXString(price1) + "_" + ToXString(price2);
|
||||||
|
|
||||||
|
//
|
||||||
|
object = new CChartObjectTrend();
|
||||||
|
result = object.Create(
|
||||||
|
chartId,
|
||||||
|
name,
|
||||||
|
subWindow,
|
||||||
|
time1,
|
||||||
|
price1,
|
||||||
|
time2,
|
||||||
|
price2 //
|
||||||
|
);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
ApplyStyle(
|
||||||
|
object,
|
||||||
|
dir //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (rayRight)
|
||||||
|
{
|
||||||
|
object.RayRight(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (rayLeft)
|
||||||
|
{
|
||||||
|
object.RayLeft(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply Specified Style to Object ...
|
* Apply Specified Style to Object ...
|
||||||
*/
|
*/
|
||||||
@@ -932,7 +1021,7 @@ class XCPOIDrawer : public XCBase
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply Style to Specified Chart Object ...
|
* Apply Style to Specified Chart Object ...
|
||||||
*
|
*
|
||||||
* @param dir: Argument 2
|
* @param dir: Argument 2
|
||||||
*/
|
*/
|
||||||
void ApplyStyle(
|
void ApplyStyle(
|
||||||
|
|||||||
@@ -25,16 +25,9 @@
|
|||||||
// Imports ...
|
// Imports ...
|
||||||
#include "../Classes/x-saherelm.x-backtester.expert.class.mq5"
|
#include "../Classes/x-saherelm.x-backtester.expert.class.mq5"
|
||||||
#include "../Classes/x-saherelm.x-market.pattern.class.mq5"
|
#include "../Classes/x-saherelm.x-market.pattern.class.mq5"
|
||||||
|
#include "../Classes/x-saherelm.x-poi.drawer.class.mq5"
|
||||||
#include "../Helpers/x-saherelm.xom1.helper.mq5"
|
#include "../Helpers/x-saherelm.xom1.helper.mq5"
|
||||||
|
|
||||||
//
|
|
||||||
#import "user32.dll"
|
|
||||||
void keybd_event(int bVk, int bScan, int dwFlags, int dwExtraInfo);
|
|
||||||
#import
|
|
||||||
#define VK_SPACE 0x20 // Space
|
|
||||||
#define VK_RETURN 0x0D // Return - Enter Key
|
|
||||||
#define KEYEVENTF_KEYUP 0x0002 // Key up
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Definitions ...
|
// Definitions ...
|
||||||
|
|
||||||
@@ -133,6 +126,10 @@ string eaLogTag; // EA Log Prefix ...
|
|||||||
XCBackTesterEA *eaExpert; // EA Expert ...
|
XCBackTesterEA *eaExpert; // EA Expert ...
|
||||||
XCMarketPatternDetector *eaPatternDetector; // EA Pattern Detector ...
|
XCMarketPatternDetector *eaPatternDetector; // EA Pattern Detector ...
|
||||||
|
|
||||||
|
//
|
||||||
|
XCPOIDrawer *eaDrawer; // Ea POI Drawer ...
|
||||||
|
CArrayObj draws; // Drawn Objects ...
|
||||||
|
|
||||||
//
|
//
|
||||||
XBarTracker eaBarTracker; // EA Bar Traker ...
|
XBarTracker eaBarTracker; // EA Bar Traker ...
|
||||||
|
|
||||||
@@ -140,6 +137,9 @@ XBarTracker eaBarTracker; // EA Bar Traker ...
|
|||||||
int eaHandler = INVALID_HANDLE; // Indicator Handler ...
|
int eaHandler = INVALID_HANDLE; // Indicator Handler ...
|
||||||
int eaCTHandler = INVALID_HANDLE; // Candle Timer Handler ...
|
int eaCTHandler = INVALID_HANDLE; // Candle Timer Handler ...
|
||||||
|
|
||||||
|
//
|
||||||
|
ENUM_X_DIRECTION trendDir = X_DIRECTION_NONE;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Define Indicators Here ...
|
// Define Indicators Here ...
|
||||||
|
|
||||||
@@ -314,6 +314,10 @@ int OnInit()
|
|||||||
// Instantiate Market Pattern Detector ...
|
// Instantiate Market Pattern Detector ...
|
||||||
eaPatternDetector = new XCMarketPatternDetector();
|
eaPatternDetector = new XCMarketPatternDetector();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Instantiate POI Drawer ...
|
||||||
|
eaDrawer = new XCPOIDrawer();
|
||||||
|
|
||||||
//
|
//
|
||||||
Print(ShortName, ": Initialized Successfully ...");
|
Print(ShortName, ": Initialized Successfully ...");
|
||||||
return INIT_SUCCEEDED;
|
return INIT_SUCCEEDED;
|
||||||
@@ -346,6 +350,10 @@ void OnDeinit(const int reason)
|
|||||||
//
|
//
|
||||||
eaBarTracker.Clean();
|
eaBarTracker.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
delete eaDrawer;
|
||||||
|
ZeroMemory(eaDrawer);
|
||||||
|
|
||||||
//
|
//
|
||||||
delete eaPatternDetector;
|
delete eaPatternDetector;
|
||||||
ZeroMemory(eaPatternDetector);
|
ZeroMemory(eaPatternDetector);
|
||||||
@@ -363,242 +371,7 @@ void OnTick()
|
|||||||
eaExpert.HandleOnTick();
|
eaExpert.HandleOnTick();
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isNewBar = eaBarTracker.IsNewBar();
|
DetectPatterns();
|
||||||
if (isNewBar)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Initialize 1 Indexed Bar ...
|
|
||||||
XOHCL cBar;
|
|
||||||
bool has = cBar.Init(
|
|
||||||
_Symbol,
|
|
||||||
_Period,
|
|
||||||
1 //
|
|
||||||
);
|
|
||||||
if (has)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Do Analysis ...
|
|
||||||
|
|
||||||
//
|
|
||||||
ENUM_X_DIRECTION iDir = X_DIRECTION_NONE;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Define Detection Flags ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool detectPinned = false;
|
|
||||||
bool detectMomentum = false;
|
|
||||||
bool detectEngulfed = false;
|
|
||||||
bool detectTrueGaped = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool detectStarPattern = false;
|
|
||||||
bool detectFlagPattern = false;
|
|
||||||
bool detectRisingPattern = false;
|
|
||||||
bool detectPiercingPattern = false;
|
|
||||||
bool detectSignalKeyBarPattern = true;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool detectSwingTrend = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Momentum Bar ...
|
|
||||||
if (detectMomentum)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool isMomentum = eaPatternDetector.IsMomentumBar(
|
|
||||||
cBar,
|
|
||||||
iDir //
|
|
||||||
);
|
|
||||||
bool isBullishMomentum = isMomentum &&
|
|
||||||
IsSpecifiedBullish(iDir);
|
|
||||||
bool isBearishMomentum = isMomentum &&
|
|
||||||
IsSpecifiedBearish(iDir);
|
|
||||||
if (isMomentum)
|
|
||||||
{
|
|
||||||
Print(ToXString(iDir), " Momentum Bar: ", cBar.time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Engulfed Bar ...
|
|
||||||
if (detectEngulfed)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool isEngulfed = eaPatternDetector.IsEngulfedBar(
|
|
||||||
cBar,
|
|
||||||
iDir //
|
|
||||||
);
|
|
||||||
bool isBullishEngulfed = isEngulfed &&
|
|
||||||
IsSpecifiedBullish(iDir);
|
|
||||||
bool isBearishEngulfed = isEngulfed &&
|
|
||||||
IsSpecifiedBearish(iDir);
|
|
||||||
if (isEngulfed)
|
|
||||||
{
|
|
||||||
Print(ToXString(iDir), " Engulfed Bar: ", cBar.time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking TruGaped Bar ...
|
|
||||||
if (detectTrueGaped)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool isTrueGaped = eaPatternDetector.IsTrueGapedBar(
|
|
||||||
cBar,
|
|
||||||
iDir //
|
|
||||||
);
|
|
||||||
bool isBullishTrueGaped = isTrueGaped &&
|
|
||||||
IsSpecifiedBullish(iDir);
|
|
||||||
bool isBearishTrueGaped = isTrueGaped &&
|
|
||||||
IsSpecifiedBearish(iDir);
|
|
||||||
if (isTrueGaped)
|
|
||||||
{
|
|
||||||
Print(ToXString(iDir), " TrueGapped Bar: ", cBar.time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Pinned Bar ...
|
|
||||||
if (detectPinned)
|
|
||||||
{
|
|
||||||
bool isPinned = eaPatternDetector.IsPinnedBar(
|
|
||||||
cBar,
|
|
||||||
iDir //
|
|
||||||
);
|
|
||||||
bool isBullishPinned = isPinned &&
|
|
||||||
IsSpecifiedBullish(iDir);
|
|
||||||
bool isBearishPinned = isPinned &&
|
|
||||||
IsSpecifiedBearish(iDir);
|
|
||||||
if (isPinned)
|
|
||||||
{
|
|
||||||
Print(ToXString(iDir), " Pinned Bar: ", cBar.time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Star Pattern ...
|
|
||||||
if (detectStarPattern)
|
|
||||||
{
|
|
||||||
bool isStarPattern = eaPatternDetector.IsStartPattern(
|
|
||||||
cBar,
|
|
||||||
iDir //
|
|
||||||
);
|
|
||||||
bool isBullishStarPattern = isStarPattern &&
|
|
||||||
IsSpecifiedBullish(iDir);
|
|
||||||
bool isBearishStarPattern = isStarPattern &&
|
|
||||||
IsSpecifiedBearish(iDir);
|
|
||||||
if (isStarPattern)
|
|
||||||
{
|
|
||||||
Print(ToXString(iDir), " Star Pattern: ", cBar.time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Piercing Pattern ...
|
|
||||||
if (detectPiercingPattern)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool isPiercingPattern = eaPatternDetector.IsPiercingPattern(
|
|
||||||
cBar,
|
|
||||||
iDir //
|
|
||||||
);
|
|
||||||
bool isBullishPiercingPattern = isPiercingPattern &&
|
|
||||||
IsSpecifiedBullish(iDir);
|
|
||||||
bool isBearishPiercingPattern = isPiercingPattern &&
|
|
||||||
IsSpecifiedBearish(iDir);
|
|
||||||
if (isPiercingPattern)
|
|
||||||
{
|
|
||||||
Print(ToXString(iDir), " Piercing Pattern: ", cBar.time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Rising Pattern ...
|
|
||||||
if (detectRisingPattern)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool isRisingPattern = eaPatternDetector.IsRisingPattern(
|
|
||||||
cBar,
|
|
||||||
iDir //
|
|
||||||
);
|
|
||||||
bool isBullishRisingPattern = isRisingPattern &&
|
|
||||||
IsSpecifiedBullish(iDir);
|
|
||||||
bool isBearishRisingPattern = isRisingPattern &&
|
|
||||||
IsSpecifiedBearish(iDir);
|
|
||||||
if (isRisingPattern)
|
|
||||||
{
|
|
||||||
Print(ToXString(iDir), " Rising Pattern: ", cBar.time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Flag Pattern ...
|
|
||||||
if (detectFlagPattern)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
XOHCL swingBar;
|
|
||||||
bool isFlagPattern = eaPatternDetector.IsFlagPattern(
|
|
||||||
cBar,
|
|
||||||
iDir,
|
|
||||||
swingBar //
|
|
||||||
);
|
|
||||||
bool isBullishFlagPattern = isFlagPattern &&
|
|
||||||
IsSpecifiedBullish(iDir);
|
|
||||||
bool isBearishFlagPattern = isFlagPattern &&
|
|
||||||
IsSpecifiedBearish(iDir);
|
|
||||||
if (isFlagPattern)
|
|
||||||
{
|
|
||||||
Print(ToXString(iDir), " Flag Pattern: ", cBar.time, ", Swing: ", swingBar.time);
|
|
||||||
}
|
|
||||||
swingBar.Clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Detect Swing Trend ...
|
|
||||||
if (detectSwingTrend)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
XOHCL swings[];
|
|
||||||
bool hasSwingTrend = eaPatternDetector.HasSwingTrend(
|
|
||||||
cBar,
|
|
||||||
iDir,
|
|
||||||
swings //
|
|
||||||
);
|
|
||||||
bool hasBullishSwingTrend = hasSwingTrend &&
|
|
||||||
IsSpecifiedBullish(iDir);
|
|
||||||
bool hasBearishSwingTrend = hasSwingTrend &&
|
|
||||||
IsSpecifiedBearish(iDir);
|
|
||||||
if (hasSwingTrend)
|
|
||||||
{
|
|
||||||
Print(ToXString(iDir), " Swing Trend: ", cBar.time);
|
|
||||||
}
|
|
||||||
SpecifiedClean(swings);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Detect SignalKey Bar Pattern ...
|
|
||||||
if (detectSignalKeyBarPattern)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool isSignalKeyBar = eaPatternDetector.IsSignalKeyBarPattern(
|
|
||||||
cBar,
|
|
||||||
iDir //
|
|
||||||
);
|
|
||||||
bool isBullishSignalKeyBar = isSignalKeyBar &&
|
|
||||||
IsSpecifiedBullish(iDir);
|
|
||||||
bool isBearishSignalKeyBar = isSignalKeyBar &&
|
|
||||||
IsSpecifiedBearish(iDir);
|
|
||||||
if (isSignalKeyBar)
|
|
||||||
{
|
|
||||||
Print(ToXString(iDir), " SignalKey Bar Pattern: ", cBar.time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
cBar.Clean();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -852,3 +625,403 @@ void OnTradeStateChanged(const XOnTradeHandlerState &state)
|
|||||||
{
|
{
|
||||||
eaExpert.HandleOnTradeStateChanged(state);
|
eaExpert.HandleOnTradeStateChanged(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Market Conditions for Pattern Detection ...
|
||||||
|
*/
|
||||||
|
void DetectPatterns()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isNewBar = eaBarTracker.IsNewBar();
|
||||||
|
if (!isNewBar)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize 1 Indexed Bar ...
|
||||||
|
XOHCL cBar;
|
||||||
|
bool has = cBar.Init(
|
||||||
|
_Symbol,
|
||||||
|
_Period,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Do Analysis ...
|
||||||
|
|
||||||
|
//
|
||||||
|
ENUM_X_DIRECTION iDir = X_DIRECTION_NONE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define Detection Flags ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool detectPinned = false;
|
||||||
|
bool detectMomentum = false;
|
||||||
|
bool detectEngulfed = false;
|
||||||
|
bool detectTrueGaped = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool detectStarPattern = false;
|
||||||
|
bool detectFlagPattern = false;
|
||||||
|
bool detectRisingPattern = false;
|
||||||
|
bool detectPiercingPattern = false;
|
||||||
|
bool detectSignalKeyBarPattern = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool detectSwingTrend = false;
|
||||||
|
bool detectSwingTrendBreakes = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool detectSupports = false;
|
||||||
|
bool detectResistance = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Checking Momentum Bar ...
|
||||||
|
if (detectMomentum)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isMomentum = eaPatternDetector.IsMomentumBar(
|
||||||
|
cBar,
|
||||||
|
iDir //
|
||||||
|
);
|
||||||
|
bool isBullishMomentum = isMomentum &&
|
||||||
|
IsSpecifiedBullish(iDir);
|
||||||
|
bool isBearishMomentum = isMomentum &&
|
||||||
|
IsSpecifiedBearish(iDir);
|
||||||
|
if (isMomentum)
|
||||||
|
{
|
||||||
|
Print(ToXString(iDir), " Momentum Bar: ", cBar.time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Checking Engulfed Bar ...
|
||||||
|
if (detectEngulfed)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isEngulfed = eaPatternDetector.IsEngulfedBar(
|
||||||
|
cBar,
|
||||||
|
iDir //
|
||||||
|
);
|
||||||
|
bool isBullishEngulfed = isEngulfed &&
|
||||||
|
IsSpecifiedBullish(iDir);
|
||||||
|
bool isBearishEngulfed = isEngulfed &&
|
||||||
|
IsSpecifiedBearish(iDir);
|
||||||
|
if (isEngulfed)
|
||||||
|
{
|
||||||
|
Print(ToXString(iDir), " Engulfed Bar: ", cBar.time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Checking TruGaped Bar ...
|
||||||
|
if (detectTrueGaped)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isTrueGaped = eaPatternDetector.IsTrueGapedBar(
|
||||||
|
cBar,
|
||||||
|
iDir //
|
||||||
|
);
|
||||||
|
bool isBullishTrueGaped = isTrueGaped &&
|
||||||
|
IsSpecifiedBullish(iDir);
|
||||||
|
bool isBearishTrueGaped = isTrueGaped &&
|
||||||
|
IsSpecifiedBearish(iDir);
|
||||||
|
if (isTrueGaped)
|
||||||
|
{
|
||||||
|
Print(ToXString(iDir), " TrueGapped Bar: ", cBar.time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Checking Pinned Bar ...
|
||||||
|
if (detectPinned)
|
||||||
|
{
|
||||||
|
bool isPinned = eaPatternDetector.IsPinnedBar(
|
||||||
|
cBar,
|
||||||
|
iDir //
|
||||||
|
);
|
||||||
|
bool isBullishPinned = isPinned &&
|
||||||
|
IsSpecifiedBullish(iDir);
|
||||||
|
bool isBearishPinned = isPinned &&
|
||||||
|
IsSpecifiedBearish(iDir);
|
||||||
|
if (isPinned)
|
||||||
|
{
|
||||||
|
Print(ToXString(iDir), " Pinned Bar: ", cBar.time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Checking Star Pattern ...
|
||||||
|
if (detectStarPattern)
|
||||||
|
{
|
||||||
|
bool isStarPattern = eaPatternDetector.IsStartPattern(
|
||||||
|
cBar,
|
||||||
|
iDir //
|
||||||
|
);
|
||||||
|
bool isBullishStarPattern = isStarPattern &&
|
||||||
|
IsSpecifiedBullish(iDir);
|
||||||
|
bool isBearishStarPattern = isStarPattern &&
|
||||||
|
IsSpecifiedBearish(iDir);
|
||||||
|
if (isStarPattern)
|
||||||
|
{
|
||||||
|
Print(ToXString(iDir), " Star Pattern: ", cBar.time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Checking Piercing Pattern ...
|
||||||
|
if (detectPiercingPattern)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isPiercingPattern = eaPatternDetector.IsPiercingPattern(
|
||||||
|
cBar,
|
||||||
|
iDir //
|
||||||
|
);
|
||||||
|
bool isBullishPiercingPattern = isPiercingPattern &&
|
||||||
|
IsSpecifiedBullish(iDir);
|
||||||
|
bool isBearishPiercingPattern = isPiercingPattern &&
|
||||||
|
IsSpecifiedBearish(iDir);
|
||||||
|
if (isPiercingPattern)
|
||||||
|
{
|
||||||
|
Print(ToXString(iDir), " Piercing Pattern: ", cBar.time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Checking Rising Pattern ...
|
||||||
|
if (detectRisingPattern)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isRisingPattern = eaPatternDetector.IsRisingPattern(
|
||||||
|
cBar,
|
||||||
|
iDir //
|
||||||
|
);
|
||||||
|
bool isBullishRisingPattern = isRisingPattern &&
|
||||||
|
IsSpecifiedBullish(iDir);
|
||||||
|
bool isBearishRisingPattern = isRisingPattern &&
|
||||||
|
IsSpecifiedBearish(iDir);
|
||||||
|
if (isRisingPattern)
|
||||||
|
{
|
||||||
|
Print(ToXString(iDir), " Rising Pattern: ", cBar.time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Checking Flag Pattern ...
|
||||||
|
if (detectFlagPattern)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOHCL swingBar;
|
||||||
|
bool isFlagPattern = eaPatternDetector.IsFlagPattern(
|
||||||
|
cBar,
|
||||||
|
iDir,
|
||||||
|
swingBar //
|
||||||
|
);
|
||||||
|
bool isBullishFlagPattern = isFlagPattern &&
|
||||||
|
IsSpecifiedBullish(iDir);
|
||||||
|
bool isBearishFlagPattern = isFlagPattern &&
|
||||||
|
IsSpecifiedBearish(iDir);
|
||||||
|
if (isFlagPattern)
|
||||||
|
{
|
||||||
|
Print(ToXString(iDir), " Flag Pattern: ", cBar.time, ", Swing: ", swingBar.time);
|
||||||
|
}
|
||||||
|
swingBar.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect SignalKey Bar Pattern ...
|
||||||
|
if (detectSignalKeyBarPattern)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isSignalKeyBar = eaPatternDetector.IsSignalKeyBarPattern(
|
||||||
|
cBar,
|
||||||
|
iDir //
|
||||||
|
);
|
||||||
|
bool isBullishSignalKeyBar = isSignalKeyBar &&
|
||||||
|
IsSpecifiedBullish(iDir);
|
||||||
|
bool isBearishSignalKeyBar = isSignalKeyBar &&
|
||||||
|
IsSpecifiedBearish(iDir);
|
||||||
|
if (isSignalKeyBar)
|
||||||
|
{
|
||||||
|
Print(ToXString(iDir), " SignalKey Bar Pattern: ", cBar.time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Swing Trend ...
|
||||||
|
if (detectSwingTrend)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOHCL swings[];
|
||||||
|
bool hasSwingTrend = eaPatternDetector.HasSwingTrend(
|
||||||
|
cBar,
|
||||||
|
iDir,
|
||||||
|
swings //
|
||||||
|
);
|
||||||
|
bool hasBullishSwingTrend = hasSwingTrend &&
|
||||||
|
IsSpecifiedBullish(iDir);
|
||||||
|
bool hasBearishSwingTrend = hasSwingTrend &&
|
||||||
|
IsSpecifiedBearish(iDir);
|
||||||
|
if (hasSwingTrend)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Print(ToXString(iDir), " Swing Trend: ", cBar.time);
|
||||||
|
|
||||||
|
//
|
||||||
|
CChartObjectTrend *iObj;
|
||||||
|
has = eaDrawer.DrawSwingTrend(
|
||||||
|
swings,
|
||||||
|
iDir,
|
||||||
|
iObj,
|
||||||
|
true // Ray Right ...
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
draws.Add(iObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SpecifiedClean(swings);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Swing Trend Breakes ...
|
||||||
|
if (detectSwingTrendBreakes)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOHCL swings[];
|
||||||
|
bool hasSwingTrend = eaPatternDetector.HasSwingTrend(
|
||||||
|
cBar,
|
||||||
|
iDir,
|
||||||
|
swings //
|
||||||
|
);
|
||||||
|
bool hasBullishSwingTrend = hasSwingTrend &&
|
||||||
|
IsSpecifiedBullish(iDir);
|
||||||
|
bool hasBearishSwingTrend = hasSwingTrend &&
|
||||||
|
IsSpecifiedBearish(iDir);
|
||||||
|
if (hasSwingTrend)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (!HasDirection(trendDir))
|
||||||
|
{
|
||||||
|
trendDir = iDir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Breaked Detection ...
|
||||||
|
if (trendDir != iDir)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Print("Trend Dir Breaked to: ", ToXString(iDir));
|
||||||
|
trendDir = iDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
SpecifiedClean(swings);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Supports ...
|
||||||
|
if (detectSupports)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOHCL support;
|
||||||
|
bool hasSupport = eaPatternDetector.HasSupport(
|
||||||
|
cBar,
|
||||||
|
support //
|
||||||
|
);
|
||||||
|
if (hasSupport)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XBoxZone supportBox;
|
||||||
|
has = ToSupportBox(support, supportBox);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Draw Box ...
|
||||||
|
XCBoxObject *iObj;
|
||||||
|
has = eaDrawer.DrawBox(
|
||||||
|
supportBox,
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Apply Style ...
|
||||||
|
eaDrawer.ApplyStyle(
|
||||||
|
iObj,
|
||||||
|
eaDrawer.boxBullishStyle //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
draws.Add(iObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ZeroMemory(iObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
supportBox.Clean();
|
||||||
|
}
|
||||||
|
support.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect Resistance ...
|
||||||
|
if (detectResistance)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOHCL resistance;
|
||||||
|
bool hasResistance = eaPatternDetector.HasResistance(
|
||||||
|
cBar,
|
||||||
|
resistance //
|
||||||
|
);
|
||||||
|
if (hasResistance)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XBoxZone resistanceBox;
|
||||||
|
has = ToResistanceBox(resistance, resistanceBox);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Draw Box ...
|
||||||
|
XCBoxObject *iObj;
|
||||||
|
has = eaDrawer.DrawBox(
|
||||||
|
resistanceBox,
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Apply Style ...
|
||||||
|
eaDrawer.ApplyStyle(
|
||||||
|
iObj,
|
||||||
|
eaDrawer.boxBearishStyle //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
draws.Add(iObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ZeroMemory(iObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
resistanceBox.Clean();
|
||||||
|
}
|
||||||
|
resistance.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
cBar.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
@@ -1260,4 +1260,104 @@ void ValidateBoxes(
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a Bar to Support Box ...
|
||||||
|
*
|
||||||
|
* @param bar: XOHCL, Specified Bar ...
|
||||||
|
* @param box: XBoxZone, destination Box ...
|
||||||
|
* @param toTime: datetime, Specified Box to Time ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool ToSupportBox(
|
||||||
|
XOHCL &bar,
|
||||||
|
XBoxZone &box,
|
||||||
|
datetime toTime = NULL //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
box.Clean();
|
||||||
|
toTime = NormalizeTime(toTime);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = bar.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
box.to = toTime;
|
||||||
|
box.from = bar.time;
|
||||||
|
box.lower = bar.low;
|
||||||
|
box.symbol = bar.symbol;
|
||||||
|
box.period = bar.period;
|
||||||
|
box.upper = bar.GetDown();
|
||||||
|
box.dir = X_DIRECTION_BULLISH;
|
||||||
|
box.type = "Support";
|
||||||
|
|
||||||
|
//
|
||||||
|
result = box.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
box.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a Bar to Resistance Box ...
|
||||||
|
*
|
||||||
|
* @param bar: XOHCL, Specified Bar ...
|
||||||
|
* @param box: XBoxZone, destination Box ...
|
||||||
|
* @param toTime: datetime, Specified Box to Time ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool ToResistanceBox(
|
||||||
|
XOHCL &bar,
|
||||||
|
XBoxZone &box,
|
||||||
|
datetime toTime = NULL //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
box.Clean();
|
||||||
|
toTime = NormalizeTime(toTime);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = bar.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
box.to = toTime;
|
||||||
|
box.from = bar.time;
|
||||||
|
box.upper = bar.high;
|
||||||
|
box.symbol = bar.symbol;
|
||||||
|
box.period = bar.period;
|
||||||
|
box.lower = bar.GetUp();
|
||||||
|
box.dir = X_DIRECTION_BEARISH;
|
||||||
|
box.type = "Resistance";
|
||||||
|
|
||||||
|
//
|
||||||
|
result = box.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
box.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
Reference in New Issue
Block a user