Hello Mr. Popov,
I would like to request a dynamic lot sizing feature (percentage of equity) be added to the auto-generated EA code.
I was able to add this to my Porfolio EA with the following MQL5 code. Feel free to adjust /change:
enum ENUM_MM_TYPE {
MM_FIXED, // Fixed Lots
MM_PERCENT // Risk Percent
};
input ENUM_MM_TYPE MM_Type = MM_FIXED; // Money Management Type
input double Risk_Percent = 1.0; // Risk Percentage (%)
static input double Entry_Amount = 0.01; // Entry lots (or fallback if SL is 0)//+------------------------------------------------------------------+
//| Calculate Dynamic Lot Size based on Risk % |
//+------------------------------------------------------------------+
double GetDynamicLots(int slPips)
{
// If Fixed mode is selected, or if the strategy has no Stop Loss (0), use fixed lots
if(MM_Type == MM_FIXED || slPips <= 0)
return Entry_Amount;
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
double riskAmount = equity * (Risk_Percent / 100.0);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
// Safety check to prevent division by zero
if(tickSize == 0 || tickValue == 0) return Entry_Amount;
// Calculate the monetary loss per 1.00 lot if Stop Loss is hit
// We use the global 'pip' variable already defined in your EA
double slPriceDistance = slPips * pip;
double lossPerLot = (slPriceDistance / tickSize) * tickValue;
if(lossPerLot <= 0) return Entry_Amount;
double calculatedLots = riskAmount / lossPerLot;
// Normalize lots to the broker's step (e.g., 0.01)
calculatedLots = MathFloor(calculatedLots / lotStep) * lotStep;
// Check Broker Limits
double minVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
if(calculatedLots < minVol) calculatedLots = minVol;
if(calculatedLots > maxVol) calculatedLots = maxVol;
return calculatedLots;
}Update the `OpenPosition` Function: change
const double posLots = Entry_Amount;...to this:
const double posLots = GetDynamicLots(signal.StopLossPips);Thank you