This commit is contained in:
2025-04-22 13:07:47 +03:30
parent a3a02973ef
commit 168f2c58d1
7 changed files with 437 additions and 55 deletions
-12
View File
@@ -2792,12 +2792,6 @@ class XCX121Helper : public XCBase
conditions.strBuffer //
);
//
Copy(
xstrConditions.strMidBuffer,
conditions.strMidBuffer //
);
//
Copy(
xstrConditions.strUpBuffer,
@@ -2834,12 +2828,6 @@ class XCX121Helper : public XCBase
conditions.strSMHighBuffer //
);
//
Copy(
xstrConditions.strMidStateBuffer,
conditions.strMidStateBuffer //
);
//
// Conditions ...
+1 -1
View File
@@ -1077,7 +1077,7 @@ class XCX121XVOLUMEHelper : public XCBaseHelper
{
//
// Buffers ...
if (barInex < 0) {
if (barIndex < 0) {
barIndex = 0;
}
+5 -5
View File
@@ -4657,8 +4657,8 @@ class XCTicksZone : public XCTwoBarZone
// Calculate Start and End Time ...
datetime from = startBar.time;
datetime to = endBar.time;
ulong fromM = ((ulong)startBar.time * 1000);
ulong toM = ((ulong)endBar.time * 1000);
ulong fromM = ((ulong)to * 1000);
ulong toM = ((ulong)from * 1000);
//
// Symbol and Period ...
@@ -4672,7 +4672,7 @@ class XCTicksZone : public XCTwoBarZone
//
// Retrieve Ticks between Times ...
SpecificClean(mTicks);
CopyTicksRange(
int res = CopyTicksRange(
symbol,
mTicks,
COPY_TICKS_ALL,
@@ -4826,8 +4826,8 @@ class XCTicksZone : public XCTwoBarZone
mType = X_POI_TICKS_ZONES;
mEndBar = endBar;
mStartBar = startBar;
From(startBar.time);
To(endBar.time);
From(endBar.time);
To(startBar.time);
//
result = IsValid();
+366 -33
View File
@@ -13,6 +13,7 @@
//////////////////////////////////////////////////////
//
// Global Properties ...
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
@@ -469,17 +470,17 @@ struct XCAPivot
};
//
struct XCAPVFVG
struct XCAPVPivot
{
//
// Props ...
double value;
XCAPivot fvgs[];
XCAPivot pivots[];
ENUM_X_DIRECTION dir;
//
// Constructor ...
XCAPVFVG()
XCAPVPivot()
{
Clean();
}
@@ -492,7 +493,7 @@ struct XCAPVFVG
{
//
value = 0;
Clean(fvgs);
Clean(pivots);
dir = X_DIRECTION_NONE;
//
@@ -514,7 +515,7 @@ struct XCAPVFVG
}
//
void AddFVG(XCAPivot &pivot)
void AddPivot(XCAPivot &pivot)
{
//
if (!IsValid() ||
@@ -528,7 +529,7 @@ struct XCAPVFVG
bool has = FindPivotIndex(
idx,
pivot,
fvgs //
pivots //
);
if (has)
{
@@ -538,43 +539,43 @@ struct XCAPVFVG
//
AddRef(
pivot,
fvgs //
pivots //
);
}
//
int GetFVGs(XBoxZone &fvgBoxes[])
int GetPivots(XBoxZone &pivotBoxes[])
{
//
int result = 0;
//
Clean(fvgBoxes);
Clean(pivotBoxes);
//
bool has = false;
//
has = IsValid() &&
HasChild(fvgs);
HasChild(pivots);
if (!has)
{
return result;
}
//
int count = ArraySize(fvgs);
int count = ArraySize(pivots);
for (int i = 0; i < count; i++)
{
//
XBoxZone iBox;
has = fvgs[i].AsBox(iBox);
has = pivots[i].AsBox(iBox);
if (has)
{
//
AddRef(
iBox,
fvgBoxes //
pivotBoxes //
);
}
@@ -583,13 +584,159 @@ struct XCAPVFVG
}
//
result = ArraySize(fvgBoxes);
result = ArraySize(pivotBoxes);
//
return result;
}
};
//
struct XCAPVTick
{
//
XCAPivot pivot;
XCTicksZone *zone;
//
XCAPVTick()
{
Clean();
}
//
// Tools ...
//
void Clean()
{
//
pivot.Clean();
//
ZeroMemory(zone);
ZeroMemory(this);
}
//
bool IsValid()
{
//
bool result = false;
//
result = pivot.IsValid() &&
zone != NULL;
//
return result;
}
//
bool Init(XCAPivot &_pivot)
{
//
bool result = false;
//
result = _pivot.IsValid();
if (!result)
{
return result;
}
//
int toIDX = _pivot.ToIndex();
int fromIDX = _pivot.FromIndex();
int rangeLength = fromIDX - toIDX;
result = IsValidIndex(fromIDX) &&
IsValidIndex(toIDX);
if (!result)
{
//
Clean();
return result;
}
//
XOHCL toBar;
XOHCL fromBar;
result = toBar.Init(
_pivot.symbol,
_pivot.period,
toIDX //
);
result = result &&
fromBar.Init(
_pivot.symbol,
_pivot.period,
fromIDX //
);
if (!result)
{
//
toBar.Clean();
fromBar.Clean();
//
Clean();
//
return result;
}
//
double rangeDivider = 10 * GetPoints(_pivot.symbol);
double rangeL = toBar.FindLowest(rangeLength, MODE_LOW);
double rangeH = toBar.FindHighest(rangeLength, MODE_HIGH);
double rangeDiff = (rangeH - rangeL);
int zoneLevels = (int)(rangeDiff / rangeDivider);
//
XCTicksZone *_zone;
_zone = new XCTicksZone();
_zone.Levels(zoneLevels);
result = _zone.Init(
fromBar,
toBar //
);
if (!result)
{
//
toBar.Clean();
fromBar.Clean();
ZeroMemory(_zone);
//
Clean();
//
return result;
}
//
pivot = _pivot;
zone = _zone;
//
result = IsValid();
if (!result)
{
Clean();
}
//
toBar.Clean();
fromBar.Clean();
ZeroMemory(_zone);
//
return result;
}
//
};
/**
* Find Specified Pivot Index inside a Collection of Pivots ...
*
@@ -725,12 +872,12 @@ void AddPivot(
*
* @param value: double, Peak or Vale Value ...
* @param fvg: XCAPivot instance reference, Specified Pivot ...
* @param collection: XCAPVFVG instance Collection ...
* @param collection: XCAPVPivot instance Collection ...
*/
void AddOrUpdatePVFVG(
double value,
XCAPivot &fvg,
XCAPVFVG &collection[] //
XCAPVPivot &collection[] //
)
{
//
@@ -761,7 +908,7 @@ void AddOrUpdatePVFVG(
for (int i = 0; i < count; i++)
{
//
XCAPVFVG iTem = collection[i];
XCAPVPivot iTem = collection[i];
//
bool isSameValue = iTem.value == value;
@@ -789,7 +936,7 @@ void AddOrUpdatePVFVG(
{
//
// New Item ...
XCAPVFVG iPVFVG;
XCAPVPivot iPVFVG;
//
iPVFVG.dir = dir;
@@ -798,7 +945,7 @@ void AddOrUpdatePVFVG(
//
AddRef(
fvg,
iPVFVG.fvgs //
iPVFVG.pivots //
);
//
@@ -811,12 +958,56 @@ void AddOrUpdatePVFVG(
{
//
// Add Pivot to Existing Item ...
collection[idx].AddFVG(fvg);
collection[idx].AddPivot(fvg);
}
//
}
/**
* Add Specified PVTick to Collection ...
*
* @param pvTick: XCAPVTick instance Reference ...
* @param pvTicks: XCAPVTickinstance Reference Collection ...
*/
void AddPVTick(
XCAPVTick &pvTick,
XCAPVTick &pvTicks[] //
)
{
//
bool has = pvTick.IsValid();
if (!has)
{
return;
}
//
has = false;
int count = ArraySize(pvTicks);
for (int i = 0; i < count; i++)
{
//
has = pvTicks[i].pivot.IsSameAs(pvTick.pivot);
if (has)
{
break;
}
}
//
if (has)
{
return;
}
//
AddRef(
pvTick,
pvTicks //
);
}
//
// Implementations ...
class XCXCAEAPOIDetector : public XCBase
@@ -958,8 +1149,12 @@ class XCXCAEAPOIDetector : public XCBase
XCAPivot cciCrossedUnderOBPivots[];
//
XCAPVFVG pvFVGBullishPivots[];
XCAPVFVG pvFVGBearishPivots[];
XCAPVTick peakTicks[];
XCAPVTick valeTicks[];
//
XCAPVPivot pvFVGBullishPivots[];
XCAPVPivot pvFVGBearishPivots[];
//
// Constructors ...
@@ -2120,6 +2315,21 @@ class XCXCAEAPOIDetector : public XCBase
peakSWHResPivots,
maxAllowedPivots //
);
//
XCAPVTick peakTick;
has = peakTick.Init(peakSWHResPivot);
if (has)
{
//
AddPVTick(
peakTick,
peakTicks //
);
}
//
peakTick.Clean();
}
//
@@ -2185,6 +2395,21 @@ class XCXCAEAPOIDetector : public XCBase
valeSWLSupPivots,
maxAllowedPivots //
);
//
XCAPVTick valeTick;
has = valeTick.Init(valeSWLSupPivot);
if (has)
{
//
AddPVTick(
valeTick,
valeTicks //
);
}
//
valeTick.Clean();
}
//
@@ -4664,7 +4889,7 @@ class XCXCAEAPOIDetector : public XCBase
//
// PVFVG ...
XCAPVFVG tmpPVFVG[];
XCAPVPivot tmpPVFVG[];
//
has = HasPVFVGBullishPivots();
@@ -4679,7 +4904,7 @@ class XCXCAEAPOIDetector : public XCBase
while (HasChild(tmpPVFVG))
{
//
XCAPVFVG iPVFVG = tmpPVFVG[0];
XCAPVPivot iPVFVG = tmpPVFVG[0];
ArrayRemove(
tmpPVFVG,
0,
@@ -4689,10 +4914,10 @@ class XCXCAEAPOIDetector : public XCBase
//
XCAPivot tmpFVGs[];
Copy(
iPVFVG.fvgs,
iPVFVG.pivots,
tmpFVGs //
);
Clean(iPVFVG.fvgs);
Clean(iPVFVG.pivots);
while (HasChild(tmpFVGs))
{
//
@@ -4714,14 +4939,14 @@ class XCXCAEAPOIDetector : public XCBase
//
AddRef(
iPivot,
iPVFVG.fvgs //
iPVFVG.pivots //
);
}
}
Clean(tmpFVGs);
//
if (HasChild(iPVFVG.fvgs))
if (HasChild(iPVFVG.pivots))
{
//
AddRef(
@@ -4747,7 +4972,7 @@ class XCXCAEAPOIDetector : public XCBase
while (HasChild(tmpPVFVG))
{
//
XCAPVFVG iPVFVG = tmpPVFVG[0];
XCAPVPivot iPVFVG = tmpPVFVG[0];
ArrayRemove(
tmpPVFVG,
0,
@@ -4757,10 +4982,10 @@ class XCXCAEAPOIDetector : public XCBase
//
XCAPivot tmpFVGs[];
Copy(
iPVFVG.fvgs,
iPVFVG.pivots,
tmpFVGs //
);
Clean(iPVFVG.fvgs);
Clean(iPVFVG.pivots);
while (HasChild(tmpFVGs))
{
//
@@ -4782,14 +5007,14 @@ class XCXCAEAPOIDetector : public XCBase
//
AddRef(
iPivot,
iPVFVG.fvgs //
iPVFVG.pivots //
);
}
}
Clean(tmpFVGs);
//
if (HasChild(iPVFVG.fvgs))
if (HasChild(iPVFVG.pivots))
{
//
AddRef(
@@ -5580,9 +5805,90 @@ class XCXCAEAPOIDetector : public XCBase
Clean(tmp);
}
//
// PVTICKS ...
//
XCAPVTick tmpTicks[];
//
has = HasPeakTicks();
if (has)
{
//
Copy(
peakTicks,
tmpTicks //
);
Clean(peakTicks);
while (HasChild(tmpTicks))
{
//
XCAPVTick iPVTick = tmpTicks[0];
ArrayRemove(
tmpTicks,
0,
1);
//
has = IsPivotBreaked(
iPVTick.pivot,
unAvailableBoxes,
barIndex //
);
if (!has)
{
//
AddRef(
iPVTick,
peakTicks //
);
}
}
Clean(tmpTicks);
}
//
has = HasValeTicks();
if (has)
{
//
Copy(
valeTicks,
tmpTicks //
);
Clean(valeTicks);
while (HasChild(tmpTicks))
{
//
XCAPVTick iPVTick = tmpTicks[0];
ArrayRemove(
tmpTicks,
0,
1);
//
has = IsPivotBreaked(
iPVTick.pivot,
unAvailableBoxes,
barIndex //
);
if (!has)
{
//
AddRef(
iPVTick,
valeTicks //
);
}
}
Clean(tmpTicks);
}
//
Clean(tmp);
Clean(tmpPVFVG);
Clean(tmpTicks);
}
//
@@ -6888,6 +7194,33 @@ class XCXCAEAPOIDetector : public XCBase
return ArraySize(cciCrossedUnderOBPivots);
}
//
// PVTICKS ...
//
bool HasPeakTicks()
{
return HasChild(peakTicks);
}
//
int CountPeakTicks()
{
return ArraySize(peakTicks);
}
//
bool HasValeTicks()
{
return HasChild(valeTicks);
}
//
int CountValeTicks()
{
return ArraySize(valeTicks);
}
//
// Protected ...
protected:
+60 -4
View File
@@ -13,6 +13,7 @@
//////////////////////////////////////////////////////
//
// Global Properties ...
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
@@ -65,6 +66,9 @@ class XCXCAEAPOIDrawer : public XCBase
bool drawCCICrossedOverOSPivots;
bool drawCCICrossedUnderOBPivots;
//
bool drawTicks;
//
// Colorize Props ...
@@ -212,6 +216,9 @@ class XCXCAEAPOIDrawer : public XCBase
drawCCICrossedOverOSPivots = false;
drawCCICrossedUnderOBPivots = false;
//
drawTicks = false;
//
// Color ...
defBullishPivotColor = clrLime;
@@ -274,6 +281,7 @@ class XCXCAEAPOIDrawer : public XCBase
void Draw(datetime to = NULL)
{
//
DrawTicks();
DrawSWHPivots(to);
DrawSWLPivots(to);
DrawPeakPivots(to);
@@ -306,6 +314,54 @@ class XCXCAEAPOIDrawer : public XCBase
//
//
//
void DrawTicks()
{
//
if (!drawTicks)
{
return;
}
//
// PEAK TICKS ...
bool has = detector.HasPeakTicks();
if (has) {
//
int count = detector.CountPeakTicks();
for (int i = 0; i < count; i++) {
//
XCTicksZoneObject *iObj;
has = drawer.CreateTicksZone(
detector.peakTicks[i].zone,
iObj //
);
if (has) {
mPeakPivotObjects.Add(iObj);
}
}
}
//
// VALE TICKS ...
has = detector.HasValeTicks();
if (has) {
//
int count = detector.CountValeTicks();
for (int i = 0; i < count; i++) {
//
XCTicksZoneObject *iObj;
has = drawer.CreateTicksZone(
detector.valeTicks[i].zone,
iObj //
);
if (has) {
mPeakPivotObjects.Add(iObj);
}
}
}
}
//
void DrawSWHPivots(datetime to = NULL)
{
@@ -725,11 +781,11 @@ class XCXCAEAPOIDrawer : public XCBase
for (int i = 0; i < count; i++)
{
//
XCAPVFVG iPVFVG = detector.pvFVGBullishPivots[i];
XCAPVPivot iPVFVG = detector.pvFVGBullishPivots[i];
//
XBoxZone fvgBoxes[];
int fvgBoxesCount = iPVFVG.GetFVGs(fvgBoxes);
int fvgBoxesCount = iPVFVG.GetPivots(fvgBoxes);
has = IsValidSize(fvgBoxesCount);
if (has)
{
@@ -840,11 +896,11 @@ class XCXCAEAPOIDrawer : public XCBase
for (int i = 0; i < count; i++)
{
//
XCAPVFVG iPVFVG = detector.pvFVGBearishPivots[i];
XCAPVPivot iPVFVG = detector.pvFVGBearishPivots[i];
//
XBoxZone fvgBoxes[];
int fvgBoxesCount = iPVFVG.GetFVGs(fvgBoxes);
int fvgBoxesCount = iPVFVG.GetPivots(fvgBoxes);
has = IsValidSize(fvgBoxesCount);
if (has)
{
+1
View File
@@ -13,6 +13,7 @@
//////////////////////////////////////////////////////
//
// Global Properties ...
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
+4
View File
@@ -13,6 +13,7 @@
//////////////////////////////////////////////////////
//
// Global Properties ...
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
@@ -796,6 +797,9 @@ class XCXCAEASignaller : XCBase
drawer.drawCCICrossedOverOSPivots = false;
drawer.drawCCICrossedUnderOBPivots = false;
//
drawer.drawTicks = true;
//
// Configure Width ...
drawer.peakPivotWidth = 1;