973 lines
19 KiB
Plaintext
973 lines
19 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Class
|
|
// -------------------------------------------------
|
|
// Name: XCX121XKIPoiDetector ...
|
|
// Description: X121XKI POI Detector 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 Detector Class"
|
|
#property strict
|
|
|
|
//
|
|
// Imports ...
|
|
#include "../../Classes/x-saherelm.base.class.mq5"
|
|
#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5"
|
|
#include "../../Classes/x-saherelm.x-market.pattern.class.mq5"
|
|
#include "../../Helpers/x-saherelm.x121.xki.helper.mq5"
|
|
#include "../Classes/x-saherelm.x121.xki.parser.class.mq5"
|
|
|
|
//
|
|
// Definitions ...
|
|
|
|
//
|
|
// Implementation ...
|
|
class XCX121XKIPOIDetector : public XCMarketPatternDetector
|
|
{
|
|
//
|
|
// Public ...
|
|
public:
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
string symbol;
|
|
ENUM_TIMEFRAMES period;
|
|
|
|
//
|
|
XCBarAnalyser *barAnalyser; // Bar Analyser ...
|
|
XCX121XKIHelper *kiHelper; // X121XKI Helper ...
|
|
XCX121XKIHelperParser *kiParser; // X121XKI Helper Parser ...
|
|
|
|
//
|
|
// Constructor ...
|
|
XCX121XKIPOIDetector(
|
|
XCX121XKIHelper *_kiHelper,
|
|
XCX121XKIHelperParser *_kiParser //
|
|
) : XCMarketPatternDetector()
|
|
{
|
|
//
|
|
barAnalyser = new XCBarAnalyser();
|
|
kiHelper = _kiHelper;
|
|
kiParser = _kiParser;
|
|
|
|
//
|
|
symbol = kiHelper.GetSymbol();
|
|
period = kiHelper.GetPeriod();
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
~XCX121XKIPOIDetector()
|
|
{
|
|
Destroy();
|
|
}
|
|
|
|
//
|
|
// Actions and Tools ...
|
|
|
|
// #region POI Detectors ...
|
|
bool NearestKIFastBullish(
|
|
int &index,
|
|
int barIndex = 0,
|
|
int loopback = 50 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
index = -1;
|
|
|
|
//
|
|
// Normalize ...
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
// Loop Back ...
|
|
bool isPassed = false;
|
|
for (int i = barIndex; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
isPassed = kiParser.IsKIFastBullish(i);
|
|
if (isPassed)
|
|
{
|
|
//
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
result = IsValidIndex(index);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool NearestKIFastBearish(
|
|
int &index,
|
|
int barIndex = 0,
|
|
int loopback = 50 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
index = -1;
|
|
|
|
//
|
|
// Normalize ...
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
// Loop Back ...
|
|
bool isPassed = false;
|
|
for (int i = barIndex; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
isPassed = kiParser.IsKIFastBearish(i);
|
|
if (isPassed)
|
|
{
|
|
//
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
result = IsValidIndex(index);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool NearestKIFastSwitchedToBullish(
|
|
int &index,
|
|
int barIndex = 0,
|
|
int loopback = 50 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
index = -1;
|
|
|
|
//
|
|
// Normalize ...
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
// Loop Back ...
|
|
bool isPassed = false;
|
|
for (int i = barIndex; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
isPassed = kiParser.IsKIFastSwitchedToBullish(i);
|
|
if (isPassed)
|
|
{
|
|
//
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
result = IsValidIndex(index);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool NearestKIFastSwitchedToBearish(
|
|
int &index,
|
|
int barIndex = 0,
|
|
int loopback = 50 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
index = -1;
|
|
|
|
//
|
|
// Normalize ...
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
// Loop Back ...
|
|
bool isPassed = false;
|
|
for (int i = barIndex; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
isPassed = kiParser.IsKIFastSwitchedToBearish(i);
|
|
if (isPassed)
|
|
{
|
|
//
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
result = IsValidIndex(index);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool NearestKISlowBullish(
|
|
int &index,
|
|
int barIndex = 0,
|
|
int loopback = 50 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
index = -1;
|
|
|
|
//
|
|
// Normalize ...
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
// Loop Back ...
|
|
bool isPassed = false;
|
|
for (int i = barIndex; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
isPassed = kiParser.IsKISlowBullish(i);
|
|
if (isPassed)
|
|
{
|
|
//
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
result = IsValidIndex(index);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool NearestKISlowBearish(
|
|
int &index,
|
|
int barIndex = 0,
|
|
int loopback = 50 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
index = -1;
|
|
|
|
//
|
|
// Normalize ...
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
// Loop Back ...
|
|
bool isPassed = false;
|
|
for (int i = barIndex; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
isPassed = kiParser.IsKISlowBearish(i);
|
|
if (isPassed)
|
|
{
|
|
//
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
result = IsValidIndex(index);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool NearestKISlowSwitchedToBullish(
|
|
int &index,
|
|
int barIndex = 0,
|
|
int loopback = 50 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
index = -1;
|
|
|
|
//
|
|
// Normalize ...
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
// Loop Back ...
|
|
bool isPassed = false;
|
|
for (int i = barIndex; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
isPassed = kiParser.IsKISlowSwitchedToBullish(i);
|
|
if (isPassed)
|
|
{
|
|
//
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
result = IsValidIndex(index);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool NearestKISlowSwitchedToBearish(
|
|
int &index,
|
|
int barIndex = 0,
|
|
int loopback = 50 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
index = -1;
|
|
|
|
//
|
|
// Normalize ...
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
// Loop Back ...
|
|
bool isPassed = false;
|
|
for (int i = barIndex; i < barIndex + loopback; i++)
|
|
{
|
|
//
|
|
isPassed = kiParser.IsKISlowSwitchedToBearish(i);
|
|
if (isPassed)
|
|
{
|
|
//
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
result = IsValidIndex(index);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
// #endregion
|
|
|
|
// #region Detectors ...
|
|
bool IsBullishPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsTrendBullish(barIndex) &&
|
|
kiParser.IsRSIBullish(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = result &&
|
|
IsPinnedBar(bar, dir) &&
|
|
IsXBullish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool IsBearishPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsTrendBearish(barIndex) &&
|
|
kiParser.IsRSIBearish(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = result &&
|
|
IsPinnedBar(bar, dir) &&
|
|
IsXBearish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool IsBullishBreakoutPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsBullishBreakout(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = result &&
|
|
IsMomentumBar(bar, dir) &&
|
|
IsXBullish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool IsBearishBreakoutPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsBearishBreakout(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = result &&
|
|
IsMomentumBar(bar, dir) &&
|
|
IsXBearish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool IsBullishReversalPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsBullishReversal(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = result &&
|
|
IsStarPattern(bar, dir) &&
|
|
IsXBullish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool IsBearishReversalPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsBearishReversal(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = result &&
|
|
IsStarPattern(bar, dir) &&
|
|
IsXBearish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool IsBullishContinuationPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsTrendStrongBullish(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
XOHCL swingBar;
|
|
result = result &&
|
|
IsFlagPattern(bar, dir, swingBar) &&
|
|
IsXBullish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
swingBar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool IsBearishContinuationPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsTrendStrongBearish(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
XOHCL swingBar;
|
|
result = result &&
|
|
IsFlagPattern(bar, dir, swingBar) &&
|
|
IsXBearish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
swingBar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool IsBullishExhaustionPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsTrendStrongBullish(barIndex) &&
|
|
kiParser.IsRSIOverbought(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = result &&
|
|
IsPiercingPattern(bar, dir) &&
|
|
IsXBullish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool IsBearishExhaustionPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsTrendStrongBearish(barIndex) &&
|
|
kiParser.IsRSIOversold(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = result &&
|
|
IsPiercingPattern(bar, dir) &&
|
|
IsXBearish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool IsBullishTrendExhaustedPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsTrendStrongBullish(barIndex) &&
|
|
kiParser.IsVolatilityLow(barIndex, 20) &&
|
|
kiParser.IsRSIOverbought(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = result &&
|
|
IsPiercingPattern(bar, dir) &&
|
|
IsXBullish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
bool IsBearishTrendExhaustedPOI(int barIndex = 0)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
result = kiParser.IsTrendStrongBearish(barIndex) &&
|
|
kiParser.IsVolatilityLow(barIndex, 20) &&
|
|
kiParser.IsRSIOversold(barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Add candlestick confirmation ...
|
|
XOHCL bar;
|
|
ENUM_X_DIRECTION dir;
|
|
result = result &&
|
|
bar.Init(symbol, period, barIndex);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = result &&
|
|
IsPiercingPattern(bar, dir) &&
|
|
IsXBearish(dir);
|
|
|
|
//
|
|
bar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
// #endregion
|
|
|
|
// #region XDetectors ...
|
|
bool IsKISignal(
|
|
ENUM_X_DIRECTION &dir, //
|
|
int barIndex = 0 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
dir = X_DIRECTION_NONE;
|
|
barIndex = kiParser.NormalizeBarIndex(barIndex);
|
|
|
|
//
|
|
// Retrieve KI State ...
|
|
bool isBullish = kiParser.IsKIFastSwitchedToBullish(barIndex + 1) &&
|
|
kiParser.IsKIFastBullish(barIndex) &&
|
|
kiParser.IsKISlowBullish(barIndex);
|
|
bool isBearish = kiParser.IsKIFastSwitchedToBearish(barIndex + 1) &&
|
|
kiParser.IsKIFastBearish(barIndex) &&
|
|
kiParser.IsKISlowBearish(barIndex);
|
|
result = isBullish ||
|
|
isBearish;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
dir = isBullish
|
|
? X_DIRECTION_BULLISH
|
|
: isBearish
|
|
? X_DIRECTION_BEARISH
|
|
: X_DIRECTION_NONE;
|
|
result = HasDirection(dir);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
XOHCL bar;
|
|
result = bar.Init(symbol, period, barIndex + 1);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Bar Direction Same as Dir ...
|
|
|
|
//
|
|
// Price Place Check ...
|
|
double kiFast = kiHelper.GetKIFast(barIndex + 1);
|
|
double kiSlow = kiHelper.GetKISlow(barIndex + 1);
|
|
isBullish =
|
|
isBullish &&
|
|
bar.close > kiFast &&
|
|
kiFast > kiSlow &&
|
|
(kiParser.IsKIFastOverLast(barIndex + 1) ||
|
|
kiParser.IsKISlowOverLast(barIndex + 1));
|
|
isBearish =
|
|
isBearish &&
|
|
bar.close < kiFast &&
|
|
kiFast < kiSlow &&
|
|
(kiParser.IsKIFastUnderLast(barIndex + 1) ||
|
|
kiParser.IsKISlowUnderLast(barIndex + 1));
|
|
|
|
//
|
|
result =
|
|
result &&
|
|
(isBullish ||
|
|
isBearish);
|
|
|
|
//
|
|
// Cleanup Resources ...
|
|
bar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
// #endregion
|
|
|
|
//
|
|
// Others ...
|
|
|
|
/**
|
|
* Destroy ...
|
|
*/
|
|
void Destroy()
|
|
{
|
|
//
|
|
delete barAnalyser;
|
|
ZeroMemory(barAnalyser);
|
|
|
|
//
|
|
ZeroMemory(kiHelper);
|
|
ZeroMemory(kiParser);
|
|
}
|
|
|
|
//
|
|
// Testers ...
|
|
|
|
//
|
|
// Protected ...
|
|
protected:
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
// Private ...
|
|
private:
|
|
//
|
|
|
|
//
|
|
};
|
|
|
|
// |