attach alert to class and implement hedging in trade handler ...

This commit is contained in:
2024-07-22 17:02:27 +03:30
parent 818bfdf4f5
commit 5529e12b25
2 changed files with 167 additions and 1 deletions
+156
View File
@@ -4177,6 +4177,59 @@ public:
mTrailBasedOnProfit = value;
}
//
// Hedging ...
//
bool AllowHedging()
{
return mAllowHedging;
}
//
void AllowHedging(bool value)
{
mAllowHedging = value;
}
//
double HedgeVolumeFactor()
{
return mHedgeVolumeFactor;
}
//
void HedgeVolumeFactor(double value)
{
//
if (value < 0)
{
value = 0;
}
//
mHedgeVolumeFactor = value;
}
//
double HedgeMinProfitPerVolumeFactor()
{
return mHedgeMinProfitPerVolumeFactor;
}
//
void HedgeMinProfitPerVolumeFactor(double value)
{
//
if (value < 0)
{
value = 0;
}
//
mHedgeMinProfitPerVolumeFactor = value;
}
//
// Tools ...
@@ -4386,11 +4439,57 @@ public:
//
// Do Hedging ...
if (mAllowHedging)
{
//
// Check Values Validation ...
if (count > 1 &&
mHedgeVolumeFactor > 0 &&
mHedgeMinProfitPerVolumeFactor > 0)
{
//
double profits = 0;
double commissions = 0;
double requiredProfitsForHedge = 0;
CalculateHedgeData(
profits,
commissions,
requiredProfitsForHedge //
);
//
bool canHedge = profits >= requiredProfitsForHedge;
if (canHedge)
{
//
string comment = "Hedging ...";
//
XPosition positions[];
int positionsCount = mTrader.GetPositions(positions);
if (IsValidSize(positionsCount))
{
//
int closeds = mTrader.Close(
positions,
comment //
);
if (IsValidSize(closeds))
{
//
string msg = ToString(positionsCount) + " Closed Due Hedge Action in: " + ToString(profits) + " ...";
Alert(msg);
}
}
}
}
}
//
// Do Force Closing ...
//
// Loop through Data ...
for (int i = 0; i < count; i++)
{
//
@@ -4614,6 +4713,12 @@ protected:
double mTrailStartInPoint; // Trail Starts in Points of Profit
double mTrailStepInPoint; // Profit Must Grows Point to do Trailling
//
// Hedging ...
bool mAllowHedging; // Hedge Trades
double mHedgeVolumeFactor; // Hedging Volume Factor
double mHedgeMinProfitPerVolumeFactor; // Hedging Min Required Profit Per Volume Factor
//
XTradeData mData[]; // Hold Trade Data
@@ -4821,6 +4926,57 @@ private:
// Save Signal ...
mCollector.SaveSignal(item);
}
//
// Calculate Required Data for Hedging ...
void CalculateHedgeData(
double &profits,
double &commissions,
double &requiredProfitsForHedge //
)
{
//
// Reset Values ...
profits = 0;
commissions = 0;
requiredProfitsForHedge = 0;
//
// Validate Configurations ...
if (mHedgeVolumeFactor <= 0 ||
mHedgeMinProfitPerVolumeFactor <= 0)
{
return;
}
//
// Check Positions Exists For Hedging ...
int count = Count();
if (!IsValidSize(count))
{
return;
}
//
double swaps = 0;
double volumes = 0;
for (int i = 0; i < count; i++)
{
//
swaps += mData[i].swap;
profits += mData[i].profit;
volumes += mData[i].volume;
commissions += mData[i].commission;
}
//
// Calculate required Profits for Hedging ...
requiredProfitsForHedge = ((volumes / mHedgeVolumeFactor) * mHedgeMinProfitPerVolumeFactor);
requiredProfitsForHedge += -1 * (swaps);
requiredProfitsForHedge -= commissions;
}
//
};
//
+11 -1
View File
@@ -71,6 +71,10 @@ XSCBaseStrategy *strategies[];
// Trader Instance Class ...
XSCTrade *eaTrader;
//
// Alert Class ...
XSCAlert *eaAlert;
//
// Trade Handler Instance Class ...
XSCXTradeHandler *eaTradeHandler;
@@ -128,6 +132,7 @@ void OnDeinit(const int reason)
delete mCCHelper;
//
delete eaAlert;
delete eaTrader;
delete eaTradeHandler;
@@ -213,6 +218,11 @@ bool InitialEA()
return result;
}
//
// Create Instance of Alert Class ...
eaAlert = new XSCAlert();
eaAlert.SetPrefix(ShortName);
//
// Create Trader Instance ...
eaTrader = new XSCTrade(
@@ -411,7 +421,7 @@ void OnSignalRecieved(XSignal &signal)
" on: " + signal.symbol +
" in: " + ToString(signal.period) +
" Executed Successfully ...";
Print(msg);
eaAlert.Alert(msg);
}
}