add support for dynamic volume calculation in ea ...
This commit is contained in:
@@ -3285,6 +3285,51 @@ public:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prepare Dynamic Volume ...
|
||||||
|
double GetDynamicVolume(
|
||||||
|
string _symbol,
|
||||||
|
double _balanceFactor,
|
||||||
|
double _volumeStep //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Inputs ...
|
||||||
|
if (!IsValid(_symbol) ||
|
||||||
|
_volumeStep <= 0 ||
|
||||||
|
_balanceFactor <= 0)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Account Balance ...
|
||||||
|
double balance = mAccount.GetBalance();
|
||||||
|
|
||||||
|
//
|
||||||
|
double bStep = balance / _balanceFactor;
|
||||||
|
bStep = MathFloor(bStep);
|
||||||
|
if (bStep == 0)
|
||||||
|
{
|
||||||
|
bStep = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = bStep * _volumeStep;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = NormalizeVolume(
|
||||||
|
result,
|
||||||
|
_symbol //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Protected ...
|
// Protected ...
|
||||||
protected:
|
protected:
|
||||||
@@ -4939,6 +4984,39 @@ public:
|
|||||||
GetMaxDrawdown();
|
GetMaxDrawdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void UpdateSignal(XSignal &signal)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (!signal.IsValid())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int count = Count();
|
||||||
|
if (!IsValidSize(count))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isOwn = mData[i].IsOwn(
|
||||||
|
signal.symbol,
|
||||||
|
signal.provider,
|
||||||
|
signal.period,
|
||||||
|
ToPositionType(signal.type) //
|
||||||
|
);
|
||||||
|
if (isOwn)
|
||||||
|
{
|
||||||
|
mData[i].Fill(signal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Do all Protections ...
|
// Do all Protections ...
|
||||||
void HandleProtection()
|
void HandleProtection()
|
||||||
@@ -5810,7 +5888,7 @@ protected:
|
|||||||
bool mSaveConditions; // Save SL Conditions
|
bool mSaveConditions; // Save SL Conditions
|
||||||
|
|
||||||
//
|
//
|
||||||
XSymbolSessionParser mSymbolSession; // Check Symbol Session
|
XSymbolSessionParser mSymbolSession; // Check Symbol Session
|
||||||
|
|
||||||
//
|
//
|
||||||
bool mAllowLong; // Allow Long/Buy Trade Type
|
bool mAllowLong; // Allow Long/Buy Trade Type
|
||||||
|
|||||||
@@ -49,9 +49,12 @@ input bool eaUseMaxAllowedTradesPerSymbol = true; /
|
|||||||
input string eaSymbols = "EURUSDb,GBPUSDb,USDJPYb,USDCHFb,XAUUSDb,DowJones30"; // Trading Symbols
|
input string eaSymbols = "EURUSDb,GBPUSDb,USDJPYb,USDCHFb,XAUUSDb,DowJones30"; // Trading Symbols
|
||||||
|
|
||||||
//
|
//
|
||||||
// Trades ...
|
// Risk Management ...
|
||||||
input group "Trades";
|
input group "Risk Management";
|
||||||
input double eaVolume = 0.3; // Static Volume
|
|
||||||
|
//
|
||||||
|
// Risk Management > Risk / Reward Calculation ...
|
||||||
|
input group "Risk/Reward";
|
||||||
input double eaR2R = 1.5; // Risk to Reward Ratio for Dynamic TP SL
|
input double eaR2R = 1.5; // Risk to Reward Ratio for Dynamic TP SL
|
||||||
input bool eaUseFixedTPSLPoints = true; // Use Fixed TP SL in Points
|
input bool eaUseFixedTPSLPoints = true; // Use Fixed TP SL in Points
|
||||||
input bool eaIgnoreTP = false; // Ignore TP
|
input bool eaIgnoreTP = false; // Ignore TP
|
||||||
@@ -60,8 +63,12 @@ input double eaTPPoint = 200; // Static TP Point
|
|||||||
input double eaSLPoint = 500; // Static SL Point
|
input double eaSLPoint = 500; // Static SL Point
|
||||||
|
|
||||||
//
|
//
|
||||||
// Risk Management ...
|
// Risk Management > Volume Calculation ...
|
||||||
input group "Risk Management";
|
input group "Volume";
|
||||||
|
input bool eaUseDynamicVolume = false; // Use Dynamic Volume
|
||||||
|
input double eaDynamicVolumeStep = 0.01; // Increase Volume Step
|
||||||
|
input double eaDynamicVolumeBalanceFactor = 200; // Balance Factor for Generate Dynamic Volume
|
||||||
|
input double eaVolume = 0.3; // Static Volume
|
||||||
|
|
||||||
//
|
//
|
||||||
// Risk Management > Trade Management ...
|
// Risk Management > Trade Management ...
|
||||||
@@ -646,6 +653,30 @@ void OnSignalRecieved(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prepare Signal Dynamic Volume
|
||||||
|
// if Provided ...
|
||||||
|
if (eaUseDynamicVolume &&
|
||||||
|
eaDynamicVolumeStep > 0 &&
|
||||||
|
eaDynamicVolumeBalanceFactor > 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double dVolume = eaTrader.GetDynamicVolume(
|
||||||
|
signal.symbol,
|
||||||
|
eaDynamicVolumeBalanceFactor,
|
||||||
|
eaDynamicVolumeStep //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (dVolume > 0)
|
||||||
|
{
|
||||||
|
signal.volume = dVolume;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
eaTradeHandler.UpdateSignal(signal);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Since Signal Filtering done based on
|
// Since Signal Filtering done based on
|
||||||
// Strategy and it's not related to Public
|
// Strategy and it's not related to Public
|
||||||
|
|||||||
Reference in New Issue
Block a user