124 lines
4.7 KiB
MQL5
124 lines
4.7 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| ExpertMoney.mqh |
| |||
//| Copyright 2000-2025, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#include "ExpertBase.mqh"
| |||
//+------------------------------------------------------------------+
| |||
//| Class CExpertMoney. |
| |||
//| Purpose: Base class money managment. |
| |||
//| Derives from class CExpertBase. |
| |||
//+------------------------------------------------------------------+
| |||
class CExpertMoney : public CExpertBase
| |||
{
| |||
protected:
| |||
//--- input parameters
| |||
double m_percent;
| |||
| |||
public:
| |||
CExpertMoney(void);
| |||
~CExpertMoney(void);
| |||
//--- methods of setting adjustable parameters
| |||
void Percent(double percent) { m_percent=percent; }
| |||
//--- method of verification of settings
| |||
virtual bool ValidationSettings();
| |||
//---
| |||
virtual double CheckOpenLong(double price,double sl);
| |||
virtual double CheckOpenShort(double price,double sl);
| |||
virtual double CheckReverse(CPositionInfo *position,double sl);
| |||
virtual double CheckClose(CPositionInfo *position);
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Constructor |
| |||
//+------------------------------------------------------------------+
| |||
void CExpertMoney::CExpertMoney(void) : m_percent(10.0)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Destructor |
| |||
//+------------------------------------------------------------------+
| |||
void CExpertMoney::~CExpertMoney(void)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Validation settings protected data. |
| |||
//+------------------------------------------------------------------+
| |||
bool CExpertMoney::ValidationSettings()
| |||
{
| |||
if(!CExpertBase::ValidationSettings())
| |||
return(false);
| |||
//--- initial data checks
| |||
if(m_percent<0.0 || m_percent>100.0)
| |||
{
| |||
printf(__FUNCTION__+": percentage of risk should be in the range from 0 to 100 inclusive");
| |||
return(false);
| |||
}
| |||
//--- ok
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Getting lot size for open long position. |
| |||
//+------------------------------------------------------------------+
| |||
double CExpertMoney::CheckOpenLong(double price,double sl)
| |||
{
| |||
if(m_symbol==NULL)
| |||
return(0.0);
| |||
//---
| |||
double lot;
| |||
if(price==0.0)
| |||
lot=m_account.MaxLotCheck(m_symbol.Name(),ORDER_TYPE_BUY,m_symbol.Ask(),m_percent);
| |||
else
| |||
lot=m_account.MaxLotCheck(m_symbol.Name(),ORDER_TYPE_BUY,price,m_percent);
| |||
if(lot<m_symbol.LotsMin())
| |||
return(0.0);
| |||
//---
| |||
return(m_symbol.LotsMin());
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Getting lot size for open short position. |
| |||
//+------------------------------------------------------------------+
| |||
double CExpertMoney::CheckOpenShort(double price,double sl)
| |||
{
| |||
if(m_symbol==NULL)
| |||
return(0.0);
| |||
//---
| |||
double lot;
| |||
if(price==0.0)
| |||
lot=m_account.MaxLotCheck(m_symbol.Name(),ORDER_TYPE_SELL,m_symbol.Bid(),m_percent);
| |||
else
| |||
lot=m_account.MaxLotCheck(m_symbol.Name(),ORDER_TYPE_SELL,price,m_percent);
| |||
if(lot<m_symbol.LotsMin())
| |||
return(0.0);
| |||
//---
| |||
return(m_symbol.LotsMin());
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Getting lot size for reverse. |
| |||
//+------------------------------------------------------------------+
| |||
double CExpertMoney::CheckReverse(CPositionInfo *position,double sl)
| |||
{
| |||
double lots=0.0;
| |||
//---
| |||
if(position.PositionType()==POSITION_TYPE_BUY)
| |||
lots=CheckOpenShort(m_symbol.Bid(),sl);
| |||
if(position.PositionType()==POSITION_TYPE_SELL)
| |||
lots=CheckOpenLong(m_symbol.Ask(),sl);
| |||
//---
| |||
if(lots!=0.0) lots+=position.Volume();
| |||
//---
| |||
return(lots);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Getting lot size for close. |
| |||
//+------------------------------------------------------------------+
| |||
double CExpertMoney::CheckClose(CPositionInfo *position)
| |||
{
| |||
if(m_percent==0.0)
| |||
return(0.0);
| |||
//---
| |||
if(-position.Profit()>m_account.Balance()*m_percent/100.0)
| |||
return(position.Volume());
| |||
//---
| |||
return(0.0);
| |||
}
| |||
//+------------------------------------------------------------------+
|