MQL5/3_MQL5_EA_Tools/03_Calculate_LotSize.mq5
2025-04-16 11:59:03 -04:00

75 lines
2.7 KiB
MQL5

//+------------------------------------------------------------------+
//| 3.Calculate_LotSize.mq5 |
//| Author: Santiago Cruz |
//| https://www.mql5.com/en/users/algo-trader/ |
//+------------------------------------------------------------------+
#property copyright "Santiago Cruz"
#property link "https://www.mql5.com/en/users/algo-trader/"
#property version "1.00"
#include <Trade/Trade.mqh>
CTrade trade;
input double RiskPercent = 2; //Risk on one tradfe as % of Capital
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
double sl = price - 400*_Point;
double tp = price + 400*_Point;
double lots = calcLots(price - sl);
if(PositionsTotal()<1)
{
trade.Buy(lots,_Symbol,price,sl,tp,"Money Management");
}
}
//+------------------------------------------------------------------+
//| Calculate LoteSize |
//+------------------------------------------------------------------+
double calcLots(double slPoints){
double risk = AccountInfoDouble(ACCOUNT_BALANCE) * RiskPercent / 100;
double ticksize = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
double tickvalue = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE);
double lotstep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
double MoneyPerLotstep = slPoints / ticksize * tickvalue * lotstep;
double lots = MathFloor(risk / MoneyPerLotstep) * lotstep;
double MinVolume = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
double MaxVolume = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
if(MaxVolume!=0) lots = MathMin(lots,MaxVolume);
if(MinVolume!=0) lots = MathMax(lots,MinVolume);
lots = NormalizeDouble(lots,2);
return lots;
}
//+------------------------------------------------------------------+