109 lines
4.2 KiB
MQL5
109 lines
4.2 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| MoneyFixedRisk.mqh |
|
|
//| Copyright 2000-2025, MetaQuotes Ltd. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#include <Expert\ExpertMoney.mqh>
|
|
// wizard description start
|
|
//+------------------------------------------------------------------+
|
|
//| Description of the class |
|
|
//| Title=Trading with fixed risk |
|
|
//| Type=Money |
|
|
//| Name=FixRisk |
|
|
//| Class=CMoneyFixedRisk |
|
|
//| Page= |
|
|
//| Parameter=Percent,double,10.0,Risk percentage |
|
|
//+------------------------------------------------------------------+
|
|
// wizard description end
|
|
//+------------------------------------------------------------------+
|
|
//| Class CMoneyFixedRisk. |
|
|
//| Purpose: Class of money management with fixed percent risk. |
|
|
//| Derives from class CExpertMoney. |
|
|
//+------------------------------------------------------------------+
|
|
class CMoneyFixedRisk : public CExpertMoney
|
|
{
|
|
public:
|
|
CMoneyFixedRisk(void);
|
|
~CMoneyFixedRisk(void);
|
|
//---
|
|
virtual double CheckOpenLong(double price,double sl);
|
|
virtual double CheckOpenShort(double price,double sl);
|
|
virtual double CheckClose(CPositionInfo *position) { return(0.0); }
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| Constructor |
|
|
//+------------------------------------------------------------------+
|
|
void CMoneyFixedRisk::CMoneyFixedRisk(void)
|
|
{
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Destructor |
|
|
//+------------------------------------------------------------------+
|
|
void CMoneyFixedRisk::~CMoneyFixedRisk(void)
|
|
{
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Getting lot size for open long position. |
|
|
//+------------------------------------------------------------------+
|
|
double CMoneyFixedRisk::CheckOpenLong(double price,double sl)
|
|
{
|
|
if(m_symbol==NULL)
|
|
return(0.0);
|
|
//--- select lot size
|
|
double lot;
|
|
double minvol=m_symbol.LotsMin();
|
|
if(sl==0.0)
|
|
lot=minvol;
|
|
else
|
|
{
|
|
double loss;
|
|
if(price==0.0)
|
|
loss=-m_account.OrderProfitCheck(m_symbol.Name(),ORDER_TYPE_BUY,1.0,m_symbol.Ask(),sl);
|
|
else
|
|
loss=-m_account.OrderProfitCheck(m_symbol.Name(),ORDER_TYPE_BUY,1.0,price,sl);
|
|
double stepvol=m_symbol.LotsStep();
|
|
lot=MathFloor(m_account.Balance()*m_percent/loss/100.0/stepvol)*stepvol;
|
|
}
|
|
//---
|
|
if(lot<minvol)
|
|
lot=minvol;
|
|
//---
|
|
double maxvol=m_symbol.LotsMax();
|
|
if(lot>maxvol)
|
|
lot=maxvol;
|
|
//--- return trading volume
|
|
return(lot);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Getting lot size for open short position. |
|
|
//+------------------------------------------------------------------+
|
|
double CMoneyFixedRisk::CheckOpenShort(double price,double sl)
|
|
{
|
|
if(m_symbol==NULL)
|
|
return(0.0);
|
|
//--- select lot size
|
|
double lot;
|
|
double minvol=m_symbol.LotsMin();
|
|
if(sl==0.0)
|
|
lot=minvol;
|
|
else
|
|
{
|
|
double loss;
|
|
if(price==0.0)
|
|
loss=-m_account.OrderProfitCheck(m_symbol.Name(),ORDER_TYPE_SELL,1.0,m_symbol.Bid(),sl);
|
|
else
|
|
loss=-m_account.OrderProfitCheck(m_symbol.Name(),ORDER_TYPE_SELL,1.0,price,sl);
|
|
double stepvol=m_symbol.LotsStep();
|
|
lot=MathFloor(m_account.Balance()*m_percent/loss/100.0/stepvol)*stepvol;
|
|
}
|
|
//---
|
|
if(lot<minvol)
|
|
lot=minvol;
|
|
//---
|
|
double maxvol=m_symbol.LotsMax();
|
|
if(lot>maxvol)
|
|
lot=maxvol;
|
|
//--- return trading volume
|
|
return(lot);
|
|
}
|
|
//+------------------------------------------------------------------+
|