228 righe
9 KiB
Markdown
228 righe
9 KiB
Markdown
|
|
# TestRefactor – Dokumentace EA
|
||
|
|
|
||
|
|
## Přehled
|
||
|
|
|
||
|
|
EA (Expert Advisor) pro MetaTrader 5 postavený v OOP stylu. Používá crossover rychlé a pomalé SMA + RSI pro generování signálů, s podporou režimu jedné pozice (Single) nebo Grid strategie. Trend je ověřován na H1 a dvou dodatečných timeframech (TF1, TF2).
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Inputy (parametry EA)
|
||
|
|
|
||
|
|
Všechny inputy jsou deklarovány v hlavním souboru `testRefactor2.mq5` a předávány do tříd přes `CContext`.
|
||
|
|
|
||
|
|
### Indikátory (SMA, RSI)
|
||
|
|
|
||
|
|
| Input | Typ | Výchozí | Popis |
|
||
|
|
|-------|-----|---------|------|
|
||
|
|
| `InpFastMaPeriod` | int | 5 | Perioda rychlé SMA – kratší MA pro detekci crossoveru |
|
||
|
|
| `InpSlowMaPeriod` | int | 15 | Perioda pomalé SMA – delší MA pro trend |
|
||
|
|
| `InpRsiPeriod` | int | 14 | Perioda RSI indikátoru |
|
||
|
|
| `InpRsiOverbought` | double | 70 | RSI horní hranice – signál BUY jen když RSI < tato hodnota |
|
||
|
|
| `InpRsiOversold` | double | 30 | RSI dolní hranice – signál SELL jen když RSI > tato hodnota |
|
||
|
|
| `InpSmaMinDistancePoints` | double | 0 | Min. vzdálenost SMA v bodech – signál jen když Fast-Slow >= tato hodnota (0 = vypnuto) |
|
||
|
|
|
||
|
|
### Trend (H1)
|
||
|
|
|
||
|
|
| Input | Typ | Výchozí | Popis |
|
||
|
|
|-------|-----|---------|------|
|
||
|
|
| `InpH1TrendMaPeriod` | int | 50 | Perioda SMA na H1 – trend: close > MA = uptrend, close < MA = downtrend (0 = vypnuto) |
|
||
|
|
|
||
|
|
### Ověření směru (TF1, TF2) – pro Grid
|
||
|
|
|
||
|
|
| Input | Typ | Výchozí | Popis |
|
||
|
|
|-------|-----|---------|------|
|
||
|
|
| `InpTimeframe1` | ENUM_TIMEFRAMES | PERIOD_H4 | První dodatečný timeframe pro filtrování otevření Grid pozic |
|
||
|
|
| `InpTimeframe1MaPeriod` | int | 20 | Perioda SMA na TF1 – BUY jen když close > MA, SELL jen když close < MA (0 = vypnuto) |
|
||
|
|
| `InpTimeframe2` | ENUM_TIMEFRAMES | PERIOD_D1 | Druhý dodatečný timeframe pro filtrování otevření Grid pozic |
|
||
|
|
| `InpTimeframe2MaPeriod` | int | 50 | Perioda SMA na TF2 – oba TF musí souhlasit se směrem (0 = vypnuto) |
|
||
|
|
|
||
|
|
### Obchodování
|
||
|
|
|
||
|
|
| Input | Typ | Výchozí | Popis |
|
||
|
|
|-------|-----|---------|------|
|
||
|
|
| `InpLotSize` | double | 0.1 | Velikost lotu pro otevření pozic |
|
||
|
|
| `InpTradeMode` | ENUM_TRADE_MODE | TRADE_SINGLE | Režim: Single (jedna pozice) nebo Grid (více úrovní) |
|
||
|
|
| `InpTrailingTriggerUSD` | double | 3.0 | Zisk v USD, od kterého se aktivuje trailing stop (Single režim) |
|
||
|
|
| `InpTrailingDistanceUSD` | double | 1.0 | Vzdálenost trailing stop od aktuálního zisku v USD |
|
||
|
|
|
||
|
|
### Grid
|
||
|
|
|
||
|
|
| Input | Typ | Výchozí | Popis |
|
||
|
|
|-------|-----|---------|------|
|
||
|
|
| `InpGridDistancePoints` | double | 50 | Vzdálenost mezi úrovněmi Gridu v bodech – nová pozice při pohybu ceny o tuto vzdálenost |
|
||
|
|
| `InpGridTargetProfitUSD` | double | 20.0 | Cílový zisk v USD – při dosažení se uzavře celý Grid |
|
||
|
|
| `InpGridMaxLevels` | int | 20 | Max. počet úrovní (pozic) v jednom směru |
|
||
|
|
|
||
|
|
### Ostatní
|
||
|
|
|
||
|
|
| Input | Typ | Výchozí | Popis |
|
||
|
|
|-------|-----|---------|------|
|
||
|
|
| `InpMaxEquityDrawdownPct` | double | 10.0 | Max. povolený drawdown equity v % – při překročení se uzavřou všechny pozice (jen Single) |
|
||
|
|
| `InpExitMode` | ENUM_EXIT_MODE | EXIT_BY_SL_TRAIL | Režim uzavření: Stop Loss & Trailing nebo Opposite Crossover (uzavření při protisměrném signálu) |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Třídy
|
||
|
|
|
||
|
|
### CContext
|
||
|
|
|
||
|
|
**Účel:** Centrální úložiště konfigurace z inputů. Všechny třídy dostávají parametry přes `SContext` z `CContext.Get()`.
|
||
|
|
|
||
|
|
**Metody:**
|
||
|
|
- `SetFromInputs(...)` – naplní kontext hodnotami z inputů
|
||
|
|
- `Get()` – vrátí kopii `SContext`
|
||
|
|
- `SetGridMaxLevels(int)` – nastaví max. počet úrovní Gridu
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CLogger
|
||
|
|
|
||
|
|
**Účel:** Centralizované logování s úrovněmi Error, Info, Debug.
|
||
|
|
|
||
|
|
**Metody:**
|
||
|
|
- `Error(string)` – chyby
|
||
|
|
- `Info(string)` – informace
|
||
|
|
- `Debug(string)` – ladění
|
||
|
|
- `SetMinLevel(ENUM_LOG_LEVEL)` – minimální úroveň pro výstup
|
||
|
|
- `SetPrefix(string)` – prefix zpráv
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CPosition
|
||
|
|
|
||
|
|
**Účel:** Reprezentace jedné otevřené pozice. Čte data z terminálu přes `PositionSelectByTicket()`.
|
||
|
|
|
||
|
|
**Metody:**
|
||
|
|
- `Set(ticket, symbol)` – nastaví ticket a symbol
|
||
|
|
- `GetTicket()`, `GetSymbol()` – identifikace
|
||
|
|
- `Select()` – vybere pozici v terminálu
|
||
|
|
- `GetType()` – BUY/SELL
|
||
|
|
- `GetOpenPrice()`, `GetVolume()`, `GetProfit()`, `GetSwap()`, `GetSL()`, `GetTP()`
|
||
|
|
- `IsBuy()`, `IsSell()` – pomocné predikáty
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CPositions
|
||
|
|
|
||
|
|
**Účel:** Kolekce otevřených pozic daného symbolu. Jediné místo, kde se volá `PositionsTotal()` / `PositionGetTicket()` pro daný symbol.
|
||
|
|
|
||
|
|
**Metody:**
|
||
|
|
- `Refresh()` – znovu načte pozice z terminálu
|
||
|
|
- `Count()`, `CountBuy()`, `CountSell()` – počty
|
||
|
|
- `GetMinOpenPriceBuy()`, `GetMaxOpenPriceSell()` – min/max ceny pro Grid
|
||
|
|
- `GetTotalProfit()` – součet profit + swap všech pozic
|
||
|
|
- `GetTickets(ulong &[])` – seznam ticketů
|
||
|
|
- `HasNoPositions()`, `HasBuy()`, `HasSell()` – predikáty
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CClosedPosition / CClosedPositions
|
||
|
|
|
||
|
|
**Účel:** Snapshot zavřené pozice a kolekce pro historii/statistiky. Připraveno pro budoucí rozšíření (ukládání při uzavření).
|
||
|
|
|
||
|
|
**CClosedPosition:** ticket, symbol, type, openPrice, closePrice, volume, profit, swap, openTime, closeTime
|
||
|
|
|
||
|
|
**CClosedPositions:** `Add()`, `Count()`, `At(index)`, `GetTotalProfit()`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CSignalEngine
|
||
|
|
|
||
|
|
**Účel:** Indikátory (SMA, RSI) a výpočet obchodních signálů. Drží handly, detekuje nový bar, vrací buy/sell signály s filtrem trendu.
|
||
|
|
|
||
|
|
**Indikátory:**
|
||
|
|
- Fast MA, Slow MA (aktuální timeframe)
|
||
|
|
- RSI (aktuální timeframe)
|
||
|
|
- H1 trend MA (volitelné)
|
||
|
|
- TF1 MA, TF2 MA (volitelné)
|
||
|
|
|
||
|
|
**Metody:**
|
||
|
|
- `Init()` / `Deinit()` – vytvoření a uvolnění handleů
|
||
|
|
- `IsNewBar()` – true při novém baru na aktuálním grafu
|
||
|
|
- `GetSignals()` – vrací `SSignalResult` (buySignal, sellSignal, volume, trendUp, smaDistancePoints)
|
||
|
|
- `GetH1Trend()` – trend na H1 (close > MA = uptrend)
|
||
|
|
- `GetTf1Trend()`, `GetTf2Trend()` – trend na TF1, TF2
|
||
|
|
- `IsBuyDirectionValid()` – true když TF1 i TF2 ukazují uptrend
|
||
|
|
- `IsSellDirectionValid()` – true když TF1 i TF2 ukazují downtrend
|
||
|
|
- `GetLastBarValues()` – hodnoty MA a RSI pro dashboard
|
||
|
|
|
||
|
|
**Logika signálů:**
|
||
|
|
- **BUY:** Fast MA crossover nad Slow MA + RSI < overbought + min. distance + H1 uptrend
|
||
|
|
- **SELL:** Fast MA crossover pod Slow MA + RSI > oversold + min. distance + H1 downtrend
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CEquityDrawdown
|
||
|
|
|
||
|
|
**Účel:** Sleduje vrchol equity. Při překročení max. drawdownu (např. 10 %) uzavře všechny pozice symbolu.
|
||
|
|
|
||
|
|
**Poznámka:** Aktivní jen v režimu TRADE_SINGLE. V Grid režimu se nepoužívá (Grid má vlastní logiku uzavření).
|
||
|
|
|
||
|
|
**Metody:**
|
||
|
|
- `CheckAndClose()` – voláno každý tick; při překročení limitu uzavře pozice
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CTrailingStop
|
||
|
|
|
||
|
|
**Účel:** Trailing stop pro režim jedné pozice. Posouvá SL za cenou při dosažení zisku.
|
||
|
|
|
||
|
|
**Podmínky:** Aktivní jen při `TRADE_SINGLE` a `EXIT_BY_SL_TRAIL`. V Grid režimu se nepoužívá.
|
||
|
|
|
||
|
|
**Logika:** Když profit >= `trailingTriggerUSD`, posune SL tak, aby zajištěný zisk byl `trailingTriggerUSD - trailingDistanceUSD`.
|
||
|
|
|
||
|
|
**Metody:**
|
||
|
|
- `Update()` – voláno každý tick; upraví SL u pozic splňujících podmínky
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CGrid
|
||
|
|
|
||
|
|
**Účel:** Logika Grid strategie – otevření první úrovně, přidání dalších úrovní podle distance, uzavření při cílovém zisku.
|
||
|
|
|
||
|
|
**Metody:**
|
||
|
|
- `CheckProfitTargetAndClose()` – když celkový zisk >= `gridTargetProfitUSD`, uzavře všechny pozice Gridu
|
||
|
|
- `OnNewBar(buySignal, sellSignal, volume, tfBuyValid, tfSellValid)` – na nový bar:
|
||
|
|
- Bez pozic: otevře první BUY nebo SELL podle signálu **a** TF1+TF2 (pokud jsou nastaveny)
|
||
|
|
- S BUY pozicemi: přidá další BUY, když cena klesla o `gridDistancePoints` a `canBuy` (signál + TF1+TF2 uptrend)
|
||
|
|
- S SELL pozicemi: přidá další SELL, když cena vzrostla o `gridDistancePoints` a `canSell` (signál + TF1+TF2 downtrend)
|
||
|
|
|
||
|
|
**TF1/TF2 filtr:** Grid otevírá pozice jen když směr souhlasí s oběma timeframy. BUY jen při uptrendu na TF1 i TF2, SELL jen při downtrendu.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CDashboard
|
||
|
|
|
||
|
|
**Účel:** Zobrazení informací na grafu přes `Comment()`.
|
||
|
|
|
||
|
|
**Zobrazuje:** slowMa, fastMa, RSI, SMA distance, H1 trend, TF1 trend, TF2 trend, stav Gridu (počet Buy/Sell).
|
||
|
|
|
||
|
|
**Metody:**
|
||
|
|
- `Update()` – voláno každý tick; sestaví a zobrazí text
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Tok OnTick()
|
||
|
|
|
||
|
|
1. `g_positions.Refresh()` – aktualizace seznamu pozic
|
||
|
|
2. `g_equityDD.CheckAndClose()` – kontrola drawdownu (Single)
|
||
|
|
3. `g_grid.CheckProfitTargetAndClose()` – uzavření Gridu při cílovém zisku
|
||
|
|
4. `g_trailing.Update()` – trailing stop (Single, SL_TRAIL)
|
||
|
|
5. **Na nový bar:**
|
||
|
|
- `g_signals.GetSignals()` – výpočet signálů
|
||
|
|
- Pokud `EXIT_BY_OPPOSITE_SIGNAL` + Single: uzavření protisměrných pozic
|
||
|
|
- Single: otevření BUY/SELL podle signálu
|
||
|
|
- Grid: `g_grid.OnNewBar(...)` s TF1/TF2 filtrem
|
||
|
|
6. `g_dashboard.Update()` – aktualizace dashboardu
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Enumerace
|
||
|
|
|
||
|
|
### ENUM_EXIT_MODE
|
||
|
|
- `EXIT_BY_SL_TRAIL` – uzavření přes Stop Loss a trailing stop
|
||
|
|
- `EXIT_BY_OPPOSITE_SIGNAL` – uzavření při protisměrném crossover signálu
|
||
|
|
|
||
|
|
### ENUM_TRADE_MODE
|
||
|
|
- `TRADE_SINGLE` – jedna pozice najednou
|
||
|
|
- `TRADE_GRID` – Grid strategie (více úrovní)
|