well tested truge detecting ...
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user