A comprehensive collection of MQL5 implementations for risk management and position management in algorithmic trading.
This repository contains the source code from articles published on MQL5.com by nique_372..
---
## Main features
### RM
#### Oco order
```cpp
COcoOrder oco;
void Function()
{
.
.
unsigned long ticket1 = trade.ResultOrder();
.
.
unsigned long ticket2 = trade.ResultOrder();
oco.AddOrders(ticket1,ticket2);
}
```
#### Risk management
```cpp
CRiskManagement rm;
// Note: "rm" requires that the lot, type, maximum profit and loss be reset, etc., before calling functions like CalculateSL, GetLote, etc.
// Check superated
if(g_loss_profit_manager.MaxLossIsSuperated())
{
risk.CloseAllPositions();
CanTrade = false;
}
// Calcule lot size
double entry_price = 1000.0;
double l = risk.GetLote(ORDER_TYPE_BUY, entry_price, 100, 0);
// Calcule SL
long sl = risk.GetSL(ORDER_TYPE_BUY, entry_price, 100, 0)
// And more (GetPositionsTotal, SetStopLoss, CloseAllOrders, GetPositions, etc..)
```
### Strategy
#### Basic configuration
```cpp
CAtrUltraOptimized* atr_ultra = new CAtrUltraOptimized();
atr_ultra.SetVariables(PERIOD_CURRENT, _Symbol, 0, 14);
atr_ultra.SetInternalPointer();
strategy.AddLogFlags(InpStrategyLogLevel); // Log Flags
strategy.SetAtrTP_SL(atr_ultra, INP_STRATEGY_ATR_MULTIPLIER_TP, INP_STRATEGY_ATR_MULTIPLIER_SL); // TP sl by atr
strategy.SetOperateMode(TR_BUY_SELL, INP_STRATEGY_TYPE_TPSL); // Operate mode
strategy.SetTP_SL(INP_STRATEGY_SL_POINT, INP_STRATEGY_TP_POINT); // TP SL by point
if(InpRmLoteType == Fijo)
strategy.FixedLotSize(InpRmLote); // Fixed lot size
```
#### Filters
```cpp
// Filter RSI
if(INP_FILTER_RSI_ENABLE)
{
CSFilterRsi* f = new CSFilterRsi();
strategy.AddFilter(f);
}
// Filter Stochastic
if(INP_FILTER_STOCH_ENABLE)
{
CSFilterStochastic* f = new CSFilterStochastic();
strategy.AddFilter(f);
}
// Filter Bollinger Bands
if(INP_FILTER_BANDS_ENABLE)
{
CSFilterBands* f = new CSFilterBands();
strategy.AddFilter(f);
}
// Codigo
g_strategy_filter_general_parser.AddLogFlags(InpFIlterLogLevel);
strategy.CodeCompra(StringFormat("#group oAnd (%s,%s,%s,%s,%s,%s,%s) == 0 oAnd ([%s] == 0 oOr [%s] == 2)",
CSFIlterAD_NAME, CSFilterSuperTrend_NAME, CSFilterFvg_NAME, CSFilterBands_NAME, CSFilterRsi_NAME, CSFilterStochastic_NAME, CSFilterLiqEstimed_NAME, CMediationsByZoneFilterName, CMediationsByZoneFilterName), 5);
strategy.CodeVenta(StringFormat("#group oAnd (%s,%s,%s,%s,%s,%s,%s) == 1 oAnd ([%s] == 1 oOr [%s] == 2)",
CSFIlterAD_NAME, CSFilterSuperTrend_NAME, CSFilterFvg_NAME, CSFilterBands_NAME, CSFilterRsi_NAME, CSFilterStochastic_NAME, CSFilterLiqEstimed_NAME, CMediationsByZoneFilterName, CMediationsByZoneFilterName), 5);
// Summary
strategy.PrintFilters();
```
### Position management
#### Breakeven
```cpp
//--- Atr
atr_ultra_optimized.SetVariables(_Period, _Symbol, 0, 14);
atr_ultra_optimized.SetInternalPointer();
//--- We set the breakeven values so its use is allowed
break_even.SetBeByAtr(InpBeAtrMultiplier, InpBeAtrMultiplierExtra, GetPointer(atr_ultra_optimized));
break_even.SetBeByFixedPoints(InpBeFixedPointsToPutBe, InpBeFixedPointsExtra);
break_even.SetBeByRR(InpBeRrDbl, InpBeTypeExtraRr, InpBeExtraPointsRrOrAtrMultiplier, GetPointer(atr_ultra_optimized));
break_even.SetInternalPointer(InpTypeBreakEven);
break_even.obj.AddLogFlags(InpLogLevelBe);
```
#### Partial closures
```cpp
g_partials.AddLogFlags(InpLogLevelPartials);
g_partials.Init(InpMagic, _Symbol, InpVolumenQueSeQuitaraDeLaPosicionEnPorcentaje, InpPartesDelTpDondeSeTomaraParciales);
```
#### Conditional partial closures
```cpp
if(InpPartialsIsEnable)
{
// Atr creation
g_atr = new CAtr();
g_atr.Create(_Period, _Symbol, 14, true, true);
g_atr.SetAsSeries(true);
CAutoCleaner::AddPtr(g_atr); // AƱadimos para que se auto elimine
// We assign to g_partilas the dynamic instance returned by CConditionalPartialsFactory::Create(...)
g_partials = CConditionalPartialsFactory::Create(InpPartialsClassManagerType); // Sera elimnado globalmente
// Initial log flags
g_partials.AddLogFlags(InpPartialsLogLevel);
// Create condition
CConditionalPartialsIndRsi* rsi_condition = new CConditionalPartialsIndRsi(); // True dado que sera eliminado por partials
// Rsi condition config
if(!rsi_condition.Init(InpPartialsRsiTimeframe, _Symbol, InpPartialsRsiPeriod, InpPartialsRsiOverBoughtLevel, InpPartialsRsiOverSoldLevel))
return INIT_PARAMETERS_INCORRECT;
// Condition config
ConditionalPartialConfig config;
config.condition = rsi_condition;
config.min_distance_to_close_pos = CreateDiffptr(MODE_DIFF_BY_ATR, _Symbol, g_atr, 0, InpPartialsMinDistanceInAtrMul);
config.str_percentage_volume_to_close = InpPartialsVolumeToClosePercentage;
config.magic_number = InpMagic;
// Init partials
if(!g_partials.Init(config))
return INIT_PARAMETERS_INCORRECT;
else
CAutoCleaner::AddPtr(g_partials); // AƱadimos al cleaner
if(InpPartialsClassManagerType == CONDITIONAL_PARTIAL_CLASS_TYPE_CONSTANT)
{
CConditionalPartialsConst* partial = (CConditionalPartialsConst*)g_partials;
partial.ForzeToClose(true);
}
}
```
### Utils
#### Fibbonaci
```cpp
CFibbo fibbo;
fibbo.Create(ChartID(), "Fibbo", 0, clrGreen, STYLE_SOLID, 1, "Fibbonaci");
fibbo.SetLevels("0.0,0.2,1.0,2.0", "clrRed,clrRed,clrRed,clrRed", STYLE_SOLID, 1, ',');
fibbo.Move(D'2025.01.01 10:00:00', D'2026.01.01 10:00:00', 1000.0, 1050.0);
double tp = fibbo.GetLevelPrice(2.0);
double sl = fibbo.GetLevelPrice(0.2);
```
#### GraphicObjects
```cpp
RectangleCreate(...);
EventCreate(...);
ArrowRightPriceCreate(..);
.
.
.
// +10 Functions
```
#### SetFile
```cpp
void OnStart()
{
//---
CSetFile sf;
sf.Init("BotSimple");
sf.AddParamLineNumber("InpMagic", 100, 100, 1, 999);
sf.AddParamLineReal("InpRisk", 1.0, 2, 0.1, 0.1, 10.0);
sf.AddParamLineBool("InpUseFilter", false);
sf.AddParamLineDatetime("InpStartDate", D'2024.01.01', D'2020.01.01', 86400, D'2025.12.31');
sf.AddParamLineColor("InpLineColor", clrRed);
sf.ModifyParamValueNumber("InpMagic", 999);
sf.ModifyParamValueRealNumber("InpRisk", 5.5, 2);
sf.ModifyParamValueBoolean("InpUseFilter", true);
sf.ModifyParamValueDatetime("InpStartDate", D'2025.06.01');
sf.ModifyParamValueColor("InpLineColor", clrBlue);
sf.ModifyParamOptDatetimeStart("InpStartDate", D'2023.01.01');
sf.ModifyParamOptDatetimeStep("InpStartDate", 3600);
sf.ModifyParamOptDatetimeStop("InpStartDate", D'2026.01.01');
sf.Imprimir();
}
```
> These are only 5-10% of the classes available in MQLArticles; only the most important classes in the library were represented.
---
## Requirements
See the requirements.txt file.
---
## Installation Methods
- Clone the git repository into shared projects via cmd.
- Contact me privately on MQL5 chats (user: nique_372) to be added as a collaborator with your MQL5 nickname (read-only access), which will make the repository automatically appear in your Shared Projects folder.
- Fork the repository.
---
## Repository Structure
| Folder | Description |
|---------|-------------|
| **Defines** | Markdown files containing optional defines to activate or increase logging verbosity for specific classes in the repository. |
| **Examples** | Basic examples that implement various libraries from the MQLArticles repository, such as risk management, position management, etc. |
| **Images** | Screenshots and visual assets from repository examples (breakeven manager, lot size calculator, order blocks indicator). |
| **IndicatorsCts** | Wrapper library for implementing technical indicators. |
| **Ob** | Order Blocks indicator implementation and example Expert Advisors from published articles (author: nique_372). |
| **PosMgmt** | Position management libraries including:
- Breakeven management
- Partial position closure
- Conditional partial closure with indicator-based conditions |
| **RM** | Complete Risk Management (RM) library modules. |
| **Utils** | Core utility library for EAs, indicators, and libraries.
| **Sets** | Preset configuration files (.set) used in articles published by nique_372. |
| **Strategy** | Strategy implementation framework for the MQLArticles ecosystem. |
---
## Examples
- Examples\\GUI\\BE\\Ea.mq5

