This commit is contained in:
2025-01-04 05:19:28 +03:30
parent fbc232a2b7
commit 6f61bc6d30
8 changed files with 783 additions and 143 deletions
+161 -13
View File
@@ -38,7 +38,7 @@ enum ENUM_XCHARTOBJECTS
//
// Global ...
X_ZONE_OBJ = 7860,
X_FROM_TO_OBJ = 7861,
X_BOX_OBJ = 7861,
X_BAR_ARROW_OBJ = 7862,
//
X_SIGNAL_OBJ = 8860,
@@ -2359,7 +2359,7 @@ class XCOHCLObject : public XCBaseObject
// Getter(s) / Setter(s) ...
/**
* Set Pivot Width ...
* Set High Shadow Width ...
*
* @param value: Integer ...
*/
@@ -2376,7 +2376,7 @@ class XCOHCLObject : public XCBaseObject
}
/**
* Set Pivot Color ...
* Set High Shadow Color ...
*
* @param value: Color ...
*/
@@ -2386,7 +2386,7 @@ class XCOHCLObject : public XCBaseObject
}
/**
* Set Pivot Style ...
* Set High Shadow Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
@@ -2396,7 +2396,7 @@ class XCOHCLObject : public XCBaseObject
}
/**
* Set Pivot Fill ...
* Set High Shadow Fill ...
*
* @param value: Boolean ...
*/
@@ -2406,7 +2406,7 @@ class XCOHCLObject : public XCBaseObject
}
/**
* Set Pivot Width ...
* Set Body Width ...
*
* @param value: Integer ...
*/
@@ -2423,7 +2423,7 @@ class XCOHCLObject : public XCBaseObject
}
/**
* Set Pivot Color ...
* Set Body Color ...
*
* @param value: Color ...
*/
@@ -2433,7 +2433,7 @@ class XCOHCLObject : public XCBaseObject
}
/**
* Set Pivot Style ...
* Set Body Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
@@ -2443,7 +2443,7 @@ class XCOHCLObject : public XCBaseObject
}
/**
* Set Pivot Fill ...
* Set Body Fill ...
*
* @param value: Boolean ...
*/
@@ -2453,7 +2453,7 @@ class XCOHCLObject : public XCBaseObject
}
/**
* Set Pivot Width ...
* Set Low Shadow Width ...
*
* @param value: Integer ...
*/
@@ -2470,7 +2470,7 @@ class XCOHCLObject : public XCBaseObject
}
/**
* Set Pivot Color ...
* Set Low Shadow Color ...
*
* @param value: Color ...
*/
@@ -2480,7 +2480,7 @@ class XCOHCLObject : public XCBaseObject
}
/**
* Set Pivot Style ...
* Set Low Shadow Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
@@ -2490,7 +2490,7 @@ class XCOHCLObject : public XCBaseObject
}
/**
* Set Pivot Fill ...
* Set Low Shadow Fill ...
*
* @param value: Boolean ...
*/
@@ -2523,6 +2523,154 @@ class XCOHCLObject : public XCBaseObject
CChartObjectRectangle mLowShadowRect;
};
class XCBoxObject : public XCBaseObject
{
//
public:
//
/**
* Creator ...
*
* @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ...
* @param pivot: XPVPivot instance ...
* @param prefix: String ...
*
* @return ( bool )
*/
bool Create(
long chart_id,
int window,
string name,
double upper,
double lower,
datetime from,
datetime to,
string prefix = NULL //
)
{
//
bool result = false;
//
result =
upper > 0 &&
lower > 0 &&
to > from &&
IsValid(to) &&
IsValid(name) &&
IsValid(from) &&
upper > lower;
if (!result)
{
return result;
}
//
if (IsValid(prefix))
{
name = prefix + "_" + name;
}
string nameMD5 = ToMD5(name);
//
result = mRect.Create(
chart_id,
name,
window,
from,
upper,
to,
lower //
);
if (!result)
{
return result;
}
//
if (result)
{
ObjName(name);
}
//
return result;
}
//
// Getter(s) / Setter(s) ...
/**
* Set Width ...
*
* @param value: Integer ...
*/
void BoxWidth(int value)
{
//
if (value < 1)
{
value = 1;
}
//
mRect.Width(value);
}
/**
* Set Color ...
*
* @param value: Color ...
*/
void BoxColor(color value)
{
mRect.Color(value);
}
/**
* Set Style ...
*
* @param value: ENUM_LINE_STYLE member ...
*/
void BoxStyle(ENUM_LINE_STYLE value)
{
mRect.Style(value);
}
/**
* Set Fill ...
*
* @param value: Boolean ...
*/
void BoxFill(bool value)
{
mRect.Fill(value);
}
//
// Virtual ...
/**
* Retrieve Object Type ...
*
* @return ( ENUM_XCHARTOBJECTS )
*/
virtual ENUM_XCHARTOBJECTS Type()
{
return X_BOX_OBJ;
}
//
private:
//
//
// Props ...
CChartObjectRectangle mRect;
};
//
// Zone Ticks ...
+303 -108
View File
@@ -2858,6 +2858,97 @@ class XCPOIDrawer : public XCBase
return result;
}
/**
* Create Specific Box on Chart ...
*
* @param upper: Double ...
* @param lower: Double ...
* @param from: Datetime ...
* @param to: Datetime ...
* @param clr: Color ...
* @param width: Integer ...
* @param fill: Boolean ...
* @param style: ENUM_LINE_STYLE member ...
*
* @return ( bool )
*/
bool CreateBox(
XCBoxObject *&object,
double upper,
double lower,
datetime from,
datetime to,
color clr = clrYellowGreen,
int width = 1,
bool fill = false,
ENUM_LINE_STYLE style = STYLE_SOLID //
)
{
//
bool result = false;
//
object = NULL;
//
to = NormalizeTime(to);
//
string dateStr = ToFormatString(from) + "|" + ToFormatString(to);
string dateMD5 = ToMD5(dateStr);
string name = "XBox_" +
ToString(upper) + "_" +
ToString(lower) + "_" +
dateMD5;
//
result =
upper > 0 &&
lower > 0 &&
to > from &&
IsValid(to) &&
IsValid(name) &&
IsValid(from) &&
upper > lower;
if (!result)
{
return result;
}
//
string prefix = Prefix();
long chartID = ChartIdentification();
int window = SubWindowIdentification();
//
object = new XCBoxObject();
result = object.Create(
chartID,
window,
name,
upper,
lower,
from,
to,
prefix //
);
//
if (!result)
{
return result;
}
//
object.BoxColor(clr);
object.BoxFill(fill);
object.BoxWidth(width);
object.BoxStyle(style);
//
return result;
}
/**
* Draw Specified Signal ...
*
@@ -2934,7 +3025,8 @@ class XCPOIDrawer : public XCBase
int DrawPriceZone(
XPriceZones &zone,
XCBaseObject *&drawnObjects[],
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE //
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE,
bool onlyBoundary = false //
)
{
//
@@ -2951,6 +3043,7 @@ class XCPOIDrawer : public XCBase
//
bool isBullish = IsBullish(forDir);
bool isBearish = IsBearish(forDir);
bool isAll = forDir == X_DIRECTION_ALL ||
forDir == X_DIRECTION_NONE;
@@ -2958,170 +3051,272 @@ class XCPOIDrawer : public XCBase
if (isAll || isBullish)
{
//
// Support Zone ...
if (zone.HasSupportZone())
if (onlyBoundary)
{
//
XCSupportZoneObject *iObj;
bool isCreated = CreateSupportZone(
zone.supportZone,
iObj //
double upper = 0;
double lower = 0;
datetime to = NULL;
datetime from = NULL;
//
bool isRetrieved = zone.GetBoxData(
X_DIRECTION_NONE,
upper,
lower,
from,
to //
);
if (isCreated)
if (isRetrieved)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
color clr =
isBullish
? BarBullishColor()
: isBearish
? BarBearishColor()
: clrGray;
XCBoxObject *iObj;
result = CreateBox(
iObj,
upper,
lower,
from,
to,
clr,
1,
false,
STYLE_DOT //
);
if (result)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
//
// Demand Zone ...
if (zone.HasDemandZone())
else
{
//
XCDemandZoneObject *iObj;
bool isCreated = CreateDemandZone(
zone.demandZone,
iObj //
);
if (isCreated)
// Support Zone ...
if (zone.HasSupportZone())
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
XCSupportZoneObject *iObj;
bool isCreated = CreateSupportZone(
zone.supportZone,
iObj //
);
if (isCreated)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
//
// OrderBlock ...
if (zone.HasOrderBlock() &&
zone.orderBlock.IsBullish())
{
//
XCBullishOrderBlockObject *iObj;
bool isCreated = CreateBullishOrderBlock(
zone.orderBlock,
iObj //
);
if (isCreated)
// Demand Zone ...
if (zone.HasDemandZone())
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
XCDemandZoneObject *iObj;
bool isCreated = CreateDemandZone(
zone.demandZone,
iObj //
);
if (isCreated)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
//
// FairValueGap ...
if (zone.HasFairValueGap() &&
zone.fairValueGap.IsBullish())
{
//
XCBullishFairValueGapObject *iObj;
bool isCreated = CreateBullishFairValueGap(
zone.fairValueGap,
iObj //
);
if (isCreated)
// OrderBlock ...
if (zone.HasOrderBlock() &&
zone.orderBlock.IsBullish())
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
XCBullishOrderBlockObject *iObj;
bool isCreated = CreateBullishOrderBlock(
zone.orderBlock,
iObj //
);
if (isCreated)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
//
// FairValueGap ...
if (zone.HasFairValueGap() &&
zone.fairValueGap.IsBullish())
{
//
XCBullishFairValueGapObject *iObj;
bool isCreated = CreateBullishFairValueGap(
zone.fairValueGap,
iObj //
);
if (isCreated)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
}
//
if (isAll || !isBullish)
if (isAll || isBearish)
{
//
// Resistance Zone ...
if (zone.HasResistanceZone())
if (onlyBoundary)
{
//
XCResistanceZoneObject *iObj;
bool isCreated = CreateResistanceZone(
zone.resistanceZone,
iObj //
double upper = 0;
double lower = 0;
datetime to = NULL;
datetime from = NULL;
//
bool isRetrieved = zone.GetBoxData(
X_DIRECTION_NONE,
upper,
lower,
from,
to //
);
if (isCreated)
if (isRetrieved)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
color clr =
isBullish
? BarBullishColor()
: isBearish
? BarBearishColor()
: clrGray;
XCBoxObject *iObj;
result = CreateBox(
iObj,
upper,
lower,
from,
to,
clr,
1,
false,
STYLE_DOT //
);
if (result)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
//
// Supply Zone ...
if (zone.HasSupplyZone())
else
{
//
XCSupplyZoneObject *iObj;
bool isCreated = CreateSupplyZone(
zone.supplyZone,
iObj //
);
if (isCreated)
// Resistance Zone ...
if (zone.HasResistanceZone())
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
XCResistanceZoneObject *iObj;
bool isCreated = CreateResistanceZone(
zone.resistanceZone,
iObj //
);
if (isCreated)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
//
// OrderBlock ...
if (zone.HasOrderBlock() &&
zone.orderBlock.IsBearish())
{
//
XCBearishOrderBlockObject *iObj;
bool isCreated = CreateBearishOrderBlock(
zone.orderBlock,
iObj //
);
if (isCreated)
// Supply Zone ...
if (zone.HasSupplyZone())
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
XCSupplyZoneObject *iObj;
bool isCreated = CreateSupplyZone(
zone.supplyZone,
iObj //
);
if (isCreated)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
//
// FairValueGap ...
if (zone.HasFairValueGap() &&
zone.fairValueGap.IsBearish())
{
//
XCBearishFairValueGapObject *iObj;
bool isCreated = CreateBearishFairValueGap(
zone.fairValueGap,
iObj //
);
if (isCreated)
// OrderBlock ...
if (zone.HasOrderBlock() &&
zone.orderBlock.IsBearish())
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
XCBearishOrderBlockObject *iObj;
bool isCreated = CreateBearishOrderBlock(
zone.orderBlock,
iObj //
);
if (isCreated)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
//
// FairValueGap ...
if (zone.HasFairValueGap() &&
zone.fairValueGap.IsBearish())
{
//
XCBearishFairValueGapObject *iObj;
bool isCreated = CreateBearishFairValueGap(
zone.fairValueGap,
iObj //
);
if (isCreated)
{
//
Add(
(XCBaseObject *)iObj,
drawnObjects //
);
}
}
}
}
+4 -4
View File
@@ -57,10 +57,10 @@ input int eaMinRequiredVerificationForSpreadPass = 20; // Minimum Spread Ve
//
// Trade ...
input group "Trade";
input bool eaAllowTrade = true; // Allow Open Trade On Signals
input string eaStartTradeAt = "0:0"; // Enable Trade on Signals on Time
input string eaStopTradeAt = "0:0"; // Enable Trade on Signals on Time
input string eaCloseAllTradesAt = "0:0"; // Enable Close All Trades on Signals on Time
input bool eaAllowTrade = true; // Allow Open Trade On Signals
input string eaStartTradeAt = ""; // Enable Trade on Signals on Time
input string eaStopTradeAt = ""; // Enable Trade on Signals on Time
input string eaCloseAllTradesAt = "11:30"; // Enable Close All Trades on Signals on Time
//
// Risk Management ...
+2 -2
View File
@@ -1832,7 +1832,7 @@ class XCX121Helper : public XCBaseHelper
}
//
canContinue = index > barIndex + loopback;
canContinue = index < barIndex + loopback;
index++;
}
@@ -1884,7 +1884,7 @@ class XCX121Helper : public XCBaseHelper
}
//
canContinue = index > barIndex + loopback;
canContinue = index < barIndex + loopback;
index++;
}
+289 -7
View File
@@ -5225,15 +5225,10 @@ struct XPriceZones
//
Clean(zones);
//
if (dir == X_DIRECTION_NONE)
{
return result;
}
//
bool isBullish = IsBullish(dir);
bool isBoth = dir == X_DIRECTION_ALL;
bool isBoth = dir == X_DIRECTION_ALL ||
dir == X_DIRECTION_NONE;
//
if (isBoth || isBullish)
@@ -5396,6 +5391,293 @@ struct XPriceZones
return result;
}
/**
* Calculate Lifetime of Zones ...
*
* @param dir: ENUM_X_DIRECTION Member, Specified Direction ...
* @param from: DateTime ...
* @param to: DateTime ...
*
* @return ( bool )
*/
bool GetLifetime(
ENUM_X_DIRECTION dir,
datetime &from,
datetime &to //
)
{
//
bool result = false;
//
to = NULL;
from = NULL;
//
XCZone *zones[];
int mCount = FillZones(dir, zones);
result = IsValidSize(mCount);
if (!result)
{
return result;
}
//
bool isBullish = IsBullish(dir);
bool isAll = dir == X_DIRECTION_NONE ||
dir == X_DIRECTION_ALL;
//
if (isAll || isBullish)
{
//
// Support Zone ...
bool hasSupportZone = HasSupportZone();
if (hasSupportZone)
{
//
XCSupportZone *zone = supportZone;
//
from =
!IsValid(from) ||
from > zone.From()
? zone.From()
: from;
//
to =
!IsValid(to) ||
to < zone.To()
? zone.To()
: from;
}
//
// Demand Zone ...
bool hasDemandZone = HasDemandZone();
if (hasDemandZone)
{
//
XCDemandZone *zone = demandZone;
//
from =
!IsValid(from) ||
from > zone.From()
? zone.From()
: from;
//
to =
!IsValid(to) ||
to < zone.To()
? zone.To()
: from;
}
//
// Order Block ...
bool hasOrderBlock = HasOrderBlock() &&
orderBlock.IsBullish();
if (hasOrderBlock)
{
//
XCOrderBlock *zone = orderBlock;
//
from =
!IsValid(from) ||
from > zone.From()
? zone.From()
: from;
//
to =
!IsValid(to) ||
to < zone.To()
? zone.To()
: from;
}
//
// Fair Value Gap ...
bool hasFairValueGap = HasFairValueGap() &&
fairValueGap.IsBullish();
if (hasFairValueGap)
{
//
XCFVG *zone = fairValueGap;
//
from =
!IsValid(from) ||
from > zone.From()
? zone.From()
: from;
//
to =
!IsValid(to) ||
to < zone.To()
? zone.To()
: from;
}
}
//
if (isAll || !isBullish)
{
//
// Resistance Zone ...
bool hasResistanceZone = HasResistanceZone();
if (hasResistanceZone)
{
//
XCResistanceZone *zone = resistanceZone;
//
from =
!IsValid(from) ||
from > zone.From()
? zone.From()
: from;
//
to =
!IsValid(to) ||
to < zone.To()
? zone.To()
: from;
}
//
// Supply Zone ...
bool hasSupplyZone = HasSupplyZone();
if (hasSupplyZone)
{
//
XCSupplyZone *zone = supplyZone;
//
from =
!IsValid(from) ||
from > zone.From()
? zone.From()
: from;
//
to =
!IsValid(to) ||
to < zone.To()
? zone.To()
: from;
}
//
// Order Block ...
bool hasOrderBlock = HasOrderBlock() &&
orderBlock.IsBearish();
if (hasOrderBlock)
{
//
XCOrderBlock *zone = orderBlock;
//
from =
!IsValid(from) ||
from > zone.From()
? zone.From()
: from;
//
to =
!IsValid(to) ||
to < zone.To()
? zone.To()
: from;
}
//
// Fair Value Gap ...
bool hasFairValueGap = HasFairValueGap() &&
fairValueGap.IsBearish();
if (hasFairValueGap)
{
//
XCFVG *zone = fairValueGap;
//
from =
!IsValid(from) ||
from > zone.From()
? zone.From()
: from;
//
to =
!IsValid(to) ||
to < zone.To()
? zone.To()
: from;
}
}
//
result =
to > from &&
IsValid(to) &&
IsValid(from);
//
return result;
}
/**
* Calculate Box Model Data ...
*
* @param dir: ENUM_X_DIRECTION Member, Specified Direction ...
* @param upper: Double ...
* @param lower: Double ...
* @param from: DateTime ...
* @param to: DateTime ...
*
* @return ( bool )
*/
bool GetBoxData(
ENUM_X_DIRECTION dir,
double &upper,
double &lower,
datetime &from,
datetime &to //
)
{
//
bool result = false;
//
bool hasBoundary = GetBoundary(
dir,
upper,
lower //
);
//
bool hasLifetime = GetLifetime(
dir,
from,
to //
);
//
result =
hasBoundary &&
hasLifetime;
//
return result;
}
//
};
@@ -3278,7 +3278,11 @@ class XC121SMCTradeHandler : public XCBaseAlert
DrawX121SMCStrategyConditions(
conditions,
conditionsObjects,
mDrawer //
mDrawer,
true,
true, // Analyse Price Zones ...
true, // Decision Zone ...
true // Only Box ...
);
}
+10 -4
View File
@@ -1328,12 +1328,13 @@ class XC121SMCExpert : public XCBaseExpert
string forceCloseTimeStr = CloseAllTradesAt();
datetime forceCloseTime = ParseDateTimeFromTimeString(forceCloseTimeStr);
bool canForceClose = IsTimeInRange(
TimeCurrent(),
forceCloseTime //
);
TimeCurrent(),
forceCloseTime //
) &&
!mIsForceCloseAtTime;
if (canForceClose)
{
mTradeHandler.ForceClose();
mIsForceCloseAtTime = mTradeHandler.ForceClose();
}
//
@@ -1462,6 +1463,8 @@ class XC121SMCExpert : public XCBaseExpert
*/
void HandleOnNewDay() override
{
//
mIsForceCloseAtTime = false;
mTradeHandler.ResumePausedSymbols();
}
@@ -1753,6 +1756,9 @@ class XC121SMCExpert : public XCBaseExpert
string mStopTradeAt; // Enable Trade on Signals on Time ...
string mCloseAllTradesAt; // Enable Close All Trades on Signals on Time ...
//
bool mIsForceCloseAtTime;
//
// Risk Management Props ...
double mR2R; // Signallers Risk to Reward Ratio ...
+8 -3
View File
@@ -516,7 +516,8 @@ int DrawX121SMCStrategyConditions(
XCPOIDrawer *drawer,
bool drawMarketStructure = true,
bool drawPriceZones = true,
bool drawDecisionZones = true //
bool drawDecisionZones = true,
bool drawOnlyPriceZonesBoundary = true //
)
{
//
@@ -545,7 +546,9 @@ int DrawX121SMCStrategyConditions(
XCBaseObject *objects[];
int objectsCount = drawer.DrawPriceZone(
conditions.priceZones,
objects //
objects,
conditions.signalDir,
drawOnlyPriceZonesBoundary //
);
if (IsValidSize(objectsCount))
{
@@ -567,7 +570,9 @@ int DrawX121SMCStrategyConditions(
XCBaseObject *objects[];
int objectsCount = drawer.DrawPriceZone(
conditions.decisionZones,
objects //
objects,
conditions.signalDir,
drawOnlyPriceZonesBoundary //
);
if (IsValidSize(objectsCount))
{