last backup ...
This commit is contained in:
@@ -0,0 +1,621 @@
|
||||
/**
|
||||
* 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 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 ...
|
||||
if (isBullish)
|
||||
{
|
||||
//
|
||||
// Looking Bar Patterns to Detect Zone ...
|
||||
poiDetector.HasRecentPatternTouched(zone, iBar.close, barIndex, 5, 5, iBar.period, X_DIRECTION_BULLISH);
|
||||
}
|
||||
else if (isBearish)
|
||||
{
|
||||
//
|
||||
// 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)
|
||||
{
|
||||
//
|
||||
// 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();
|
||||
}
|
||||
|
||||
//
|
||||
config.Clean();
|
||||
|
||||
//
|
||||
if (drawn > 0)
|
||||
{
|
||||
// DebugBreak();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check and Prepare Direction ...
|
||||
dir =
|
||||
isBullish
|
||||
? X_DIRECTION_BULLISH
|
||||
: isBearish ? X_DIRECTION_BEARISH
|
||||
: X_DIRECTION_NONE;
|
||||
result = result &&
|
||||
HasDirection(dir);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
iBar.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Prepare Zone ...
|
||||
double entry = GetEntry(iBar.symbol, dir);
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
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();
|
||||
|
||||
//
|
||||
result =
|
||||
result &&
|
||||
zone.IsValid() &&
|
||||
HasDirection(dir);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
//
|
||||
// Customize Patterns ...
|
||||
// iConfig.FullPattern();
|
||||
|
||||
//
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_OB);
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_PINNED);
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_ENGULFED);
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_SIGNALKEY);
|
||||
|
||||
//
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_FVG);
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_PIERCING);
|
||||
|
||||
//
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_STAR);
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_RISING);
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_MOMENTUM);
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_CONSOLIDATION);
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_LOW, X_DIRECTION_BULLISH);
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_HIGH, X_DIRECTION_BEARISH);
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_SUPPORT);
|
||||
// iConfig.AddPattern(X_BAR_PATTERN_RESISTANCE);
|
||||
|
||||
//
|
||||
// XAUUSD ...
|
||||
iConfig.AddPattern(X_BAR_PATTERN_FVG);
|
||||
iConfig.AddPattern(X_BAR_PATTERN_PIERCING);
|
||||
|
||||
//
|
||||
// Looping Back ...
|
||||
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;
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup Resource ...
|
||||
iBar.Clean();
|
||||
iAnalysis.Clean();
|
||||
XClean(iBullishZones);
|
||||
XClean(iBearishZones);
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup Resources ...
|
||||
iBar.Clean();
|
||||
iConfig.Clean();
|
||||
iAnalysis.Clean();
|
||||
XClean(iBullishZones);
|
||||
XClean(iBearishZones);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 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);
|
||||
|
||||
@@ -0,0 +1,489 @@
|
||||
// #region KI Fast ...
|
||||
//
|
||||
// if (kiParser.IsKIFastBullish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIFastSwitchedToBullish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIFastBearish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIFastSwitchedToBearish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIFastOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIFastUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIFastSameAsLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIFastSwitchedOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIFastSwitchedUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
// #region KI Slow ...
|
||||
//
|
||||
// if (kiParser.IsKISlowBullish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISlowSwitchedToBullish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISlowBearish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISlowSwitchedToBearish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISlowOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISlowUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISlowSameAsLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISlowSwitchedOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISlowSwitchedUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
// #region KI Super Slow ...
|
||||
//
|
||||
// if (kiParser.IsKISuperSlowBullish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISuperSlowSwitchedToBullish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISuperSlowBearish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISuperSlowSwitchedToBearish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISuperSlowOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISuperSlowUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISuperSlowSameAsLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISuperSlowSwitchedOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKISuperSlowSwitchedUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
// #region KI Wave ...
|
||||
//
|
||||
// if (kiParser.IsKIWaveBullish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIWaveBearish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIWaveSwitchedToBullish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIWaveSwitchedToBearish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIWaveOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIWaveUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIWaveSwitchedOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsKIWaveSwitchedUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
// #region KI Band ...
|
||||
//
|
||||
// if (kiParser.IsPriceOverKIUpper(barIndex, X_PRICE_LOW))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsPriceSwitchedOverKIUpper(barIndex, X_PRICE_LOW))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsPriceUnderKIUpper(barIndex, X_PRICE_HIGH))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsPriceSwitchedUnderKIUpper(barIndex, X_PRICE_HIGH))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsPriceOverKILower(barIndex, X_PRICE_LOW))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsPriceSwitchedOverKILower(barIndex, X_PRICE_LOW))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsPriceUnderKILower(barIndex, X_PRICE_HIGH))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsPriceSwitchedUnderKILower(barIndex, X_PRICE_HIGH))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsPriceInsideKIBands(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
// #region MA ...
|
||||
// #region MA Fast ...
|
||||
//
|
||||
// if (kiParser.IsMAFastBullish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMAFastSwitchedToBullish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMAFastBearish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMAFastSwitchedToBearish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMAFastOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMAFastSwitchedOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMAFastUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMAFastSwitchedUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
// #region MA Slow ...
|
||||
//
|
||||
// if (kiParser.IsMASlowBullish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASlowSwitchedToBullish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASlowBearish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASlowSwitchedToBearish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASlowOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASlowSwitchedOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASlowUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASlowSwitchedUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
// #region MA Super Slow ...
|
||||
//
|
||||
// if (kiParser.IsMASuperSlowBullish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASuperSlowSwitchedToBullish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASuperSlowBearish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASuperSlowSwitchedToBearish(barIndex, X_PRICE_CLOSE))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASuperSlowOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASuperSlowSwitchedOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASuperSlowUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMASuperSlowSwitchedUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
//
|
||||
// if (kiParser.IsMACrossoverBullish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMACrossoverSwitchedToBullish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMACrossoverBearish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsMACrossoverSwitchedToBearish(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
// #region PV ...
|
||||
//
|
||||
// if (kiParser.IsPeakSameAsLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsPeakOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsPeakUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsValeSameAsLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsValeOverLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
|
||||
//
|
||||
// if (kiParser.IsValeUnderLast(barIndex))
|
||||
// {
|
||||
// DebugBreak();
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,707 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class
|
||||
// -------------------------------------------------
|
||||
// Name: XCX121XKIPoiDrawer ...
|
||||
// Description: X121XKI POI Drawer Class ...
|
||||
//
|
||||
//
|
||||
// Maintainer:
|
||||
// ------------
|
||||
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||
//
|
||||
//////////////////////////////////////////////////////
|
||||
//
|
||||
// Global Properties ...
|
||||
#property library
|
||||
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||
#property link "https://saherelm.ir"
|
||||
#property version "1.00"
|
||||
#property description "SaherElm X121XKI POI Drawer Class"
|
||||
#property strict
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
#include "../../Classes/x-saherelm.x-poi.drawer.class.mq5"
|
||||
|
||||
//
|
||||
// Implementation ...
|
||||
class XCX121XKIPOIDrawer : public XCPOIDrawer
|
||||
{
|
||||
//
|
||||
public:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Tested Zones ...
|
||||
color testedBullishColor;
|
||||
color testedBearishColor;
|
||||
|
||||
//
|
||||
// Breaked Zones ...
|
||||
color breakedBullishColor;
|
||||
color breakedBearishColor;
|
||||
|
||||
//
|
||||
// FakeBreaked Zones ...
|
||||
color fakeBreakedBullishColor;
|
||||
color fakeBreakedBearishColor;
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
XCX121XKIPOIDrawer() : XCPOIDrawer()
|
||||
{
|
||||
Default();
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
~XCX121XKIPOIDrawer()
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
// Overrides ...
|
||||
|
||||
/**
|
||||
* Do additional Configurations for Child Classes ...
|
||||
*/
|
||||
void virtual Default() override
|
||||
{
|
||||
//
|
||||
// Apply Default Props ...
|
||||
|
||||
//
|
||||
Prefix(NULL);
|
||||
ChartIdentification(0);
|
||||
SubWindowIdentification(0);
|
||||
|
||||
//
|
||||
defaultBullishStyle.width = 1;
|
||||
defaultBullishStyle.clr = clrAqua;
|
||||
defaultBullishStyle.style = STYLE_SOLID;
|
||||
|
||||
//
|
||||
defaultBearishStyle.width = 1;
|
||||
defaultBearishStyle.clr = clrMagenta;
|
||||
defaultBearishStyle.style = STYLE_SOLID;
|
||||
|
||||
//
|
||||
boxBullishStyle = defaultBullishStyle;
|
||||
boxBearishStyle = defaultBearishStyle;
|
||||
|
||||
//
|
||||
testedBullishColor = clrLime;
|
||||
breakedBullishColor = clrGreen;
|
||||
fakeBreakedBullishColor = clrYellow;
|
||||
|
||||
//
|
||||
testedBearishColor = clrRed;
|
||||
breakedBearishColor = clrDarkRed;
|
||||
fakeBreakedBearishColor = clrDarkOrange;
|
||||
}
|
||||
|
||||
//
|
||||
// Get Specified Directional Arrow Anchor ...
|
||||
ENUM_ARROW_ANCHOR GetArrowAnchor(ENUM_X_DIRECTION forDir)
|
||||
{
|
||||
//
|
||||
ENUM_ARROW_ANCHOR result = ANCHOR_BOTTOM;
|
||||
|
||||
//
|
||||
if (HasDirection(forDir))
|
||||
{
|
||||
//
|
||||
result =
|
||||
IsSpecifiedBullish(forDir)
|
||||
? ANCHOR_TOP
|
||||
: ANCHOR_BOTTOM;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Get Specified Directional Arrow Code ...
|
||||
int GetArrowCode(ENUM_X_DIRECTION forDir)
|
||||
{
|
||||
//
|
||||
int result = 159;
|
||||
|
||||
//
|
||||
if (HasDirection(forDir))
|
||||
{
|
||||
//
|
||||
result =
|
||||
IsSpecifiedBullish(forDir)
|
||||
? 233
|
||||
: 234;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Get Specified Directional Arrow Code ...
|
||||
color GetArrowColor(ENUM_X_DIRECTION forDir)
|
||||
{
|
||||
//
|
||||
color result = clrYellow;
|
||||
|
||||
//
|
||||
if (HasDirection(forDir))
|
||||
{
|
||||
//
|
||||
result =
|
||||
IsSpecifiedBullish(forDir)
|
||||
? clrAqua
|
||||
: clrMagenta;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Get Specified Directional Arrow Price Type ...
|
||||
ENUM_X_PRICE GetArrowPriceType(ENUM_X_DIRECTION forDir)
|
||||
{
|
||||
//
|
||||
ENUM_X_PRICE result = X_PRICE_CLOSE;
|
||||
|
||||
//
|
||||
if (HasDirection(forDir))
|
||||
{
|
||||
//
|
||||
result =
|
||||
IsSpecifiedBullish(forDir)
|
||||
? X_PRICE_LOW
|
||||
: X_PRICE_HIGH;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Tested Zone Style ...
|
||||
*
|
||||
* @param style: reference to hold result ...
|
||||
* @param zone: Specified Zone ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetTestedStyle(
|
||||
XPOIStyle &style,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
style.Clean();
|
||||
|
||||
//
|
||||
result = zone.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
GetBoxStyle(
|
||||
style,
|
||||
zone.dir //
|
||||
);
|
||||
|
||||
//
|
||||
style.width = 3;
|
||||
style.clr =
|
||||
zone.IsBullish()
|
||||
? testedBullishColor
|
||||
: testedBearishColor;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Patterns Zone Style ...
|
||||
*
|
||||
* @param style: reference to hold result ...
|
||||
* @param zone: Specified Zone ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetPatternStyle(
|
||||
XPOIStyle &style,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
style.Clean();
|
||||
|
||||
//
|
||||
result = zone.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
GetPatternStyle(
|
||||
style,
|
||||
zone.dir //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Patterns Zone Style ...
|
||||
*
|
||||
* @param style: reference to hold result ...
|
||||
* @param forDir: Specified Direction ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetPatternStyle(
|
||||
XPOIStyle &style,
|
||||
ENUM_X_DIRECTION forDir //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
style.Clean();
|
||||
|
||||
//
|
||||
result = HasDirection(forDir);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
GetBoxStyle(
|
||||
style,
|
||||
forDir //
|
||||
);
|
||||
|
||||
//
|
||||
style.width = 2;
|
||||
style.style = STYLE_DASH;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Breaked Zone Style ...
|
||||
*
|
||||
* @param style: reference to hold result ...
|
||||
* @param zone: Specified Zone ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetBreakedStyle(
|
||||
XPOIStyle &style,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
style.Clean();
|
||||
|
||||
//
|
||||
result = zone.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
GetBoxStyle(
|
||||
style,
|
||||
zone.dir //
|
||||
);
|
||||
|
||||
//
|
||||
style.width = 3;
|
||||
style.clr =
|
||||
zone.IsBullish()
|
||||
? breakedBullishColor
|
||||
: breakedBearishColor;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Fake Breaked Zone Style ...
|
||||
*
|
||||
* @param style: reference to hold result ...
|
||||
* @param zone: Specified Zone ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetFakeBreakedStyle(
|
||||
XPOIStyle &style,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
style.Clean();
|
||||
|
||||
//
|
||||
result = zone.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
GetBoxStyle(
|
||||
style,
|
||||
zone.dir //
|
||||
);
|
||||
|
||||
//
|
||||
style.width = 3;
|
||||
style.clr =
|
||||
zone.IsBullish()
|
||||
? fakeBreakedBullishColor
|
||||
: fakeBreakedBearishColor;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill Arrow Based Drawing Specs ...
|
||||
*
|
||||
* @param forDir: Specified Direction ...
|
||||
* @param arrowPriceType: ENUM_X_PRICE, refrence for Arrow Price ...
|
||||
* @param arrowCode: int, reference for Arrow Code ...
|
||||
* @param arrowWidth: int, reference for Arrow Width ...
|
||||
* @param arrowColor: color, reference for Arrow Color ...
|
||||
* @param arrowAnchor: ENUM_ARROW_ANCHOR, reference for Arrow Anchor ...
|
||||
*/
|
||||
void FillArrowSpecs(
|
||||
ENUM_X_DIRECTION forDir,
|
||||
ENUM_X_PRICE &arrowPriceType,
|
||||
int &arrowCode,
|
||||
int &arrowWidth,
|
||||
color &arrowColor,
|
||||
ENUM_ARROW_ANCHOR &arrowAnchor //
|
||||
)
|
||||
{
|
||||
//
|
||||
// Prepare ...
|
||||
arrowCode = 159;
|
||||
arrowWidth = 2;
|
||||
arrowColor = CLR_NONE;
|
||||
arrowAnchor = ANCHOR_BOTTOM;
|
||||
arrowPriceType = X_PRICE_CLOSE;
|
||||
|
||||
//
|
||||
if (HasDirection(forDir))
|
||||
{
|
||||
//
|
||||
arrowCode = GetArrowCode(forDir);
|
||||
arrowColor = GetArrowColor(forDir);
|
||||
arrowAnchor = GetArrowAnchor(forDir);
|
||||
arrowPriceType = GetArrowPriceType(forDir);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Tested Style ...
|
||||
*
|
||||
* @param object: reference pointer to Object ...
|
||||
* @param zone: reference to Zone ...
|
||||
*/
|
||||
void ApplyTestedStyle(
|
||||
XCBoxObject *&object,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (!zone.IsValid() ||
|
||||
object == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
XPOIStyle style;
|
||||
if (!GetTestedStyle(style, zone))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
ApplyBoxStyle(
|
||||
object,
|
||||
style //
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Breaked Style ...
|
||||
*
|
||||
* @param object: reference pointer to Object ...
|
||||
* @param zone: reference to Zone ...
|
||||
*/
|
||||
void ApplyBreakedStyle(
|
||||
XCBoxObject *&object,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (!zone.IsValid() ||
|
||||
object == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
XPOIStyle style;
|
||||
if (!GetBreakedStyle(style, zone))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
ApplyBoxStyle(
|
||||
object,
|
||||
style //
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Tested Style ...
|
||||
*
|
||||
* @param object: reference pointer to Object ...
|
||||
* @param zone: reference to Zone ...
|
||||
*/
|
||||
void ApplyFakeBreakStyle(
|
||||
XCBoxObject *&object,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (!zone.IsValid() ||
|
||||
object == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
XPOIStyle style;
|
||||
if (!GetFakeBreakedStyle(style, zone))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
ApplyBoxStyle(
|
||||
object,
|
||||
style //
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Pattern Style ...
|
||||
*
|
||||
* @param object: reference pointer to Object ...
|
||||
* @param zone: reference to Zone ...
|
||||
*/
|
||||
void ApplyPatternStyle(
|
||||
XCBoxObject *&object,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (!zone.IsValid() ||
|
||||
object == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
XPOIStyle style;
|
||||
if (!GetPatternStyle(style, zone))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
ApplyBoxStyle(
|
||||
object,
|
||||
style //
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Patterns Style ...
|
||||
*
|
||||
* @param object: reference pointer to Object ...
|
||||
*/
|
||||
void ApplyPatternsStyle(
|
||||
CArrayObj *&objects //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (objects == NULL ||
|
||||
objects.Total() == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
bool has = false;
|
||||
XPOIStyle iStyle;
|
||||
string iName = NULL;
|
||||
XCBoxObject *iBoxObj = NULL;
|
||||
ENUM_X_DIRECTION iDir = X_DIRECTION_NONE;
|
||||
for (int i = 0; i < objects.Total(); i++)
|
||||
{
|
||||
//
|
||||
iBoxObj = (XCBoxObject *)objects.At(i);
|
||||
iName = iBoxObj.ObjName();
|
||||
|
||||
//
|
||||
iDir =
|
||||
IsSpecifiedValid(iName) &&
|
||||
Contains(
|
||||
"BULL",
|
||||
iName //
|
||||
)
|
||||
? X_DIRECTION_BULLISH
|
||||
: IsSpecifiedValid(iName) &&
|
||||
Contains(
|
||||
"BEAR",
|
||||
iName //
|
||||
)
|
||||
? X_DIRECTION_BEARISH
|
||||
: X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
has = GetPatternStyle(iStyle, iDir);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
ApplyBoxStyle(
|
||||
iBoxObj,
|
||||
iStyle //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
iStyle.Clean();
|
||||
ZeroMemory(iBoxObj);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Style to Specified Pivot Object ...
|
||||
*
|
||||
* @param object: reference pointer to Object ...
|
||||
* @param zone: reference to Zone ...
|
||||
*/
|
||||
void ApplyPivotStyle(
|
||||
XCBarArrowObject *&object,
|
||||
XPOIStyle &style //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (object == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
object.ArrowColor(style.clr);
|
||||
object.ArrowWidth(style.width);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Patterns Style ...
|
||||
*
|
||||
* @param object: reference pointer to Object ...
|
||||
*/
|
||||
void ApplyPivotsStyle(
|
||||
CArrayObj *&objects //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (objects == NULL ||
|
||||
objects.Total() == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
bool has = false;
|
||||
XPOIStyle iStyle;
|
||||
string iName = NULL;
|
||||
XCBarArrowObject *iObj = NULL;
|
||||
ENUM_X_DIRECTION iDir = X_DIRECTION_NONE;
|
||||
for (int i = 0; i < objects.Total(); i++)
|
||||
{
|
||||
//
|
||||
iObj = (XCBarArrowObject *)objects.At(i);
|
||||
iName = iObj.ObjName();
|
||||
|
||||
//
|
||||
iDir =
|
||||
IsSpecifiedValid(iName) &&
|
||||
Contains(
|
||||
"BULL",
|
||||
iName //
|
||||
)
|
||||
? X_DIRECTION_BULLISH
|
||||
: IsSpecifiedValid(iName) &&
|
||||
Contains(
|
||||
"BEAR",
|
||||
iName //
|
||||
)
|
||||
? X_DIRECTION_BEARISH
|
||||
: X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
has = GetPatternStyle(iStyle, iDir);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
ApplyPivotStyle(
|
||||
iObj,
|
||||
iStyle //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
iStyle.Clean();
|
||||
ZeroMemory(iObj);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
};
|
||||
|
||||
//
|
||||
@@ -0,0 +1,201 @@
|
||||
📄 X121XKIEA Framework Pricing & Skill Assessment Document
|
||||
|
||||
Overview
|
||||
|
||||
This document synthesizes the group discussion around the analysis of the X121XKIEA MQL5 Expert Advisor framework, the evaluation of programming skills demonstrated in its design, and the pricing strategy options for monetizing the framework.
|
||||
|
||||
1. Framework Analysis
|
||||
|
||||
High-Level Architecture
|
||||
|
||||
Core Utilities: XCBase, XCommonLib, XModelsLib, XOHCL (bar abstraction).
|
||||
|
||||
Market Structure & Patterns: XCBarAnalyser, XCMarketPatternDetector.
|
||||
|
||||
Visualization: XPOI, XCPOIDrawer, chart object libraries.
|
||||
|
||||
Trading & Risk Management: XCAccount, XCTrade, XCVolume, XCTarget, XCGuard.
|
||||
|
||||
Signalling & Execution: XCBaseSignaller, XCTradeManager.
|
||||
|
||||
Indicators: XKI (Ichimoku/KI composite), XCT (candle timer), XCC (chart cosmetics).
|
||||
|
||||
EA Scaffolding: XCBaseExpert, XCBackTesterEA, X121XKIEABackTester.
|
||||
|
||||
Ancillary: XCAlert, XCDataCollector, XCHttp, XCMD5.
|
||||
|
||||
Strengths
|
||||
|
||||
Modular, layered design.
|
||||
|
||||
Advanced risk management (multi-target, risk-free, guards).
|
||||
|
||||
Rich visualization overlays.
|
||||
|
||||
Event-driven orchestration.
|
||||
|
||||
Issues Identified
|
||||
|
||||
Constructors incorrectly declared with void.
|
||||
|
||||
Unsafe use of ZeroMemory(this) in structs.
|
||||
|
||||
Incomplete/truncated implementations.
|
||||
|
||||
Guard/target concurrency risks.
|
||||
|
||||
Config parsing robustness.
|
||||
|
||||
Recommendations
|
||||
|
||||
Correct constructor/destructor syntax.
|
||||
|
||||
Replace unsafe memory reset patterns.
|
||||
|
||||
Complete truncated modules.
|
||||
|
||||
Add unit-style validations.
|
||||
|
||||
Improve config parsing (JSON-like).
|
||||
|
||||
2. Programming Skill Assessment
|
||||
|
||||
Skill Profile Matrix (Qualitative)
|
||||
|
||||
Architecture: Advanced modular design, clear separation of concerns.
|
||||
|
||||
Syntax & Language: Strong struct/class usage, consistent naming; needs syntactic polish.
|
||||
|
||||
Trading Logic: Sophisticated risk and signal management.
|
||||
|
||||
Visualization: Rich overlays, QA-friendly.
|
||||
|
||||
Maintainability: Event-driven, alerts, config parsing; needs more robust validation.
|
||||
|
||||
Innovation: Pivot regression, multi-strategy signaller design.
|
||||
|
||||
Quantified Scores (1–10)
|
||||
|
||||
Architecture: 9.5
|
||||
|
||||
Syntax & Language: 7.5
|
||||
|
||||
Trading Logic: 9.0
|
||||
|
||||
Visualization: 8.5
|
||||
|
||||
Maintainability: 8.0
|
||||
|
||||
Innovation: 9.0
|
||||
|
||||
Overall Rating: 8.7 / 10 (Advanced/Expert tier)
|
||||
|
||||
3. Pricing Analysis
|
||||
|
||||
Methods Considered
|
||||
|
||||
Cost-Based: $12,000–$15,000 (based on hours × rate).
|
||||
|
||||
Value-Based: $10,000–$50,000 (based on trading edge and impact).
|
||||
|
||||
Market-Based: $1,500–$3,000 (retail EA market), $8,000–$15,000 (institutional/private sale).
|
||||
|
||||
Comparison Table
|
||||
|
||||
Method
|
||||
|
||||
Price Range
|
||||
|
||||
Best Use Case
|
||||
|
||||
Cost-Based
|
||||
|
||||
$12,000–$15,000
|
||||
|
||||
Consulting, custom builds
|
||||
|
||||
Value-Based
|
||||
|
||||
$10,000–$50,000
|
||||
|
||||
Exclusive licensing, institutions
|
||||
|
||||
Market-Based
|
||||
|
||||
$1,500–$3,000 (retail)<br>$8,000–$15,000 (institutional)
|
||||
|
||||
Retail vs private sale
|
||||
|
||||
4. Pricing Strategy Plan
|
||||
|
||||
Retail Market (MQL5 Market)
|
||||
|
||||
Target: Individual traders.
|
||||
|
||||
Price: $1,500–$3,000.
|
||||
|
||||
Pros: Large audience, visibility.
|
||||
|
||||
Cons: Lower margins, copycat risk.
|
||||
|
||||
Best Use: Lite version.
|
||||
|
||||
Institutional Clients
|
||||
|
||||
Target: Prop firms, hedge funds.
|
||||
|
||||
Price: $8,000–$15,000.
|
||||
|
||||
Pros: High margins, prestige.
|
||||
|
||||
Cons: Requires performance proof.
|
||||
|
||||
Best Use: Full framework.
|
||||
|
||||
Licensing Model
|
||||
|
||||
Target: Firms needing ongoing access.
|
||||
|
||||
Price: $2,000–$5,000/year or $500–$1,000/month.
|
||||
|
||||
Pros: Recurring revenue.
|
||||
|
||||
Cons: Requires license enforcement.
|
||||
|
||||
Best Use: Subscription with updates/support.
|
||||
|
||||
Consulting + Custom Builds
|
||||
|
||||
Target: Traders needing tailored solutions.
|
||||
|
||||
Price: $12,000–$15,000/project.
|
||||
|
||||
Pros: Direct monetization of expertise.
|
||||
|
||||
Cons: Time-intensive.
|
||||
|
||||
Best Use: Bespoke strategy builds.
|
||||
|
||||
5. Recommended Strategy
|
||||
|
||||
Dual Approach:
|
||||
|
||||
Retail Lite version (~$2,000).
|
||||
|
||||
Full institutional version (~$10,000–$15,000).
|
||||
|
||||
Add Licensing: For recurring revenue and support.
|
||||
|
||||
Consulting: Premium option for custom builds.
|
||||
|
||||
Future Considerations
|
||||
|
||||
Develop tiered pricing packages (Lite, Pro, Enterprise).
|
||||
|
||||
Provide performance metrics (backtests, live results) to strengthen institutional sales.
|
||||
|
||||
Expand strategy diversity (breakout, continuation, exhaustion signallers).
|
||||
|
||||
End of Document
|
||||
|
||||
https://copilot.microsoft.com/shares/pages/ERAAHojiAwN8eTuiKtiZ2
|
||||
Binary file not shown.
@@ -0,0 +1,124 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Library
|
||||
// -------------------------------------------------
|
||||
// Name: XCX121XKIEALib ...
|
||||
// Description: X121XKI Library ...
|
||||
//
|
||||
//
|
||||
// Maintainer:
|
||||
// ------------
|
||||
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||
//
|
||||
//////////////////////////////////////////////////////
|
||||
//
|
||||
// Global Properties ...
|
||||
#property library
|
||||
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||
#property link "https://saherelm.ir"
|
||||
#property version "1.00"
|
||||
#property description "SaherElm X121XKIEA Library"
|
||||
#property strict
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
#include "../../Libraries/x-saherelm.common.lib.mq5"
|
||||
|
||||
//
|
||||
// Enums ...
|
||||
|
||||
// #region XKIStrategies ...
|
||||
enum X121XKIStrategies
|
||||
{
|
||||
X121_XKI_STRATEGY_UNKNOWN = 0,
|
||||
X121_XKI_STRATEGY_1 = 1,
|
||||
X121_XKI_STRATEGY_2 = 2,
|
||||
X121_XKI_STRATEGY_3 = 3,
|
||||
X121_XKI_STRATEGY_4 = 4,
|
||||
X121_XKI_STRATEGY_5 = 5,
|
||||
X121_XKI_STRATEGY_6 = 6,
|
||||
};
|
||||
bool IsXValid(X121XKIStrategies value)
|
||||
{
|
||||
return value != X121_XKI_STRATEGY_UNKNOWN;
|
||||
}
|
||||
string ToXString(X121XKIStrategies value)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
if (IsXValid(value))
|
||||
{
|
||||
//
|
||||
switch (value)
|
||||
{
|
||||
//
|
||||
case X121_XKI_STRATEGY_1:
|
||||
result = "1";
|
||||
break;
|
||||
//
|
||||
case X121_XKI_STRATEGY_2:
|
||||
result = "2";
|
||||
break;
|
||||
//
|
||||
case X121_XKI_STRATEGY_3:
|
||||
result = "3";
|
||||
break;
|
||||
//
|
||||
case X121_XKI_STRATEGY_4:
|
||||
result = "4";
|
||||
break;
|
||||
//
|
||||
case X121_XKI_STRATEGY_5:
|
||||
result = "5";
|
||||
break;
|
||||
//
|
||||
case X121_XKI_STRATEGY_6:
|
||||
result = "6";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
X121XKIStrategies ToX121XKIStrategy(string value)
|
||||
{
|
||||
//
|
||||
X121XKIStrategies result = X121_XKI_STRATEGY_UNKNOWN;
|
||||
|
||||
//
|
||||
if (IsXValid(value))
|
||||
{
|
||||
//
|
||||
if (value == ToXString(X121_XKI_STRATEGY_1))
|
||||
{
|
||||
result = X121_XKI_STRATEGY_1;
|
||||
}
|
||||
else if (value == ToXString(X121_XKI_STRATEGY_2))
|
||||
{
|
||||
result = X121_XKI_STRATEGY_2;
|
||||
}
|
||||
else if (value == ToXString(X121_XKI_STRATEGY_3))
|
||||
{
|
||||
result = X121_XKI_STRATEGY_3;
|
||||
}
|
||||
else if (value == ToXString(X121_XKI_STRATEGY_4))
|
||||
{
|
||||
result = X121_XKI_STRATEGY_4;
|
||||
}
|
||||
else if (value == ToXString(X121_XKI_STRATEGY_5))
|
||||
{
|
||||
result = X121_XKI_STRATEGY_5;
|
||||
}
|
||||
else if (value == ToXString(X121_XKI_STRATEGY_6))
|
||||
{
|
||||
result = X121_XKI_STRATEGY_6;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
// #endregion
|
||||
Reference in New Issue
Block a user