well tested truge detecting ...

This commit is contained in:
2025-09-24 14:32:49 +03:30
parent 4b161771f2
commit e2b05b6455
4 changed files with 736 additions and 6 deletions
@@ -33,110 +33,740 @@ class XCXFIMAPOIDrawer : public XCPOIDrawer
public:
//
void DrawMarketStructure(
//
// 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;
}
/**
* 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 = 3;
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);
}
}
int DrawMarketStructure(
XFIMAMarketStructure &structure,
XFIMAMarketStructureDrawerConfig &config,
CArrayObj *&objects //
)
{
//
int result = 0;
//
// Normalize ...
if (objects == NULL)
{
objects = new CArrayObj();
}
//
// Prepare ...
objects.Clear();
//
bool has = false;
int arrowCode = -1;
int arrowWidth = 3;
string arrowName = NULL;
color arrowColor = CLR_NONE;
ENUM_X_PRICE arrowPriceType = X_PRICE_CLOSE;
ENUM_ARROW_ANCHOR arrowAnchor = ANCHOR_BOTTOM;
//
int bullArrowCode = GetArrowCode(X_DIRECTION_BULLISH);
int bearArrowCode = GetArrowCode(X_DIRECTION_BEARISH);
//
// Validate ...
has = structure.bar.IsValid();
if (!has)
{
return result;
}
//
// Apply Drawing Methods ...
//
// OB ...
if (config.drawOB)
{
//
// Validate ...
has = structure.ob.IsValid();
if (has)
{
//
XCBoxObject *iObj;
has = DrawBox(
structure.ob,
iObj //
);
if (has)
{
objects.Add(iObj);
}
//
ZeroMemory(iObj);
}
}
//
// FVG ...
if (config.drawFVG)
{
//
// Validate ...
has = structure.fvg.IsValid();
if (has)
{
//
XCBoxObject *iObj;
has = DrawBox(
structure.fvg,
iObj //
);
if (has)
{
objects.Add(iObj);
}
//
ZeroMemory(iObj);
}
}
//
// Support ...
if (config.drawSupports)
{
//
// Validate ...
has = structure.support.IsValid();
if (has)
{
//
XCBoxObject *iObj;
has = DrawBox(
structure.support,
iObj //
);
if (has)
{
objects.Add(iObj);
}
//
ZeroMemory(iObj);
}
}
//
// Resistance ...
if (config.drawResistance)
{
//
// Validate ...
has = structure.resistance.IsValid();
if (has)
{
//
XCBoxObject *iObj;
has = DrawBox(
structure.resistance,
iObj //
);
if (has)
{
objects.Add(iObj);
}
//
ZeroMemory(iObj);
}
}
//
// Swing Trend ...
if (config.drawSwingTrend)
{
//
// Validate ...
has = HasDirection(structure.trendDir) &&
HasChild(structure.trendSwings);
if (has)
{
//
CChartObjectTrend *iObj;
has = DrawSwingTrend(
structure.trendSwings,
structure.trendDir,
iObj, //
true, // Ray Right ...
false // Ray Left ...
);
if (has)
{
objects.Add(iObj);
}
//
ZeroMemory(iObj);
}
}
//
// Start Pattern ...
if (config.drawStarPattern)
{
//
// Validate ...
has = HasDirection(structure.starPatternDir);
if (has)
{
//
FillArrowSpecs(
structure.starPatternDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XStar_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Flag Pattern ...
if (config.drawFlagPattern)
{
//
// Validate ...
has = HasDirection(structure.flagPatternDir) &&
structure.flagSwing.IsValid();
if (has)
{
//
FillArrowSpecs(
structure.flagPatternDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XFlag_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Rising Pattern ...
if (config.drawRisingPattern)
{
//
// Validate ...
has = HasDirection(structure.risingPatternDir);
if (has)
{
//
FillArrowSpecs(
structure.risingPatternDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XRise_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Piercing Pattern ...
if (config.drawPiercingPattern)
{
//
// Validate ...
has = HasDirection(structure.piercingPatternDir);
if (has)
{
//
FillArrowSpecs(
structure.piercingPatternDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XPiercing_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Signal Key Bar Pattern ...
if (config.drawSignalKeyBarPattern)
{
//
// Validate ...
has = HasDirection(structure.signalKeyBarPatternDir);
if (has)
{
//
FillArrowSpecs(
structure.signalKeyBarPatternDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XSignalKey_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Pinned Bar ...
if (config.drawPinned)
{
//
// Validate ...
has = HasDirection(structure.pinnedDir);
if (has)
{
//
FillArrowSpecs(
structure.pinnedDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XPin_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Momentum Bar ...
if (config.drawMomentum)
{
//
// Validate ...
has = HasDirection(structure.momentumDir);
if (has)
{
//
FillArrowSpecs(
structure.momentumDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XMomentum_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Engulfed Bar ...
if (config.drawEngulfed)
{
//
// Validate ...
has = HasDirection(structure.engulfedDir);
if (has)
{
//
FillArrowSpecs(
structure.engulfedDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XEngulf_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// True Gaped Bar ...
if (config.drawTrueGaped)
{
//
// Validate ...
has = HasDirection(structure.trueGapedDir);
if (has)
{
//
FillArrowSpecs(
structure.trueGapedDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XTrueGap_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// XFIMA PV Analysis ...
if (config.drawFIMAPVPivotsAnalysis)
{
//
// Validate ...
has = structure.pvAnalysis.IsValid();
if (has)
{
//
XCPivotAnalysisObject *iObj;
has = DrawPivotAnalysis(
structure.pvAnalysis,
iObj,
config.drawFIMAPVPivotsAnalysisPivots,
bearArrowCode,
bullArrowCode //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// XFIMA MA Analysis ...
if (config.drawFIMAMAPivotsAnalysis)
{
//
// Validate ...
has = structure.maAnalysis.IsValid();
if (has)
{
//
XCPivotAnalysisObject *iObj;
has = DrawPivotAnalysis(
structure.pvAnalysis,
iObj,
config.drawFIMAMAPivotsAnalysisPivots,
bearArrowCode,
bullArrowCode //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// XFIMA Sar Analysis ...
if (config.drawFIMASARPivotsAnalysis)
{
//
// Validate ...
has = structure.sarAnalysis.IsValid();
if (has)
{
//
XCPivotAnalysisObject *iObj;
has = DrawPivotAnalysis(
structure.pvAnalysis,
iObj,
config.drawFIMASARPivotsAnalysisPivots,
bearArrowCode,
bullArrowCode //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// XFIMA ZigZag Analysis ...
if (config.drawFIMAZigZagPivotsAnalysis)
{
//
// Validate ...
has = structure.zigzagAnalysis.IsValid();
if (has)
{
//
XCPivotAnalysisObject *iObj;
has = DrawPivotAnalysis(
structure.pvAnalysis,
iObj,
config.drawFIMAZigZagPivotsAnalysisPivots,
bearArrowCode,
bullArrowCode //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
result = objects.Total();
//
return result;
}
//