- Examples\\GUI\\Risk_Management_Panel.mq5

- Ob\\Indicator\\OrderBlockIndPart2.mq5

---
## Implemented Article Series
### Risk Management
| Part | Main Topic | Article Link |
|-------|----------------|-------------------|
| **Part 1** | Risk management fundamentals | [[EN]](https://www.mql5.com/en/articles/16820) |
| **Part 2** | Lot size calculation | [[ES]](https://www.mql5.com/es/articles/16985) |
| **Part 3** | Base class construction | [[ES]](https://www.mql5.com/es/articles/17249) |
| **Part 4** | Completing key functions of the CRiskManagement class | [[ES]](https://www.mql5.com/es/articles/17508) |
| **Part 5** | Integrating risk management into an EA (Order Block) | [[ES]](https://www.mql5.com/es/articles/17640) |
> **Important Update**: The RiskManagement library has been completely renovated since the last publication (part 5).
### Position Management - Breakeven
| Part | Focus | Article Link |
|-------|---------|-------------------|
| **Part 1** | Base class and breakeven by fixed points | [[ES]](https://www.mql5.com/es/articles/17957) |
| **Part 2** | Breakeven by ATR and RRR | [[ES]](https://www.mql5.com/es/articles/18111) |
### Position Management - Partial Closes
| Focus | Article Link |
|-------|--------------------|
| Implementation of partial closes in MQL5 | [[ES]](https://www.mql5.com/es/articles/19682) |
### Position Management - Conditional partial closure
| Focus | Article Link |
|-------|--------------------|
| Implementation of the base class in MQL5 | [[ES]](https://www.mql5.com/es/articles/20048) |
### Order Block Indicator
| Part | Focus | Article Link |
|-------|---------|-------------------|
| **Part 1** | Initial implementation of Order Blocks in an indicator | [[EN]](https://www.mql5.com/en/articles/15899) |
| **Part 2** | Signal implementation in the Order Block indicator | [[EN]](https://www.mql5.com/en/articles/16268) |