This commit is contained in:
2025-01-18 12:16:28 +03:30
parent 9cdd5b4c7d
commit e74f64c51e
10 changed files with 2111 additions and 1003 deletions
+920 -16
View File
@@ -6471,9 +6471,9 @@ struct XFVGOrderBlock
/**
* Check Model is same as another Istance ...
*
*
* @param value: XFVGOrderBlock instance Reference ...
*
*
* @return ( bool )
*/
bool IsSameAs(XFVGOrderBlock &value)
@@ -6510,18 +6510,18 @@ struct XFVGOrderBlock
result =
//
dir == valueDir
//
&&
//
orderBlock.From() == value.orderBlock.From() &&
orderBlock.Upper() == value.orderBlock.Upper() &&
orderBlock.Lower() == value.orderBlock.Lower()
//
&&
//
fairValueGap.From() == value.fairValueGap.From() &&
fairValueGap.Upper() == value.fairValueGap.Upper() &&
fairValueGap.Lower() == value.fairValueGap.Lower()
//
&&
//
orderBlock.From() == value.orderBlock.From() &&
orderBlock.Upper() == value.orderBlock.Upper() &&
orderBlock.Lower() == value.orderBlock.Lower()
//
&&
//
fairValueGap.From() == value.fairValueGap.From() &&
fairValueGap.Upper() == value.fairValueGap.Upper() &&
fairValueGap.Lower() == value.fairValueGap.Lower()
//
;
@@ -7720,6 +7720,910 @@ void DetectPivotPOIs(
}
}
/**
* Fill Pivot Tick Zone ...
*
* @param pivot: XPVPivot instance Reference ...
*/
void CalculatePivotTickZone(
XPVPivot &pivot,
int ticksLevels,
int ticksRange,
ENUM_TIMEFRAMES _period = NULL //
)
{
//
string symbol = pivot.symbol;
ENUM_TIMEFRAMES period = IsValid(_period)
? _period
: pivot.period;
//
bool isInited = false;
//
datetime from = pivot.from;
XOHCL iFromBar;
int iFromBarIndex = iBarShift(
symbol,
period,
from //
);
isInited = iFromBar.Init(
symbol,
period,
iFromBarIndex //
);
if (!isInited)
{
return;
}
//
datetime to = pivot.to;
XOHCL iToBar;
int iToBarIndex = iBarShift(
symbol,
period,
to //
);
isInited = iToBar.Init(
symbol,
period,
iToBarIndex //
);
if (!isInited)
{
return;
}
//
if (iFromBarIndex <= iToBarIndex)
{
return;
}
//
XCTicksZone *iZone;
iZone = new XCTicksZone();
//
isInited = ticksLevels > 0 &&
ticksRange > 0;
if (!isInited)
{
return;
}
//
isInited = iZone.Init(
iFromBar,
iToBar //
);
if (!isInited)
{
return;
}
//
pivot.state.ticksZone = iZone;
}
/**
* Filter State based on Pivot ...
*
* @param pivot: XPVPivot instance Reference ...
* @param state: XPOIState instance Reference ...
*/
void FilterPivotState(
XPVPivot &pivot,
XPOIState &state //
)
{
//
bool isValid =
pivot.IsValid() &&
state.IsValid() &&
state.HasChild();
if (!isValid)
{
return;
}
//
int count = 0;
//
double upper = pivot.upper;
double lower = pivot.lower;
//
//
//
//
// Resistance ...
count = state.CountResistanceZones();
if (IsValidSize(count))
{
//
XCResistanceZone *tmp[];
Copy(
state.resistanceZones,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCResistanceZone *item = tmp[i];
//
bool isValid = IsPriceInsideZone(
upper,
item //
);
if (!isValid)
{
//
ArrayRemove(
state.resistanceZones,
i,
1 //
);
}
}
//
ArrayFree(tmp);
}
//
// Supply ...
count = state.CountSupplyZones();
if (IsValidSize(count))
{
//
XCSupplyZone *tmp[];
Copy(
state.supplyZones,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCSupplyZone *item = tmp[i];
//
bool isValid = IsPriceInsideZone(
upper,
item //
);
if (!isValid)
{
//
ArrayRemove(
state.supplyZones,
i,
1 //
);
}
}
//
ArrayFree(tmp);
}
//
// Bearish Order Block ...
count = state.CountBearishOrderBlocks();
if (IsValidSize(count))
{
//
XCOrderBlock *tmp[];
Copy(
state.bearishOrderBlocks,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCOrderBlock *item = tmp[i];
//
bool isValid = IsPriceInsideZone(
upper,
item //
);
if (!isValid)
{
//
ArrayRemove(
state.bearishOrderBlocks,
i,
1 //
);
}
}
//
ArrayFree(tmp);
}
//
// Bearish Fair Value Gap ...
count = state.CountBearishFairValueGaps();
if (IsValidSize(count))
{
//
XCFVG *tmp[];
Copy(
state.bearishFairValueGaps,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCFVG *item = tmp[i];
//
bool isValid = IsPriceInsideZone(
upper,
item //
);
if (!isValid)
{
//
ArrayRemove(
state.bearishFairValueGaps,
i,
1 //
);
}
}
//
ArrayFree(tmp);
}
//
//
//
//
// Support ...
count = state.CountSupportZones();
if (IsValidSize(count))
{
//
XCSupportZone *tmp[];
Copy(
state.supportZones,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCSupportZone *item = tmp[i];
//
bool isValid = IsPriceInsideZone(
lower,
item //
);
if (!isValid)
{
//
ArrayRemove(
state.supportZones,
i,
1 //
);
}
}
//
ArrayFree(tmp);
}
//
// Demand ...
count = state.CountDemandZones();
if (IsValidSize(count))
{
//
XCDemandZone *tmp[];
Copy(
state.demandZones,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCDemandZone *item = tmp[i];
//
bool isValid = IsPriceInsideZone(
lower,
item //
);
if (!isValid)
{
//
ArrayRemove(
state.demandZones,
i,
1 //
);
}
}
//
ArrayFree(tmp);
}
//
// Bullish Order Block ...
count = state.CountBullishOrderBlocks();
if (IsValidSize(count))
{
//
XCOrderBlock *tmp[];
Copy(
state.bullishOrderBlocks,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCOrderBlock *item = tmp[i];
//
bool isValid = IsPriceInsideZone(
lower,
item //
);
if (!isValid)
{
//
ArrayRemove(
state.bullishOrderBlocks,
i,
1 //
);
}
}
//
ArrayFree(tmp);
}
//
// Bullish Fair Value Gap ...
count = state.CountBullishFairValueGaps();
if (IsValidSize(count))
{
//
XCFVG *tmp[];
Copy(
state.bullishFairValueGaps,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCFVG *item = tmp[i];
//
bool isValid = IsPriceInsideZone(
lower,
item //
);
if (!isValid)
{
//
ArrayRemove(
state.bullishFairValueGaps,
i,
1 //
);
}
}
//
ArrayFree(tmp);
}
}
/**
* Detect Box Date of Specified Pivot ...
*/
bool DetectPivotStateBoxData(
XPVPivot &pivot,
double &peakUpper,
double &peakLower,
datetime &peakFrom,
datetime &peakTo,
double &valeUpper,
double &valeLower,
datetime &valeFrom,
datetime &valeTo //
)
{
//
bool result = false;
//
peakUpper = 0;
peakLower = 0;
valeUpper = 0;
valeLower = 0;
//
peakFrom = NULL;
peakTo = NULL;
valeFrom = NULL;
valeTo = NULL;
//
result = pivot.IsValid();
if (!result)
{
return result;
}
//
int count = 0;
//
//
//
//
// Resistance ...
count = pivot.state.CountResistanceZones();
if (IsValidSize(count))
{
//
XCResistanceZone *tmp[];
Copy(
pivot.state.resistanceZones,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCResistanceZone *item = tmp[i];
//
if (peakUpper == 0 ||
peakUpper < item.Upper())
{
peakUpper = item.Upper();
}
//
if (peakLower == 0 ||
peakLower > item.Lower())
{
peakLower = item.Lower();
}
//
if (!IsValid(peakFrom) ||
peakFrom > item.From())
{
peakFrom = item.From();
}
//
if (!IsValid(peakTo) ||
peakTo < item.To())
{
peakTo = item.To();
}
}
//
ArrayFree(tmp);
}
//
// Supply ...
count = pivot.state.CountSupplyZones();
if (IsValidSize(count))
{
//
XCSupplyZone *tmp[];
Copy(
pivot.state.supplyZones,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCSupplyZone *item = tmp[i];
//
if (peakUpper == 0 ||
peakUpper < item.Upper())
{
peakUpper = item.Upper();
}
//
if (peakLower == 0 ||
peakLower > item.Lower())
{
peakLower = item.Lower();
}
//
if (!IsValid(peakFrom) ||
peakFrom > item.From())
{
peakFrom = item.From();
}
//
if (!IsValid(peakTo) ||
peakTo < item.To())
{
peakTo = item.To();
}
}
//
ArrayFree(tmp);
}
//
// Bearish Order Block ...
count = pivot.state.CountBearishOrderBlocks();
if (IsValidSize(count))
{
//
XCOrderBlock *tmp[];
Copy(
pivot.state.bearishOrderBlocks,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCOrderBlock *item = tmp[i];
//
if (peakUpper == 0 ||
peakUpper < item.Upper())
{
peakUpper = item.Upper();
}
//
if (peakLower == 0 ||
peakLower > item.Lower())
{
peakLower = item.Lower();
}
//
if (!IsValid(peakFrom) ||
peakFrom > item.From())
{
peakFrom = item.From();
}
//
if (!IsValid(peakTo) ||
peakTo < item.To())
{
peakTo = item.To();
}
}
//
ArrayFree(tmp);
}
//
// Bearish Fair Value Gap ...
count = pivot.state.CountBearishFairValueGaps();
if (IsValidSize(count))
{
//
XCFVG *tmp[];
Copy(
pivot.state.bearishFairValueGaps,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCFVG *item = tmp[i];
//
if (peakUpper == 0 ||
peakUpper < item.Upper())
{
peakUpper = item.Upper();
}
//
if (peakLower == 0 ||
peakLower > item.Lower())
{
peakLower = item.Lower();
}
//
if (!IsValid(peakFrom) ||
peakFrom > item.From())
{
peakFrom = item.From();
}
//
if (!IsValid(peakTo) ||
peakTo < item.To())
{
peakTo = item.To();
}
}
//
ArrayFree(tmp);
}
//
//
//
//
// Support ...
count = pivot.state.CountSupportZones();
if (IsValidSize(count))
{
//
XCSupportZone *tmp[];
Copy(
pivot.state.supportZones,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCSupportZone *item = tmp[i];
//
if (valeUpper == 0 ||
valeUpper < item.Upper())
{
valeUpper = item.Upper();
}
//
if (valeLower == 0 ||
valeLower > item.Lower())
{
valeLower = item.Lower();
}
//
if (!IsValid(valeFrom) ||
valeFrom > item.From())
{
valeFrom = item.From();
}
//
if (!IsValid(valeTo) ||
valeTo < item.To())
{
valeTo = item.To();
}
}
//
ArrayFree(tmp);
}
//
// Demand ...
count = pivot.state.CountDemandZones();
if (IsValidSize(count))
{
//
XCDemandZone *tmp[];
Copy(
pivot.state.demandZones,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCDemandZone *item = tmp[i];
//
if (valeUpper == 0 ||
valeUpper < item.Upper())
{
valeUpper = item.Upper();
}
//
if (valeLower == 0 ||
valeLower > item.Lower())
{
valeLower = item.Lower();
}
//
if (!IsValid(valeFrom) ||
valeFrom > item.From())
{
valeFrom = item.From();
}
//
if (!IsValid(valeTo) ||
valeTo < item.To())
{
valeTo = item.To();
}
}
//
ArrayFree(tmp);
}
//
// Bullish Order Block ...
count = pivot.state.CountBullishOrderBlocks();
if (IsValidSize(count))
{
//
XCOrderBlock *tmp[];
Copy(
pivot.state.bullishOrderBlocks,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCOrderBlock *item = tmp[i];
//
if (valeUpper == 0 ||
valeUpper < item.Upper())
{
valeUpper = item.Upper();
}
//
if (valeLower == 0 ||
valeLower > item.Lower())
{
valeLower = item.Lower();
}
//
if (!IsValid(valeFrom) ||
valeFrom > item.From())
{
valeFrom = item.From();
}
//
if (!IsValid(valeTo) ||
valeTo < item.To())
{
valeTo = item.To();
}
}
//
ArrayFree(tmp);
}
//
// Bullish Fair Value Gap ...
count = pivot.state.CountBullishFairValueGaps();
if (IsValidSize(count))
{
//
XCFVG *tmp[];
Copy(
pivot.state.bullishFairValueGaps,
tmp //
);
//
for (int i = 0; i < count; i++)
{
//
XCFVG *item = tmp[i];
//
if (valeUpper == 0 ||
valeUpper < item.Upper())
{
valeUpper = item.Upper();
}
//
if (valeLower == 0 ||
valeLower > item.Lower())
{
valeLower = item.Lower();
}
//
if (!IsValid(valeFrom) ||
valeFrom > item.From())
{
valeFrom = item.From();
}
//
if (!IsValid(valeTo) ||
valeTo < item.To())
{
valeTo = item.To();
}
}
//
ArrayFree(tmp);
}
//
result = peakUpper > 0 &&
peakLower > 0 &&
valeUpper > 0 &&
valeLower > 0 &&
IsValid(peakTo) &&
IsValid(valeTo) &&
IsValid(peakFrom) &&
IsValid(valeFrom) &&
peakTo > peakFrom &&
valeTo > valeFrom &&
peakUpper > peakLower &&
valeUpper > valeLower;
//
return result;
}
/**
* Detect Price Inside Zones ...
*
@@ -9745,14 +10649,14 @@ double CalculateTarget(
/**
* Test Market for Detect Order Block FVG ...
*
*
* @param forDir: Direction
* @param bullishOrderBlocks: Detected Bullish Order Blocks ...
* @param bearishOrderBlocks: Detected Bearish Order Blocks ...
* @param orderBlockState: Order Block Detection POIState ...
* @param fairValueGapState: Fair Value Gap Detection POIState ...
* @param barIndex: Bar Index ...
*
*
* @return ( bool )
*/
bool DetectFVGOB(