Complete Position Drawer and Well Test it ...

This commit is contained in:
2025-10-06 23:44:20 +03:30
parent b9a53670ee
commit 1a7cfc424a
3 changed files with 110 additions and 24 deletions
@@ -564,6 +564,12 @@ class XCBackTesterEA : public XCBase
const string comment //
)
{
//
eaPositionDrawer.HandleOnPositionModified(
ticket,
profit,
comment //
);
}
/**
+51 -19
View File
@@ -523,7 +523,7 @@ bool XUpdatePosition(
// Global Chart Objects ...
/**
* Base Chart Object ...
* Base Chart Object ...
**/
class XCBaseObject : public CChartObject
{
@@ -1151,7 +1151,7 @@ class XCSignalObject : public XCBaseObject
};
/**
* XRR Object ...
* XRR Object ...
**/
class XCRRObject : public XCSignalObject
{
@@ -2115,28 +2115,20 @@ class XCPositionObject : public XCBaseObject
void ApplyStyle()
{
//
// Validate ...
bool has = HasPosition();
if (!has)
{
return;
}
//
// Risk Style ...
mRiskBoxObj.BoxColor(riskStyle.clr);
mRiskBoxObj.BoxFill(riskStyle.fill);
mRiskBoxObj.BoxStyle(riskStyle.style);
mRiskBoxObj.BoxWidth(riskStyle.width);
//
// Reward Style ...
mRewardBoxObj.BoxColor(rewardStyle.clr);
mRewardBoxObj.BoxFill(rewardStyle.fill);
mRewardBoxObj.BoxStyle(rewardStyle.style);
mRewardBoxObj.BoxWidth(rewardStyle.width);
//
// Check Position in Profit ...
bool isLong = IsLong(mPosition.type);
bool isRiskFreed =
isLong
? mPosition.sl > mPosition.entry
: mPosition.sl < mPosition.entry;
bool isInProfit = mPosition.profit > 0;
XPOIStyle _priceStyle;
if (isInProfit)
@@ -2157,6 +2149,28 @@ class XCPositionObject : public XCBaseObject
_priceStyle.fill = true;
_priceStyle.style = priceStyle;
//
// Change Risk Style if Risk Freed Position ...
if (isRiskFreed) {
//
riskStyle.fill = true;
riskStyle.clr = rewardStyle.clr;
}
//
// Risk Style ...
mRiskBoxObj.BoxColor(riskStyle.clr);
mRiskBoxObj.BoxFill(riskStyle.fill);
mRiskBoxObj.BoxStyle(riskStyle.style);
mRiskBoxObj.BoxWidth(riskStyle.width);
//
// Reward Style ...
mRewardBoxObj.BoxColor(rewardStyle.clr);
mRewardBoxObj.BoxFill(rewardStyle.fill);
mRewardBoxObj.BoxStyle(rewardStyle.style);
mRewardBoxObj.BoxWidth(rewardStyle.width);
//
// Price Style ..
mPriceBoxObj.BoxColor(_priceStyle.clr);
@@ -2323,6 +2337,10 @@ class XCPositionObject : public XCBaseObject
//
bool isInProfit = mPosition.profit > 0;
bool isRiskFreed =
isLong
? mPosition.sl > mPosition.entry
: mPosition.sl < mPosition.entry;
ENUM_X_DIRECTION iPriceDir = isInProfit
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
@@ -2342,17 +2360,27 @@ class XCPositionObject : public XCBaseObject
mRiskBox.at = iAt;
mRiskBox.lower =
isLong
? isRiskFreed
? iEntry
: iSL
: isRiskFreed
? iSL
: iEntry;
mRiskBox.upper =
isLong
? isRiskFreed
? iSL
: iEntry
: isRiskFreed
? iEntry
: iSL;
mRiskBox.from = iFrom;
mRiskBox.symbol = iSymbol;
mRiskBox.period = iPeriod;
mRiskBox.type = iRiskName;
mRiskBox.dir = X_DIRECTION_BEARISH;
mRiskBox.dir = isRiskFreed
? X_DIRECTION_BEARISH
: X_DIRECTION_BULLISH;
//
// Reward Box ...
@@ -2379,10 +2407,14 @@ class XCPositionObject : public XCBaseObject
mPriceBox.lower =
isLong
? isInProfit
? iEntry
? isRiskFreed
? iSL
: iEntry
: iPrice
: isInProfit
? iPrice
? isRiskFreed
? iSL
: iPrice
: iEntry;
mPriceBox.upper =
isLong
+53 -5
View File
@@ -126,8 +126,8 @@ class XCPositionDrawer : public XCBase
//
// Price Style ...
priceStyle = STYLE_SOLID;
inProfitColor = ApplyAlpha(clrAqua, 100);
inDrawdownColor = ApplyAlpha(clrMagenta, 100);
inProfitColor = clrAqua; // ApplyAlpha(clrAqua, 100);
inDrawdownColor = clrMagenta; // ApplyAlpha(clrMagenta, 100);
}
/**
@@ -320,6 +320,7 @@ class XCPositionDrawer : public XCBase
*/
void HandleStopLossTriggered(const XDeal &deal)
{
//
Finalize(deal.positionId);
}
@@ -349,6 +350,53 @@ class XCPositionDrawer : public XCBase
Finalize(ticket);
}
/**
* Handle Position Modified Event ...
*
* @param ticket: ulong, triggered Positions ticket ...
* @param profit: double, Position Profit ...
* @param comment: string, Comment ...
*/
void HandleOnPositionModified(
const ulong ticket,
const double profit,
const string comment //
)
{
//
// Detect Position Index ...
int index = FindIndex(ticket);
bool has = IsValidIndex(index);
if (!has)
{
return;
}
//
// Get Position of Objects ...
XPosition _position;
has = ((XCPositionObject *)positionObjects.At(index)).GetPosition(_position);
if (has)
{
//
// Get Position of Trader Instance ...
has = trader.GetPosition(
ticket,
_position //
);
if (has)
{
//
// Update Position ...
((XCPositionObject *)positionObjects.At(index)).Update(_position);
}
}
//
// Cleanup Resources ...
_position.Clean();
}
//
// Protected ...
protected:
@@ -371,9 +419,9 @@ class XCPositionDrawer : public XCBase
}
//
XCPositionObject *iObj = positionObjects.At(index);
positionObjects.Delete(index);
finalizedObjects.Add(iObj);
// XCPositionObject *iObj = positionObjects.At(index);
// positionObjects.Delete(index);
// finalizedObjects.Add(iObj);
}
/**