last ...
This commit is contained in:
@@ -533,3 +533,553 @@
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Bar Has Signal Based on Strategy 1 ...
|
||||
* POI ...
|
||||
*
|
||||
* @param bar: XOHCL, reference to Bar ...
|
||||
* @param zone: XBoxZone, reference to holds affected zone ...
|
||||
* @param targets: XTarget, reference to detected Signal's Targets collections ...
|
||||
* @param dir: ENUM_X_DIRECTION, detected Signal's direction ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool Strategy1HasSignal(
|
||||
XOHCL &bar,
|
||||
XBoxZone &zone,
|
||||
XTarget &targets[],
|
||||
ENUM_X_DIRECTION &dir //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
zone.Clean();
|
||||
XClean(targets);
|
||||
dir = X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
result = bar.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int scoreBullish = 0;
|
||||
int scoreBearish = 0;
|
||||
bool isBullish = false;
|
||||
bool isBearish = false;
|
||||
int barIndex = bar.Index() + 1;
|
||||
|
||||
//
|
||||
// Initialize Indexed Bar ...
|
||||
XOHCL iBar;
|
||||
result = iBar.Init(bar.symbol, bar.period, barIndex);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
// #region Swings/OrderFlow ...
|
||||
//
|
||||
// Swings ...
|
||||
XBoxZone swingLow;
|
||||
XBoxZone swingHigh;
|
||||
bool hasSwings = poiDetector.DetectRecentSwings(
|
||||
swingHigh,
|
||||
swingLow,
|
||||
barIndex //
|
||||
);
|
||||
|
||||
//
|
||||
// Order Flow ...
|
||||
|
||||
//
|
||||
XBoxZone bullishOrderFlow[];
|
||||
result = poiDetector.HasOrderFlow(bullishOrderFlow, barIndex, 4, X_DIRECTION_BULLISH, 15);
|
||||
|
||||
//
|
||||
XBoxZone bearishOrderFlow[];
|
||||
result = poiDetector.HasOrderFlow(bearishOrderFlow, barIndex, 4, X_DIRECTION_BEARISH, 15);
|
||||
// #endregion
|
||||
|
||||
// #region Reading Conditions and Scoring ...
|
||||
//
|
||||
// ATR ...
|
||||
bool isATRUp = kiParser.IsVolatilityHigh(barIndex) ||
|
||||
kiParser.IsVolatilitySwitchdToHigh(barIndex);
|
||||
|
||||
// #region KI ...
|
||||
//
|
||||
bool isKIReadyForBullish = ((kiParser.IsKIFastBearish(barIndex) ||
|
||||
(kiParser.IsKIFastBullish(barIndex) &&
|
||||
iBar.IsRejected(kiHelper.GetKIFast(barIndex), X_DIRECTION_BULLISH))) &&
|
||||
kiParser.IsKISlowBullish(barIndex));
|
||||
|
||||
//
|
||||
bool isKIReadyForBearish = ((kiParser.IsKIFastBullish(barIndex) ||
|
||||
(kiParser.IsKIFastBearish(barIndex) &&
|
||||
iBar.IsRejected(kiHelper.GetKIFast(barIndex), X_DIRECTION_BEARISH))) &&
|
||||
kiParser.IsKISlowBearish(barIndex));
|
||||
|
||||
//
|
||||
bool isKIBandBullish = (kiHelper.GetKIUpper(barIndex) > kiHelper.GetKIUpper(barIndex + 1) ||
|
||||
kiHelper.GetKILower(barIndex) > kiHelper.GetKILower(barIndex + 1));
|
||||
|
||||
//
|
||||
bool isKIBandBearish = (kiHelper.GetKIUpper(barIndex) < kiHelper.GetKIUpper(barIndex + 1) ||
|
||||
kiHelper.GetKILower(barIndex) < kiHelper.GetKILower(barIndex + 1));
|
||||
|
||||
//
|
||||
bool isKIBullish = (kiParser.IsKIFastBullish(barIndex) ||
|
||||
kiParser.IsKIFastSwitchedToBullish(barIndex)) &&
|
||||
(kiParser.IsKISlowBullish(barIndex) ||
|
||||
kiParser.IsKISlowSwitchedToBullish(barIndex));
|
||||
if (isKIBullish)
|
||||
{
|
||||
scoreBullish++;
|
||||
}
|
||||
|
||||
//
|
||||
bool isKIBearish = (kiParser.IsKIFastBearish(barIndex) ||
|
||||
kiParser.IsKIFastSwitchedToBearish(barIndex)) &&
|
||||
(kiParser.IsKISlowBearish(barIndex) ||
|
||||
kiParser.IsKISlowSwitchedToBearish(barIndex));
|
||||
if (isKIBearish)
|
||||
{
|
||||
scoreBearish++;
|
||||
}
|
||||
// #endregion
|
||||
|
||||
// #region KI Wave ...
|
||||
//
|
||||
bool isKIWaveBullish = kiParser.IsKIWaveBullish(barIndex) ||
|
||||
kiParser.IsKIWaveSwitchedToBullish(barIndex);
|
||||
if (isKIWaveBullish)
|
||||
{
|
||||
scoreBullish++;
|
||||
}
|
||||
|
||||
//
|
||||
bool isKIWaveBearish = kiParser.IsKIWaveBearish(barIndex) ||
|
||||
kiParser.IsKIWaveSwitchedToBearish(barIndex);
|
||||
if (isKIWaveBearish)
|
||||
{
|
||||
scoreBearish++;
|
||||
}
|
||||
// #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
|
||||
// #endregion
|
||||
|
||||
// #region Summarize Directional Conditions ...
|
||||
//
|
||||
isBullish =
|
||||
isATRUp &&
|
||||
isLowerTFBullish &&
|
||||
isKIReadyForBullish &&
|
||||
isCandlestickBullish &&
|
||||
scoreBullish >= 2 &&
|
||||
(isKIBullish ||
|
||||
isMaBullish ||
|
||||
isKIWaveBullish ||
|
||||
isKIBandBullish);
|
||||
|
||||
//
|
||||
isBearish =
|
||||
isATRUp &&
|
||||
isLowerTFBearish &&
|
||||
isKIReadyForBearish &&
|
||||
isCandlestickBearish &&
|
||||
scoreBearish >= 2 &&
|
||||
(isKIBearish ||
|
||||
isMaBearish ||
|
||||
isKIWaveBearish ||
|
||||
isKIBandBearish);
|
||||
// #endregion
|
||||
|
||||
//
|
||||
// Validate Conditions ...
|
||||
result = isBullish || isBearish;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
iBar.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Select Operational Zone ...
|
||||
ENUM_X_DIRECTION patternsDir[];
|
||||
ENUM_X_BAR_PATTERN patterns[];
|
||||
|
||||
//
|
||||
// GetAllBarPatters(patterns, patternsDir);
|
||||
|
||||
//
|
||||
// XAUUSD ...
|
||||
|
||||
//
|
||||
// FVG ...
|
||||
Add(X_BAR_PATTERN_FVG, patterns);
|
||||
Add(X_DIRECTION_NONE, patternsDir);
|
||||
|
||||
//
|
||||
// Piercing ...
|
||||
Add(X_BAR_PATTERN_PIERCING, patterns);
|
||||
Add(X_DIRECTION_NONE, patternsDir);
|
||||
|
||||
//
|
||||
// EURUSD ...
|
||||
|
||||
//
|
||||
// Add(X_BAR_PATTERN_STAR, patterns);
|
||||
// Add(X_DIRECTION_NONE, patternsDir);
|
||||
|
||||
// //
|
||||
// Add(X_BAR_PATTERN_SUPPORT, patterns);
|
||||
// Add(X_DIRECTION_NONE, patternsDir);
|
||||
|
||||
// //
|
||||
// Add(X_BAR_PATTERN_RESISTANCE, patterns);
|
||||
// Add(X_DIRECTION_NONE, patternsDir);
|
||||
|
||||
//
|
||||
// Add(X_BAR_PATTERN_SIGNALKEY, patterns);
|
||||
// Add(X_DIRECTION_NONE, patternsDir);
|
||||
|
||||
//
|
||||
int nearestOrderFlowIDX = -1;
|
||||
if (isBullish)
|
||||
{
|
||||
//
|
||||
// Looking Bar Patterns to Detect Zone ...
|
||||
isBullish =
|
||||
isBullish &&
|
||||
HasChild(bullishOrderFlow) &&
|
||||
// bullishOrderFlow[0].lower == iBar.low &&
|
||||
// poiDetector.HasNearZone(
|
||||
// nearestOrderFlowIDX,
|
||||
// iBar.close,
|
||||
// 5,
|
||||
// bullishOrderFlow //
|
||||
// ) &&
|
||||
poiDetector.HasRecentPatternTouched(
|
||||
zone,
|
||||
patterns,
|
||||
patternsDir,
|
||||
iBar.close,
|
||||
barIndex,
|
||||
5,
|
||||
5,
|
||||
iBar.period,
|
||||
X_DIRECTION_BULLISH //
|
||||
);
|
||||
}
|
||||
else if (isBearish)
|
||||
{
|
||||
//
|
||||
// Looking Bar Patterns to Detect Zone ...
|
||||
isBearish =
|
||||
isBearish &&
|
||||
HasChild(bearishOrderFlow) &&
|
||||
// bearishOrderFlow[0].upper == iBar.high &&
|
||||
// poiDetector.HasNearZone(
|
||||
// nearestOrderFlowIDX,
|
||||
// iBar.close,
|
||||
// 5,
|
||||
// bearishOrderFlow //
|
||||
// ) &&
|
||||
poiDetector.HasRecentPatternTouched(
|
||||
zone,
|
||||
patterns,
|
||||
patternsDir,
|
||||
iBar.close,
|
||||
barIndex,
|
||||
5,
|
||||
5,
|
||||
iBar.period,
|
||||
X_DIRECTION_BEARISH //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Refactor Result ...
|
||||
result = result &&
|
||||
zone.IsValid();
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
// Refine Zone ...
|
||||
poiDetector.RefineZone(zone);
|
||||
|
||||
//
|
||||
// SL Refactoring ...
|
||||
|
||||
//
|
||||
XOHCL toBar;
|
||||
if (zone.ToBar(toBar))
|
||||
{
|
||||
//
|
||||
int to = zone.ToIndex();
|
||||
int from = zone.FromIndex();
|
||||
int length = from - to;
|
||||
double iValue =
|
||||
isBullish
|
||||
? toBar.FindLowest(length, MODE_LOW)
|
||||
: isBearish
|
||||
? toBar.FindHighest(length, MODE_HIGH)
|
||||
: EMPTY_VALUE;
|
||||
if (NotEmptyZero(iValue))
|
||||
{
|
||||
//
|
||||
if (isBullish)
|
||||
{
|
||||
zone.lower = MathMin(zone.lower, iValue);
|
||||
}
|
||||
|
||||
//
|
||||
if (isBearish)
|
||||
{
|
||||
zone.upper = MathMax(zone.upper, iValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
toBar.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// 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();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Draws ...
|
||||
bool draw = true;
|
||||
if (draw && result)
|
||||
{
|
||||
//
|
||||
int drawn = 0;
|
||||
|
||||
//
|
||||
XPOIDrawConfig config;
|
||||
config.Default();
|
||||
|
||||
//
|
||||
if (zone.IsValid())
|
||||
{
|
||||
//
|
||||
drawn++;
|
||||
|
||||
//
|
||||
config.zonesWidth = 3;
|
||||
config.bullishColor = clrYellow;
|
||||
config.bearishColor = clrOrange;
|
||||
|
||||
//
|
||||
poiDrawer.DrawZone(zone, config);
|
||||
|
||||
//
|
||||
config.Default();
|
||||
}
|
||||
|
||||
//
|
||||
if (swingLow.IsValid())
|
||||
{
|
||||
//
|
||||
drawn++;
|
||||
poiDrawer.DrawZone(swingLow, config);
|
||||
}
|
||||
|
||||
//
|
||||
if (swingHigh.IsValid())
|
||||
{
|
||||
//
|
||||
drawn++;
|
||||
poiDrawer.DrawZone(swingHigh, config);
|
||||
}
|
||||
|
||||
//
|
||||
if (HasChild(bullishOrderFlow))
|
||||
{
|
||||
//
|
||||
drawn += ArraySize(bullishOrderFlow);
|
||||
poiDrawer.DrawZones(bullishOrderFlow, config);
|
||||
}
|
||||
|
||||
//
|
||||
if (HasChild(bearishOrderFlow))
|
||||
{
|
||||
//
|
||||
drawn += ArraySize(bearishOrderFlow);
|
||||
poiDrawer.DrawZones(bearishOrderFlow, config);
|
||||
}
|
||||
|
||||
//
|
||||
if (drawn > 0)
|
||||
{
|
||||
// DebugBreak();
|
||||
}
|
||||
|
||||
//
|
||||
config.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Check and Prepare Direction ...
|
||||
dir =
|
||||
isBullish
|
||||
? X_DIRECTION_BULLISH
|
||||
: isBearish ? X_DIRECTION_BEARISH
|
||||
: X_DIRECTION_NONE;
|
||||
result = result &&
|
||||
HasDirection(dir);
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
// Prepare Zone ...
|
||||
double entry = GetEntry(iBar.symbol, dir);
|
||||
|
||||
//
|
||||
double upper = isBullish
|
||||
? entry
|
||||
: zone.upper;
|
||||
double lower = isBullish
|
||||
? zone.lower
|
||||
: entry;
|
||||
datetime to = bar.time;
|
||||
datetime from = isBullish
|
||||
? zone.from
|
||||
: zone.from;
|
||||
result = zone.Init(
|
||||
iBar.symbol,
|
||||
iBar.period,
|
||||
upper,
|
||||
lower,
|
||||
from,
|
||||
to,
|
||||
dir,
|
||||
"XS1" //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup Resources ...
|
||||
iBar.Clean();
|
||||
swingLow.Clean();
|
||||
XClean(patterns);
|
||||
swingHigh.Clean();
|
||||
XClean(patternsDir);
|
||||
XClean(bullishOrderFlow);
|
||||
XClean(bearishOrderFlow);
|
||||
|
||||
//
|
||||
result =
|
||||
result &&
|
||||
zone.IsValid() &&
|
||||
HasDirection(dir);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user