1352 lines
40 KiB
Plaintext
1352 lines
40 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Class
|
|
// -------------------------------------------------
|
|
// Name: XCXFIMAPoiDetector ...
|
|
// Description: XFIMA 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 XFIMA 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 "../Libraries/x-saherelm.xfima.lib.mq5"
|
|
|
|
//
|
|
// Implementation ...
|
|
class XCXFIMAPOIDetector : public XCMarketPatternDetector
|
|
{
|
|
//
|
|
// Public ...
|
|
public:
|
|
//
|
|
// Props ...
|
|
XCBarAnalyser *barAnalyser; // Bar Analyser ...
|
|
XCXFIMAHelper *fimaHelper; // XFIMA Helper ...
|
|
|
|
//
|
|
XBoxZone obs[];
|
|
XBoxZone fvgs[];
|
|
XBoxZone supports[];
|
|
XBoxZone resistances[];
|
|
|
|
//
|
|
// Constructor ...
|
|
XCXFIMAPOIDetector(
|
|
XCXFIMAHelper *_fimaHelper //
|
|
) : XCMarketPatternDetector()
|
|
{
|
|
//
|
|
barAnalyser = new XCBarAnalyser();
|
|
fimaHelper = _fimaHelper;
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
~XCXFIMAPOIDetector()
|
|
{
|
|
Destroy();
|
|
}
|
|
|
|
//
|
|
// Actions and Tools ...
|
|
|
|
//
|
|
// Pivot Analysors ...
|
|
|
|
/**
|
|
* Analyse Market based on Specified Kind of Pivots ...
|
|
*
|
|
* @param analysis: XPivotAnalysis, reference to hold result ...
|
|
* @param barIndex: int, Bar Index ...
|
|
* @param requiredNumberOFPivots: int, Specified which Number of Pivots must be Extracted ...
|
|
* @param maxAllowedLoopbackLength: int, Specified Maximum Loopback Length for Pivot Extraction ...
|
|
* @param validationLength: int, Specified Pivots Validation Length ignore if <= 0 ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool AnalysePVPivots(
|
|
XPivotAnalysis &analysis,
|
|
int barIndex = 0,
|
|
int requiredNumberOFPivots = 50,
|
|
int maxAllowedLoopbackLength = 1500,
|
|
int validationLength = 0 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Prepare ...
|
|
analysis.Clean();
|
|
|
|
//
|
|
// Reading Pivots ...
|
|
XPivot pivots[];
|
|
int count = fimaHelper.ExtractPVPivots(
|
|
pivots, // Result ...
|
|
barIndex, // Bar Index ...
|
|
requiredNumberOFPivots, // Required Number of Pivots ...
|
|
maxAllowedLoopbackLength, // Max Allowed Loopback ...
|
|
validationLength // Validation Length ...
|
|
);
|
|
result = IsValidSize(count);
|
|
if (!result)
|
|
{
|
|
//
|
|
SpecifiedClean(pivots);
|
|
return result;
|
|
}
|
|
|
|
//
|
|
string symbol = fimaHelper.GetSymbol();
|
|
ENUM_TIMEFRAMES period = fimaHelper.GetPeriod();
|
|
|
|
//
|
|
// Initialize Analysis ...
|
|
result = analysis.Init(
|
|
"XFIMA_XPV",
|
|
symbol,
|
|
period,
|
|
pivots //
|
|
);
|
|
|
|
//
|
|
// Cleanup Resources ...
|
|
if (!result)
|
|
{
|
|
analysis.Clean();
|
|
}
|
|
SpecifiedClean(pivots);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Analyse Market based on Specified Kind of Pivots ...
|
|
*
|
|
* @param analysis: XPivotAnalysis, reference to hold result ...
|
|
* @param barIndex: int, Bar Index ...
|
|
* @param requiredNumberOFPivots: int, Specified which Number of Pivots must be Extracted ...
|
|
* @param maxAllowedLoopbackLength: int, Specified Maximum Loopback Length for Pivot Extraction ...
|
|
* @param validationLength: int, Specified Pivots Validation Length ignore if <= 0 ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool AnalyseMAPivots(
|
|
XPivotAnalysis &analysis,
|
|
int barIndex = 0,
|
|
int requiredNumberOFPivots = 50,
|
|
int maxAllowedLoopbackLength = 1500,
|
|
int validationLength = 0 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Prepare ...
|
|
analysis.Clean();
|
|
|
|
//
|
|
// Reading Pivots ...
|
|
XPivot pivots[];
|
|
int count = fimaHelper.ExtractMAPivots(
|
|
pivots, // Result ...
|
|
barIndex, // Bar Index ...
|
|
requiredNumberOFPivots, // Required Number of Pivots ...
|
|
maxAllowedLoopbackLength, // Max Allowed Loopback ...
|
|
validationLength // Validation Length ...
|
|
);
|
|
result = IsValidSize(count);
|
|
if (!result)
|
|
{
|
|
//
|
|
SpecifiedClean(pivots);
|
|
return result;
|
|
}
|
|
|
|
//
|
|
string symbol = fimaHelper.GetSymbol();
|
|
ENUM_TIMEFRAMES period = fimaHelper.GetPeriod();
|
|
|
|
//
|
|
// Initialize Analysis ...
|
|
result = analysis.Init(
|
|
"XFIMA_XMA",
|
|
symbol,
|
|
period,
|
|
pivots //
|
|
);
|
|
|
|
//
|
|
// Cleanup Resources ...
|
|
if (!result)
|
|
{
|
|
analysis.Clean();
|
|
}
|
|
SpecifiedClean(pivots);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Analyse Market based on Specified Kind of Pivots ...
|
|
*
|
|
* @param analysis: XPivotAnalysis, reference to hold result ...
|
|
* @param barIndex: int, Bar Index ...
|
|
* @param requiredNumberOFPivots: int, Specified which Number of Pivots must be Extracted ...
|
|
* @param maxAllowedLoopbackLength: int, Specified Maximum Loopback Length for Pivot Extraction ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool AnalyseSARPivots(
|
|
XPivotAnalysis &analysis,
|
|
int barIndex = 0,
|
|
int requiredNumberOFPivots = 50,
|
|
int maxAllowedLoopbackLength = 1500 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Prepare ...
|
|
analysis.Clean();
|
|
|
|
//
|
|
// Reading Pivots ...
|
|
XPivot pivots[];
|
|
int count = fimaHelper.ExtractSARPivots(
|
|
pivots, // Result ...
|
|
barIndex, // Bar Index ...
|
|
requiredNumberOFPivots, // Required Number of Pivots ...
|
|
maxAllowedLoopbackLength // Max Allowed Loopback ...
|
|
);
|
|
result = IsValidSize(count);
|
|
if (!result)
|
|
{
|
|
//
|
|
SpecifiedClean(pivots);
|
|
return result;
|
|
}
|
|
|
|
//
|
|
string symbol = fimaHelper.GetSymbol();
|
|
ENUM_TIMEFRAMES period = fimaHelper.GetPeriod();
|
|
|
|
//
|
|
// Initialize Analysis ...
|
|
result = analysis.Init(
|
|
"XFIMA_XSAR",
|
|
symbol,
|
|
period,
|
|
pivots //
|
|
);
|
|
|
|
//
|
|
// Cleanup Resources ...
|
|
if (!result)
|
|
{
|
|
analysis.Clean();
|
|
}
|
|
SpecifiedClean(pivots);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Analyse Market based on Specified Kind of Pivots ...
|
|
*
|
|
* @param analysis: XPivotAnalysis, reference to hold result ...
|
|
* @param barIndex: int, Bar Index ...
|
|
* @param requiredNumberOFPivots: int, Specified which Number of Pivots must be Extracted ...
|
|
* @param maxAllowedLoopbackLength: int, Specified Maximum Loopback Length for Pivot Extraction ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool AnalyseZigZagPivots(
|
|
XPivotAnalysis &analysis,
|
|
int barIndex = 0,
|
|
int requiredNumberOFPivots = 50,
|
|
int maxAllowedLoopbackLength = 1500 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Prepare ...
|
|
analysis.Clean();
|
|
|
|
//
|
|
// Reading Pivots ...
|
|
XPivot pivots[];
|
|
int count = fimaHelper.ExtractZigZagPivots(
|
|
pivots, // Result ...
|
|
barIndex, // Bar Index ...
|
|
requiredNumberOFPivots, // Required Number of Pivots ...
|
|
maxAllowedLoopbackLength // Max Allowed Loopback ...
|
|
);
|
|
result = IsValidSize(count);
|
|
if (!result)
|
|
{
|
|
//
|
|
SpecifiedClean(pivots);
|
|
return result;
|
|
}
|
|
|
|
//
|
|
string symbol = fimaHelper.GetSymbol();
|
|
ENUM_TIMEFRAMES period = fimaHelper.GetPeriod();
|
|
|
|
//
|
|
// Initialize Analysis ...
|
|
result = analysis.Init(
|
|
"XFIMA_XZG",
|
|
symbol,
|
|
period,
|
|
pivots //
|
|
);
|
|
|
|
//
|
|
// Cleanup Resources ...
|
|
if (!result)
|
|
{
|
|
analysis.Clean();
|
|
}
|
|
SpecifiedClean(pivots);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Destroy ...
|
|
*/
|
|
void Destroy()
|
|
{
|
|
//
|
|
SpecifiedClean(obs);
|
|
SpecifiedClean(fvgs);
|
|
SpecifiedClean(supports);
|
|
SpecifiedClean(resistances);
|
|
|
|
//
|
|
delete barAnalyser;
|
|
ZeroMemory(barAnalyser);
|
|
}
|
|
|
|
//
|
|
// Testers ...
|
|
|
|
/**
|
|
* Analyse Market based on Specified Bar ...
|
|
*
|
|
* @param forBar: XOHCL, reference Specified Bar for Analyse Market ...
|
|
* @param structure: XFIMAMarketStructure, reference to holds result ...
|
|
* @param config: XFIMAPatternDetectorConfig, reference to Configure Detector ...
|
|
*/
|
|
void AnalyseMarket(
|
|
XOHCL &forBar,
|
|
XFIMAMarketStructure &structure // ,
|
|
//XFIMAPatternDetectorConfig &config //
|
|
)
|
|
{
|
|
// //
|
|
// // Prepare ...
|
|
// structure.Clean();
|
|
|
|
// //
|
|
// // Validate ...
|
|
// if (!forBar.IsValid())
|
|
// {
|
|
// return;
|
|
// }
|
|
|
|
// //
|
|
// // Do Analysis ...
|
|
|
|
// //
|
|
// structure.bar = forBar;
|
|
|
|
// //
|
|
// int idx = -1;
|
|
// int count = 0;
|
|
// XBoxZone iBox;
|
|
// bool has = false;
|
|
// ENUM_X_DIRECTION iDir = X_DIRECTION_NONE;
|
|
|
|
// //
|
|
// // Detecting POI Based on Config ...
|
|
|
|
// //
|
|
// // Checking Momentum Bar ...
|
|
// if (config.detectMomentum)
|
|
// {
|
|
// //
|
|
// bool isMomentum = IsMomentumBar(
|
|
// forBar,
|
|
// iDir,
|
|
// config.momentumBarRangeLength,
|
|
// config.momentumBarApprovedMultiplier //
|
|
// );
|
|
// bool isBullishMomentum = isMomentum &&
|
|
// IsSpecifiedBullish(iDir);
|
|
// bool isBearishMomentum = isMomentum &&
|
|
// IsSpecifiedBearish(iDir);
|
|
// if (isMomentum)
|
|
// {
|
|
// structure.momentumDir = iDir;
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // Checking Engulfed Bar ...
|
|
// if (config.detectEngulfed)
|
|
// {
|
|
// //
|
|
// bool isEngulfed = IsEngulfedBar(
|
|
// forBar,
|
|
// iDir //
|
|
// );
|
|
// bool isBullishEngulfed = isEngulfed &&
|
|
// IsSpecifiedBullish(iDir);
|
|
// bool isBearishEngulfed = isEngulfed &&
|
|
// IsSpecifiedBearish(iDir);
|
|
// if (isEngulfed)
|
|
// {
|
|
// structure.engulfedDir = iDir;
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // Checking TruGaped Bar ...
|
|
// if (config.detectTrueGaped)
|
|
// {
|
|
// //
|
|
// bool isTrueGaped = IsTrueGapedBar(
|
|
// forBar,
|
|
// iDir,
|
|
// config.truwGapApprovedPointMultiplier //
|
|
// );
|
|
// bool isBullishTrueGaped = isTrueGaped &&
|
|
// IsSpecifiedBullish(iDir);
|
|
// bool isBearishTrueGaped = isTrueGaped &&
|
|
// IsSpecifiedBearish(iDir);
|
|
// if (isTrueGaped)
|
|
// {
|
|
// structure.trueGapedDir = iDir;
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // Checking Pinned Bar ...
|
|
// if (config.detectPinned)
|
|
// {
|
|
// //
|
|
// bool isPinned = IsPinnedBar(
|
|
// forBar,
|
|
// iDir,
|
|
// config.pinnedBaarShadowApprovedMultiplier,
|
|
// config.pinnedBarMinimumPinBarRangeMultiplier,
|
|
// config.pinnedBarForceDirection //
|
|
// );
|
|
// bool isBullishPinned = isPinned &&
|
|
// IsSpecifiedBullish(iDir);
|
|
// bool isBearishPinned = isPinned &&
|
|
// IsSpecifiedBearish(iDir);
|
|
// if (isPinned)
|
|
// {
|
|
// structure.pinnedDir = iDir;
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // Checking Star Pattern ...
|
|
// if (config.detectStarPattern)
|
|
// {
|
|
// //
|
|
// bool isStarPattern = IsStarPattern(
|
|
// forBar,
|
|
// iDir //
|
|
// );
|
|
// bool isBullishStarPattern = isStarPattern &&
|
|
// IsSpecifiedBullish(iDir);
|
|
// bool isBearishStarPattern = isStarPattern &&
|
|
// IsSpecifiedBearish(iDir);
|
|
// if (isStarPattern)
|
|
// {
|
|
// structure.starPatternDir = iDir;
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // Checking Piercing Pattern ...
|
|
// if (config.detectPiercingPattern)
|
|
// {
|
|
// //
|
|
// bool isPiercingPattern = IsPiercingPattern(
|
|
// forBar,
|
|
// iDir //
|
|
// );
|
|
// bool isBullishPiercingPattern = isPiercingPattern &&
|
|
// IsSpecifiedBullish(iDir);
|
|
// bool isBearishPiercingPattern = isPiercingPattern &&
|
|
// IsSpecifiedBearish(iDir);
|
|
// if (isPiercingPattern)
|
|
// {
|
|
// structure.piercingPatternDir = iDir;
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // Checking Rising Pattern ...
|
|
// if (config.detectRisingPattern)
|
|
// {
|
|
// //
|
|
// bool isRisingPattern = IsRisingPattern(
|
|
// forBar,
|
|
// iDir //
|
|
// );
|
|
// bool isBullishRisingPattern = isRisingPattern &&
|
|
// IsSpecifiedBullish(iDir);
|
|
// bool isBearishRisingPattern = isRisingPattern &&
|
|
// IsSpecifiedBearish(iDir);
|
|
// if (isRisingPattern)
|
|
// {
|
|
// structure.risingPatternDir = iDir;
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // Checking Flag Pattern ...
|
|
// if (config.detectFlagPattern)
|
|
// {
|
|
// //
|
|
// XOHCL swingBar;
|
|
// bool isFlagPattern = IsFlagPattern(
|
|
// forBar,
|
|
// iDir,
|
|
// swingBar,
|
|
// config.flagPatternMinimumPullbackBars //
|
|
// );
|
|
// bool isBullishFlagPattern = isFlagPattern &&
|
|
// IsSpecifiedBullish(iDir);
|
|
// bool isBearishFlagPattern = isFlagPattern &&
|
|
// IsSpecifiedBearish(iDir);
|
|
// if (isFlagPattern)
|
|
// {
|
|
// //
|
|
// structure.flagSwing = swingBar;
|
|
// structure.flagPatternDir = iDir;
|
|
// }
|
|
// swingBar.Clean();
|
|
// }
|
|
|
|
// //
|
|
// // Detect SignalKey Bar Pattern ...
|
|
// if (config.detectSignalKeyBarPattern)
|
|
// {
|
|
// //
|
|
// bool isSignalKeyBar = IsSignalKeyBarPattern(
|
|
// forBar,
|
|
// iDir,
|
|
// config.signalKeyBarShadowApprovedMultiplier,
|
|
// config.signalKeyBarMinimumPinBarRangeMultiplier,
|
|
// config.signalKeyBarForceDirection //
|
|
// );
|
|
// bool isBullishSignalKeyBar = isSignalKeyBar &&
|
|
// IsSpecifiedBullish(iDir);
|
|
// bool isBearishSignalKeyBar = isSignalKeyBar &&
|
|
// IsSpecifiedBearish(iDir);
|
|
// if (isSignalKeyBar)
|
|
// {
|
|
// structure.signalKeyBarPatternDir = iDir;
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // Detect Swing Trend ...
|
|
// if (config.detectSwingTrend)
|
|
// {
|
|
// //
|
|
// XOHCL swings[];
|
|
// bool hasSwingTrend = HasSwingTrend(
|
|
// forBar,
|
|
// iDir,
|
|
// swings,
|
|
// config.trendingNumberOfSwings,
|
|
// config.trendingSwingShoulders //
|
|
// );
|
|
// bool hasBullishSwingTrend = hasSwingTrend &&
|
|
// IsSpecifiedBullish(iDir);
|
|
// bool hasBearishSwingTrend = hasSwingTrend &&
|
|
// IsSpecifiedBearish(iDir);
|
|
// if (hasSwingTrend)
|
|
// {
|
|
// //
|
|
// Copy(
|
|
// swings,
|
|
// structure.trendSwings //
|
|
// );
|
|
// structure.trendDir = iDir;
|
|
// }
|
|
// SpecifiedClean(swings);
|
|
// }
|
|
|
|
// //
|
|
// // Custom Indicator Pivots ...
|
|
|
|
// //
|
|
// // Detecting MA Crosses ...
|
|
// if (config.detectMACrosses)
|
|
// {
|
|
// //
|
|
// idx = forBar.Index();
|
|
// has = fimaHelper.HasMACross(
|
|
// structure.maCrossDir,
|
|
// idx,
|
|
// config.validMACrossDiffMultiplier //
|
|
// );
|
|
|
|
// //
|
|
// fimaHelper.ExtractMAPivots(
|
|
// structure.maCrosses,
|
|
// idx,
|
|
// config.zonesRequiredNumber,
|
|
// config.validMACrossDiffMultiplier,
|
|
// config.zonesMaxAllowedLoopbackLength //
|
|
// );
|
|
// }
|
|
|
|
// //
|
|
// // Detecting HK Switches ...
|
|
// if (config.detectHKSwitches)
|
|
// {
|
|
// //
|
|
// idx = forBar.Index();
|
|
// has = fimaHelper.HasHKSwitch(
|
|
// structure.hkSwitchDir,
|
|
// idx //
|
|
// );
|
|
|
|
// //
|
|
// fimaHelper.ExtractHKPivots(
|
|
// structure.hkSwitches,
|
|
// idx,
|
|
// config.zonesRequiredNumber,
|
|
// config.zonesMaxAllowedLoopbackLength //
|
|
// );
|
|
// }
|
|
|
|
// //
|
|
// // Detecting SAR Switches ...
|
|
// if (config.detectSARSwitches)
|
|
// {
|
|
// //
|
|
// idx = forBar.Index();
|
|
// has = fimaHelper.HasSARSwitch(
|
|
// structure.sarSwitchDir,
|
|
// idx //
|
|
// );
|
|
|
|
// //
|
|
// fimaHelper.ExtractSARPivots(
|
|
// structure.sarSwitches,
|
|
// idx,
|
|
// config.zonesRequiredNumber,
|
|
// config.zonesMaxAllowedLoopbackLength //
|
|
// );
|
|
// }
|
|
|
|
// //
|
|
// // Custom Analysers ...
|
|
|
|
// //
|
|
// // Analyse Based on PV ...
|
|
// if (config.analyseFIMAPVPivots)
|
|
// {
|
|
// //
|
|
// XPivotAnalysis analysis;
|
|
// has = AnalysePVPivots(
|
|
// analysis, // Result ...
|
|
// forBar.Index(), // Bar Index ...
|
|
// config.numberOfRequiredPivotsForAnalysis, // Required Number of Pivots ...
|
|
// config.maxAllowedLoopbackLengthForAnalysis, // Max Allowed Loopback ...
|
|
// config.pvPivotsValidationLength // Validation Length ...
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// structure.pvAnalysis = analysis;
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // Analyse Based on ZigZag ...
|
|
// if (config.analyseFIMAZigZagPivots)
|
|
// {
|
|
// //
|
|
// XPivotAnalysis analysis;
|
|
// has = AnalyseZigZagPivots(
|
|
// analysis, // Result ...
|
|
// forBar.Index(), // Bar Index ...
|
|
// config.numberOfRequiredPivotsForAnalysis, // Required Number of Pivots ...
|
|
// config.maxAllowedLoopbackLengthForAnalysis // Max Allowed Loopback ...
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// structure.zigzagAnalysis = analysis;
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // Zones and Patterns Recent Actions ...
|
|
// if (config.zonesRequiredNumber > 0 &&
|
|
// config.zonesMaxAllowedLoopbackLength > 0)
|
|
// {
|
|
// //
|
|
// // Detect Recent Patterns ...
|
|
|
|
// //
|
|
// XOHCL iBar;
|
|
// XOHCL tmpBar;
|
|
// XPivot iPivot;
|
|
// XBoxZone iBox;
|
|
// bool has = false;
|
|
// string iPrefix = NULL;
|
|
// int start = forBar.Index();
|
|
// ENUM_X_SORT_BY iSortBy = X_SORT_BY_DATE;
|
|
// ENUM_X_DIRECTION iDir = X_DIRECTION_NONE;
|
|
// ENUM_X_DIRECTION iSortDir = X_DIRECTION_BULLISH;
|
|
// int end = start + config.zonesMaxAllowedLoopbackLength;
|
|
|
|
// //
|
|
// // Loop through Items ...
|
|
// for (int i = start; i < end; i++)
|
|
// {
|
|
// //
|
|
// iPivot.Clean();
|
|
|
|
// //
|
|
// // Initialize Indexed Bar ...
|
|
// has = forBar.BarAt(i, iBar);
|
|
// if (!has)
|
|
// {
|
|
// //
|
|
// iBar.Clean();
|
|
// continue;
|
|
// }
|
|
|
|
// //
|
|
// // OB ...
|
|
// has = HasOB(
|
|
// iBar,
|
|
// iDir,
|
|
// iBox,
|
|
// 5 //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// obs //
|
|
// );
|
|
// }
|
|
|
|
// //
|
|
// // FVG ...
|
|
// has = HasFVG(
|
|
// iBar,
|
|
// iDir,
|
|
// iBox,
|
|
// 5 //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// fvgs //
|
|
// );
|
|
// }
|
|
|
|
// //
|
|
// // SUPPORT ...
|
|
// tmpBar.Clean();
|
|
// has = HasSupport(
|
|
// iBar,
|
|
// tmpBar,
|
|
// config.zonesValidationLength,
|
|
// config.zonesMaxAllowedLoopbackLength //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// has = ToSupportBox(tmpBar, iBox, iBar.time);
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// // Check Strength ...
|
|
// if (config.zonesMinAlloweStrength > 0)
|
|
// {
|
|
// has = (iBox.upper - iBox.lower) > (config.zonesMinAlloweStrength * GetPoints(iBar.symbol));
|
|
// }
|
|
|
|
// //
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// supports //
|
|
// );
|
|
// }
|
|
// }
|
|
// }
|
|
// iBox.Clean();
|
|
// tmpBar.Clean();
|
|
|
|
// //
|
|
// // RESISATNCE ...
|
|
// tmpBar.Clean();
|
|
// has = HasResistance(
|
|
// iBar,
|
|
// tmpBar,
|
|
// config.zonesValidationLength,
|
|
// config.zonesMaxAllowedLoopbackLength //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// has = ToResistanceBox(tmpBar, iBox, iBar.time);
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// // Check Strength ...
|
|
// if (config.zonesMinAlloweStrength > 0)
|
|
// {
|
|
// has = (iBox.upper - iBox.lower) > (config.zonesMinAlloweStrength * GetPoints(iBar.symbol));
|
|
// }
|
|
|
|
// //
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// resistances //
|
|
// );
|
|
// }
|
|
// }
|
|
// }
|
|
// iBox.Clean();
|
|
// tmpBar.Clean();
|
|
|
|
// //
|
|
// // Bars Detecting ...
|
|
|
|
// //
|
|
// // Momentum Bars ...
|
|
// if (config.detectMomentum)
|
|
// {
|
|
// //
|
|
// iPrefix = "MomentumBar";
|
|
// has = IsMomentumBar(
|
|
// iBar,
|
|
// iDir,
|
|
// config.momentumBarRangeLength,
|
|
// config.momentumBarApprovedMultiplier //
|
|
// );
|
|
// has = has &&
|
|
// ToPivot(
|
|
// iBar,
|
|
// iPivot,
|
|
// iDir,
|
|
// iPrefix //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iPivot,
|
|
// structure.momentumBars //
|
|
// );
|
|
// }
|
|
// iPivot.Clean();
|
|
// }
|
|
|
|
// //
|
|
// // Engulfed Bars ...
|
|
// if (config.detectEngulfed)
|
|
// {
|
|
// //
|
|
// iPrefix = "EngulfedBar";
|
|
// has = IsEngulfedBar(
|
|
// iBar,
|
|
// iDir //
|
|
// );
|
|
// has = has &&
|
|
// ToPivot(
|
|
// iBar,
|
|
// iPivot,
|
|
// iDir,
|
|
// iPrefix //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iPivot,
|
|
// structure.engulfBars //
|
|
// );
|
|
// }
|
|
// iPivot.Clean();
|
|
// }
|
|
|
|
// //
|
|
// // TruGaped Bars ...
|
|
// if (config.detectTrueGaped)
|
|
// {
|
|
// //
|
|
// iPrefix = "TruGapedBar";
|
|
// has = IsTrueGapedBar(
|
|
// iBar,
|
|
// iDir,
|
|
// config.truwGapApprovedPointMultiplier //
|
|
// );
|
|
// has = has &&
|
|
// ToPivot(
|
|
// iBar,
|
|
// iPivot,
|
|
// iDir,
|
|
// iPrefix //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iPivot,
|
|
// structure.trueGapBars //
|
|
// );
|
|
// }
|
|
// iPivot.Clean();
|
|
// }
|
|
|
|
// //
|
|
// // Pin Bars ...
|
|
// if (config.detectTrueGaped)
|
|
// {
|
|
// //
|
|
// iPrefix = "PinBar";
|
|
// has = IsPinnedBar(
|
|
// iBar,
|
|
// iDir,
|
|
// config.pinnedBaarShadowApprovedMultiplier,
|
|
// config.pinnedBarMinimumPinBarRangeMultiplier,
|
|
// config.pinnedBarForceDirection //
|
|
// );
|
|
// has = has &&
|
|
// ToPivot(
|
|
// iBar,
|
|
// iPivot,
|
|
// iDir,
|
|
// iPrefix //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iPivot,
|
|
// structure.pinBars //
|
|
// );
|
|
// }
|
|
// iPivot.Clean();
|
|
// }
|
|
|
|
// //
|
|
// // Patterns Detecting ...
|
|
|
|
// //
|
|
// // Star Pattern ...
|
|
// if (config.detectStarPattern)
|
|
// {
|
|
// //
|
|
// iPrefix = "Star";
|
|
// has = IsStarPattern(
|
|
// iBar,
|
|
// iDir //
|
|
// );
|
|
// has = has &&
|
|
// ToBox(
|
|
// iBar,
|
|
// iBox,
|
|
// iDir,
|
|
// iPrefix //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// structure.starPatterns //
|
|
// );
|
|
// }
|
|
// iBox.Clean();
|
|
// }
|
|
|
|
// //
|
|
// // Piercing Pattern ...
|
|
// if (config.detectPiercingPattern)
|
|
// {
|
|
// //
|
|
// iPrefix = "Piercing";
|
|
// has = IsPiercingPattern(
|
|
// iBar,
|
|
// iDir //
|
|
// );
|
|
// has = has &&
|
|
// ToBox(
|
|
// iBar,
|
|
// iBox,
|
|
// iDir,
|
|
// iPrefix //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// structure.piercingPatterns //
|
|
// );
|
|
// }
|
|
// iBox.Clean();
|
|
// }
|
|
|
|
// //
|
|
// // Rising Pattern ...
|
|
// if (config.detectRisingPattern)
|
|
// {
|
|
// //
|
|
// iPrefix = "Rising";
|
|
// has = IsRisingPattern(
|
|
// iBar,
|
|
// iDir //
|
|
// );
|
|
// has = has &&
|
|
// ToBox(
|
|
// iBar,
|
|
// iBox,
|
|
// iDir,
|
|
// iPrefix //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// structure.risingPatterns //
|
|
// );
|
|
// }
|
|
// iBox.Clean();
|
|
// }
|
|
|
|
// //
|
|
// // Flag Pattern ...
|
|
// if (config.detectFlagPattern)
|
|
// {
|
|
// //
|
|
// iPrefix = "Flag";
|
|
// XOHCL swingBar;
|
|
// has = IsFlagPattern(
|
|
// iBar,
|
|
// iDir,
|
|
// swingBar,
|
|
// config.flagPatternMinimumPullbackBars //
|
|
// );
|
|
// has = has &&
|
|
// ToBox(
|
|
// iBar,
|
|
// iBox,
|
|
// iDir,
|
|
// iPrefix //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// structure.flagPatterns //
|
|
// );
|
|
// }
|
|
// iBox.Clean();
|
|
// }
|
|
|
|
// //
|
|
// // SignalKey Bar Pattern ...
|
|
// if (config.detectSignalKeyBarPattern)
|
|
// {
|
|
// //
|
|
// iPrefix = "SignalKeyBar";
|
|
// has = IsSignalKeyBarPattern(
|
|
// iBar,
|
|
// iDir,
|
|
// config.signalKeyBarShadowApprovedMultiplier,
|
|
// config.signalKeyBarMinimumPinBarRangeMultiplier,
|
|
// config.signalKeyBarForceDirection //
|
|
// );
|
|
// has = has &&
|
|
// ToBox(
|
|
// iBar,
|
|
// iBox,
|
|
// iDir,
|
|
// iPrefix //
|
|
// );
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// structure.signalKeyBarPatterns //
|
|
// );
|
|
// }
|
|
// iBox.Clean();
|
|
// }
|
|
|
|
// //
|
|
// iBar.Clean();
|
|
// iBox.Clean();
|
|
// tmpBar.Clean();
|
|
// iPivot.Clean();
|
|
// }
|
|
|
|
// //
|
|
// // Zones Extractions ...
|
|
|
|
// //
|
|
// // XBARZONES ...
|
|
// XBoxZone tmpZones[];
|
|
// int tmpZonesCount = fimaHelper.ExtractBarZones(
|
|
// tmpZones,
|
|
// forBar.Index(),
|
|
// config.zonesRequiredNumber,
|
|
// config.zonesBreakValidationLength,
|
|
// config.zonesBreakValidationLength > 0,
|
|
// config.zonesBarShadowMultiplier,
|
|
// config.zonesMinAlloweStrength,
|
|
// config.zonesValidationLength,
|
|
// config.zonesMaxAllowedLoopbackLength //
|
|
// );
|
|
// has = IsValidSize(tmpZonesCount);
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// for (int i = 0; i < tmpZonesCount; i++)
|
|
// {
|
|
// //
|
|
// if (tmpZones[i].IsBullish())
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// tmpZones[i],
|
|
// supports //
|
|
// );
|
|
// }
|
|
// else if (tmpZones[i].IsBearish())
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// tmpZones[i],
|
|
// resistances //
|
|
// );
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // XHK ...
|
|
// XClean(tmpZones);
|
|
// tmpZonesCount = fimaHelper.ExtractHKZones(
|
|
// tmpZones,
|
|
// forBar.Index(),
|
|
// config.zonesRequiredNumber,
|
|
// config.zonesBreakValidationLength,
|
|
// config.zonesBreakValidationLength > 0,
|
|
// config.zonesBarShadowMultiplier,
|
|
// config.zonesMinAlloweStrength,
|
|
// config.zonesValidationLength,
|
|
// config.zonesMaxAllowedLoopbackLength //
|
|
// );
|
|
// has = IsValidSize(tmpZonesCount);
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// for (int i = 0; i < tmpZonesCount; i++)
|
|
// {
|
|
// //
|
|
// if (tmpZones[i].IsBullish())
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// tmpZones[i],
|
|
// supports //
|
|
// );
|
|
// }
|
|
// else if (tmpZones[i].IsBearish())
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// tmpZones[i],
|
|
// resistances //
|
|
// );
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// //
|
|
// // Cleanup Resources ...
|
|
// iBar.Clean();
|
|
// iBox.Clean();
|
|
// tmpBar.Clean();
|
|
// iPivot.Clean();
|
|
// }
|
|
|
|
// //
|
|
// // Analysis Zones ...
|
|
|
|
// //
|
|
// // XPV ...
|
|
|
|
// //
|
|
// // Support ...
|
|
// has = structure.pvAnalysis.IsValid() &&
|
|
// structure.pvAnalysis.HasSupportBox(iBox);
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// supports //
|
|
// );
|
|
// }
|
|
|
|
// //
|
|
// // Resistance ...
|
|
// has = structure.pvAnalysis.IsValid() &&
|
|
// structure.pvAnalysis.HasResistanceBox(iBox);
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// resistances //
|
|
// );
|
|
// }
|
|
|
|
// //
|
|
// // XZG ...
|
|
|
|
// //
|
|
// // Support ...
|
|
// has = structure.zigzagAnalysis.IsValid() &&
|
|
// structure.zigzagAnalysis.HasSupportBox(iBox);
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// supports //
|
|
// );
|
|
// }
|
|
|
|
// //
|
|
// // Resistance ...
|
|
// has = structure.zigzagAnalysis.IsValid() &&
|
|
// structure.zigzagAnalysis.HasResistanceBox(iBox);
|
|
// if (has)
|
|
// {
|
|
// //
|
|
// AddIfNotExists(
|
|
// iBox,
|
|
// resistances //
|
|
// );
|
|
// }
|
|
|
|
// //
|
|
// // ZONES Specified ...
|
|
|
|
// //
|
|
// // OBS ...
|
|
// CheckZones(forBar, obs);
|
|
// UpdateToTime(obs, forBar.time);
|
|
// Copy(
|
|
// obs,
|
|
// structure.obs //
|
|
// );
|
|
|
|
// //
|
|
// // FVGS ...
|
|
// CheckZones(forBar, fvgs);
|
|
// UpdateToTime(fvgs, forBar.time);
|
|
// Copy(
|
|
// fvgs,
|
|
// structure.fvgs //
|
|
// );
|
|
|
|
// //
|
|
// // SUPPORTS ...
|
|
// CheckZones(forBar, supports);
|
|
// UpdateToTime(supports, forBar.time);
|
|
// Copy(
|
|
// supports,
|
|
// structure.supports //
|
|
// );
|
|
|
|
// //
|
|
// // RESISTANCES ...
|
|
// CheckZones(forBar, resistances);
|
|
// UpdateToTime(resistances, forBar.time);
|
|
// Copy(
|
|
// resistances,
|
|
// structure.resistances //
|
|
// );
|
|
|
|
// //
|
|
// // Cleanup Resources ...
|
|
// iBox.Clean();
|
|
}
|
|
|
|
//
|
|
// Protected ...
|
|
protected:
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
// Private ...
|
|
private:
|
|
//
|
|
|
|
//
|
|
};
|
|
|
|
// |