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 // const string comment //
) )
{ {
//
eaPositionDrawer.HandleOnPositionModified(
ticket,
profit,
comment //
);
} }
/** /**
+49 -17
View File
@@ -2115,28 +2115,20 @@ class XCPositionObject : public XCBaseObject
void ApplyStyle() void ApplyStyle()
{ {
// //
// Validate ...
bool has = HasPosition(); bool has = HasPosition();
if (!has) if (!has)
{ {
return; 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 ... // 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; bool isInProfit = mPosition.profit > 0;
XPOIStyle _priceStyle; XPOIStyle _priceStyle;
if (isInProfit) if (isInProfit)
@@ -2157,6 +2149,28 @@ class XCPositionObject : public XCBaseObject
_priceStyle.fill = true; _priceStyle.fill = true;
_priceStyle.style = priceStyle; _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 .. // Price Style ..
mPriceBoxObj.BoxColor(_priceStyle.clr); mPriceBoxObj.BoxColor(_priceStyle.clr);
@@ -2323,6 +2337,10 @@ class XCPositionObject : public XCBaseObject
// //
bool isInProfit = mPosition.profit > 0; bool isInProfit = mPosition.profit > 0;
bool isRiskFreed =
isLong
? mPosition.sl > mPosition.entry
: mPosition.sl < mPosition.entry;
ENUM_X_DIRECTION iPriceDir = isInProfit ENUM_X_DIRECTION iPriceDir = isInProfit
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
@@ -2342,17 +2360,27 @@ class XCPositionObject : public XCBaseObject
mRiskBox.at = iAt; mRiskBox.at = iAt;
mRiskBox.lower = mRiskBox.lower =
isLong isLong
? isRiskFreed
? iEntry
: iSL
: isRiskFreed
? iSL ? iSL
: iEntry; : iEntry;
mRiskBox.upper = mRiskBox.upper =
isLong isLong
? isRiskFreed
? iSL
: iEntry
: isRiskFreed
? iEntry ? iEntry
: iSL; : iSL;
mRiskBox.from = iFrom; mRiskBox.from = iFrom;
mRiskBox.symbol = iSymbol; mRiskBox.symbol = iSymbol;
mRiskBox.period = iPeriod; mRiskBox.period = iPeriod;
mRiskBox.type = iRiskName; mRiskBox.type = iRiskName;
mRiskBox.dir = X_DIRECTION_BEARISH; mRiskBox.dir = isRiskFreed
? X_DIRECTION_BEARISH
: X_DIRECTION_BULLISH;
// //
// Reward Box ... // Reward Box ...
@@ -2379,10 +2407,14 @@ class XCPositionObject : public XCBaseObject
mPriceBox.lower = mPriceBox.lower =
isLong isLong
? isInProfit ? isInProfit
? iEntry ? isRiskFreed
? iSL
: iEntry
: iPrice : iPrice
: isInProfit : isInProfit
? iPrice ? isRiskFreed
? iSL
: iPrice
: iEntry; : iEntry;
mPriceBox.upper = mPriceBox.upper =
isLong isLong
+53 -5
View File
@@ -126,8 +126,8 @@ class XCPositionDrawer : public XCBase
// //
// Price Style ... // Price Style ...
priceStyle = STYLE_SOLID; priceStyle = STYLE_SOLID;
inProfitColor = ApplyAlpha(clrAqua, 100); inProfitColor = clrAqua; // ApplyAlpha(clrAqua, 100);
inDrawdownColor = ApplyAlpha(clrMagenta, 100); inDrawdownColor = clrMagenta; // ApplyAlpha(clrMagenta, 100);
} }
/** /**
@@ -320,6 +320,7 @@ class XCPositionDrawer : public XCBase
*/ */
void HandleStopLossTriggered(const XDeal &deal) void HandleStopLossTriggered(const XDeal &deal)
{ {
//
Finalize(deal.positionId); Finalize(deal.positionId);
} }
@@ -349,6 +350,53 @@ class XCPositionDrawer : public XCBase
Finalize(ticket); 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 ...
protected: protected:
@@ -371,9 +419,9 @@ class XCPositionDrawer : public XCBase
} }
// //
XCPositionObject *iObj = positionObjects.At(index); // XCPositionObject *iObj = positionObjects.At(index);
positionObjects.Delete(index); // positionObjects.Delete(index);
finalizedObjects.Add(iObj); // finalizedObjects.Add(iObj);
} }
/** /**