last ...
This commit is contained in:
@@ -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 ...
|
||||
|
||||
Reference in New Issue
Block a user