204 lines
4.7 KiB
Markdown
204 lines
4.7 KiB
Markdown
# RiskManager Component Documentation
| |||
| |||
## Overview
| |||
The RiskManager is responsible for enforcing risk management rules, calculating position sizes, and protecting the trading account from excessive losses.
| |||
| |||
## Class Diagram
| |||
| |||
```mermaid
| |||
classDiagram
| |||
class CRiskManager {
| |||
+bool Initialize()
| |||
+void Deinitialize()
| |||
+double CalculateLotSize()
| |||
+bool CheckDailyLossLimit()
| |||
+bool CheckMaxOpenTrades()
| |||
+bool CheckMarginRequirements()
| |||
-double CalculatePositionRisk()
| |||
-void UpdateDailyStats()
| |||
-datetime m_lastCheckTime
| |||
-double m_dailyLossLimit
| |||
-int m_maxOpenTrades
| |||
-double m_riskPerTrade
| |||
}
| |||
```
| |||
| |||
## Public Methods
| |||
| |||
### Initialize
| |||
```cpp
| |||
bool Initialize()
| |||
```
| |||
Initializes the RiskManager with default values and loads configuration.
| |||
| |||
**Returns:**
| |||
- `true` if initialization was successful
| |||
- `false` if initialization failed
| |||
| |||
---
| |||
| |||
### Deinitialize
| |||
```cpp
| |||
void Deinitialize()
| |||
```
| |||
Cleans up resources and resets the RiskManager to its initial state.
| |||
| |||
---
| |||
| |||
### CalculateLotSize
| |||
```cpp
| |||
double CalculateLotSize(double stopLossPips, double riskPercent = 1.0)
| |||
```
| |||
Calculates the appropriate lot size based on account balance and risk parameters.
| |||
| |||
**Parameters:**
| |||
- `stopLossPips`: Stop loss distance in pips
| |||
- `riskPercent`: Percentage of account to risk (default: 1.0%)
| |||
| |||
**Returns:**
| |||
- Calculated lot size, or 0.0 if calculation fails
| |||
| |||
---
| |||
| |||
### CheckDailyLossLimit
| |||
```cpp
| |||
bool CheckDailyLossLimit()
| |||
```
| |||
Checks if the daily loss limit has been reached.
| |||
| |||
**Returns:**
| |||
- `true` if daily loss limit has not been reached
| |||
- `false` if daily loss limit has been reached
| |||
| |||
---
| |||
| |||
### CheckMaxOpenTrades
| |||
```cpp
| |||
bool CheckMaxOpenTrades()
| |||
```
| |||
Checks if the maximum number of open trades has been reached.
| |||
| |||
**Returns:**
| |||
- `true` if more trades can be opened
| |||
- `false` if maximum open trades limit has been reached
| |||
| |||
---
| |||
| |||
### CheckMarginRequirements
| |||
```cpp
| |||
bool CheckMarginRequirements(double lots, ENUM_ORDER_TYPE orderType)
| |||
```
| |||
Verifies if there is sufficient margin to open a new position.
| |||
| |||
**Parameters:**
| |||
- `lots`: Number of lots for the new position
| |||
- `orderType`: Type of order (BUY/SELL)
| |||
| |||
**Returns:**
| |||
- `true` if margin requirements are met
| |||
- `false` if there is insufficient margin
| |||
| |||
## Risk Management Rules
| |||
| |||
The RiskManager enforces the following rules:
| |||
| |||
1. **Position Sizing**:
| |||
- Based on account balance and risk percentage
| |||
- Considers stop loss distance
| |||
- Respects minimum/maximum lot sizes
| |||
| |||
2. **Daily Loss Limit**:
| |||
- Tracks daily P&L
| |||
- Prevents new trades if daily loss exceeds limit
| |||
- Resets at the start of each trading day
| |||
| |||
3. **Maximum Open Trades**:
| |||
- Limits the number of concurrent positions
| |||
- Prevents overexposure
| |||
| |||
4. **Margin Requirements**:
| |||
- Verifies sufficient margin before opening new positions
| |||
- Considers existing positions and orders
| |||
| |||
## Usage Example
| |||
| |||
```cpp
| |||
// Initialize the RiskManager
| |||
CRiskManager riskManager;
| |||
if(!riskManager.Initialize())
| |||
{
| |||
Print("Failed to initialize RiskManager!");
| |||
return;
| |||
}
| |||
| |||
// Check if we can open a new trade
| |||
if(!riskManager.CheckDailyLossLimit())
| |||
{
| |||
Print("Daily loss limit reached!");
| |||
return;
| |||
}
| |||
| |||
if(!riskManager.CheckMaxOpenTrades())
| |||
{
| |||
Print("Maximum open trades reached!");
| |||
return;
| |||
}
| |||
| |||
// Calculate position size
| |||
double stopLossPips = 20.0; // 20 pips stop loss
| |||
double lotSize = riskManager.CalculateLotSize(stopLossPips, 1.0);
| |||
if(lotSize <= 0)
| |||
{
| |||
Print("Failed to calculate lot size!");
| |||
return;
| |||
}
| |||
| |||
// Verify margin requirements
| |||
if(!riskManager.CheckMarginRequirements(lotSize, ORDER_TYPE_BUY))
| |||
{
| |||
Print("Insufficient margin!");
| |||
return;
| |||
}
| |||
| |||
// Proceed with trade execution
| |||
// ...
| |||
```
| |||
| |||
## Configuration
| |||
| |||
### Input Parameters
| |||
| |||
```cpp
| |||
// Risk parameters
| |||
input double InpRiskPerTrade = 1.0; // Risk per trade (% of balance)
| |||
input double InpMaxDailyLoss = 5.0; // Max daily loss (% of balance)
| |||
input int InpMaxOpenTrades = 3; // Maximum number of open trades
| |||
input double InpMinLotSize = 0.01; // Minimum lot size
| |||
input double InpMaxLotSize = 10.0; // Maximum lot size
| |||
```
| |||
| |||
## Best Practices
| |||
| |||
1. Always check risk parameters before opening new positions
| |||
2. Use appropriate stop loss levels to control position size
| |||
3. Monitor daily P&L to ensure compliance with risk limits
| |||
4. Adjust risk parameters according to account size and risk tolerance
| |||
| |||
## Troubleshooting
| |||
| |||
### Common Issues
| |||
| |||
1. **Insufficient Margin**:
| |||
- Reduce position size
| |||
- Close other positions
| |||
- Deposit more funds
| |||
| |||
2. **Lot Size Too Small**:
| |||
- Increase stop loss distance
| |||
- Increase risk percentage (if appropriate)
| |||
- Check minimum lot size with your broker
| |||
| |||
3. **Daily Loss Limit Reached**:
| |||
- Review trading strategy
| |||
- Adjust daily loss limit if too restrictive
| |||
- Wait for the next trading day
|