This commit is contained in:
2025-02-22 01:13:26 +03:30
parent 627e9c4706
commit c371004b3b
10 changed files with 2701 additions and 4 deletions
+6 -1
View File
@@ -401,7 +401,7 @@ class XCBarAnalyser : public XCBase
return result;
}
//
//
double points = GetPoints(bar.symbol);
int index = bar.Index();
@@ -1458,6 +1458,11 @@ class XCBarAnalyser : public XCBase
//
// Check Body ...
double rangePercent = GetBarRangePercent(bar);
result = rangePercent > 0;
if (!result)
{
return result;
}
//
double body = bar.GetBody();
+159 -2
View File
@@ -233,8 +233,9 @@ class XCBarArrowObject : public XCBaseObject
//
result =
//
bar.IsValid()
//
bar.IsValid() &&
IsValid(name)
//
;
if (!result)
@@ -2872,6 +2873,162 @@ class XCTrendObject : public XCBaseObject
public:
//
/**
* Creator ...
*
* @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ...
* @param rr: XRR instance Reference ...
* @param prefix: String ...
*
* @return ( bool )
*/
bool Create(
long chart_id,
int window,
XPoint &swings[],
bool useMinAsStart = true,
string prefix = NULL //
)
{
//
bool result = false;
//
int count = ArraySize(swings);
result =
count >= 2 &&
IsValidSize(count);
if (!result)
{
return result;
}
//
double min = 0;
datetime minAt = NULL;
//
double max = 0;
datetime maxAt = NULL;
//
// Etract Min/Max ...
for (int i = 0; i < count; i++)
{
//
XPoint iPoint = swings[i];
//
if (!iPoint.IsValid())
{
//
iPoint.Clean();
continue;
}
//
bool canSetMin =
min == 0
? true
: min > iPoint.value;
if (canSetMin)
{
//
minAt = iPoint.at;
min = iPoint.value;
}
//
bool canSetMax =
max == 0
? true
: max < iPoint.value;
if (canSetMax)
{
//
maxAt = iPoint.at;
max = iPoint.value;
}
//
iPoint.Clean();
}
//
double first =
useMinAsStart
? min
: max;
datetime firstTime =
useMinAsStart
? minAt
: maxAt;
//
double second =
useMinAsStart
? max
: min;
datetime secondTime =
useMinAsStart
? maxAt
: minAt;
//
// Validate Points ...
result =
//
first > 0 &&
second > 0 &&
(useMinAsStart
? first <= second
: first >= second) &&
IsSpecifiedValid(firstTime) &&
IsSpecifiedValid(secondTime)
//
;
if (!result)
{
return result;
}
//
ENUM_X_DIRECTION dir =
useMinAsStart
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
string name = "XTRND" + ToString(dir) + "_" + ToString(first) + "_" + ToString(second);
if (IsValid(prefix))
{
name = prefix + "_" + name;
}
string nameMD5 = ToMD5(name);
//
result = mTrend.Create(
chart_id,
name,
window,
firstTime,
first,
secondTime,
second //
);
if (!result)
{
return result;
}
//
ObjName(name);
//
return result;
}
/**
* Creator ...
*
+140 -1
View File
@@ -23,6 +23,7 @@
// Imports ...
#include "../Classes/x-saherelm.base.class.mq5"
#include "../Classes/x-saherelm.x-cobject.class.mq5"
#include "../Libraries/x-saherelm.x-poi.extensions.lib.mq5"
//
// Definitions ...
@@ -2872,6 +2873,66 @@ class XCPOIDrawer : public XCBase
return result;
}
/**
* Create Trend Line Object ...
*
* @param swings: XSwingPoint instance Collection ...
* @param useMinAsStart: Specified Min Value as Start ...
*
* @return ( bool )
*/
bool CreateTrend(
XPoint &swings[],
XCTrendObject *&object,
bool useMinAsStart = true //
)
{
//
bool result = false;
//
object = NULL;
//
result = ArraySize(swings) >= 2 &&
IsValidSize(ArraySize(swings));
if (!result)
{
return result;
}
//
string prefix = Prefix();
long chartID = ChartIdentification();
int window = SubWindowIdentification();
//
object = new XCTrendObject();
result = object.Create(
chartID,
window,
swings,
useMinAsStart,
prefix //
);
//
if (!result)
{
return result;
}
//
color clrTrend = useMinAsStart
? SwingLowColor()
: SwingHighColor();
object.TrendColor(clrTrend);
object.TrendRayRight(true);
//
return result;
}
/**
* Create Consolidation Zone Object ...
*
@@ -2929,7 +2990,7 @@ class XCPOIDrawer : public XCBase
/**
* Create Bar Object ...
*
* @param bar: XOHCL instance Reference ..
* @param bar: XOHCL instance Reference ...
* @param object: XCOHCLObject pointer Reference ..
* @param to: Datetime ...
*
@@ -3030,6 +3091,84 @@ class XCPOIDrawer : public XCBase
return result;
}
/**
* Create Bar Arrow Object ...
*
* @param bar: XOHCL instance Reference ...
* @param priceType: ENUM_X_PRICE member ...
* @param arrow: int, Arrow Code ...
* @param clr: color, Arro Color ...
* @param width: int, Arrow Width ...
* @param anchor: ENUM_ARROW_ANCHOR, anchor of Arrow ...
* @param name: string, name of Arrow ...
*
* @return ( bool )
*/
bool CreateBarArrow(
XOHCL &bar,
XCBarArrowObject *&object,
ENUM_X_PRICE priceType,
int arrow = 159,
color clr = clrYellow,
int width = 3,
ENUM_ARROW_ANCHOR anchor = ANCHOR_BOTTOM,
string name = NULL //
)
{
//
bool result = false;
//
object = NULL;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
string barTag = bar.GetTag(name);
//
string prefix = Prefix();
long chartID = ChartIdentification();
int window = SubWindowIdentification();
//
color mBullishColor = BarBullishColor();
color mBearishColor = BarBearishColor();
//
prefix =
(IsValid(prefix)
? prefix + "_"
: prefix) +
barTag;
//
object = new XCBarArrowObject();
result = object
.CreateByBar(
chartID,
prefix,
window,
arrow,
bar,
priceType //
);
if (result)
{
//
object.ArrowColor(clr);
object.ArrowWidth(width);
}
//
return result;
}
/**
* Create Specific Box on Chart ...
*
+346
View File
@@ -0,0 +1,346 @@
//
// Detect Inside Zones ...
//
XCFVG *insideFVG;
bool hasInsideFVG = false;
//
XCOrderBlock *insideOB;
bool hasInsideOB = false;
//
XCSupplyZone *insideSupply;
bool hasInsideSupply = false;
//
XCDemandZone *insideDemand;
bool hasInsideDemand = false;
//
XCSupportZone *insideSupport;
bool hasInsideSupport = false;
//
XCResistanceZone *insideResistnce;
bool hasInsideResistance = false;
//
// Detect PullBack ...
//
ENUM_X_DIRECTION pullbackDir;
bool hasPullBack = mXWZBarAnalyser.HasPullBack(
pullbackDir,
iBar //
);
bool hasBullishPullBack =
hasPullBack &&
IsBullish(pullbackDir);
bool hasBearishPullBack =
hasPullBack &&
IsBearish(pullbackDir);
//
// Detect PinBar ...
//
ENUM_X_DIRECTION pinBarDir;
bool hasPinBar = mXWZBarAnalyser.IsPinBar(
iBar,
pinBarDir,
0 //
);
bool hasBullishPinBar =
hasPinBar &&
IsBullish(pinBarDir);
bool hasBearishPinBar =
hasPinBar &&
IsBearish(pinBarDir);
//
// Detect Order Block ...
//
XOHCL obBar;
XCOrderBlock *ob;
ENUM_X_DIRECTION obDir;
bool hasOB = mXWZBarAnalyser.HasOrderBlock(
iBar,
obBar,
obDir //
);
bool hasBullishOB =
hasOB &&
IsBullish(obDir);
bool hasBearishOB =
hasOB &&
IsBearish(obDir);
if (hasOB)
{
//
ob = new XCOrderBlock();
bool isInited = ob.Init(obBar, obDir);
if (isInited)
{
//
ENUM_X_DIRECTION forDir = ob.GetDirection();
//
// Check OB Not Activated ...
XOHCL activationBar;
bool isObActivationBarBodyIn = false;
bool isActivated = ob.IsActivated(
forDir,
activationBar,
isObActivationBarBodyIn,
false,
_Period //
);
//
if (isActivated)
{
//
hasOB = false;
obBar.Clean();
ZeroMemory(ob);
hasBullishOB = false;
hasBearishOB = false;
}
}
}
//
if (hasBullishPinBar)
{
//
XCBarArrowObject *iObj;
bool isCreated = mXWZPOIDrawer
.CreateBarArrow(
iBar,
iObj,
X_PRICE_LOW,
159,
clrAqua,
3,
ANCHOR_BOTTOM,
"BULLPULL" //
);
if (isCreated)
{
mXWZDrawnObjects.Add(iObj);
}
}
//
if (hasBearishPinBar)
{
//
XCBarArrowObject *iObj;
bool isCreated = mXWZPOIDrawer
.CreateBarArrow(
iBar,
iObj,
X_PRICE_HIGH,
159,
clrMagenta,
3,
ANCHOR_TOP,
"BEARPULL" //
);
if (isCreated)
{
mXWZDrawnObjects.Add(iObj);
}
}
//
if (hasOB)
{
//
XCBaseObject *iObj;
bool isCreated = mXWZPOIDrawer.CreateOrderBlock(
ob,
iObj //
);
if (isCreated)
{
mXWZDrawnObjects.Add(iObj);
}
}
//
int idx = -1;
int count = 0;
bool has = false;
//
ENUM_X_DIRECTION trend =
IsValid(lastBullishTrend) &&
lastBullishTrend > lastBearishTrend
? X_DIRECTION_BULLISH
: IsValid(lastBearishTrend) &&
lastBearishTrend > lastBullishTrend
? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
bool hasTrend = HasDirection(trend);
bool hasBullishTrend = hasTrend &&
IsBullish(trend);
bool hasBearishTrend = hasTrend &&
IsBearish(trend);
//
// Order Block ...
has = hasBullishTrend;
if (has)
{
}
has = hasBearishTrend;
if (has)
{
}
//
// Fair Value Gap ...
has = hasBullishTrend;
if (has)
{
}
has = hasBearishTrend;
if (has)
{
}
//
// Supply Zone ...
has = hasBearishTrend;
if (has)
{
}
//
// Resistance Zone ...
has = hasBearishTrend;
if (has)
{
}
//
// Demand Zone ...
has = hasBullishTrend;
if (has)
{
}
//
// Support Zone ...
has = hasBullishTrend;
if (has)
{
}
//
// Draw Inside Zones ...
//
if (hasInsideOB)
{
//
XCBaseObject *iObj;
bool isCreated = mXWZPOIDrawer
.CreateOrderBlock(
insideOB,
iObj //
);
//
if (isCreated)
{
mXWZDrawnObjects.Add(iObj);
}
}
//
if (hasInsideFVG)
{
//
XCBaseObject *iObj;
bool isCreated = mXWZPOIDrawer
.CreateFairValueGap(
insideFVG,
iObj //
);
//
if (isCreated)
{
mXWZDrawnObjects.Add(iObj);
}
}
//
if (hasInsideSupply)
{
//
XCSupplyZoneObject *iObj;
bool isCreated = mXWZPOIDrawer
.CreateSupplyZone(
insideSupply,
iObj //
);
//
if (isCreated)
{
mXWZDrawnObjects.Add(iObj);
}
}
//
if (hasInsideDemand)
{
//
XCDemandZoneObject *iObj;
bool isCreated = mXWZPOIDrawer
.CreateDemandZone(
insideDemand,
iObj //
);
//
if (isCreated)
{
mXWZDrawnObjects.Add(iObj);
}
}
//
if (hasInsideSupport)
{
//
XCSupportZoneObject *iObj;
bool isCreated = mXWZPOIDrawer
.CreateSupportZone(
insideSupport,
iObj //
);
//
if (isCreated)
{
mXWZDrawnObjects.Add(iObj);
}
}
//
if (hasInsideResistance)
{
//
XCResistanceZoneObject *iObj;
bool isCreated = mXWZPOIDrawer
.CreateResistanceZone(
insideResistnce,
iObj //
);
//
if (isCreated)
{
mXWZDrawnObjects.Add(iObj);
}
}
+247
View File
@@ -2117,3 +2117,250 @@ bool IsReject(
mObjects.Add(iObj);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//
XPOIState state;
mXWZPOIDetector.GetState(state);
//
ENUM_X_DIRECTION trend =
IsValid(lastBullishTrend) &&
lastBullishTrend > lastBearishTrend
? X_DIRECTION_BULLISH
: IsValid(lastBearishTrend) &&
lastBearishTrend > lastBullishTrend
? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
bool hasTrend = HasDirection(trend);
bool hasBullishTrend = hasTrend &&
IsBullish(trend);
bool hasBearishTrend = hasTrend &&
IsBearish(trend);
//
// Order Block ...
has = hasBullishTrend &&
state.HasBullishOrderBlocks();
if (has)
{
//
XCOrderBlock *tmps[];
count = ExtractInsideZones(
iBar,
state.bullishOrderBlocks,
tmps //
);
has = IsValidSize(count);
if (has)
{
//
idx = GetLowest(tmps);
hasInsideOB = IsValidIndex(idx);
if (hasInsideOB)
{
insideOB = tmps[idx];
}
}
//
Clean(tmps);
}
has = hasBearishTrend &&
state.HasBearishOrderBlocks();
if (has)
{
//
XCOrderBlock *tmps[];
count = ExtractInsideZones(
iBar,
state.bearishOrderBlocks,
tmps //
);
has = IsValidSize(count);
if (has)
{
//
idx = GetHighest(tmps);
hasInsideOB = IsValidIndex(idx);
if (hasInsideOB)
{
insideOB = tmps[idx];
}
}
//
Clean(tmps);
}
//
// Fair Value Gap ...
has = hasBullishTrend &&
state.HasBullishFairValueGaps();
if (has)
{
//
XCFVG *tmps[];
count = ExtractInsideZones(
iBar,
state.bullishFairValueGaps,
tmps //
);
has = IsValidSize(count);
if (has)
{
//
idx = GetLowest(tmps);
hasInsideFVG = IsValidIndex(idx);
if (hasInsideFVG)
{
insideFVG = tmps[idx];
}
}
//
Clean(tmps);
}
has = hasBearishTrend &&
state.HasBearishFairValueGaps();
if (has)
{
//
XCFVG *tmps[];
count = ExtractInsideZones(
iBar,
state.bearishFairValueGaps,
tmps //
);
has = IsValidSize(count);
if (has)
{
//
idx = GetHighest(tmps);
hasInsideFVG = IsValidIndex(idx);
if (hasInsideFVG)
{
insideFVG = tmps[idx];
}
}
//
Clean(tmps);
}
//
// Supply Zone ...
has = hasBearishTrend &&
state.HasSupplyZones();
if (has)
{
//
XCSupplyZone *tmps[];
count = ExtractInsideZones(
iBar,
state.supplyZones,
tmps //
);
has = IsValidSize(count);
if (has)
{
//
idx = GetHighest(tmps);
hasInsideSupply = IsValidIndex(idx);
if (hasInsideSupply)
{
insideSupply = tmps[idx];
}
}
//
Clean(tmps);
}
//
// Resistance Zone ...
has = hasBearishTrend &&
state.HasResistanceZones();
if (has)
{
//
XCResistanceZone *tmps[];
count = ExtractInsideZones(
iBar,
state.resistanceZones,
tmps //
);
has = IsValidSize(count);
if (has)
{
//
idx = GetHighest(tmps);
hasInsideResistance = IsValidIndex(idx);
if (hasInsideResistance)
{
insideResistnce = tmps[idx];
}
}
//
Clean(tmps);
}
//
// Demand Zone ...
has = hasBullishTrend &&
state.HasDemandZones();
if (has)
{
//
XCDemandZone *tmps[];
count = ExtractInsideZones(
iBar,
state.demandZones,
tmps //
);
has = IsValidSize(count);
if (has)
{
//
idx = GetLowest(tmps);
hasInsideDemand = IsValidIndex(idx);
if (hasInsideDemand)
{
insideDemand = tmps[idx];
}
}
//
Clean(tmps);
}
//
// Support Zone ...
has = hasBullishTrend &&
state.HasSupportZones();
if (has)
{
//
XCSupportZone *tmps[];
count = ExtractInsideZones(
iBar,
state.supportZones,
tmps //
);
has = IsValidSize(count);
if (has)
{
//
idx = GetLowest(tmps);
hasInsideSupport = IsValidIndex(idx);
if (hasInsideSupport)
{
insideSupport = tmps[idx];
}
}
//
Clean(tmps);
}
+77
View File
@@ -1149,6 +1149,83 @@ else if (isPriceRejected)
/////////////////////////////////////////////////////////////////////////////////////////////////////
//
XPoint llPoint;
llPoint.value = iLL;
llPoint.at = iLLTime;
//
//
//
XPoint hhPoint;
hhPoint.value = iHH;
hhPoint.at = iHHTime;
//
XPoint llSwings[];
AddRef(
llPoint,
llSwings //
);
//
llPoint.at = iHHTime;
AddRef(
llPoint,
llSwings //
);
//
//
//
XPoint hhSwings[];
//
hhPoint.at = iLLTime;
AddRef(
hhPoint,
hhSwings //
);
//
hhPoint.at = iHHTime;
AddRef(
hhPoint,
hhSwings //
);
//
XCTrendObject *llTrendObj;
bool isCreated = mXWZPOIDrawer.CreateTrend(
llSwings,
llTrendObj //
);
if (isCreated)
{
mXWZDrawnObjects.Add(llTrendObj);
}
//
XCTrendObject *hhTrendObj;
isCreated = mXWZPOIDrawer.CreateTrend(
hhSwings,
hhTrendObj //
);
if (isCreated)
{
mXWZDrawnObjects.Add(hhTrendObj);
}
//
//
//
Clean(llSwings);
Clean(hhSwings);
llPoint.Clean();
hhPoint.Clean();
/////////////////////////////////////////////////////////////////////////////////////////////////////
File diff suppressed because it is too large Load Diff
+39
View File
@@ -3588,6 +3588,45 @@ struct XMarketParser
//
};
//
struct XPoint
{
//
// Props ...
double value;
datetime at;
//
XPoint()
{
Clean();
}
//
// Tools ...
//
void Clean()
{
//
value = 0;
at = NULL;
//
ZeroMemory(this);
}
//
bool IsValid()
{
//
return value > 0 &&
IsValid(at);
}
//
};
//
// Specified Swing Point ...
struct XSwingPoint
@@ -2006,6 +2006,77 @@ void SortZones(
Clean(tmpItems);
}
/**
* Extract all Zones Which provided bar is Inside it ...
*
* @return ( int )
*/
template <typename T>
int ExtractInsideZones(
XOHCL &bar, // Bar ...
T *&zones[], // Source of Zones ...
T *&dest[] // Dest (all inside Zones) ...
)
{
//
int result = 0;
//
Clean(dest);
//
int count = ArraySize(zones);
bool isValid = bar.IsValid() &&
IsValidSize(count);
if (!isValid)
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
T *iZone = zones[i];
//
bool isHighInside = IsInside(
bar.high,
iZone //
);
//
bool isLowInside = IsInside(
bar.low,
iZone //
);
//
bool isInside =
isLowInside &&
isHighInside;
//
if (isInside)
{
//
Add(
iZone,
dest //
);
}
//
ZeroMemory(iZone);
}
//
result = ArraySize(dest);
//
return result;
}
//
template <typename T>
int FilterZones(
@@ -1094,9 +1094,29 @@ class XCX121SMCXWZSignalDetector : public XCBase
ZeroMemory(newAnalyseFVG);
}
//
// Reading Trand Line Value ...
double zValue = workingZone.GetOrderFlowTrendLinePrice(
zIndex,
period //
);
double cValue = workingZone.GetOrderFlowTrendLinePrice(
cIndex,
period //
);
double pValue = workingZone.GetOrderFlowTrendLinePrice(
pIndex,
period //
);
double ppValue = workingZone.GetOrderFlowTrendLinePrice(
ppIndex,
period //
);
//
// TODO: Implement Trend Line Trading Senario ...
//
// TODO: Implement Quarter Line Trading Senario ...