last ...
This commit is contained in:
@@ -1686,3 +1686,293 @@ bool Strategy1HasSignal(
|
|||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// //
|
||||||
|
// isBullish =
|
||||||
|
// // majorSupport.IsValid() &&
|
||||||
|
// minorSupport.IsValid() &&
|
||||||
|
// poiDetector.IsKIBullishPOI(barIndex) &&
|
||||||
|
// poiDetector.HasCandlestickDirection(
|
||||||
|
// iBar,
|
||||||
|
// X_DIRECTION_BULLISH //
|
||||||
|
// ) &&
|
||||||
|
// IsTFBullishPattern(barIndex, PERIOD_M5) &&
|
||||||
|
// // minorSupport.lower <= majorSupport.upper &&
|
||||||
|
// poiDetector.IsNearZone(iBar.close, minorSupport, 10);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// isBearish =
|
||||||
|
// // majorResistance.IsValid() &&
|
||||||
|
// minorResistance.IsValid() &&
|
||||||
|
// poiDetector.IsKIBearishPOI(barIndex) &&
|
||||||
|
// poiDetector.HasCandlestickDirection(
|
||||||
|
// iBar,
|
||||||
|
// X_DIRECTION_BEARISH //
|
||||||
|
// ) &&
|
||||||
|
// IsTFBearishPattern(barIndex, PERIOD_M5) &&
|
||||||
|
// // minorResistance.upper >= majorResistance.lower &&
|
||||||
|
// poiDetector.IsNearZone(iBar.close, minorResistance, 10);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Base Conditions ...
|
||||||
|
// isBullish =
|
||||||
|
// isBullish &&
|
||||||
|
// IsBullishPOILongEntry(barIndex);
|
||||||
|
// isBearish =
|
||||||
|
// isBearish &&
|
||||||
|
// IsBearishPOIShortEntry(barIndex);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Do Validation and Filtering Market Structure if required ...
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Validate near Support / Resistance Zones ...
|
||||||
|
// bool validateNearSupRes = true;
|
||||||
|
// if (result && validateNearSupRes)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// // Configs ...
|
||||||
|
// int loopback = 100;
|
||||||
|
// int validationLength = 7;
|
||||||
|
// double nearThreshold = 5;
|
||||||
|
// int validationRetests = 0;
|
||||||
|
// int validationLoopback = 100;
|
||||||
|
// double validationThreshold = 5;
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Filling Zones ...
|
||||||
|
// XBoxZone zones[];
|
||||||
|
// if (isBullish)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// // Detect Supports ...
|
||||||
|
// poiDetector.DetectSupports(
|
||||||
|
// zones,
|
||||||
|
// barIndex,
|
||||||
|
// loopback,
|
||||||
|
// true,
|
||||||
|
// validationLength, // Validation Length ...
|
||||||
|
// validationRetests, // Min Retest ...
|
||||||
|
// validationThreshold, // Retest Threshold ...
|
||||||
|
// validationLoopback, // Retest Loopback ...
|
||||||
|
// symbol,
|
||||||
|
// period //
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// else if (isBearish)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// // Detect Resistances ...
|
||||||
|
// poiDetector.DetectResistances(
|
||||||
|
// zones,
|
||||||
|
// barIndex,
|
||||||
|
// loopback,
|
||||||
|
// true,
|
||||||
|
// validationLength, // Validation Length ...
|
||||||
|
// validationRetests, // Min Retest ...
|
||||||
|
// validationThreshold, // Retest Threshold ...
|
||||||
|
// validationLoopback, // Retest Loopback ...
|
||||||
|
// symbol,
|
||||||
|
// period //
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (HasChild(zones))
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// XPOIDrawConfig iConfig;
|
||||||
|
// iConfig.Default();
|
||||||
|
|
||||||
|
// //
|
||||||
|
// poiDrawer.DrawZones(zones, iConfig);
|
||||||
|
// iConfig.Clean();
|
||||||
|
// // DebugBreak();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Check Has Nearest ...
|
||||||
|
// int nearIDX = -1;
|
||||||
|
// result = poiDetector.HasNearZone(
|
||||||
|
// nearIDX,
|
||||||
|
// bar.close,
|
||||||
|
// nearThreshold,
|
||||||
|
// zones //
|
||||||
|
// );
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Validate ...
|
||||||
|
// if (!result)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// isBullish = false;
|
||||||
|
// isBearish = false;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Validate by ATR Rising/Falling ...
|
||||||
|
// bool validateByATRRaisFalling = true;
|
||||||
|
// if (result && validateByATRRaisFalling)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// // Bullish:
|
||||||
|
// // - ATR Lower Rising ...
|
||||||
|
// // - ATR Over ATR Ma ...
|
||||||
|
// // Bearsih:
|
||||||
|
// // - ATR Upper Falling ...
|
||||||
|
// // - ATR Over ATR Ma ...
|
||||||
|
|
||||||
|
// //
|
||||||
|
// isBullish =
|
||||||
|
// isBullish &&
|
||||||
|
// // kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) &&
|
||||||
|
// kiHelper.GetKILower(barIndex) > kiHelper.GetKILower(barIndex + 1);
|
||||||
|
// isBearish =
|
||||||
|
// isBearish &&
|
||||||
|
// // kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) &&
|
||||||
|
// kiHelper.GetKIUpper(barIndex) < kiHelper.GetKIUpper(barIndex + 1);
|
||||||
|
// result = isBullish || isBearish;
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (!result)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// isBullish = false;
|
||||||
|
// isBearish = false;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Validate by RSI ...
|
||||||
|
// bool validatebyRSI = false;
|
||||||
|
// if (result && validatebyRSI)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// // Bullish:
|
||||||
|
// // - Not in Over Baught;
|
||||||
|
// // - Rising;
|
||||||
|
// // Bearish :
|
||||||
|
// // - Not in Over Sold;
|
||||||
|
// // - Falling;
|
||||||
|
|
||||||
|
// //
|
||||||
|
// isBullish =
|
||||||
|
// isBullish &&
|
||||||
|
// !kiParser.IsRSIOverbought(barIndex) &&
|
||||||
|
// kiHelper.GetRSI(barIndex) > kiHelper.GetRSI(barIndex + 1);
|
||||||
|
// isBearish =
|
||||||
|
// isBearish &&
|
||||||
|
// !kiParser.IsRSIOversold(barIndex) &&
|
||||||
|
// kiHelper.GetRSI(barIndex) < kiHelper.GetRSI(barIndex + 1);
|
||||||
|
// result = isBullish || isBearish;
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (!result)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// isBullish = false;
|
||||||
|
// isBearish = false;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Validate by iBar Pattern ...
|
||||||
|
// // in this Strategy we have PinBar or SignalKeyBar ...
|
||||||
|
// bool validateByBarPatterns = false;
|
||||||
|
// if (result && validateByBarPatterns)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// // Pin ...
|
||||||
|
// bool isPinBar = poiDetector.IsPinnedBar(
|
||||||
|
// iBar,
|
||||||
|
// dir //
|
||||||
|
// );
|
||||||
|
// bool isPinBarBullish =
|
||||||
|
// isPinBar &&
|
||||||
|
// IsXBullish(dir);
|
||||||
|
// bool isPinBarBearish =
|
||||||
|
// isPinBar &&
|
||||||
|
// IsXBearish(dir);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Engulfe ...
|
||||||
|
// bool isEngulfed = poiDetector.IsEngulfedBar(
|
||||||
|
// iBar,
|
||||||
|
// dir //
|
||||||
|
// );
|
||||||
|
// bool isEngulfedBullish =
|
||||||
|
// isEngulfed &&
|
||||||
|
// IsXBullish(dir);
|
||||||
|
// bool isEngulfedBearish =
|
||||||
|
// isEngulfed &&
|
||||||
|
// IsXBearish(dir);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Signal Key Bar ...
|
||||||
|
// bool isSignalKeyBar = poiDetector.IsSignalKeyBarPattern(
|
||||||
|
// iBar,
|
||||||
|
// dir //
|
||||||
|
// );
|
||||||
|
// bool isSignalKeyBarBullish =
|
||||||
|
// isSignalKeyBar &&
|
||||||
|
// IsXBullish(dir);
|
||||||
|
// bool isSignalKeyBarBearish =
|
||||||
|
// isSignalKeyBar &&
|
||||||
|
// IsXBearish(dir);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// isBullish =
|
||||||
|
// isBullish &&
|
||||||
|
// (isEngulfedBullish);
|
||||||
|
// isBearish =
|
||||||
|
// isBearish &&
|
||||||
|
// (isEngulfedBearish);
|
||||||
|
|
||||||
|
// // //
|
||||||
|
// // isBullish =
|
||||||
|
// // isBullish &&
|
||||||
|
// // (isPinBarBullish ||
|
||||||
|
// // isEngulfedBullish ||
|
||||||
|
// // isSignalKeyBarBullish);
|
||||||
|
// // isBearish =
|
||||||
|
// // isBearish &&
|
||||||
|
// // (isPinBarBearish ||
|
||||||
|
// // isEngulfedBearish ||
|
||||||
|
// // isSignalKeyBarBearish);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// result = isBullish || isBearish;
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (!result)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// isBullish = false;
|
||||||
|
// isBearish = false;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//
|
||||||
|
// Recent Support ...
|
||||||
|
// else if (HasChild(supports))
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// tmpSupportIDX = GetYoungestBelow(iBar.close, supports);
|
||||||
|
// if (IsValidIndex(tmpSupportIDX))
|
||||||
|
// {
|
||||||
|
// zone = supports[tmpSupportIDX];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//
|
||||||
|
// Recent Resistance ...
|
||||||
|
// else if (HasChild(resistances))
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// tmpResistanceIDX = GetYoungestAbove(iBar.close, resistances);
|
||||||
|
// if (IsValidIndex(tmpResistanceIDX))
|
||||||
|
// {
|
||||||
|
// zone = resistances[tmpResistanceIDX];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|||||||
@@ -2379,6 +2379,127 @@ struct XPatternAnalysis
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract All Exists Patterns Pivots ...
|
||||||
|
*
|
||||||
|
* @param dest: XBoxZone, collection reference to holds Extracted Patterns ...
|
||||||
|
* @param forDir: ENUM_X_DIRECTION, Specified Direction of Extractions ...
|
||||||
|
*
|
||||||
|
* @return ( int )
|
||||||
|
*/
|
||||||
|
int GetPatterns(
|
||||||
|
XBoxZone &dest[],
|
||||||
|
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prepare ...
|
||||||
|
XClean(dest);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
bool has = IsValid() &&
|
||||||
|
HasChild(patterns);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Do ...
|
||||||
|
XOHCL iBar;
|
||||||
|
XPivot iPivot;
|
||||||
|
XBoxZone iZone;
|
||||||
|
int count = ArraySize(patterns);
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
has = GetPattern(iBar, iPivot, iZone, patterns[i], forDir);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
AddIfNotExists(iZone, dest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = ArraySize(dest);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleanup ...
|
||||||
|
iBar.Clean();
|
||||||
|
iZone.Clean();
|
||||||
|
iPivot.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract All Exists Patterns Pivots ...
|
||||||
|
*
|
||||||
|
* @param dest: XPivot, collection reference to holds Extracted Patterns ...
|
||||||
|
* @param zones: XBoxZone, collection reference to holds Extracted Patterns ...
|
||||||
|
* @param forDir: ENUM_X_DIRECTION, Specified Direction of Extractions ...
|
||||||
|
*
|
||||||
|
* @return ( int )
|
||||||
|
*/
|
||||||
|
int GetPatterns(
|
||||||
|
XPivot &dest[],
|
||||||
|
XBoxZone &zones[],
|
||||||
|
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prepare ...
|
||||||
|
XClean(dest);
|
||||||
|
XClean(zones);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
bool has = IsValid() &&
|
||||||
|
HasChild(patterns);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Do ...
|
||||||
|
XOHCL iBar;
|
||||||
|
XPivot iPivot;
|
||||||
|
XBoxZone iZone;
|
||||||
|
int count = ArraySize(patterns);
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
has = GetPattern(iBar, iPivot, iZone, patterns[i], forDir);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddIfNotExists(iPivot, dest);
|
||||||
|
AddIfNotExists(iZone, zones);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = ArraySize(dest);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleanup ...
|
||||||
|
iBar.Clean();
|
||||||
|
iZone.Clean();
|
||||||
|
iPivot.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -925,6 +925,70 @@ class XCX121XKIHelperParser : XCBase
|
|||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsVolatilitySwitchdToHigh(int barIndex = 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalize ...
|
||||||
|
barIndex = NormalizeBarIndex(barIndex);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
result = IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
double atr = helper.GetATR(barIndex);
|
||||||
|
double atrPrev = helper.GetATR(barIndex + 1);
|
||||||
|
double atrMa = helper.GetATRSmoothed(barIndex);
|
||||||
|
double atrMaPrev = helper.GetATRSmoothed(barIndex + 1);
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
atr > atrMa &&
|
||||||
|
atrPrev <= atrMaPrev;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsVolatilitySwitchdToLow(int barIndex = 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalize ...
|
||||||
|
barIndex = NormalizeBarIndex(barIndex);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
result = IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
double atr = helper.GetATR(barIndex);
|
||||||
|
double atrPrev = helper.GetATR(barIndex + 1);
|
||||||
|
double atrMa = helper.GetATRSmoothed(barIndex);
|
||||||
|
double atrMaPrev = helper.GetATRSmoothed(barIndex + 1);
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
atr < atrMa &&
|
||||||
|
atrPrev >= atrMaPrev;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
// #endregion
|
// #endregion
|
||||||
|
|
||||||
// #region RSI ...
|
// #region RSI ...
|
||||||
|
|||||||
@@ -973,11 +973,15 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
int score = 0;
|
||||||
|
int scoreBullish = 0;
|
||||||
|
int scoreBearish = 0;
|
||||||
bool isBullish = false;
|
bool isBullish = false;
|
||||||
bool isBearish = false;
|
bool isBearish = false;
|
||||||
int barIndex = bar.Index() + 1;
|
int barIndex = bar.Index() + 1;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
// Initialize Indexed Bar ...
|
||||||
XOHCL iBar;
|
XOHCL iBar;
|
||||||
result = iBar.Init(bar.symbol, bar.period, barIndex);
|
result = iBar.Init(bar.symbol, bar.period, barIndex);
|
||||||
if (!result)
|
if (!result)
|
||||||
@@ -985,7 +989,7 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
// #region Market Structure ...
|
||||||
XBoxZone supports[];
|
XBoxZone supports[];
|
||||||
XBoxZone resistances[];
|
XBoxZone resistances[];
|
||||||
XBoxZone minorSupport;
|
XBoxZone minorSupport;
|
||||||
@@ -1001,8 +1005,8 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
|
|||||||
majorResistance,
|
majorResistance,
|
||||||
barIndex,
|
barIndex,
|
||||||
bar.symbol,
|
bar.symbol,
|
||||||
bar.period, // Minor ...
|
iBar.period, // Minor ...
|
||||||
PERIOD_H1, // Major ...
|
PERIOD_H1, // Major ...
|
||||||
50,
|
50,
|
||||||
14,
|
14,
|
||||||
21,
|
21,
|
||||||
@@ -1010,35 +1014,166 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
|
|||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
isBullish = majorSupport.IsValid() &&
|
// Refining Zones ...
|
||||||
minorSupport.IsValid() &&
|
int refineLoopback = 500;
|
||||||
poiDetector.HasCandlestickDirection(
|
double refineBreakThreshold = 10;
|
||||||
iBar,
|
ENUM_X_PRICE refineBreakBy = X_PRICE_CLOSE;
|
||||||
X_DIRECTION_BULLISH //
|
poiDetector.RefineStructure(
|
||||||
) &&
|
supports,
|
||||||
IsTFBullishPattern(barIndex, PERIOD_M5) &&
|
resistances,
|
||||||
minorSupport.lower <= majorSupport.upper &&
|
minorSupport,
|
||||||
poiDetector.IsNearZone(iBar.close, minorSupport, 10);
|
majorSupport,
|
||||||
|
minorResistance,
|
||||||
|
majorResistance,
|
||||||
|
refineLoopback,
|
||||||
|
refineBreakThreshold,
|
||||||
|
refineBreakBy //
|
||||||
|
);
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region Reading Conditions and Scoring ...
|
||||||
|
//
|
||||||
|
// ATR ...
|
||||||
|
bool isATRUp = kiParser.IsVolatilityHigh(barIndex) ||
|
||||||
|
kiParser.IsVolatilitySwitchdToHigh(barIndex);
|
||||||
|
|
||||||
|
// #region KI ...
|
||||||
|
//
|
||||||
|
bool isKIBullish = (kiParser.IsKIFastBullish(barIndex) ||
|
||||||
|
kiParser.IsKIFastSwitchedToBullish(barIndex)) &&
|
||||||
|
(kiParser.IsKISlowBullish(barIndex) ||
|
||||||
|
kiParser.IsKISlowSwitchedToBullish(barIndex));
|
||||||
|
if (isKIBullish)
|
||||||
|
{
|
||||||
|
scoreBullish++;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
isBearish = majorResistance.IsValid() &&
|
bool isKIBearish = (kiParser.IsKIFastBearish(barIndex) ||
|
||||||
minorResistance.IsValid() &&
|
kiParser.IsKIFastSwitchedToBearish(barIndex)) &&
|
||||||
poiDetector.HasCandlestickDirection(
|
(kiParser.IsKISlowBearish(barIndex) ||
|
||||||
iBar,
|
kiParser.IsKISlowSwitchedToBearish(barIndex));
|
||||||
X_DIRECTION_BEARISH //
|
if (isKIBearish)
|
||||||
) &&
|
{
|
||||||
IsTFBearishPattern(barIndex, PERIOD_M5) &&
|
scoreBearish++;
|
||||||
minorResistance.upper >= majorResistance.lower &&
|
}
|
||||||
poiDetector.IsNearZone(iBar.close, minorResistance, 10);
|
// #endregion
|
||||||
|
|
||||||
|
// #region KI Wave ...
|
||||||
|
//
|
||||||
|
bool isKIWaveBullish = kiParser.IsKIWaveBullish(barIndex) ||
|
||||||
|
kiParser.IsKIWaveSwitchedToBullish(barIndex);
|
||||||
|
if (isKIWaveBullish)
|
||||||
|
{
|
||||||
|
scoreBullish++;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Retrieve Base Conditions ...
|
bool isKIWaveBearish = kiParser.IsKIWaveBearish(barIndex) ||
|
||||||
// isBullish =
|
kiParser.IsKIWaveSwitchedToBearish(barIndex);
|
||||||
// isBullish &&
|
if (isKIWaveBearish)
|
||||||
// IsBullishPOILongEntry(barIndex);
|
{
|
||||||
// isBearish =
|
scoreBearish++;
|
||||||
// isBearish &&
|
}
|
||||||
// IsBearishPOIShortEntry(barIndex);
|
// #endregion
|
||||||
|
|
||||||
|
// #region MA ...
|
||||||
|
//
|
||||||
|
bool isMaBullish = kiParser.IsMACrossoverBullish(barIndex) ||
|
||||||
|
kiParser.IsMACrossoverSwitchedToBullish(barIndex);
|
||||||
|
if (isMaBullish)
|
||||||
|
{
|
||||||
|
scoreBullish++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isMaBearish = kiParser.IsMACrossoverBearish(barIndex) ||
|
||||||
|
kiParser.IsMACrossoverSwitchedToBearish(barIndex);
|
||||||
|
if (isMaBearish)
|
||||||
|
{
|
||||||
|
scoreBearish++;
|
||||||
|
}
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region LowerTF Candlstick ...
|
||||||
|
//
|
||||||
|
bool isLowerTFBullish = IsTFBullishPattern(barIndex, PERIOD_M5);
|
||||||
|
if (isLowerTFBullish)
|
||||||
|
{
|
||||||
|
scoreBullish++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isLowerTFBearish = IsTFBearishPattern(barIndex, PERIOD_M5);
|
||||||
|
if (isLowerTFBearish)
|
||||||
|
{
|
||||||
|
scoreBearish++;
|
||||||
|
}
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region Candlestick ...
|
||||||
|
//
|
||||||
|
bool isCandlestickBullish = poiDetector.HasCandlestickDirection(
|
||||||
|
iBar,
|
||||||
|
X_DIRECTION_BULLISH //
|
||||||
|
);
|
||||||
|
if (isCandlestickBullish)
|
||||||
|
{
|
||||||
|
scoreBullish++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isCandlestickBearish = poiDetector.HasCandlestickDirection(
|
||||||
|
iBar,
|
||||||
|
X_DIRECTION_BEARISH //
|
||||||
|
);
|
||||||
|
if (isCandlestickBearish)
|
||||||
|
{
|
||||||
|
scoreBearish++;
|
||||||
|
}
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region NearInside Support/Resistance ...
|
||||||
|
//
|
||||||
|
int tmpSupportIDX = -1;
|
||||||
|
bool isNearSupport = poiDetector.HasNearZone(tmpSupportIDX, iBar.close, 5, supports);
|
||||||
|
if (isNearSupport)
|
||||||
|
{
|
||||||
|
scoreBullish++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int tmpResistanceIDX = -1;
|
||||||
|
bool isNearResistance = poiDetector.HasNearZone(tmpResistanceIDX, iBar.close, 5, resistances);
|
||||||
|
if (isNearResistance)
|
||||||
|
{
|
||||||
|
scoreBearish++;
|
||||||
|
}
|
||||||
|
// #endregion
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
//
|
||||||
|
// Summarize Directional Conditions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
isBullish =
|
||||||
|
isATRUp &&
|
||||||
|
scoreBullish >= 4 &&
|
||||||
|
(isMaBullish ||
|
||||||
|
isNearSupport ||
|
||||||
|
isKIWaveBullish ||
|
||||||
|
isLowerTFBullish ||
|
||||||
|
isCandlestickBullish);
|
||||||
|
|
||||||
|
//
|
||||||
|
isBearish =
|
||||||
|
isATRUp &&
|
||||||
|
scoreBearish >= 4 &&
|
||||||
|
(isMaBearish ||
|
||||||
|
isNearResistance ||
|
||||||
|
isKIWaveBearish ||
|
||||||
|
isLowerTFBearish ||
|
||||||
|
isCandlestickBearish);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Validate Conditions ...
|
// Validate Conditions ...
|
||||||
@@ -1059,8 +1194,110 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
// Select Operational Zone ...
|
||||||
|
if (isBullish)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Nearest Support ...
|
||||||
|
if (IsValidIndex(tmpSupportIDX))
|
||||||
|
{
|
||||||
|
zone = supports[tmpSupportIDX];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Make Sure Zone Exists ...
|
||||||
|
if (!zone.IsValid())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Looking Bar Patterns to Detect Zone ...
|
||||||
|
poiDetector.HasRecentPatternTouched(zone, iBar.close, barIndex, 5, 5, iBar.period, X_DIRECTION_BULLISH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isBearish)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Nearest Resistance ...
|
||||||
|
if (IsValidIndex(tmpResistanceIDX))
|
||||||
|
{
|
||||||
|
zone = resistances[tmpResistanceIDX];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Make Sure Zone Exists ...
|
||||||
|
if (!zone.IsValid())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Looking Bar Patterns to Detect Zone ...
|
||||||
|
poiDetector.HasRecentPatternTouched(zone, iBar.close, barIndex, 5, 5, iBar.period, X_DIRECTION_BEARISH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Refactor Result ...
|
||||||
|
result = result &&
|
||||||
|
zone.IsValid();
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
poiDetector.RefineZone(zone);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Do Directional Validation ...
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Bullish ...
|
||||||
|
if (isBullish)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
isBullish =
|
||||||
|
isBullish &&
|
||||||
|
isLowerTFBullish &&
|
||||||
|
isCandlestickBullish;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish ...
|
||||||
|
if (isBearish)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
isBearish =
|
||||||
|
isBearish &&
|
||||||
|
isLowerTFBearish &&
|
||||||
|
isCandlestickBearish;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = isBullish || isBearish;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
isBullish = false;
|
||||||
|
isBearish = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Result ...
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
iBar.Clean();
|
||||||
|
XClean(supports);
|
||||||
|
XClean(resistances);
|
||||||
|
minorSupport.Clean();
|
||||||
|
majorSupport.Clean();
|
||||||
|
minorResistance.Clean();
|
||||||
|
majorResistance.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Draws ...
|
||||||
bool draw = true;
|
bool draw = true;
|
||||||
if (draw)
|
if (draw && result)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
int drawn = 0;
|
int drawn = 0;
|
||||||
@@ -1069,6 +1306,24 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
|
|||||||
XPOIDrawConfig config;
|
XPOIDrawConfig config;
|
||||||
config.Default();
|
config.Default();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (zone.IsValid())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
drawn++;
|
||||||
|
|
||||||
|
//
|
||||||
|
config.zonesWidth = 3;
|
||||||
|
config.bullishColor = clrYellow;
|
||||||
|
config.bearishColor = clrOrange;
|
||||||
|
|
||||||
|
//
|
||||||
|
poiDrawer.DrawZone(zone, config);
|
||||||
|
|
||||||
|
//
|
||||||
|
config.Default();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Minors ...
|
// Minors ...
|
||||||
if (minorSupport.IsValid())
|
if (minorSupport.IsValid())
|
||||||
@@ -1114,237 +1369,6 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// //
|
|
||||||
// // Do Validation and Filtering Market Structure if required ...
|
|
||||||
|
|
||||||
// //
|
|
||||||
// // Validate near Support / Resistance Zones ...
|
|
||||||
// bool validateNearSupRes = true;
|
|
||||||
// if (result && validateNearSupRes)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// // Configs ...
|
|
||||||
// int loopback = 100;
|
|
||||||
// int validationLength = 7;
|
|
||||||
// double nearThreshold = 5;
|
|
||||||
// int validationRetests = 0;
|
|
||||||
// int validationLoopback = 100;
|
|
||||||
// double validationThreshold = 5;
|
|
||||||
|
|
||||||
// //
|
|
||||||
// // Filling Zones ...
|
|
||||||
// XBoxZone zones[];
|
|
||||||
// if (isBullish)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// // Detect Supports ...
|
|
||||||
// poiDetector.DetectSupports(
|
|
||||||
// zones,
|
|
||||||
// barIndex,
|
|
||||||
// loopback,
|
|
||||||
// true,
|
|
||||||
// validationLength, // Validation Length ...
|
|
||||||
// validationRetests, // Min Retest ...
|
|
||||||
// validationThreshold, // Retest Threshold ...
|
|
||||||
// validationLoopback, // Retest Loopback ...
|
|
||||||
// symbol,
|
|
||||||
// period //
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// else if (isBearish)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// // Detect Resistances ...
|
|
||||||
// poiDetector.DetectResistances(
|
|
||||||
// zones,
|
|
||||||
// barIndex,
|
|
||||||
// loopback,
|
|
||||||
// true,
|
|
||||||
// validationLength, // Validation Length ...
|
|
||||||
// validationRetests, // Min Retest ...
|
|
||||||
// validationThreshold, // Retest Threshold ...
|
|
||||||
// validationLoopback, // Retest Loopback ...
|
|
||||||
// symbol,
|
|
||||||
// period //
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// //
|
|
||||||
// if (HasChild(zones))
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// XPOIDrawConfig iConfig;
|
|
||||||
// iConfig.Default();
|
|
||||||
|
|
||||||
// //
|
|
||||||
// poiDrawer.DrawZones(zones, iConfig);
|
|
||||||
// iConfig.Clean();
|
|
||||||
// // DebugBreak();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// //
|
|
||||||
// // Check Has Nearest ...
|
|
||||||
// int nearIDX = -1;
|
|
||||||
// result = poiDetector.HasNearZone(
|
|
||||||
// nearIDX,
|
|
||||||
// bar.close,
|
|
||||||
// nearThreshold,
|
|
||||||
// zones //
|
|
||||||
// );
|
|
||||||
|
|
||||||
// //
|
|
||||||
// // Validate ...
|
|
||||||
// if (!result)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// isBullish = false;
|
|
||||||
// isBearish = false;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// //
|
|
||||||
// // Validate by ATR Rising/Falling ...
|
|
||||||
// bool validateByATRRaisFalling = true;
|
|
||||||
// if (result && validateByATRRaisFalling)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// // Bullish:
|
|
||||||
// // - ATR Lower Rising ...
|
|
||||||
// // - ATR Over ATR Ma ...
|
|
||||||
// // Bearsih:
|
|
||||||
// // - ATR Upper Falling ...
|
|
||||||
// // - ATR Over ATR Ma ...
|
|
||||||
|
|
||||||
// //
|
|
||||||
// isBullish =
|
|
||||||
// isBullish &&
|
|
||||||
// // kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) &&
|
|
||||||
// kiHelper.GetKILower(barIndex) > kiHelper.GetKILower(barIndex + 1);
|
|
||||||
// isBearish =
|
|
||||||
// isBearish &&
|
|
||||||
// // kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) &&
|
|
||||||
// kiHelper.GetKIUpper(barIndex) < kiHelper.GetKIUpper(barIndex + 1);
|
|
||||||
// result = isBullish || isBearish;
|
|
||||||
|
|
||||||
// //
|
|
||||||
// if (!result)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// isBullish = false;
|
|
||||||
// isBearish = false;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// //
|
|
||||||
// // Validate by RSI ...
|
|
||||||
// bool validatebyRSI = false;
|
|
||||||
// if (result && validatebyRSI)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// // Bullish:
|
|
||||||
// // - Not in Over Baught;
|
|
||||||
// // - Rising;
|
|
||||||
// // Bearish :
|
|
||||||
// // - Not in Over Sold;
|
|
||||||
// // - Falling;
|
|
||||||
|
|
||||||
// //
|
|
||||||
// isBullish =
|
|
||||||
// isBullish &&
|
|
||||||
// !kiParser.IsRSIOverbought(barIndex) &&
|
|
||||||
// kiHelper.GetRSI(barIndex) > kiHelper.GetRSI(barIndex + 1);
|
|
||||||
// isBearish =
|
|
||||||
// isBearish &&
|
|
||||||
// !kiParser.IsRSIOversold(barIndex) &&
|
|
||||||
// kiHelper.GetRSI(barIndex) < kiHelper.GetRSI(barIndex + 1);
|
|
||||||
// result = isBullish || isBearish;
|
|
||||||
|
|
||||||
// //
|
|
||||||
// if (!result)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// isBullish = false;
|
|
||||||
// isBearish = false;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// //
|
|
||||||
// // Validate by iBar Pattern ...
|
|
||||||
// // in this Strategy we have PinBar or SignalKeyBar ...
|
|
||||||
// bool validateByBarPatterns = false;
|
|
||||||
// if (result && validateByBarPatterns)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// // Pin ...
|
|
||||||
// bool isPinBar = poiDetector.IsPinnedBar(
|
|
||||||
// iBar,
|
|
||||||
// dir //
|
|
||||||
// );
|
|
||||||
// bool isPinBarBullish =
|
|
||||||
// isPinBar &&
|
|
||||||
// IsXBullish(dir);
|
|
||||||
// bool isPinBarBearish =
|
|
||||||
// isPinBar &&
|
|
||||||
// IsXBearish(dir);
|
|
||||||
|
|
||||||
// //
|
|
||||||
// // Engulfe ...
|
|
||||||
// bool isEngulfed = poiDetector.IsEngulfedBar(
|
|
||||||
// iBar,
|
|
||||||
// dir //
|
|
||||||
// );
|
|
||||||
// bool isEngulfedBullish =
|
|
||||||
// isEngulfed &&
|
|
||||||
// IsXBullish(dir);
|
|
||||||
// bool isEngulfedBearish =
|
|
||||||
// isEngulfed &&
|
|
||||||
// IsXBearish(dir);
|
|
||||||
|
|
||||||
// //
|
|
||||||
// // Signal Key Bar ...
|
|
||||||
// bool isSignalKeyBar = poiDetector.IsSignalKeyBarPattern(
|
|
||||||
// iBar,
|
|
||||||
// dir //
|
|
||||||
// );
|
|
||||||
// bool isSignalKeyBarBullish =
|
|
||||||
// isSignalKeyBar &&
|
|
||||||
// IsXBullish(dir);
|
|
||||||
// bool isSignalKeyBarBearish =
|
|
||||||
// isSignalKeyBar &&
|
|
||||||
// IsXBearish(dir);
|
|
||||||
|
|
||||||
// //
|
|
||||||
// isBullish =
|
|
||||||
// isBullish &&
|
|
||||||
// (isEngulfedBullish);
|
|
||||||
// isBearish =
|
|
||||||
// isBearish &&
|
|
||||||
// (isEngulfedBearish);
|
|
||||||
|
|
||||||
// // //
|
|
||||||
// // isBullish =
|
|
||||||
// // isBullish &&
|
|
||||||
// // (isPinBarBullish ||
|
|
||||||
// // isEngulfedBullish ||
|
|
||||||
// // isSignalKeyBarBullish);
|
|
||||||
// // isBearish =
|
|
||||||
// // isBearish &&
|
|
||||||
// // (isPinBarBearish ||
|
|
||||||
// // isEngulfedBearish ||
|
|
||||||
// // isSignalKeyBarBearish);
|
|
||||||
|
|
||||||
// //
|
|
||||||
// result = isBullish || isBearish;
|
|
||||||
|
|
||||||
// //
|
|
||||||
// if (!result)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// isBullish = false;
|
|
||||||
// isBearish = false;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check and Prepare Direction ...
|
// Check and Prepare Direction ...
|
||||||
dir =
|
dir =
|
||||||
@@ -1352,7 +1376,8 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
|
|||||||
? X_DIRECTION_BULLISH
|
? X_DIRECTION_BULLISH
|
||||||
: isBearish ? X_DIRECTION_BEARISH
|
: isBearish ? X_DIRECTION_BEARISH
|
||||||
: X_DIRECTION_NONE;
|
: X_DIRECTION_NONE;
|
||||||
result = HasDirection(dir);
|
result = result &&
|
||||||
|
HasDirection(dir);
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -1376,14 +1401,14 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
|
|||||||
//
|
//
|
||||||
double upper = isBullish
|
double upper = isBullish
|
||||||
? entry
|
? entry
|
||||||
: minorSupport.upper;
|
: zone.upper;
|
||||||
double lower = isBullish
|
double lower = isBullish
|
||||||
? minorResistance.lower
|
? zone.lower
|
||||||
: entry;
|
: entry;
|
||||||
datetime to = bar.time;
|
datetime to = bar.time;
|
||||||
datetime from = isBullish
|
datetime from = isBullish
|
||||||
? minorSupport.from
|
? zone.from
|
||||||
: minorResistance.from;
|
: zone.from;
|
||||||
result = zone.Init(
|
result = zone.Init(
|
||||||
iBar.symbol,
|
iBar.symbol,
|
||||||
iBar.period,
|
iBar.period,
|
||||||
@@ -1394,18 +1419,6 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
|
|||||||
dir,
|
dir,
|
||||||
"XS1" //
|
"XS1" //
|
||||||
);
|
);
|
||||||
if (result)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
XPOIDrawConfig iConfig;
|
|
||||||
iConfig.Default();
|
|
||||||
|
|
||||||
//
|
|
||||||
poiDrawer.DrawZone(zone, iConfig);
|
|
||||||
|
|
||||||
//
|
|
||||||
// DebugBreak();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1123,6 +1123,71 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
|
|||||||
// #endregion
|
// #endregion
|
||||||
|
|
||||||
// #region XDetectors ...
|
// #region XDetectors ...
|
||||||
|
bool IsKIPOI(
|
||||||
|
ENUM_X_DIRECTION &dir,
|
||||||
|
int barIndex = 0 //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
dir = X_DIRECTION_NONE;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isBullish = IsKIBullishPOI(barIndex);
|
||||||
|
bool isBearish = IsKIBearishPOI(barIndex);
|
||||||
|
|
||||||
|
//
|
||||||
|
dir = isBullish
|
||||||
|
? X_DIRECTION_BULLISH
|
||||||
|
: isBearish
|
||||||
|
? X_DIRECTION_BEARISH
|
||||||
|
: X_DIRECTION_NONE;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = HasDirection(dir);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsKIBullishPOI(int barIndex = 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
kiParser.IsValid() &&
|
||||||
|
kiParser.IsKISlowBullish(barIndex) &&
|
||||||
|
kiParser.IsKIFastBearish(barIndex);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsKIBearishPOI(int barIndex = 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
kiParser.IsValid() &&
|
||||||
|
kiParser.IsKISlowBearish(barIndex) &&
|
||||||
|
kiParser.IsKIFastBullish(barIndex);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
bool IsKISignal(
|
bool IsKISignal(
|
||||||
ENUM_X_DIRECTION &dir, //
|
ENUM_X_DIRECTION &dir, //
|
||||||
int barIndex = 0 //
|
int barIndex = 0 //
|
||||||
@@ -1798,6 +1863,85 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
|
|||||||
XClean(tmpResistances);
|
XClean(tmpResistances);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RefineStructure(
|
||||||
|
XBoxZone &supports[],
|
||||||
|
XBoxZone &resistances[],
|
||||||
|
XBoxZone &minorSupport,
|
||||||
|
XBoxZone &majorSupport,
|
||||||
|
XBoxZone &minorResistance,
|
||||||
|
XBoxZone &majorResistance,
|
||||||
|
int loopback = 500,
|
||||||
|
double breakThreshold = 5,
|
||||||
|
ENUM_X_PRICE breakBy = X_PRICE_CLOSE //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Support ...
|
||||||
|
if (HasChild(supports))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < ArraySize(supports); i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
RefineZone(
|
||||||
|
supports[i],
|
||||||
|
loopback,
|
||||||
|
breakThreshold,
|
||||||
|
breakBy //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Resistance ...
|
||||||
|
if (HasChild(resistances))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < ArraySize(resistances); i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
RefineZone(
|
||||||
|
resistances[i],
|
||||||
|
loopback,
|
||||||
|
breakThreshold,
|
||||||
|
breakBy //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
RefineZone(
|
||||||
|
minorSupport,
|
||||||
|
loopback,
|
||||||
|
breakThreshold,
|
||||||
|
breakBy //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
RefineZone(
|
||||||
|
majorSupport,
|
||||||
|
loopback,
|
||||||
|
breakThreshold,
|
||||||
|
breakBy //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
RefineZone(
|
||||||
|
minorResistance,
|
||||||
|
loopback,
|
||||||
|
breakThreshold,
|
||||||
|
breakBy //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
RefineZone(
|
||||||
|
majorResistance,
|
||||||
|
loopback,
|
||||||
|
breakThreshold,
|
||||||
|
breakBy //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
int CounteZoneTouches(
|
int CounteZoneTouches(
|
||||||
XBoxZone &zone,
|
XBoxZone &zone,
|
||||||
double threshold = 10,
|
double threshold = 10,
|
||||||
@@ -1942,6 +2086,277 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
|
|||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RefineZone(
|
||||||
|
XBoxZone &zone,
|
||||||
|
int loopback = 500,
|
||||||
|
double breakThreshold = 5,
|
||||||
|
ENUM_X_PRICE breakBy = X_PRICE_CLOSE //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool has =
|
||||||
|
zone.IsValid() &&
|
||||||
|
IsXValid(breakBy);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalize ...
|
||||||
|
loopback = NormalizeInt(loopback, 1);
|
||||||
|
breakThreshold = NormalizeDouble(breakThreshold, 0, 50);
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL iBar;
|
||||||
|
int start = zone.FromIndex();
|
||||||
|
int end = start + loopback;
|
||||||
|
double point = GetPoints(zone.symbol);
|
||||||
|
double breakDistance = point * breakThreshold;
|
||||||
|
for (int i = start; i < end; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
has = iBar.Init(zone.symbol, zone.period, i);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Check Rejections ...
|
||||||
|
has = zone.IsBullish()
|
||||||
|
? iBar.low < zone.upper &&
|
||||||
|
iBar.GetDown() > zone.upper
|
||||||
|
: iBar.high > zone.upper &&
|
||||||
|
iBar.GetUp() < zone.upper;
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
iBar.time,
|
||||||
|
zone.tests //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Break ...
|
||||||
|
double bPrice = iBar.GetPrice(breakBy);
|
||||||
|
has =
|
||||||
|
zone.IsBullish()
|
||||||
|
? bPrice < zone.lower - breakDistance
|
||||||
|
: bPrice > zone.upper + breakDistance;
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
zone.breakAt = iBar.time;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
iBar.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
has = IsXValid(zone.breakAt);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
zone.at = zone.from;
|
||||||
|
zone.from = zone.breakAt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region VolatilitySwitchedHigh ...
|
||||||
|
bool IsVolatilitySwitchedHigh(
|
||||||
|
int barIndex = 0,
|
||||||
|
int loopback = 3 //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
||||||
|
loopback = NormalizeInt(loopback, 1);
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = barIndex; i < barIndex + loopback; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
result = kiParser.IsVolatilitySwitchdToHigh(i);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region Bar Patterns ...
|
||||||
|
bool HasRecentPatternTouched(
|
||||||
|
XBoxZone &zone,
|
||||||
|
double price,
|
||||||
|
int barIndex = 0,
|
||||||
|
int loopback = 5,
|
||||||
|
int threshold = 5,
|
||||||
|
ENUM_TIMEFRAMES forPeriod = NULL,
|
||||||
|
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
zone.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
result = NotEmptyZero(price);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalize ...
|
||||||
|
loopback = NormalizeInt(loopback, 2);
|
||||||
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
||||||
|
if (IsXValid(forPeriod))
|
||||||
|
{
|
||||||
|
forPeriod = period;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL iBar;
|
||||||
|
bool has = false;
|
||||||
|
int iBullishIDX = -1;
|
||||||
|
int iBearishIDX = -1;
|
||||||
|
bool isBullish = false;
|
||||||
|
bool isBearish = false;
|
||||||
|
XBoxZone iBullishZones[];
|
||||||
|
XBoxZone iBearishZones[];
|
||||||
|
XPatternAnalysis iAnalysis;
|
||||||
|
XPatternAnalysisConfig iConfig;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Preparing Pattern Analysis Config ...
|
||||||
|
iConfig.Default();
|
||||||
|
iConfig.FullPattern();
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = barIndex; i < barIndex + loopback; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Initialize Bar ...
|
||||||
|
has = iBar.Init(symbol, forPeriod, i);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Analyse Patterns ...
|
||||||
|
has = AnalyseBarPatterns(iBar, iAnalysis, iConfig);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
iBar.Clean();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish ...
|
||||||
|
has = iAnalysis.Count(X_DIRECTION_BULLISH) > 0;
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
iAnalysis.GetPatterns(iBullishZones, X_DIRECTION_BULLISH);
|
||||||
|
has = HasChild(iBullishZones);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
has = HasNearZone(
|
||||||
|
iBullishIDX,
|
||||||
|
price,
|
||||||
|
threshold,
|
||||||
|
iBullishZones //
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
isBullish = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish ...
|
||||||
|
has = iAnalysis.Count(X_DIRECTION_BEARISH) > 0;
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
iAnalysis.GetPatterns(iBearishZones, X_DIRECTION_BEARISH);
|
||||||
|
has = HasChild(iBearishZones);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
has = HasNearZone(
|
||||||
|
iBearishIDX,
|
||||||
|
price,
|
||||||
|
threshold,
|
||||||
|
iBearishZones //
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
isBearish = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Summarizing Result ...
|
||||||
|
has =
|
||||||
|
HasDirection(forDir)
|
||||||
|
? (isBullish && !isBearish && IsXBullish(forDir)) ||
|
||||||
|
(isBearish && !isBullish && IsXBearish(forDir))
|
||||||
|
: (isBullish && !isBearish) || (isBearish && !isBullish);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Fill Zones ...
|
||||||
|
if (isBullish)
|
||||||
|
{
|
||||||
|
zone = iBullishZones[iBullishIDX];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
zone = iBearishZones[iBearishIDX];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
iBar.Clean();
|
||||||
|
iAnalysis.Clean();
|
||||||
|
XClean(iBullishZones);
|
||||||
|
XClean(iBearishZones);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Next
|
||||||
|
|
||||||
|
//
|
||||||
|
iBar.Clean();
|
||||||
|
iConfig.Clean();
|
||||||
|
iAnalysis.Clean();
|
||||||
|
XClean(iBullishZones);
|
||||||
|
XClean(iBearishZones);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
// #endregion
|
// #endregion
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user