66 lines
2.5 KiB
Markdown
66 lines
2.5 KiB
Markdown
|
|
[← MQLArticles](../README.md)
|
||
|
|
|
||
|
|
# PosMgmt
|
||
|
|
|
||
|
|
Open position management: breakeven, partial closes by volume, and partial closes conditioned on indicators.
|
||
|
|
|
||
|
|
## Main features
|
||
|
|
- Breakeven by fixed points, ATR or risk/reward ratio (`CBreakEven`, `CBreakEvenSimple`, `CBreakEvenAtr`, `CBreakEvenRR`).
|
||
|
|
- Partial closes by volume/TP percentage across multiple stages (`CPartials`).
|
||
|
|
- Conditional partial closes, triggered by a pluggable condition (e.g. RSI) instead of a fixed level (`CConditionalPartials`, `CConditionalPartialsFactory`) — see [ConditionalPartial](./ConditionalPartial) for the class hierarchy.
|
||
|
|
|
||
|
|
## Basic usage
|
||
|
|
|
||
|
|
### Breakeven
|
||
|
|
```mql5
|
||
|
|
//--- Atr
|
||
|
|
atr_ultra_optimized.SetVariables(_Period, _Symbol, 0, 14);
|
||
|
|
atr_ultra_optimized.SetInternalPointer();
|
||
|
|
|
||
|
|
//--- Configure the breakeven values so it can be used
|
||
|
|
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 closes
|
||
|
|
```mql5
|
||
|
|
g_partials.AddLogFlags(InpLogLevelPartials);
|
||
|
|
g_partials.Init(InpMagic, _Symbol, InpVolumePercentageToClose, InpTpPercentagesForPartials);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Conditional partial closes
|
||
|
|
```mql5
|
||
|
|
if(InpPartialsIsEnable)
|
||
|
|
{
|
||
|
|
// Atr creation
|
||
|
|
g_atr = new CAtr();
|
||
|
|
g_atr.Create(_Period, _Symbol, 14, true, true);
|
||
|
|
g_atr.SetAsSeries(true);
|
||
|
|
CAutoCleaner::AddPtr(g_atr); // auto-deleted on deinit
|
||
|
|
|
||
|
|
// Dynamic instance from the factory
|
||
|
|
g_partials = CConditionalPartialsFactory::Create(InpPartialsClassManagerType);
|
||
|
|
g_partials.AddLogFlags(InpPartialsLogLevel);
|
||
|
|
|
||
|
|
// RSI condition
|
||
|
|
CConditionalPartialsIndRsi* rsi_condition = new CConditionalPartialsIndRsi();
|
||
|
|
if(!rsi_condition.Init(InpPartialsRsiTimeframe, _Symbol, InpPartialsRsiPeriod, InpPartialsRsiOverBoughtLevel, InpPartialsRsiOverSoldLevel))
|
||
|
|
return INIT_PARAMETERS_INCORRECT;
|
||
|
|
|
||
|
|
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;
|
||
|
|
|
||
|
|
if(!g_partials.Init(config))
|
||
|
|
return INIT_PARAMETERS_INCORRECT;
|
||
|
|
else
|
||
|
|
CAutoCleaner::AddPtr(g_partials);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
> Only the most representative classes are shown here.
|