refactor whole projects compiling issues ...

This commit is contained in:
2025-10-06 17:57:37 +03:30
parent a03613f4cd
commit f15e58fbc4
3 changed files with 913 additions and 6 deletions
+727 -2
View File
@@ -46,6 +46,7 @@ enum ENUM_XCHARTOBJECTS
X_OHCL_OBJ = 8863, // XBar X_OHCL_OBJ = 8863, // XBar
X_RR_OBJ = 8864, // XRR X_RR_OBJ = 8864, // XRR
X_PIVOT_OBJ = 8865, // XPivot X_PIVOT_OBJ = 8865, // XPivot
X_POSITION_OBJ = 8866, // XPosition
// //
// 9860 Custom Object ... // 9860 Custom Object ...
}; };
@@ -140,7 +141,7 @@ struct XPOIStyle
* *
* @return ( bool ) * @return ( bool )
*/ */
bool ToSignal( bool ToXSignal(
XBoxZone &box, XBoxZone &box,
XSignal &signal, XSignal &signal,
double &rewardRatios[], double &rewardRatios[],
@@ -344,6 +345,177 @@ bool ToSignal(
return result; return result;
} }
/**
* Converts a Signal to Position ...
*
* @param signal: XSignal, reference to Specified Signal ...
* @param position: XPosition, reference to Generated Position ...
* @param magic: ulong, Specified Magic Number ...
* @param ticket: ulong, Specified Position Ticket ...
*
* @return ( bool )
*/
bool ToXPosition(
XSignal &signal,
XPosition &position,
ulong magic = 0,
ulong ticket = 0 //
)
{
//
bool result = false;
//
// Prepare ...
position.Clean();
//
// Validate ...
result = signal.IsValid();
if (!result)
{
return result;
}
//
// Normalize ...
//
if (ticket <= 0)
{
//
if (signal.positionId > 0)
{
ticket = signal.positionId;
}
else
{
//
ticket = MathRand();
signal.positionId = ticket;
}
}
signal.positionId = ticket;
//
if (magic <= 0)
{
magic = MathRand();
}
//
// Filling Position ...
position.swap = 0;
position.profit = 0;
position.magic = magic;
position.commission = 0;
position.tp = signal.tp;
position.sl = signal.sl;
position.ticket = ticket;
position.type = signal.type;
position.price = signal.entry;
position.entry = signal.entry;
position.openAt = signal.time;
position.volume = signal.volume;
position.symbol = signal.symbol;
position.period = signal.period;
position.comment = signal.comment;
position.provider = signal.provider;
//
result = position.IsValid();
//
// Cleanup Resources ...
if (!result)
{
position.Clean();
}
//
return result;
}
/**
* Update Specified Position by Bar ...
*
* @param position: XPosition, reference to Specified Position ...
* @param barIndex: int, Specified Bar Index ...
*
* @return ( bool )
*/
bool XUpdatePosition(
XPosition &position,
int barIndex = 0 //
)
{
//
bool result = false;
//
// Normalize ...
barIndex = NormalizeInt(barIndex, 0);
//
// Validate ...
result = position.IsValid();
if (!result)
{
return result;
}
//
XOHCL bar;
result = bar.Init(
position.symbol,
position.period,
barIndex //
);
if (!result)
{
return result;
}
//
double entryDiff = MathAbs(position.entry - position.price);
bool isLong = IsLong(position.type);
bool isInProfit = isLong
? position.price > position.entry
: position.price < position.entry;
bool isTargeted =
isLong
? position.price >= position.tp
: position.price <= position.tp;
bool isStoped =
isLong
? position.price <= position.sl
: position.price >= position.sl;
result = !isTargeted && !isStoped;
if (!result)
{
return result;
}
//
double spread = GetSpread(position.symbol);
position.price = bar.close +
(isLong
? spread
: (-1 * spread));
entryDiff = MathAbs(position.entry - position.price);
isInProfit = isLong
? position.price > position.entry
: position.price < position.entry;
result = position.IsValid();
//
// Cleanup Resources ...
bar.Clean();
//
return result;
}
// //
// Implementation ... // Implementation ...
@@ -1008,7 +1180,7 @@ class XCRRObject : public XCSignalObject
// //
XSignal signal; XSignal signal;
result = ToSignal( result = ToXSignal(
box, box,
signal, signal,
rewardRatios // rewardRatios //
@@ -1614,6 +1786,559 @@ class XCBoxObject : public XCBaseObject
CChartObjectRectangle mRect; CChartObjectRectangle mRect;
}; };
class XCPositionObject : public XCBaseObject
{
//
// Public ...
public:
//
//
// Creators ...
bool Create(
long chart_id,
int window,
XSignal &signal,
ulong magic = 0,
ulong ticket = 0 //
)
{
//
bool result = false;
//
// Converts Signal to Test Position ...
XPosition _position;
result = ToXPosition(
signal,
_position,
magic,
ticket //
);
//
// Validate ...
result = chart_id >= 0 &&
window >= 0 &&
_position.IsValid();
if (!result)
{
return result;
}
//
result = Create(
chart_id,
window,
_position //
);
//
return result;
}
/**
* Create a Position Object ...
*
* @param chart_id: Long, Specified Chart ID ...
* @param window: Integer, Specified Chart Window ID ...
* @param position: XPosition, reference to Specified Position ...
*
* @return ( bool )
*/
bool Create(
long chart_id,
int window,
XPosition &position //
)
{
//
bool result = false;
//
// Validate ...
result = chart_id >= 0 &&
window >= 0 &&
position.IsValid();
if (!result)
{
return result;
}
//
result = Update(position);
if (!result)
{
//
Destroy();
return result;
}
//
return result;
}
/**
* Update Position if Belongs to ...
*
* @param position: XPosition, reference to Specified Position ...
*
* @return ( bool )
*/
bool Update(XPosition &position)
{
//
bool result = false;
//
// Validate ...
result =
mChartID >= 0 &&
mWindowID >= 0 &&
position.IsValid() &&
(!HasPosition()
? true
: IsBelong(position));
if (!result)
{
return result;
}
//
// Validate Chart Info ...
result = XUpdatePosition(position);
//
return result;
}
bool Update(int barIndex = 0)
{
//
bool result = false;
//
// Normalize ...
barIndex = NormalizeInt(barIndex, 0);
//
// Validate ...
result = HasPosition();
if (!result)
{
return result;
}
//
// Update mPosition ...
result = XUpdatePosition(mPosition, barIndex);
if (!result)
{
return result;
}
//
result = Update(mPosition);
//
return result;
}
//
// Checkers ...
/**
* Check Object is Belongs to Specified Position or not ...
*
* @param position: XPosition, reference to Specified Position ...
*
* @return ( bool )
*/
bool IsBelong(XPosition &position)
{
//
bool result = false;
//
// Validate ...
result =
HasPosition() &&
position.IsValid();
//
// Check ...
result =
result &&
mPosition.ticket == position.ticket;
//
return result;
}
//
// Overrides ...
/**
* Retrieve Object Type ...
*
* @return ( ENUM_XCHARTOBJECTS )
*/
string TypeString() override
{
return ToXString(X_POSITION_OBJ);
}
/**
* Retrieve Object Type ...
*
* @return ( ENUM_XCHARTOBJECTS )
*/
int Type(void) const override
{
return ((int)X_POSITION_OBJ);
}
/**
* Destroy Object ...
**/
void Destroy() override
{
//
ObjName(NULL);
//
mRiskBox.Clean();
mPosition.Clean();
mPriceBox.Clean();
mRewardBox.Clean();
//
mRiskBoxObj.Detach();
mRiskBoxObj.Delete();
//
mPriceBoxObj.Detach();
mPriceBoxObj.Delete();
//
mRewardBoxObj.Detach();
mRewardBoxObj.Delete();
}
//
// Stylers ...
//
void ApplyStyle(
XPOIStyle &bullishStyle,
XPOIStyle &bearishStyle //
)
{
//
// Validate ...
if (!HasPosition())
{
return;
}
//
// Risk Box ...
if (mRiskBox.IsValid())
{
//
mRiskBoxObj.BoxColor(bearishStyle.clr);
mRiskBoxObj.BoxFill(bearishStyle.fill);
mRiskBoxObj.BoxStyle(bearishStyle.style);
mRiskBoxObj.BoxWidth(bearishStyle.width);
}
//
// Reward Box ...
if (mRewardBox.IsValid())
{
//
mRewardBoxObj.BoxColor(bullishStyle.clr);
mRewardBoxObj.BoxFill(bullishStyle.fill);
mRewardBoxObj.BoxStyle(bullishStyle.style);
mRewardBoxObj.BoxWidth(bullishStyle.width);
}
//
// Price Box ...
if (mPriceBox.IsValid())
{
//
XPOIStyle priceStyle;
if (mPriceBox.IsBullish())
{
priceStyle = bullishStyle;
}
else
{
priceStyle = bearishStyle;
}
//
mPriceBoxObj.BoxColor(priceStyle.clr);
mPriceBoxObj.BoxFill(priceStyle.fill);
mPriceBoxObj.BoxStyle(priceStyle.style);
mPriceBoxObj.BoxWidth(priceStyle.width);
//
priceStyle.Clean();
}
}
//
// Protected ...
protected:
//
//
bool HasPosition()
{
return mPosition.IsValid();
}
//
bool UpdatePosition(XPosition &_position)
{
//
bool result = false;
//
// Validate ...
result = _position.IsValid() &&
(!HasPosition()
? true
: _position.ticket == mPosition.ticket //
);
if (!result)
{
return result;
}
//
mPosition = _position;
result = UpdateZones();
//
return result;
}
//
bool UpdateZones()
{
//
bool result = false;
//
// Validate ...
result = HasPosition();
if (!result)
{
return result;
}
//
string iSymbol = mPosition.symbol;
ENUM_TIMEFRAMES iPeriod = mPosition.period;
//
datetime iAt = mPosition.openAt;
datetime iFrom = mPosition.openAt;
datetime iTo = iFrom + (PeriodSeconds(iPeriod) * 3);
//
double iTP = mPosition.tp;
double iSL = mPosition.sl;
double iEntry = mPosition.entry;
double iPrice = mPosition.price;
//
bool isLong = IsLong(mPosition.type);
ENUM_X_DIRECTION iRiskDir = isLong
? X_DIRECTION_BEARISH
: X_DIRECTION_BULLISH;
ENUM_X_DIRECTION iRewardDir = isLong
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
bool isInProfit = mPosition.profit > 0;
ENUM_X_DIRECTION iPriceDir = isInProfit
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
// Try to Update Zones ...
string iSuffix = ToXString(mPosition.type) + "_" + ToXString(mPosition.ticket);
string iPrefix = ToXString(TimeToSeconds(mPosition.openAt));
string iName = iSuffix + "_" + iPrefix;
string iRiskName = iSuffix + "_" + "RISK" + "_" + iPrefix;
string iPriceName = iSuffix + "_" + "PRICE" + "_" + iPrefix;
string iRewardName = iSuffix + "_" + "REWARD" + "_" + iPrefix;
//
// Risk Box ...
mRiskBox.to = iTo;
mRiskBox.at = iAt;
mRiskBox.lower =
isLong
? iSL
: iEntry;
mRiskBox.upper =
isLong
? iEntry
: iSL;
mRiskBox.from = iFrom;
mRiskBox.symbol = iSymbol;
mRiskBox.period = iPeriod;
mRiskBox.type = iRiskName;
mRiskBox.dir = X_DIRECTION_BEARISH;
//
// Reward Box ...
mRewardBox.to = iTo;
mRewardBox.at = iAt;
mRewardBox.lower =
isLong
? iEntry
: iTP;
mRewardBox.upper =
isLong
? iTP
: iEntry;
mRewardBox.from = iFrom;
mRewardBox.symbol = iSymbol;
mRewardBox.period = iPeriod;
mRewardBox.type = iRewardName;
mRewardBox.dir = X_DIRECTION_BULLISH;
//
// Price Box ...
mPriceBox.to = iTo;
mPriceBox.at = iAt;
mPriceBox.lower =
isLong
? isInProfit
? iEntry
: iPrice
: isInProfit
? iPrice
: iEntry;
mPriceBox.upper =
isLong
? isInProfit
? iPrice
: iEntry
: isInProfit
? iEntry
: iPrice;
mPriceBox.from = iFrom;
mPriceBox.symbol = iSymbol;
mPriceBox.period = iPeriod;
mPriceBox.type = iPriceName;
mPriceBox.dir = isInProfit
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
result = mRiskBox.IsValid() &&
mPriceBox.IsValid() &&
mRewardBox.IsValid();
if (!result)
{
return result;
}
//
mRiskBoxObj.Detach();
mRiskBoxObj.Delete();
bool isRiskCreated =
mRiskBoxObj.Create(
mChartID,
mWindowID,
mRiskBox.type,
mRiskBox.upper,
mRiskBox.lower,
mRiskBox.from,
mRiskBox.to,
NULL, // At ...
NULL // Prefix ...
);
//
mRewardBoxObj.Detach();
mRewardBoxObj.Delete();
bool isRewardCreated =
mRewardBoxObj.Create(
mChartID,
mWindowID,
mRewardBox.type,
mRewardBox.upper,
mRewardBox.lower,
mRewardBox.from,
mRewardBox.to,
NULL, // At ...
NULL // Prefix ...
);
//
mPriceBoxObj.Detach();
mPriceBoxObj.Delete();
bool isPriceCreated =
mPriceBoxObj.Create(
mChartID,
mWindowID,
mPriceBox.type,
mPriceBox.upper,
mPriceBox.lower,
mPriceBox.from,
mPriceBox.to,
NULL, // At ...
NULL // Prefix ...
);
//
result =
isRiskCreated &&
isPriceCreated &&
isRewardCreated;
if (!result)
{
ObjName(iName);
}
//
return result;
}
//
// Private ...
private:
//
// Props ...
//
int mWindowID;
long mChartID;
//
XBoxZone mRiskBox;
XBoxZone mPriceBox;
XPosition mPosition;
XBoxZone mRewardBox;
//
XCBoxObject mRiskBoxObj;
XCBoxObject mPriceBoxObj;
XCBoxObject mRewardBoxObj;
//
};
/** /**
* XPivotAnalysis Chart Object ... * XPivotAnalysis Chart Object ...
**/ **/
@@ -0,0 +1,182 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XCPositionDrawer
// Description: Provides Position
// Drawing Tools ...
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://www.saherelm.ir"
#property version "1.00"
#property strict
//
// Imports ...
#include "../Classes/x-saherelm.base.class.mq5"
#include "../Classes/x-saherelm.x-cobject.class.mq5"
#include "../Classes/x-saherelm.x-trade.class.mq5"
#include "../Libraries/x-saherelm.x-pivot.analysis.lib.mq5"
#include "../Libraries/x-saherelm.x-poi.extensions.lib.mq5"
//
// Definitions ...
//
// Implementation ...
class XCPositionDrawer : public XCBase
{
//
// Public ...
public:
//
// Props ...
XCTrade *trader;
CArrayObj positionObjects;
//
// Constructor ...
XCPositionDrawer(
XCTrade *_trader //
) : XCBase()
{
//
Init(
_trader //
);
}
//
// Deconstructor ...
~XCPositionDrawer()
{
Destroy();
}
//
// Tools ...
void Init(
XCTrade *_trader //
)
{
//
// Validate ...
bool has = _trader != NULL;
if (!has)
{
return;
}
//
trader = _trader;
}
void Destroy()
{
}
bool IsValid()
{
//
bool result = false;
//
result =
trader != NULL;
//
return result;
}
void Update(int barIndex = 0)
{
//
// Normalize ...
barIndex = NormalizeInt(barIndex, 0);
//
// Validate ...
bool has = IsValid();
if (!has) {
return;
}
//
}
//
// Trade Event Handlers ...
/**
* Add Executed Signal ...
*
* @param signal: XSignal, reference to Executed Signal ...
*/
void AddExecutedSignal(XSignal &signal)
{
//
// Validate ...
if (!signal.IsValid() || !signal.IsExecuted())
{
return;
}
}
/**
* Handle Stop Loss Event Triggered ...
*
* @param deal: XDeal instance refrence, provides Triggered Deal info ...
*/
void HandleOnStopLossTriggered(const XDeal &deal)
{
}
/**
* Handle Take Profit Event Triggered ...
*
* @param deal: XDeal instance refrence, provides Triggered Deal info ...
*/
void HandleOnTakeProfitTriggered(const XDeal &deal)
{
}
/**
* Handle Position Force Closed Event ...
*
* @param ticket: ulong, triggered Positions ticket ...
* @param position: XPosition instance refrence, Triggered Position ...
* @param comment: string, Comment ...
*/
void HandleOnPositionForceClosed(
const ulong ticket,
const XPosition &position,
const string comment //
)
{
}
//
// Protected ...
protected:
//
//
// Private ...
private:
//
//
};
//
+4 -4
View File
@@ -794,7 +794,7 @@ class XCXCATBEASignaller : XCBase
// //
// Preparing Signal ... // Preparing Signal ...
XSignal iSignal; XSignal iSignal;
result = ToSignal( result = ToXSignal(
mConditions.pivotZone, mConditions.pivotZone,
iSignal, iSignal,
targets, targets,
@@ -896,7 +896,7 @@ class XCXCATBEASignaller : XCBase
// //
// Preparing Signal ... // Preparing Signal ...
result = ToSignal( result = ToXSignal(
mConditions.triggerBlock.trigger, mConditions.triggerBlock.trigger,
mConditions.triggerBlock.signal, mConditions.triggerBlock.signal,
targets, targets,
@@ -1359,7 +1359,7 @@ class XCXCATBEASignaller : XCBase
// //
// Preparing Signal ... // Preparing Signal ...
result = ToSignal( result = ToXSignal(
mConditions.triggerBlock.trigger, mConditions.triggerBlock.trigger,
mConditions.triggerBlock.signal, mConditions.triggerBlock.signal,
targets, targets,
@@ -1368,7 +1368,7 @@ class XCXCATBEASignaller : XCBase
XSignal insideTBSignal; XSignal insideTBSignal;
result = result =
result && result &&
ToSignal( ToXSignal(
cInsideTriggerBlock.trigger, cInsideTriggerBlock.trigger,
insideTBSignal, insideTBSignal,
targets, targets,