This commit is contained in:
2025-01-23 20:52:45 +03:30
parent aa3630bc82
commit 330c70088c
10 changed files with 3085 additions and 774 deletions
+145 -24
View File
@@ -462,6 +462,60 @@ class XC121SMCExpert : public XCBaseExpert
ReConfigure();
}
/**
* Get Static Balance for Calculate Trade Volume ...
*
* @return ( double )
*/
double StaticBalance()
{
return mStaticBalance;
}
/**
* Set Static Balance for Calculate Trade Volume ...
*
* @param value: Argument 1
*/
void StaticBalance(double value)
{
//
if (value < 0)
{
value = 0;
}
//
mStaticBalance = value;
}
/**
* Get Balance Used In Each Trade ...
*
* @return ( double )
*/
double BalancePerTrade()
{
return mBalancePerTrade;
}
/**
* Set Balance Used In Each Trade ...
*
* @param value: Argument 1
*/
void BalancePerTrade(double value)
{
//
if (value < 0)
{
value = 0;
}
//
mBalancePerTrade = value;
}
/**
* Get Risk Percent Per Balance in Each Trade ...
*
@@ -1602,37 +1656,72 @@ class XC121SMCExpert : public XCBaseExpert
void ApplyVolumeOnSignal(XSignal &signal)
{
//
// Prepare Signal Dynamic Volume
// if Provided ...
if (UseDynamicVolume() &&
DynamicVolumeStep() > 0 &&
DynamicVolumeBalanceFactor() > 0)
double staticVolume = Volume();
double fVolume = staticVolume > 0
? staticVolume
: 0.01;
//
double staticBalance = StaticBalance();
double accountBalance = mTrader.mAccount.GetBalance();
double balance = staticBalance > 0
? staticBalance
: accountBalance;
//
bool useDynamicVolume = UseDynamicVolume();
double balancePerTrade = BalancePerTrade();
double dynamicVolumeStep = DynamicVolumeStep();
double riskPercentPerBalance = RiskPercentPerBalance();
bool allowDynamicRiskManagement = DynamicRiskManagement();
double dynamicVolumeBalanceFactor = DynamicVolumeBalanceFactor();
//
// Apply Static Volume ...
bool allowStaticVolume = staticVolume > 0;
//
// Apply Dynamic Volume ...
bool aloowApplyDynamicVolume = useDynamicVolume &&
dynamicVolumeStep &&
dynamicVolumeBalanceFactor;
//
// Apply Risk Per Trade Volume ...
bool allowApplyRiskPerTradeVolume =
!aloowApplyDynamicVolume &&
riskPercentPerBalance > 0;
//
// Apply Balance Per Trade Volume ...
bool allowApplyBalacePerTradeVolume =
!aloowApplyDynamicVolume &&
!allowApplyRiskPerTradeVolume &&
balancePerTrade > 0;
//
// First Check Dynamic Volume ...
if (aloowApplyDynamicVolume)
{
//
// Dynamic Volume ...
double dVolume = mTrader.GetDynamicVolume(
signal.symbol,
DynamicVolumeBalanceFactor(),
DynamicVolumeStep() //
dynamicVolumeBalanceFactor,
dynamicVolumeStep //
);
if (dVolume < fVolume)
{
dVolume = fVolume;
}
//
if (dVolume > 0)
{
signal.volume = dVolume;
}
else
{
signal.volume = Volume();
}
signal.volume = dVolume;
}
else if (RiskPercentPerBalance() > 0)
else if (allowApplyRiskPerTradeVolume)
{
//
double riskPercent = RiskPercentPerBalance();
//
double balance = mTrader.mAccount.GetBalance();
double riskAmountPerBalance = (riskPercent * balance) / 100;
double riskAmountPerBalance = (riskPercentPerBalance * balance) / 100;
//
double risk = signal.GetRisk();
@@ -1645,6 +1734,10 @@ class XC121SMCExpert : public XCBaseExpert
riskAmountPerBalance,
riskInPoints //
);
if (volume <= 0)
{
volume = fVolume;
}
//
// Check Dynamic Risk Management ...
@@ -1664,18 +1757,44 @@ class XC121SMCExpert : public XCBaseExpert
}
//
if (volume > 0)
signal.volume = volume;
}
else if (allowApplyBalacePerTradeVolume)
{
//
double risk = signal.GetRisk();
double points = GetPoints(signal.symbol);
double riskInPoints = risk / points;
//
double volume = mTrader.mAccount.CalculateVolume(
signal.symbol,
balancePerTrade,
riskInPoints //
);
if (volume <= 0)
{
volume = NormalizeVolume(volume, signal.symbol);
volume = fVolume;
}
//
signal.volume = volume;
}
else if (allowStaticVolume)
{
signal.volume = staticVolume;
}
else
{
signal.volume = Volume();
signal.volume = fVolume;
}
//
// Normalize Signal Volume ...
signal.volume = NormalizeVolume(
signal.volume,
signal.symbol //
);
}
/**
@@ -1836,6 +1955,8 @@ class XC121SMCExpert : public XCBaseExpert
// Risk Management Props ...
double mR2R; // Signallers Risk to Reward Ratio ...
double mVolume; // Static Volume ...
double mStaticBalance; // Static Balance for Calculate Trade Volume ...
double mBalancePerTrade; // Balance Used in Each Trade ...
double mRiskPercentPerBalance; // Risk Percent Per Balance in Each Trade ...
bool mDynamicRiskManagement; // Dynamic Risk Management ...
bool mUseDynamicVolume; // Use Dynamic Volume ...