This commit is contained in:
2025-10-30 00:07:23 +03:30
parent 90988de7bf
commit 574c79afcc
6 changed files with 2209 additions and 961 deletions
@@ -34,11 +34,12 @@ enum ENUM_XFIMA_PIVOTS
{
XFIMA_PIVOT_NONE = 0,
XFIMA_PIVOT_PV = 1,
XFIMA_PIVOT_ZIGZAG = 2,
XFIMA_PIVOT_MA_CROSS = 3,
XFIMA_PIVOT_HK_SWITCH = 4,
XFIMA_PIVOT_SAR_SWITCH = 5,
XFIMA_PIVOT_BOUNDARY_SWITCH = 6,
XFIMA_PIVOT_ATR = 2,
XFIMA_PIVOT_ZIGZAG = 3,
XFIMA_PIVOT_MA_CROSS = 4,
XFIMA_PIVOT_HK_SWITCH = 5,
XFIMA_PIVOT_SAR_SWITCH = 6,
XFIMA_PIVOT_BOUNDARY_SWITCH = 7,
};
bool IsXValid(ENUM_XFIMA_PIVOTS value)
@@ -77,6 +78,11 @@ string ToXString(ENUM_XFIMA_PIVOTS value)
result = "XPV";
break;
//
case XFIMA_PIVOT_ATR:
result = "XATR";
break;
//
case XFIMA_PIVOT_ZIGZAG:
result = "XZGP";
@@ -127,6 +133,10 @@ ENUM_XFIMA_PIVOTS ToXFIMAPivots(string value)
{
result = XFIMA_PIVOT_PV;
}
else if (value == ToXString(XFIMA_PIVOT_ATR))
{
result = XFIMA_PIVOT_ATR;
}
else if (value == ToXString(XFIMA_PIVOT_ZIGZAG))
{
result = XFIMA_PIVOT_ZIGZAG;
@@ -1785,6 +1795,282 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector
return result;
}
/**
* Get Cycle Based PV Zone ...
*
* @param bar: XOHCL, reference to Specified Zone ...
* @param zone: XBoxZone, reference to holds PV Zone ...
*
* @return ( bool )
*/
bool GetSCZone(
XOHCL &bar,
XBoxZone &zone //
)
{
//
bool result = false;
//
// Prepare ...
zone.Clean();
//
// Validate ...
result = bar.IsValid();
if (!result)
{
return result;
}
//
int barIndex = bar.Index();
//
double upper = fimaHelper.GetSHH(barIndex);
double lower = fimaHelper.GetSLL(barIndex);
double pHH = fimaHelper.GetSHH(barIndex + 1);
double pLL = fimaHelper.GetSLL(barIndex + 1);
int sameLLs = fimaParser.CountSCSameLLs(barIndex);
int sameHHs = fimaParser.CountSCSameHHs(barIndex);
int fromIDX = barIndex + MathMax(sameLLs, sameHHs);
//
zone.to = bar.time;
zone.at = bar.time;
zone.upper = upper;
zone.lower = lower;
zone.symbol = bar.symbol;
zone.period = bar.period;
zone.dir =
(upper > pHH ||
lower > pLL)
? X_DIRECTION_BULLISH
: (upper < pHH ||
lower < pLL)
? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
zone.type = ToXString(XFIMA_PIVOT_PV) + "_SC";
zone.from = GetBarTime(bar.symbol, bar.period, fromIDX);
//
result = zone.IsValid();
if (!result)
{
zone.Clean();
}
//
return result;
}
/**
* Get Cycle Based PV Zone ...
*
* @param bar: XOHCL, reference to Specified Zone ...
* @param zone: XBoxZone, reference to holds PV Zone ...
*
* @return ( bool )
*/
bool GetMCZone(
XOHCL &bar,
XBoxZone &zone //
)
{
//
bool result = false;
//
// Prepare ...
zone.Clean();
//
// Validate ...
result = bar.IsValid();
if (!result)
{
return result;
}
//
int barIndex = bar.Index();
//
double upper = fimaHelper.GetMHH(barIndex);
double lower = fimaHelper.GetMLL(barIndex);
double pHH = fimaHelper.GetMHH(barIndex + 1);
double pLL = fimaHelper.GetMLL(barIndex + 1);
int sameLLs = fimaParser.CountMCSameLLs(barIndex);
int sameHHs = fimaParser.CountMCSameHHs(barIndex);
int fromIDX = barIndex + MathMax(sameLLs, sameHHs);
//
zone.to = bar.time;
zone.at = bar.time;
zone.upper = upper;
zone.lower = lower;
zone.symbol = bar.symbol;
zone.period = bar.period;
zone.dir =
(upper > pHH ||
lower > pLL)
? X_DIRECTION_BULLISH
: (upper < pHH ||
lower < pLL)
? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
zone.type = ToXString(XFIMA_PIVOT_PV) + "_MC";
zone.from = GetBarTime(bar.symbol, bar.period, fromIDX);
//
result = zone.IsValid();
if (!result)
{
zone.Clean();
}
//
return result;
}
/**
* Get Cycle Based PV Zone ...
*
* @param bar: XOHCL, reference to Specified Zone ...
* @param zone: XBoxZone, reference to holds PV Zone ...
*
* @return ( bool )
*/
bool GetLCZone(
XOHCL &bar,
XBoxZone &zone //
)
{
//
bool result = false;
//
// Prepare ...
zone.Clean();
//
// Validate ...
result = bar.IsValid();
if (!result)
{
return result;
}
//
int barIndex = bar.Index();
//
double upper = fimaHelper.GetLHH(barIndex);
double lower = fimaHelper.GetLLL(barIndex);
double pHH = fimaHelper.GetLHH(barIndex + 1);
double pLL = fimaHelper.GetLLL(barIndex + 1);
int sameLLs = fimaParser.CountLCSameLLs(barIndex);
int sameHHs = fimaParser.CountLCSameHHs(barIndex);
int fromIDX = barIndex + MathMax(sameLLs, sameHHs);
//
zone.to = bar.time;
zone.at = bar.time;
zone.upper = upper;
zone.lower = lower;
zone.symbol = bar.symbol;
zone.period = bar.period;
zone.dir =
(upper > pHH ||
lower > pLL)
? X_DIRECTION_BULLISH
: (upper < pHH ||
lower < pLL)
? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
zone.type = ToXString(XFIMA_PIVOT_PV) + "_LC";
zone.from = GetBarTime(bar.symbol, bar.period, fromIDX);
//
result = zone.IsValid();
if (!result)
{
zone.Clean();
}
//
return result;
}
/**
* Get Cycle Based PV Zone ...
*
* @param bar: XOHCL, reference to Specified Zone ...
* @param zone: XBoxZone, reference to holds PV Zone ...
*
* @return ( bool )
*/
bool GetHCZone(
XOHCL &bar,
XBoxZone &zone //
)
{
//
bool result = false;
//
// Prepare ...
zone.Clean();
//
// Validate ...
result = bar.IsValid();
if (!result)
{
return result;
}
//
int barIndex = bar.Index();
//
double upper = fimaHelper.GetHHH(barIndex);
double lower = fimaHelper.GetHLL(barIndex);
double pHH = fimaHelper.GetHHH(barIndex + 1);
double pLL = fimaHelper.GetHLL(barIndex + 1);
int sameLLs = fimaParser.CountHCSameLLs(barIndex);
int sameHHs = fimaParser.CountHCSameHHs(barIndex);
int fromIDX = barIndex + MathMax(sameLLs, sameHHs);
//
zone.to = bar.time;
zone.at = bar.time;
zone.upper = upper;
zone.lower = lower;
zone.symbol = bar.symbol;
zone.period = bar.period;
zone.dir =
(upper > pHH ||
lower > pLL)
? X_DIRECTION_BULLISH
: (upper < pHH ||
lower < pLL)
? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
zone.type = ToXString(XFIMA_PIVOT_PV) + "_HC";
zone.from = GetBarTime(bar.symbol, bar.period, fromIDX);
//
result = zone.IsValid();
if (!result)
{
zone.Clean();
}
//
return result;
}
//
// Others ...