last ...
This commit is contained in:
@@ -30,6 +30,84 @@
|
||||
//
|
||||
// Definitions ...
|
||||
|
||||
enum ENUM_X_DETECTOR_ZONE_ACTION
|
||||
{
|
||||
X_DETECTOR_ZONE_ACTION_NONE = 0,
|
||||
//
|
||||
// Support ...
|
||||
X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_DETECTED = 1,
|
||||
X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_BREAKED = 2,
|
||||
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_DETECTED = 3,
|
||||
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_BREAKED = 4,
|
||||
//
|
||||
// Resistance ...
|
||||
X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_DETECTED = 5,
|
||||
X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_BREAKED = 6,
|
||||
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_DETECTED = 7,
|
||||
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_BREAKED = 8,
|
||||
};
|
||||
|
||||
bool IsXValid(ENUM_X_DETECTOR_ZONE_ACTION value)
|
||||
{
|
||||
return value != X_DETECTOR_ZONE_ACTION_NONE;
|
||||
}
|
||||
|
||||
string ToXString(ENUM_X_DETECTOR_ZONE_ACTION value)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
if (!IsXValid(value))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
switch (value)
|
||||
{
|
||||
//
|
||||
case X_DETECTOR_ZONE_ACTION_NONE:
|
||||
result = "NONE";
|
||||
break;
|
||||
//
|
||||
case X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_DETECTED:
|
||||
result = "MAJOR_SUPPORT_DETECTED";
|
||||
break;
|
||||
//
|
||||
case X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_BREAKED:
|
||||
result = "MAJOR_SUPPORT_BREAKED";
|
||||
break;
|
||||
//
|
||||
case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_DETECTED:
|
||||
result = "MINOR_SUPPORT_DETECTED";
|
||||
break;
|
||||
//
|
||||
case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_BREAKED:
|
||||
result = "MINOR_SUPPORT_BREAKED";
|
||||
break;
|
||||
//
|
||||
case X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_DETECTED:
|
||||
result = "MAJOR_RESISTANCE_DETECTED";
|
||||
break;
|
||||
//
|
||||
case X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_BREAKED:
|
||||
result = "MAJOR_RESISTANCE_BREAKED";
|
||||
break;
|
||||
//
|
||||
case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_DETECTED:
|
||||
result = "MINOR_RESISTANCE_DETECTED";
|
||||
break;
|
||||
//
|
||||
case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_BREAKED:
|
||||
result = "MINOR_RESISTANCE_BREAKED";
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Implementation ...
|
||||
class XCMarketPatternDetector : public XCBase
|
||||
@@ -40,6 +118,13 @@ class XCMarketPatternDetector : public XCBase
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
XBoxZone zones[];
|
||||
XBoxZone majorSupport;
|
||||
XBoxZone minorSupport;
|
||||
XBoxZone majorResistance;
|
||||
XBoxZone minorResistance;
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
XCMarketPatternDetector()
|
||||
@@ -2661,6 +2746,124 @@ class XCMarketPatternDetector : public XCBase
|
||||
return result;
|
||||
}
|
||||
|
||||
int UpdateZones(
|
||||
XOHCL &bar,
|
||||
ENUM_X_DETECTOR_ZONE_ACTION &actions[],
|
||||
int loopback = 1500 //
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
// Prepare ...
|
||||
XClean(actions);
|
||||
|
||||
//
|
||||
// Normalize ...
|
||||
loopback = NormalizeInt(loopback, 100);
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool has = bar.IsValid();
|
||||
if (!has)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int barIndex = bar.Index();
|
||||
|
||||
//
|
||||
// Collect Zones ...
|
||||
bool hasZone = HasChild(zones);
|
||||
if (!hasZone) {
|
||||
//
|
||||
int start = barIndex;
|
||||
int end = barIndex + loopback;
|
||||
for (int i = start; i < end; i++) {
|
||||
//
|
||||
// Extract Validated Zones ...
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Supports ...
|
||||
bool hasMajorSupport = majorSupport.IsValid();
|
||||
bool hasMinorSupport = minorSupport.IsValid();
|
||||
|
||||
//
|
||||
// Look For Major Support ...
|
||||
if (!hasMajorSupport)
|
||||
{
|
||||
//
|
||||
minorSupport.Clean();
|
||||
hasMinorSupport = false;
|
||||
}
|
||||
|
||||
//
|
||||
// For Looking up Minor Support, we
|
||||
// have to Ensure Major Support Exists ...
|
||||
if (hasMajorSupport)
|
||||
{
|
||||
//
|
||||
// Look for Minor Support ...
|
||||
if (!hasMinorSupport)
|
||||
{
|
||||
}
|
||||
//
|
||||
// Refine exists Minor Support ...
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Resistances ...
|
||||
bool hasMajorResistance = majorResistance.IsValid();
|
||||
bool hasMinorResistance = minorResistance.IsValid();
|
||||
|
||||
//
|
||||
// Look For Major Resistance ...
|
||||
if (!hasMajorResistance)
|
||||
{
|
||||
//
|
||||
minorResistance.Clean();
|
||||
hasMinorResistance = false;
|
||||
}
|
||||
|
||||
//
|
||||
// For Looking up Minor Resistance, we
|
||||
// have to Ensure Major Resistance Exists ...
|
||||
if (hasMajorResistance)
|
||||
{
|
||||
//
|
||||
// Look for Minor Resistance ...
|
||||
if (!hasMinorResistance)
|
||||
{
|
||||
}
|
||||
//
|
||||
// Refine exists Minor Resistance ...
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (!HasChild(actions))
|
||||
{
|
||||
//
|
||||
Add(
|
||||
X_DETECTOR_ZONE_ACTION_NONE,
|
||||
actions //
|
||||
);
|
||||
}
|
||||
result = ArraySize(actions);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
@@ -1221,6 +1221,229 @@ class XCXFIMAHelper : public XCBaseHelper
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Specified Bar has HK Bond Based Trend or not ...
|
||||
*
|
||||
* @param dir: ENUM_X_DIRECTION, reference to holds trend direction, if exists ...
|
||||
* @param barIndex: int, Specified Bar Index ...
|
||||
* @param validationLength: int, validation of trend ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool HasHKBasedTrend(
|
||||
ENUM_X_DIRECTION &dir,
|
||||
int barIndex = 0,
|
||||
int validationLength = 5 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Prepare ...
|
||||
dir = X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
// Normalize ...
|
||||
barIndex = NormalizeBarIndex(barIndex);
|
||||
validationLength = NormalizeInt(validationLength, 1);
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
result = IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Do ...
|
||||
|
||||
//
|
||||
// Define Requirements ...
|
||||
XOHCL iBar;
|
||||
double hkUpper;
|
||||
double hkLower;
|
||||
bool has = false;
|
||||
int bullishCount = 0;
|
||||
int bearishCount = 0;
|
||||
bool isBullish = false;
|
||||
bool isBearish = false;
|
||||
|
||||
//
|
||||
// Count Bullish/Bearish Directions ...
|
||||
int start = barIndex + 1;
|
||||
int end = start + validationLength;
|
||||
for (int i = start; i < end; i++)
|
||||
{
|
||||
//
|
||||
// Reading Requirements ...
|
||||
|
||||
//
|
||||
// Read Indexed Bar ...
|
||||
iBar.Clean();
|
||||
result = iBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
i //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// Reading Values ...
|
||||
hkUpper = GetHKBondUpper(i);
|
||||
hkLower = GetHKBondLower(i);
|
||||
result = NotEmptyZero(hkUpper) &&
|
||||
NotEmptyZero(hkLower);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Trend ...
|
||||
|
||||
//
|
||||
// Bullish ...
|
||||
isBullish = iBar.low > hkLower;
|
||||
if (isBullish)
|
||||
{
|
||||
bullishCount++;
|
||||
}
|
||||
|
||||
//
|
||||
// Bearish ...
|
||||
isBearish = iBar.high < hkUpper;
|
||||
if (isBearish)
|
||||
{
|
||||
bearishCount++;
|
||||
}
|
||||
|
||||
//
|
||||
iBar.Clean();
|
||||
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// Validate Results ...
|
||||
isBullish =
|
||||
bullishCount >= validationLength;
|
||||
isBearish =
|
||||
bearishCount >= validationLength;
|
||||
|
||||
//
|
||||
result = (isBullish && !isBearish) ||
|
||||
(isBearish && !isBullish);
|
||||
|
||||
//
|
||||
// Setting Direction if Has Trend ...
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
dir = isBullish
|
||||
? X_DIRECTION_BULLISH
|
||||
: X_DIRECTION_BEARISH;
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
iBar.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Specified Bar has HK Bond Based Trend Switch or not ...
|
||||
*
|
||||
* @param dir: ENUM_X_DIRECTION, reference to holds trend direction, if exists ...
|
||||
* @param barIndex: int, Specified Bar Index ...
|
||||
* @param validationLength: int, validation of trend ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsHKBasedTrendSwitch(
|
||||
ENUM_X_DIRECTION &dir,
|
||||
int barIndex = 0,
|
||||
int validationLength = 5 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Prepare ...
|
||||
dir = X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
// Normalize ...
|
||||
barIndex = NormalizeBarIndex(barIndex);
|
||||
validationLength = NormalizeInt(validationLength, 1);
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
result = IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Do ...
|
||||
|
||||
//
|
||||
bool hasTrend = HasHKBasedTrend(
|
||||
dir,
|
||||
barIndex,
|
||||
validationLength //
|
||||
);
|
||||
bool isBullish = hasTrend &&
|
||||
IsXBullish(dir);
|
||||
bool isBearish = hasTrend &&
|
||||
IsXBearish(dir);
|
||||
|
||||
//
|
||||
bool hasPTrend = HasHKBasedTrend(
|
||||
dir,
|
||||
barIndex + 1,
|
||||
validationLength //
|
||||
);
|
||||
bool isPBullish = hasPTrend &&
|
||||
IsXBullish(dir);
|
||||
bool isPBearish = hasPTrend &&
|
||||
IsXBearish(dir);
|
||||
|
||||
//
|
||||
dir = X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
// Checking Result ...
|
||||
isBullish = isBullish && !isPBullish;
|
||||
isBearish = isBearish && !isPBearish;
|
||||
|
||||
//
|
||||
result =
|
||||
(isBullish && !isBearish) ||
|
||||
(isBearish && !isBullish);
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
dir = isBullish
|
||||
? X_DIRECTION_BULLISH
|
||||
: X_DIRECTION_BEARISH;
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Specified Bar has SAR Switch or not ...
|
||||
*
|
||||
|
||||
@@ -372,56 +372,37 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
|
||||
structureConfig,
|
||||
barIndex //
|
||||
);
|
||||
poiDrawer.drawnObjects.Clear();
|
||||
poiDrawer.DrawMarketStructure(
|
||||
structure,
|
||||
structureDrawConfig //
|
||||
);
|
||||
|
||||
// //
|
||||
// // Testing Porposes ...
|
||||
// has = fimaHelper.IsBoundaryFakeBreaked(
|
||||
// iDir,
|
||||
// barIndex,
|
||||
// X_PRICE_CLOSE,
|
||||
// X_PRICE_CLOSE //
|
||||
// poiDrawer.drawnObjects.Clear();
|
||||
// poiDrawer.DrawMarketStructure(
|
||||
// structure,
|
||||
// structureDrawConfig //
|
||||
// );
|
||||
// if (has)
|
||||
// {
|
||||
// Print("Faked Break ...");
|
||||
// }
|
||||
|
||||
//
|
||||
// Disable Signallers ...
|
||||
// has = false;
|
||||
// iDir = X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
// Strategy 1 ...
|
||||
// Works on Support or Resistances Areas ...
|
||||
has = Strategy1HasSignal(
|
||||
iBar,
|
||||
iZone,
|
||||
iTargets,
|
||||
iDir,
|
||||
iFIMAConditions,
|
||||
structure //
|
||||
);
|
||||
// has = Strategy1HasSignal(
|
||||
// iBar,
|
||||
// iZone,
|
||||
// iTargets,
|
||||
// iDir,
|
||||
// iFIMAConditions,
|
||||
// structure //
|
||||
// );
|
||||
|
||||
//
|
||||
// Strategy 2 ...
|
||||
// Works on MA Crosses ...
|
||||
has = false;
|
||||
if (!has)
|
||||
{
|
||||
//
|
||||
// has = Strategy2HasSignal(
|
||||
// iBar,
|
||||
// iZone,
|
||||
// iTargets,
|
||||
// iDir,
|
||||
// iFIMAConditions,
|
||||
// structure //
|
||||
// );
|
||||
has = Strategy2HasSignal(
|
||||
iBar,
|
||||
iZone,
|
||||
iTargets,
|
||||
iDir,
|
||||
iFIMAConditions,
|
||||
structure //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -763,7 +744,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
|
||||
//
|
||||
Print("Affected Zone ...");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Draw Bar Pattern ...
|
||||
// poiDrawer.DrawPatternAnalysis(barAnalysis, structureDrawConfig.barAnalysisDrawConfig);
|
||||
@@ -905,37 +886,83 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
|
||||
}
|
||||
|
||||
//
|
||||
// Detect Specified MA Cross ...
|
||||
// result = HasDirection(structure.maCrossDir);
|
||||
result = false;
|
||||
bool isBullish = false;
|
||||
bool isBearish = false;
|
||||
|
||||
//
|
||||
// Do Signal Detection ...
|
||||
|
||||
//
|
||||
// result = fimaHelper.HasHKBasedTrend(dir, bar.Index(), 1);
|
||||
// bool isBullish = result &&
|
||||
// IsXBullish(dir);
|
||||
// bool isBearish = result &&
|
||||
// IsXBearish(dir);
|
||||
|
||||
//
|
||||
// Get Bar Pattern ...
|
||||
// XPatternAnalysis barAnalysis;
|
||||
// result =
|
||||
// poiDetector.AnalyseBarPatterns(
|
||||
// bar,
|
||||
// barAnalysis,
|
||||
// structureConfig.barsAnalysisConfig //
|
||||
// );
|
||||
// bool isBullish = barAnalysis.Count(X_DIRECTION_BULLISH) >= 4;
|
||||
// bool isBearish = barAnalysis.Count(X_DIRECTION_BEARISH) >= 4;
|
||||
|
||||
//
|
||||
// Prepare zone ...
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
zone.to = bar.time;
|
||||
zone.from = GetBarTime(
|
||||
bar.symbol,
|
||||
bar.period,
|
||||
bar.Index() + 2 //
|
||||
);
|
||||
zone.symbol = bar.symbol;
|
||||
zone.period = bar.period;
|
||||
// zone.dir = structure.maCrossDir;
|
||||
zone.lower = bar.FindLowest(2, MODE_LOW);
|
||||
zone.upper = bar.FindHighest(2, MODE_HIGH);
|
||||
// zone.type = name + "_" + ToXString(structure.maCrossDir);
|
||||
// Draw Bar Patterns Analysis ...
|
||||
// poiDrawer.DrawPatternAnalysis(
|
||||
// barAnalysis,
|
||||
// structureDrawConfig.barAnalysisDrawConfig //
|
||||
// );
|
||||
|
||||
//
|
||||
if (isBullish)
|
||||
{
|
||||
Print("Bullish HK Bond Trend ...");
|
||||
}
|
||||
|
||||
//
|
||||
if (isBearish)
|
||||
{
|
||||
Print("Bearish HK Bond Trend ...");
|
||||
}
|
||||
|
||||
//
|
||||
Print(ToXString(dir), " Detected ...");
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
result = false;
|
||||
dir = X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
// Draw Custom Requirements ...
|
||||
|
||||
//
|
||||
// Prepare Decision Zone ...
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
// Create Decision Zone and Validate it ...
|
||||
|
||||
//
|
||||
result = zone.IsValid();
|
||||
}
|
||||
|
||||
//
|
||||
// Check Result ...
|
||||
// Provide Direction and Targets if Required ...
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
// dir = structure.maCrossDir;
|
||||
// Handle Signal Direction ...
|
||||
|
||||
//
|
||||
// Handle Targets Detection ...
|
||||
|
||||
Reference in New Issue
Block a user