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);
| |||
}
| |||
//+------------------------------------------------------------------+
|