Trading algorytmiczny — automatyzacja, backtesting i pułapki
Pierwszy EA, który napisałem, działał trzy tygodnie na live. Potem wyzerował 40% konta w 11 transakcjach. Zanim to nastąpiło, czułem się geniuszem. EA nie drukuje pieniędzy. EA drukuje twoje błędy — tylko szybciej i bez litości. Jeśli system nie ma edge'u (art. 8.2), automat egzekwuje go z pełną konsekwencją, bez ani jednego momentu zawahania, prosto do zera na rachunku. ESMA w komunikatach dotyczących interwencji produktowej CFD z 2018 r. wskazywała, że w analizowanym okresie i próbie dostawców CFD 74–89% rachunków detalicznych traciło pieniądze[1]. Bot nie zmienia tego rachunku. Przenosi tylko twoje błędy z ręki do kodu i potrafi je egzekwować szybciej, częściej i bez wahania.
- Automat nie łamie zasad. Problem w tym, że jeśli zasady są głupie, będzie ich przestrzegał do zera na rachunku. Trading algorytmiczny to programowanie, testowanie i ciągła konserwacja systemu. Jeśli nie rozumiesz logiki swojego EA, nie jesteś algo traderem — jesteś klientem, który kupił czarną skrzynkę.
- Backtest nie mówi, ile zarobisz. Mówi, które pomysły powinieneś wyrzucić, zanim zapłacisz rynkowi za lekcję. System z 300% ROI na backteście, który zakłada stały spread 0,5 pipsa i zero slippage'u, na żywo traci pieniądze. Spread, slippage, prowizja, latency i Last Look to zmienne, nie stałe.
- Twój EA umiera nie dlatego, że rynek stał się magicznie trudniejszy — umiera, bo dopasowałeś go do szumu z historii. Każdy nowy okres OOS brutalnie pokazuje, że system nauczył się historii, nie rynku. Degrees of freedom (liczba swobodnych parametrów) to wróg numer jeden algo tradera.
- Ranking EA to cmentarzysko, z którego chwilowo widać tylko te nagrobki, które jeszcze stoją. Duża część retailowych EA sprzedaje wygładzoną equity curve okupioną ukrytym ryzykiem ogona — martingale, grid, brak twardego SL, agresywny averaging. EA, które straciły 80% konta, znikają z rankingu, więc kupujący widzi tylko tych, którzy jeszcze nie eksplodowali.
- Twój EA nie handluje na Forex. Handluje na feedzie twojego brokera, w jego modelu routingu, w jego arkuszu kwotowań. Model A-Book/B-Book, LP stack, MetaTrader Bridge (PrimeXM/oneZero), Last Look po stronie LP — to wszystko zmienne systemowe, nie tło. Twoja praca: mierzyć (slippage, rejecty, czas wykonania) i porównywać między venue, nie zakładać manipulacji.
1. Czym jest trading algorytmiczny
Bot nie zrobi z ciebie rentownego tradera. Jeśli twój system nie ma edge'u, algorytm wyczyści depozyt szybciej, niż zdążysz zrozumieć, który warunek w kodzie był błędny. Zdejmuje emocje z procesu i zostawia czystą statystykę: koszty per trade × liczba trade'ów = dystans do margin call i stop-out. Spectrum jest szerokie:
- Prosty EA (Expert Advisor) — skrypt na MT4/MT5, który wykonuje regułę typu „kup, gdy MA(20) przetnie MA(50) w górę, SL 30 pip, TP 60 pip". To nie jest strategia. To if/then z podpiętym rachunkiem.
- System systematyczny — zdefiniowane reguły wejścia, wyjścia, sizingu, filtrów reżimu — ale egzekucja ręczna lub półautomatyczna.
- Pełna automatyzacja — system handluje samodzielnie 24/5. Wymaga infrastruktury (VPS, monitoring), ale eliminuje emocje z egzekucji.
- HFT (High-Frequency Trading) — tysiące transakcji dziennie, co-location bezpośrednio przy matching engine giełdy, latencja w mikrosekundach, nie milisekundach. W HFT znaczenie mają nawet różnice długości kabli i trasy sygnału liczone w mikrosekundach. VPS w Amsterdamie próbujący handlować przez matching engine w New Jersey to zupełnie inna liga opóźnień — dziesiątki milisekund zamiast mikrosekund. Nieosiągalne dla detalisty: wymaga milionów USD na infrastrukturę, fizycznej obecności w data center giełdy i własnego stosu sieciowego[6].
Czym trading algorytmiczny NIE jest: ściągnięciem EA z forum, włączeniem go na demo i czekaniem na milion. Jeśli nie rozumiesz jednocześnie logiki strategii i zachowania kodu w egzekucji, jesteś zależny od kogoś innego. To wystarczy, żeby stracić kontrolę nad ryzykiem.
Kupiłeś EA za stówę z MQL5 Marketu z idealnie gładką krzywą kapitału? Gratulacje. Właśnie zasponsorowałeś kogoś, kto zaszył w kodzie asymetrycznego martingale'a i modli się, żeby rynek nie złapał mocnego trendu do końca tygodnia. Pierwsze tygodnie na demo wyglądają dobrze; na live — seria strat, EA otwiera 12 pozycji na skorelowanych parach, konto traci 60%. Kupujący nie wiedział, że EA podwajał pozycje po stracie — bo nie umiał przeczytać kodu. Więcej o tym, jak weryfikować EA: sekcja 9.
2. Narzędzia — MQL, Python, cTrader, API
Wybór narzędzia zależy od tego, co chcesz zrobić, ile umiesz programować i u jakiego brokera handlujesz.
| Narzędzie | Język | Backtesting | Live trading | Największe ryzyko błędnej implementacji |
|---|---|---|---|---|
| MQL4/MQL5 | C-podobny | Wbudowany (Strategy Tester) | Bezpośrednio na MT4/MT5 | Mylone SYMBOL_TRADE_TICK_VALUE (tick ≠ pip), pułapki 3/5-digit pricing, błędne zarządzanie magic number i zleceniami pending |
| Python | Python | Backtrader, Zipline, vectorbt | Przez API brokera (OANDA, IB, cTrader) | Look-ahead bias przy wektoryzacji, lookback windows używające przyszłych danych, brak modelowania spreadu/komisji w domyślnych szablonach |
| cTrader Automate | C# | Wbudowany | Bezpośrednio na cTrader | Mniejszy ekosystem przykładów = łatwo skopiować błędny wzorzec; subtelne różnice modelu egzekucji vs MT5 |
| Pine Script | Pine Script | Wbudowany (TradingView) | Ograniczony (alerty → webhook) | Repaint indicators (wartości wsteczne się zmieniają), różnica między barstate.isconfirmed a tick-by-tick, brak realnej egzekucji do walidacji kosztów |
Jeśli handlujesz u brokera MT4-only i jesteś detalistą, MQL4 jest wyborem z przymusu, nie z wyboru — broker narzuca platformę. MQL5 ma lepszy backtester i architekturę. Python daje narzędzia statystyczne (walk-forward, Monte Carlo), których w MQL nie dostaniesz bez bólu. Wielu algo traderów używa obu: Python do research i walidacji, MQL do egzekucji. MQL4 i MQL5 to różne języki — EA z MT4 nie działa na MT5 bez przepisania. Wybór brokera determinuje dostępne narzędzia: zanim napiszesz pierwszą linijkę, upewnij się, że twój broker oferuje potrzebny API (MQL/MT4-MT5, FIX, REST), jawną politykę wobec EA i scalperów oraz typ konta (ECN/raw vs standard) pasujący do stylu strategii — bo typ konta wpływa na model egzekucji i dostępność API.
3. Backtesting — fundament i największa pułapka
Backtesting to symulacja systemu na danych historycznych. Jest fundamentem algo tradingu — bez niego nie wiesz, czy twój pomysł ma szansę działać. Ale backtest nie mówi, ile zarobisz. Mówi, które pomysły powinieneś wyrzucić, zanim zapłacisz rynkowi za lekcję. Większość detalistów używa go odwrotnie: szuka potwierdzenia, że ich pomysł działa.
Co backtest powinien modelować
- Spread zmienny, nie stały — stały spread 0,5 pipsa na EUR/USD to fikcja. Realny spread zmienia się z godziny na godzinę, rozszerza się przy danych. Backtest z domyślnym spreadem MT4 zawyża wyniki.
- Slippage — na żywym rynku fill bywa gorszy niż cena zlecenia. Backtest bez modelowania slippage'u (nawet 0,5–1 pip na trade) zawyża expectancy.
- Prowizja — na rachunku ECN: 3–7 USD per round-turn lot. Na rachunku z markup — w spreadzie. Backtest musi to uwzględniać.
- Dane tickowe vs OHLC — backtest na danych OHLC pomija ruchy wewnątrz świec. Strategy Tester w MT5 oferuje tryb „Every tick based on real ticks" — używaj go[8]. Ale uwaga: „real ticks" to lepsza symulacja, nie prawdziwa egzekucja. Nie odtwarza kolejek, dostępności płynności ani jakości filli.
Czego backtest nie odtworzy nawet na dobrych tickach
- Rejecty i partial fills — na żywym rynku LP może odrzucić twoje zlecenie (Last Look) lub zrealizować je częściowo. Backtest zakłada 100% fill rate po cenie zlecenia.
- Feed vs executable price — cena widoczna na wykresie nie musi być ceną, po której dostaniesz fill. W newsach widzisz tick, którego nie dało się realnie kupić.
- Slippage asymetryczny — na stopach slippage jest gorszy niż na limitach. Backtest tego nie modeluje, chyba że programujesz to ręcznie.
- Rollover i spread nocny — między 23:00 a 00:00 czasu serwera spready na crossach (np. GBP/NZD) mogą skoczyć z 3 do 40 pipsów. EA bez filtra blokującego handel w tej godzinie zostanie zmasakrowany przez fałszywe wycięcia SL.
- Broker changing LP stack — twój broker może zmienić dostawcę płynności w dowolnym momencie. Dane historyczne nie odzwierciedlają przyszłych warunków egzekucji.
- Mid-price bias — strategia testowana na mid-price (średnia bid/ask) może wyglądać lepiej niż na realnym bid/ask, szczególnie przy ciasnych targetach i krótkim horyzoncie. Jeśli TP wynosi 5 pipsów, a spread to 1,2 pipsa — backtest na mid zawyża expectancy o ~0,6 pipsa na stronę.
Nie wiesz, w jakim modelu broker obsługuje twoje flow i jak to wpływa na egzekucję? RTS 28 nie jest magicznym rentgenem twojego konta — to raport top venues/LP i polityki wykonania, który formalnie funkcjonował pod MiFID II w UE i UK. Status raportowania zmienia się: w UK FCA decyzją PS21/20 zniosła obowiązek zewnętrznej publikacji RTS 27 i RTS 28 z dniem 1 grudnia 2021 r., ale firmy nadal podlegają obowiązkowi Best Execution pod COBS 11.2A — wewnętrznie muszą prowadzić analizę jakości wykonania. W UE raporty były zawieszane w ramach „MiFID II quick fix". Praktyczne tłumaczenie dla detalisty: formalnie nikt nie ma obowiązku ujawnienia ci raportu publicznego, ale możesz zwrócić się do compliance brokera o dane z jego wewnętrznego Best Execution review — taka analiza istnieje, nawet jeśli nie jest publikowana. Niezależnie od tego, realny dowód jakości egzekucji daje dopiero twój własny log: requested price, fill price, timestamp wysłania i wykonania, spread at fill, reject reason. Porównaj to z 200 transakcjami z konta live (nie demo) — to jest twój audyt brokera, nie marketingowa broszura.
Ważna uwaga o rynku: detalista na MT4/MT5 zwykle nie testuje i nie handluje centralnego rynku spot FX. Testuje i handluje feed oraz warunki konkretnego brokera CFD/OTC. Dane historyczne, spready, jakość filli, dostępność płynności — wszystko jest specyficzne dla twojego brokera. Backtest na danych brokera A nie gwarantuje wyników u brokera B.
Zanim przejdziesz do wyników backtesta, zweryfikuj dane wejściowe — szczegółowa checklist jakości danych w sekcji 8 pokazuje, co sprawdzić: źródło, strefę czasową, jakość ticków, luki i zgodność broker test/live.
Backtest vs live — dlaczego wyniki się różnią
| Parametr | Backtest | Live |
|---|---|---|
| Spread | Stały lub historyczny średni | Zmienny, rozszerzony przy danych |
| Slippage | Zwykle 0 (domyślnie) | 0,5–15+ pip zależnie od warunków |
| Fill | Natychmiastowy, po cenie zlecenia | Opóźniony, z Last Look, partial fills |
| Latencja | 0 ms | 20–500 ms (VPS → broker → LP) |
| Requotes | Brak | Możliwe (szczególnie B-Book) |
| Dane | Czyste, bez luk | Luki, spike'y, feed disconnects |
| Interwencja tradera | Brak | Trader zmienia SL, dodaje filtry, wyłącza system w drawdownie |
Różnica między backtest a live nie jest marginalna. Jest strukturalna — i właśnie ta różnica zbiera haracze. System z expectancy +8 pip na backteście, po uwzględnieniu realnych kosztów (spread zmienny +2 pip, slippage +1,5 pip, prowizja +0,7 pip = 4,2 pip dodatkowego kosztu per trade) ma realną expectancy +3,8 pip. Do przeliczenia kosztów na wartość pieniężną użyj kalkulatora wartości pipsa. Jeśli latencja dodaje kolejne 1–2 pip — zostajesz z +1,8–2,8 pip[2].
4. Overfitting — wróg numer jeden
Twój EA umiera nie dlatego, że rynek stał się magicznie trudniejszy. Umiera dlatego, że dopasowałeś go do szumu z historii — każdy nowy okres OOS brutalnie pokazuje, że system nauczył się historii, nie rynku. Im więcej parametrów optymalizujesz, tym lepiej system pasuje do danych treningowych — i tym gorzej radzi sobie na nowych[3].
Jak wygląda overfitting w praktyce
- Masz pomysł: „breakout z konsolidacji londyńskiej, gdy wolumen tickowy w 30-minutowym oknie pre-breakout przekracza X-krotność średniej, a zakres konsolidacji jest mniejszy od Y-krotności ATR(14)".
- Testujesz wstępnie X = 1,5; Y = 0,8 — wynik OK, expectancy +3 pip per trade na EUR/USD.
- Optymalizujesz: skanujesz wszystkie kombinacje X ∈ {1,2; 1,3; ... 2,5} × Y ∈ {0,5; 0,55; ... 1,2} × długość okna (15, 30, 45, 60 min) × godzina startu konsolidacji (8:00–10:00 co 15 min). Najlepsza kombinacja: X = 1,73; Y = 0,67; okno 45 min; start 8:30 — expectancy +11 pip.
- Dodajesz filtr trendu HTF (cena nad/pod EMA200 D1). Optymalizujesz EMA200 ↔ EMA180/220. Expectancy: +18 pip.
- Dodajesz filtr godzinowy (handel tylko w czterech konkretnych godzinach). Expectancy: +24 pip.
- Dodajesz filtr dnia tygodnia (wyrzucasz piątki i poniedziałki). Expectancy: +31 pip.
Liczba przetestowanych kombinacji. Zanim klikniesz „best result", policz, ile wariantów rzeczywiście porównałeś. W powyższym przykładzie: 14 wartości X × 15 wartości Y × 4 okna × 9 godzin startu × 5 wariantów EMA × 24 kombinacje godzin handlu × 25 kombinacji dni tygodnia ≈ ~9 mln testów. Przy progu istotności 5% przypadkowo „statystycznie istotnych" wyników jest około 450 tysięcy. Twój „najlepszy" zestaw parametrów jest jednym z setek tysięcy losowych zwycięzców szumu, nie sygnałem rynku.
Na backteście wygląda idealnie. Problem: 6+ parametrów zoptymalizowanych na tych samych danych. System nie odkrył wzorca — nauczył się historii. Bailey i López de Prado wykazali, że przy typowej liczbie prób optymalizacyjnych (1000+) prawdopodobieństwo znalezienia „zyskownego" systemu przez przypadek jest bardzo wysokie — nawet na losowych danych[4].
Sygnały ostrzegawcze overfittingu
- System działa tylko na jednej parze, jednym interwale i jednym okresie.
- Mała zmiana parametru (np. MA z 17 na 19) drastycznie pogarsza wynik — „wyspy" rentowności.
- Wynik out-of-sample jest >50% gorszy niż in-sample.
- System ma dużo parametrów (jako regułę roboczą: powyżej 5–6 — ale to heurystyka, nie prawo fizyki).
- Equity curve na backteście jest „za gładka" — brak drawdownów to czerwona flaga.
5. Walk-forward analysis i Monte Carlo
Jeśli backtest to pytanie „czy system działał?", to walk-forward analysis (WFA) to pytanie „czy system działał na danych, których nie widział podczas optymalizacji?"[5].
Procedura walk-forward
- Podziel dane na okna — np. 12 miesięcy in-sample (IS), 3 miesiące out-of-sample (OOS).
- Optymalizuj na IS — znajdź najlepsze parametry.
- Testuj na OOS — uruchom system z tymi parametrami na danych, których nie widział.
- Przesuń okno — następne IS: miesiące 4–15, OOS: 16–18. Powtórz.
- Agreguj wyniki OOS — połącz wszystkie okresy OOS. To jest twój realny wynik.
Walk-forward efficiency (WFE) = (zysk OOS / zysk IS) × 100%. WFE 70% nie daje ci gwarancji niczego. Daje ci mniejsze prawdopodobieństwo, że kupiłeś krzywą dopasowaną do historii — to nie to samo co edge. WFE odsiewa część śmieci, ale nie zamienia testu historycznego w gwarancję przyszłych wyników. Widziałem systemy z WFE 70%, które na live robiły –15% przez 6 miesięcy — bo walk-forward był przeprowadzony na jednym instrumencie w jednym reżimie rynku. WFE < 30% — prawdopodobnie overfitowany. WFE < 0% — system nie działa poza danymi treningowymi.
Anchored WFA vs rolling WFA
Rolling WFA (opisany wyżej) przesuwa okno: IS to zawsze ostatnie N miesięcy. Anchored WFA trzyma punkt startowy stały i rozszerza okno IS z każdym krokiem. Odpowiada na inne pytanie: „czy system jest stabilny, gdy widzi więcej danych?"
Jeśli rolling WFA daje WFE 60%, ale anchored WFA daje WFE 20% — system uczył się z przeszłości, nie adaptował do przyszłości. Parametry „pływały" z oknem zamiast stabilizować się. Ta różnica jest kluczowa: system z dobrym rolling WFE i słabym anchored WFE jest prawdopodobnie overfitowany do lokalnych reżimów. Oba testy powinny dawać zbliżone wyniki, zanim uznasz system za wart wdrożenia.
Monte Carlo — stress test expectancy
Monte Carlo to symulacja: bierzesz historyczne wyniki i losowo zmieniasz kolejność transakcji tysiące razy. Z 10 000 permutacji dostajesz rozkład: jaki jest najgorszy drawdown w 95% przypadków? Jaka jest minimalna expectancy?
Przykład: system ma 200 transakcji z WR 54%, średni zysk 18 pip, średnia strata –12 pip. Expectancy = 0,54 × 18 – 0,46 × 12 = +4,2 pip/trade. Po 10 000 permutacji Monte Carlo: w 95% scenariuszy max DD nie przekracza 22% konta, a expectancy nie spada poniżej +1,8 pip/trade. Jeśli na live DD zbliża się do 22% — system jest w strefie zagrożenia, ale jeszcze w zakresie. Jeśli przekroczył — degradacja jest prawdopodobna.
Matematyka Monte Carlo jest prosta do wdrożenia w Pythonie (biblioteka numpy, 15–20 linii kodu) lub Excelu (makro z losowaniem). Szczegóły metody: art. 8.2 — matematyka przewagi rynkowej.
Permutacja transakcji vs bootstrap z replacement — dwie metody, dwa różne pytania. Większość tutoriali algo upraszcza Monte Carlo do „pomieszaj kolejność trade'ów" — to jest permutacja bez powtórzeń. Statystyka: tasujesz oryginalne 200 transakcji w nowej kolejności, każda występuje raz, suma wyników jest identyczna. Pytanie, na które odpowiada: „jak źle mogłaby wyglądać equity curve, gdyby seria strat trafiła w innym momencie?". Limit metody: nie odpowiada na pytanie, czy próbka 200 transakcji jest reprezentatywna dla przyszłości — bo zakłada, że cała populacja przyszłych wyników to dokładnie te 200.
Bootstrap z replacement (losowanie ze zwracaniem) jest mocniejszą procedurą: w każdej z 10 000 iteracji losujesz 200 transakcji z powtórzeniami z oryginalnej puli. Niektóre transakcje pojawią się 3–4 razy, niektóre wcale. Suma wyników jest różna w każdej iteracji — to symuluje niepewność próbki, nie tylko niepewność kolejności. Pytanie, na które odpowiada: „jaki jest rozkład expectancy i DD, gdyby moja historia była tylko jedną z możliwych realizacji tego samego procesu losowego?". Wnioski są zwykle ostrzejsze niż z prostej permutacji: 95. percentyl DD bywa o 30–60% głębszy. Dla systemów detalicznych zalecam bootstrap — daje uczciwszy obraz tail risk niż samo tasowanie kolejności.
Matryca walidacyjna — kiedy wyrzucić, kiedy testować dalej
Po przejściu przez backtest, walk-forward (rolling i anchored) i Monte Carlo zwykle nie masz jednoznacznej odpowiedzi „działa / nie działa". Masz kombinację metryk, która klasyfikuje system:
| IS expectancy | Rolling WFE | Anchored WFE | MC bootstrap (95. perc. DD) | Werdykt |
|---|---|---|---|---|
| > 0 | > 50% | > 40% | akceptowalny | Test live na mikrolocie |
| > 0 | > 50% | < 30% | — | Overfitting do lokalnych reżimów — wróć do redukcji parametrów |
| > 0 | 30–50% | — | — | Marginalny — testuj robustness przed live |
| > 0 | < 30% | — | — | Wyrzuć do śmieci — overfitting |
| > 0 | — | — | DD > 1,5× max DD z backtest | Tail risk za duży — zmniejsz sizing albo wyrzuć |
| ≤ 0 | — | — | — | Wyrzuć — system nie ma edge'u nawet w teście |
Macierz nie jest definitywna — jest punktem startowym. Ale eliminuje 80% pomysłów, które trader inaczej testowałby przez kolejne 3 miesiące „po cichu w tle". To jest cel walidacji: szybciej odrzucać, nie dłużej testować.
6. Od backtesta do live — paper trading i infrastruktura
Po backteście i WFA nadal nie wiesz, jak system zachowa się na feedzie brokera, z realnym routingiem i realnymi błędami wykonania. Dlatego najpierw forward na demo, potem mikrolot na live.
Paper trading — test techniczny, nie prognoza
Demo to tor wyścigowy bez ruchu ulicznego. System jedzie. Ale nie ma kolizji, nie ma korków, nie ma karetki wyjeżdżającej z bocznej ulicy. Wyniki z demo mówią ci tylko: kod się kompiluje. Feed może wyglądać podobnie do live, czasem nawet ma zmienne spready, ale mechanika wykonania nie jest taka sama: brak realnego LP-risk, brak tych samych odrzutów, partial fills i kolejek płynności, bez człowieka ani LP, który musi wziąć drugą stronę twojego zlecenia. Traktuj demo jako test, czy kod działa technicznie (otwiera, zamyka, zarządza pozycjami). Minimum: 50–100 transakcji. Wyniki z demo nie prognozują wyników live.
Infrastruktura
- VPS — system musi działać 24/5 bez przerw. VPS blisko serwera brokera: latencja 1–10 ms zamiast 50–200 ms z domu. Koszt: 15–50 USD/miesiąc.
- Monitoring — alert SMS/email/Telegram, gdy system padnie, drawdown przekroczy próg lub pozycja zawiśnie. Bez monitoringu dowiesz się o awarii po powrocie z pracy.
- Kill switch — automatyczne zamknięcie wszystkich pozycji, gdy dzienny DD przekroczy próg. Fail-safe na disconnect, max pozycji jednocześnie, max DD.
- Execution mode — Instant, Market, Exchange? Wpływa na requotes i slippage.
- Max order rate — ile zleceń na sekundę toleruje serwer? Scalper wysyłający 5 zleceń/s może być blokowany.
- Stop level / freeze level — minimalna odległość SL/TP od ceny. Jeśli stop level = 10 pipsów, a twój system stawia SL na 8 — zlecenie nie wejdzie. Różni się między brokerami i parami.
- Swap table — porównaj swapy long/short na parach, które handlujesz. Różnice między brokerami bywają 2–3×.
- VPS proximity — czy broker oferuje darmowy VPS lub hosting blisko serwera?
- API availability — FIX, REST, WebSocket? Dla Pythona i zaawansowanej automatyzacji MT4/MT5 nie wystarczy.
Sizing startowy i checklist forward/live
Pierwszy miesiąc na live: minimalne loty. Cel nie jest zarabianie — jest walidacja. Jeśli po 30–50 transakcjach wyniki odbiegają znacząco od backtesta — wróć do diagnostyki. Checklist metryki do śledzenia:
- Średni spread per godzina/sesja — czy broker daje to, co reklamuje, o 3:00 w nocy?
- Slippage per typ zlecenia — stop vs limit. Czy asymetria istnieje?
- Odsetek rejectów — ile zleceń broker odrzucił? Na demo: zero. Na live: bywa kilka procent.
- Odsetek filli gorszych niż X — ile razy fill był gorszy niż 2 pipsy od ceny zlecenia?
- Expectancy: test vs forward vs live — trzy liczby. Jeśli live jest poniżej 50% backtesta — coś jest nie tak z egzekucją.
- Latencja z VPS do serwera brokera — pinguj regularnie. Jeśli rośnie — broker mógł zmienić infrastrukturę.
- Średni swap per trade i per para — swapy zmieniają się w czasie (zależą od stóp procentowych i polityki brokera). Monitoruj koszt przetrzymania pozycji: średni swap per trade, różnicę swapów long vs short na tej samej parze, zmiany swap rate w ujęciu miesięcznym. Jeśli swap rośnie — zysk systemu overnight maleje bez zmiany logiki.
Sizing z uwzględnieniem slippage — pseudokod
Artykuł mówi „modeluj slippage" — ale gdzie go wpisać? Poniższy przykład jest uproszczeniem poglądowym, nie gotowcem produkcyjnym. W praktyce przeliczenie lota musi uwzględniać specyfikę symbolu, liczbę miejsc po przecinku (3/5-digit pricing), wielkość ticka i walutę rachunku. Logika jest prosta — szczegóły implementacji nie:
// Schemat poglądowy — sizing z uwzględnieniem slippage i prowizji
double slippage_pips = 1.5; // empiryczny średni slippage [pipsy]
double commission_pips = 0.7; // prowizja przeliczona na pipsy
double nominal_SL = 25.0; // nominalny SL w pipsach
double adjusted_SL_pips = nominal_SL + slippage_pips + commission_pips;
// adjusted_SL_pips = 25 + 1.5 + 0.7 = 27.2 pipsa
double risk_amount = AccountInfoDouble(ACCOUNT_EQUITY) * 0.01; // 1% konta
// Wartość 1 pipsa dla 1 lota (zależy od symbolu i waluty rachunku)
// Zweryfikuj ręcznie dla swojego instrumentu!
double pip_value_per_lot = /* np. ~10 USD dla EUR/USD przy koncie USD */;
double lot_size = risk_amount / (adjusted_SL_pips * pip_value_per_lot);
Bez korekty o slippage i prowizję: ryzyko per trade wynosi 1% × (27,2/25,0) = 1,09% konta zamiast planowanego 1%. Na 200 transakcjach ta różnica kumuluje się. Uwaga: SYMBOL_TRADE_TICK_VALUE w MQL5 zwraca wartość jednego ticka (nie pipsa) i bywa zdradliwe dla instrumentów z niestandardową liczbą miejsc po przecinku lub dla par denominowanych w walutach innych niż waluta rachunku. Ręcznie zwaliduj logikę zarządzania wielkością pozycji w swoim kodzie, używając naszego kalkulatora wartości lota i pipsa.
Minimalny log egzekucji EA — bez tych pól nie masz danych do TCA
Backtest pokazuje krzywą equity. Live pokazuje wynik na rachunku. Pomiędzy nimi jest log egzekucji — i to on jest twoim jedynym źródłem prawdy o tym, jak broker realnie obsługuje twój system. Minimalny zestaw kolumn, który EA powinien zapisywać dla każdej transakcji:
| Pole | Co mierzy |
|---|---|
signal_time | Moment, w którym strategia wygenerowała sygnał (przed wysłaniem) |
send_time | Timestamp wysłania zlecenia z VPS |
fill_time | Timestamp przyjęcia zlecenia przez serwer brokera (broker server time) |
symbol + side | Para i kierunek (Buy/Sell) |
requested_price | Cena widziana przez EA w momencie sygnału |
fill_price | Cena, po której zlecenie faktycznie weszło |
spread_at_signal / spread_at_fill | Spread w obu momentach — pokazuje, czy LP rozszerzył kwotowanie między sygnałem a wykonaniem |
slippage_pips | (fill_price − requested_price) ze znakiem; osobna kolumna na pozytywny i negatywny slippage |
commission + swap | Twardy koszt transakcji |
reject_code | Kod odrzucenia z brokera (off quotes, requote, no money, market closed itp.) |
broker_server_time | Strefa czasowa serwera brokera — krytyczne przy filtrach godzinowych i DST |
Po 50–100 transakcjach taki log pozwala policzyć: rolling slippage per direction, asymetrię korzystny vs niekorzystny, fill rate, średni czas wykonania, korelację rejectów z konkretnymi godzinami lub eventami. Bez tych pól twój dziennik to pamiętnik, nie dane do Transaction Cost Analysis.
Przykładowy wiersz logu (orientacyjne wartości):
signal_time: 2026-03-12 14:30:00.120
send_time: 2026-03-12 14:30:00.184 (+64 ms)
fill_time: 2026-03-12 14:30:00.412 (+228 ms broker server)
symbol / side: EURUSD / Buy
requested_price: 1.08420
fill_price: 1.08434
spread_at_signal: 0.6 pip
spread_at_fill: 2.1 pip (rozszerzenie x3,5 w oknie publikacji)
slippage_pips: -1.4 pip (negatywny, na niekorzyść klienta)
commission: 3.50 USD (round-trip 0,1 lota)
swap: 0
reject_code: none
broker_server_time: GMT+2 (DST aware)
Taki wiersz pokazuje, że transakcja, która w backteście wyglądała jak +0,6 pip kosztu, w realu kosztowała 2,1 pip spreadu + 1,4 pip slippage'u + prowizja — sumarycznie ~4 pip friction zamiast zakładanych ~1 pip. Zbierz 50 takich wierszy i policz medianę slippage long vs short — to twój pierwszy realny audyt brokera.
Kiedy nie odpalać systemu — filtr sesyjności
Przed CPI, NFP, FOMC i decyzjami banków centralnych problemem nie jest tylko kierunek ruchu — problemem jest zmiana rynku z ciągłego w poszarpany. Spread przestaje być kosztem, a staje się zmienną losową; Last Look LP zaczyna selektywnie odrzucać; partial fill na ECN wchodzi w trzech transzach po coraz gorszej cenie. Backtest, który zakłada „spread normalny + slippage stały", w tym oknie nie modeluje rynku, na którym handlujesz. EA bez twardego filtra blokującego handel ±5 minut wokół Tier 1 to nie EA — to maszyna do przepłacania za chaos.
| Okno | Problem | Co zrobić |
|---|---|---|
| 5 min przed/po NFP, CPI, FOMC | Spread ×5–15, slippage kilkanaście pip, liquidity void | Wyłącz wejścia, blokuj modyfikacje SL |
| Rollover (23:00–00:00 serwera) | Spread ×3–10 na crossach, fałszywe wycięcia SL | Filtr godzinowy: blokuj handel i modyfikację zleceń |
| Święta USA/UK (np. 4 lipca, Bank Holiday) | Płynność 30–50% normalnej, spread podwyższony | Wyłącz system lub zmniejsz sizing |
| Niedzielne otwarcie (pierwsze 15–30 min) | Gap, spread kilkukrotnie wyższy | Blokuj handel do normalizacji spreadu |
| Piątek 20:00–zamknięcie | Ryzyko weekend gap, malejąca płynność | Nie otwieraj nowych pozycji. Rozważ zamknięcie lub redukcję pozycji, jeśli otwarta ekspozycja jest wysoka względem planu ryzyka, para wykonała nienaturalnie duży ruch względem ATR lub weekend niesie podwyższone ryzyko geopolityczne |
| Zmiana czasu (DST) USA vs Europa | Broker server (np. GMT+2/3) nie przestawia się synchronicznie z Europą lub USA — kalendarze ekonomiczne pokazują inne godziny niż EA, a filtry godzinowe blokują złe okno | Zweryfikuj po każdej zmianie czasu (marzec, listopad w USA; ostatnia niedziela marca i października w UE): sprawdź broker_server_time w logu EA i zaktualizuj filtry godzinowe NFP/CPI/FOMC. Klasyczny scenariusz: filtr blokuje 14:25–14:35 pod NFP, a po DST broker handluje przez 2 tygodnie w złym oknie, zanim trader to zauważy |
7. Koszty i realia prowadzenia algo
Trading algorytmiczny ma koszty, o których mało kto mówi — bo nie są widoczne na equity curve.
Koszty twarde
- VPS — 15–50 USD/miesiąc. Tanich VPS za 5 USD unikaj — niestabilne łącze, high latency.
- Dane tickowe — Dukascopy (bezpłatne z ograniczeniami). Profesjonalne: TickData, TrueFX — 100–500 USD/rok.
- Narzędzia — Python bezpłatny. Profesjonalne platformy (MultiCharts, TradeStation): 50–200 USD/miesiąc.
- Spread i prowizja — 10 transakcji/dzień × 1,5 pip kosztu × 22 dni × 12 miesięcy = 3960 pipsów/rok. Na locie 0,10 = ~396 USD/rok czysto na friction. Różnica spreadu między brokerami to 0,3–0,8 pip na majorsach — na 2640 transakcjach rocznie to 800–2100 pipsów. Zmierz realny efektywny spread na swoim koncie: eksport historii MT4/MT5, kolumny requested/fill, mediana slippage na wejściach i wyjściach osobno. Bez tej liczby wybór brokera to deklaracja, nie decyzja.
Koszty ukryte
- Czas developmentu — 100 godzin na budowę? Tyle zajmuje postawienie środowiska i ogarnięcie składni. Większość czasu zabiera nie pisanie kodu, tylko walidacja danych, debugowanie, analiza logów i odrzucanie pomysłów, które nie przechodzą testu live. Realistycznie: 300–500 godzin w pierwszym roku na budowę, testowanie i iterację jednego systemu. Benchmark kosztu alternatywnego: przy orientacyjnej stawce pracy technicznej / freelance 100–150 PLN/h 400 godzin = 40 000–60 000 PLN. Przy koncie startowym 10 000 USD (~40 000 PLN) to 1,0–1,5× wartości rachunku rocznie — czas to kapitał, nie niedogodność. A wynik po kosztach może okazać się gorszy niż pasywny ETF na indeks. Licz czas jako pierwszy koszt, zanim policzysz drugi.
- Swapy dla systemów overnight — system swing na D1 z 5 transakcjami tygodniowo trzyma pozycje 2–5 dni. Swapy na crossach (np. GBP/JPY) mogą zjadać orientacyjnie 1–3 pipsy dziennie (zależy od brokera i różnicy stóp). Na systemie z expectancy +8 pip per trade i średnim trzymaniem 3 dni — swapy to dodatkowe 3–9 pipsów kosztu, o których backtest wie tylko jeśli uruchomisz go z poprawnymi danymi historycznymi swapów. Większość brokerów nie udostępnia historii zmian swap rate.
- Konserwacja — minimum 5–10 godzin/miesiąc. Zmiana parametrów brokera, aktualizacje, weryfikacja edge'u.
- Koszt błędów implementacyjnych — bug w sizingu, źle obliczona prowizja, zły warunek wyjścia. Jeden błąd logiczny może działać przez tygodnie, zanim go zauważysz.
- Koszt zmiany brokera — nowy spread, nowy LP stack, nowa latencja. System zoptymalizowany pod jednego brokera może nie działać u drugiego.
- Koszt „martwego kapitału" — pieniądze na rachunkach testowych, u zapasowych brokerów, na VPS. Capital tied up, który nie pracuje.
8. Kiedy algo przestaje działać — regime change
Każdy system ma datę ważności. Różnica między amatorem a traderem polega na tym, czy zauważy ją przed obsunięciem 30%. Każde EA w końcu umiera — jedyną sztuką w algo tradingu jest zarobić na nim wystarczająco dużo, zanim rynek zmieni reżim i staniesz się źródłem przewidywalnego flow dla lepiej uzbrojonych uczestników rynku.
Dlaczego systemy degradują się
- Regime change — system trend-following z 2020–2021 (silne trendy dolarowe) może nie działać w 2024 (ranging). Reżim rynku (art. 8.7) się zmienia, parametry systemu są dostrojone do starego reżimu.
- Crowding — jeśli strategia jest popularna, coraz więcej uczestników ją gra. Edge maleje, bo rynek szybciej arbitrażuje sygnał.
- Zmiany mikrostrukturalne — broker zmienia LP stack, spread się zmienia. System zoptymalizowany pod stary spread może nie działać pod nowy.
Sygnały degradacji
- Hit rate spada — z 55% (ostatnie 500 trade'ów) do 42% (ostatnie 100). Patrz na rolling hit rate, nie na ostatni drawdown. (Te same metryki, które monitorujesz od startu — checklist z sekcji 6 — stają się z czasem sygnałami degradacji.)
- Rolling expectancy per trade maleje systematycznie — nie jeden zły tydzień, ale trend w dół na 3–4 tygodnie.
- Drawdown przekracza 95. percentyl Monte Carlo.
- Średni czas w pozycji rośnie — system nie łapie ruchów, które łapał wcześniej.
Nie czekaj na okrągłą liczbę transakcji, żeby zacząć diagnozować. System mean reversion na H1 robi 3–5 transakcji tygodniowo — na „statystycznie istotną" próbkę czekasz miesiącami. W tym czasie broker mógł zmienić LP stack, rynek mógł zmienić reżim. Patrz na rolling metryki z tygodnia na tydzień: hit rate, expectancy, slippage, średni czas w pozycji. Trend w dół na 3–4 tygodnie to sygnał — nie czekaj, aż stanie się pewnością.
Kiedy wyłączyć vs normalny drawdown
Monte Carlo w Excelu wygląda świetnie w niedzielę przy kawie. W czwartek, kiedy masz −22% na żywym koncie, a następny tick decyduje, czy broker zamknie cię na stop-oucie z koszmarnym poślizgiem — arkusz ląduje w koszu, a ty zaczynasz modlić się do wykresu. Decyzja procesowa wygląda łatwo w arkuszu. Przy otwartych pozycjach wygląda inaczej. Zanim włączysz system na live, wpisz do kalendarza twardy próg: „DD = 22% → wyłączam dziś wieczór, nie jutro, nie po jeszcze jednej transakcji." Bo o 23:15, przy DD 21,8%, twój mózg zacznie produkować powody, dlaczego limit 22% to może jednak za konserwatywnie. Ustal z góry drawdown trigger: 1,5× max DD z backtesta lub 95. percentyl Monte Carlo — i trzymaj się tego bez negocjacji.
Regime detection — wbudowany filtr EA
Artykuły edukacyjne opisują regime change jako zewnętrzne zagrożenie. Systematyczny trader buduje filtr reżimu bezpośrednio w system:
- ADX jako przełącznik — ADX < 20 = rynek w range, system trend-following wyłączony. ADX > 25 = trend aktywny, system mean reversion wyłączony. To jedno z prostszych i praktycznych podejść do filtrowania reżimu.
- Zmienność vs średnia — porównanie 20-dniowego ATR do 200-dniowej średniej ATR. Jeśli ATR(20) jest 2× wyższy niż średnia — reżim się zmienił, parametry systemu mogą nie pasować.
- COT jako filtr tła — nie jako trigger wejścia, ale jako kontekst tygodniowy. Ekstremalny COT (>90 percentyl) w kierunku zgodnym z systemem = mniejszy edge, bo crowding. Ekstremalny COT przeciwko = potencjalny squeeze, system trend-following może mieć dodatkową siłę. (Art. 6.6)
Mechanika wdrożenia COT w EA: CFTC publikuje raport COT w piątek o 15:30 ET, ale dane dotyczą pozycji z poprzedniego wtorku — opóźnienie wynosi 3 dni robocze. To oznacza, że COT nie nadaje się jako trigger intraday ani nawet jako sygnał dziennego wejścia. Jedyny rozsądny sposób użycia: tygodniowy sygnał kontekstowy na D1 lub W1 — filtr „czy pozycjonowanie rynku jest skrajne?" sprawdzany raz w tygodniu po publikacji. Jeśli COT jest ekstremalny (>90 percentyl netto long/short), system zmniejsza sizing lub pauzuje sygnały w kierunku zgodnym z tłumem. Dane COT w EA: parsuj CSV z CFTC ręcznie lub przez API (np. Quandl/NASDAQ Data Link).
Regime detection — operacyjna macierz
Zamiast tłumaczyć „regime change" abstrakcyjnie, EA powinien mieć zaszytą prostą tabelę decyzyjną na trzech osiach: charakter ruchu (trend / range), zmienność (high / low) i tło risk-on/off. Filtr odpalasz na D1 lub W1, raz na sesję — nie intraday:
| Reżim | Trend / range (struktura) | Volatility (ATR vs średnia) | Risk-on/off (DXY, JPY, CHF) | Co odpalasz, co wyłączasz |
|---|---|---|---|---|
| Trend, high vol | HH/HL lub LH/LL | ATR powyżej 75. percentyla | Risk-on dla AUD/JPY, NZD/JPY; risk-off dla USD/JPY, CHF | Trend-following ON, mean reversion OFF, breakout ON z katalizatorem |
| Trend, low vol | HH/HL słaba | ATR poniżej mediany | — | Trend-following z zmniejszonym sizingiem; mean reversion OFF |
| Range, high vol | Brak nowych ekstremów + szerokie świece | ATR powyżej 75. percentyla | — | Wszystko OFF — to jest „chop", w którym trend i reversion przegrywają z kosztami |
| Range, low vol | Cena oscyluje w wąskim zakresie | ATR poniżej 25. percentyla | Risk neutralny | Mean reversion ON, trend-following OFF |
| Risk-off shock | Gwałtowna zmiana w 1–3 sesje | ATR skacze 2× w tygodniu | JPY/CHF gwałtownie umacniają się | Wszystko OFF do stabilizacji 5 sesji |
EA implementuje filtr jako proste zmienne stanu odświeżane raz dziennie. Gdy stan zmienia się z „trend, high vol" na „range, high vol" — system pauzuje wejścia, ale nie zamyka otwartych pozycji (chyba że mają twardy SL i są blisko). Pauza i likwidacja to różne decyzje — pierwsza chroni edge, druga niszczy tail expectations.
Schemat poglądowy w MQL5 (kod uproszczony, do dostosowania pod własną architekturę):
// Enum stanów reżimu
enum ENUM_REGIME { REGIME_TREND_HIGH, REGIME_TREND_LOW, REGIME_RANGE_LOW, REGIME_CHOP, REGIME_RISK_OFF };
ENUM_REGIME current_regime = REGIME_RANGE_LOW;
datetime last_regime_check = 0;
// Odświeżenie raz dziennie na nowym barze D1
void OnNewDailyBar() {
current_regime = DetectRegime(); // implementacja: ATR-percentile, structure, DXY/JPY
last_regime_check = TimeCurrent();
}
// W OnTick() — bramka wejścia
void OnTick() {
if(current_regime == REGIME_CHOP || current_regime == REGIME_RISK_OFF) return; // blokada wejść
if(IsTrendStrategy() && current_regime != REGIME_TREND_HIGH) return;
if(IsMeanReversion() && current_regime != REGIME_RANGE_LOW) return;
// dalej: logika sygnału, sizing, SL/TP
}
Kluczowe: filtr odpalasz raz na sesję, nie tickowo. Tickowa zmiana reżimu produkuje fałszywe pauzy i restarty na drobnych ruchach ATR. Lepiej raz dziennie z konserwatywnym progiem niż non-stop pulsacje stanu.
Robustness testing — system odporny vs system kruchy
System, który „działa" to za mało. System musi przetrwać warunki gorsze niż te, na których go testowałeś. Test robustness to celowe pogarszanie warunków i sprawdzanie, czy system nadal daje dodatnią expectancy:
- Spread +50% — jeśli system zarabia przy spreadzie 1,0 pip, czy nadal zarabia przy 1,5 pip? Jeśli nie — jest zbyt wrażliwy na koszt wejścia.
- Opóźnienie +200 ms — dodaj sztuczny delay do backtesta. Czy wynik spada o 10% czy o 60%? System scalping zwykle nie przeżywa — swing zwykle tak.
- Różne feedy / brokerzy — uruchom ten sam system na danych tickowych z 2–3 różnych źródeł. Jeśli wyniki różnią się o >30% — system handluje artefaktami feedu, nie wzorcem rynkowym.
- Przesunięcie wejścia o 1 bar — opóźnij sygnał wejścia o jedną świecę. Jeśli system się sypie — edge zależy od precyzji, której na live nie dostaniesz.
- Swap +50% — dla systemów overnight: podnieś koszt swapu o połowę. Jeśli system z D1 traci rentowność — jest zależny od taniego finansowania, nie od wzorca.
- Plateau parametrów — nie szukaj najlepszego punktu. Szukaj regionu, w którym cała okolica parametrów daje zysk. Jeśli parametr musi być MA(17) a nie MA(19) — to overfitting, nie robustness.
W Pythonie: biblioteka vectorbt pozwala stosunkowo szybko parametryzować spread, slippage i opóźnienie wejścia oraz uruchamiać wiele wariantów w pętli. W MQL: Strategy Tester pozwala ręcznie ustawić spread i slippage per test — żmudne, ale wykonalne.
Wrażliwość systemu na egzekucję — zależy od stylu
| Styl | Wrażliwość na spread/slippage | Wrażliwość na swap | Wrażliwość na regime change | Najważniejszy test robustness |
|---|---|---|---|---|
| Scalping | Ekstremalnie wysoka | Niska (krótki czas w pozycji) | Średnia | Spread +50%, latency +200ms |
| Intraday | Wysoka | Niska | Średnia–wysoka | Spread +30%, przesunięcie 1 bar |
| Swing / D1 | Średnia | Wysoka | Wysoka | Swap +50%, różne feedy |
| Position / carry | Niska | Ekstremalnie wysoka | Ekstremalnie wysoka | Zmiana stóp procentowych, regime shift |
Kolumna „Scalping" w tabeli nie jest zaproszeniem — jest ostrzeżeniem. Detalista na MT4/MT5 u brokera CFD nie kontroluje latencji ani priorytetu routingu w stopniu, który pozwala zbudować zyskowny scalper na dłuższą metę. Wyjątki istnieją — ale są rzadsze niż sądzi większość traderów, którzy właśnie odkryli M1.
Checklist jakości danych
Trzy razy zbudowałem system, który „działał" na backteście i „nie działał" na live — zanim nauczyłem się, że moje dane z brokera miały błędną strefę czasową po zmianie DST. Filtr godzinowy, który miał blokować handel między 23:00 a 00:00, blokował 22:00–23:00. System handlował przez rollover. Problem z danymi, nie z logiką. Sprawdzaj dane przed systemem:
- Źródło danych — broker (zanieczyszczone) vs niezależne (Dukascopy, TickData). Porównaj OHLC na losowym tygodniu.
- Strefa czasowa — UTC, GMT+2, GMT+3? Zmiana DST zmienia godzinę świec — i zachowanie systemu z filtrem godzinowym.
- Jakość ticków — ile ticków na minutę? Dane z <10 ticków/min na EUR/USD to interpolacja, nie rynek.
- Luki — weekendy, święta, disconnect. Czy backtest poprawnie obsługuje luki, czy liczy je jako świece z zerowym wolumenem?
- Sposób agregacji świec — broker A liczy świece od bid, broker B od mid. Na M1/M5 to robi różnicę.
- Zgodność broker test/live — czy dane w backteście pochodzą od tego samego brokera, u którego handlujesz na live? Jeśli nie — testujesz inny rynek.
9. EA z marketu i social trading — co kupujesz
MQL5 Market, ZuluTrade, PAMM, copy trading — obietnica: „nie musisz się uczyć, ktoś inny będzie handlował za ciebie". Rzeczywistość jest mniej różowa.
MQL5 Market — ranking zwycięzców bez pełnej historii przegranych
Tysiące EA do kupienia, rankingowane po wynikach. Ranking EA to cmentarzysko, z którego chwilowo widać tylko te nagrobki, które jeszcze stoją. Kupujący widzi wynik, ale zwykle nie widzi pełnej dystrybucji ryzyka, historii zmian parametrów ani warunków, pod które system był ustawiony. EA, które straciły 80% konta, znikają z rankingu. To jest klasyczny survivor bias[7].
Typowe tricki vendorów:
- Martingale — podwajanie po stracie. Equity curve idealna do momentu, gdy jedna seria strat zniszczy konto. Track record 12 miesięcy bez DD nie oznacza dobrego systemu — oznacza, że martingale jeszcze nie trafił na czarny łabędź.
- Grid bez SL — pozycje co X pipsów bez stop lossa. Działa w range'u. Jeden trend i konto zerowe.
- Cherry-picked backtest — vendor pokazuje najlepszy okres. Nie pokazuje walk-forward.
- Demo jako „live proof" — konto demo z idealnym fillem nazwane „live results".
AI_Multiplier = 2.0. Odpowiedź vendora: „Strategy is proprietary, we cannot disclose logic." Tak wygląda istotny segment retailowego rynku EA, szczególnie tam, gdzie kupujący nie ma wglądu w logikę systemu i profil ryzyka.Due diligence przed zakupem EA — 7 kroków
| Kryterium | Minimum | Czerwona flaga |
|---|---|---|
| Kod źródłowy | Dostępny lub możliwość dekompilacji | „Proprietary, cannot disclose" |
| Track record live (nie demo) | 12+ miesięcy, weryfikowalny (MyFxBook z prawami inwestora) | Demo prezentowane jako „live results" |
| Liczba transakcji | 300+ (statystycznie istotne) | <100 transakcji |
| Max DD closed vs max floating DD | Oba podane | Tylko closed DD (floating ukryty = martingale) |
| SL na każdej pozycji | Twardy SL per trade | Brak SL, „mental stop", equity stop |
| Recovery factor | >3 (net profit / max DD) | <1 |
| Czy system dokłada do straty | Nie | Averaging, grid, martingale |
Social trading i copy trading
ZuluTrade, eToro CopyTrader, PAMM — kopiujesz „top tradera". Żadne pytanie due diligence nie ochroni cię przed tym, że „top trader" na ZuluTrade handluje kontem z lewarem 1:400 u brokera na Vanuatu, używa martingale zamaskowanego jako „averaging", a jego DD 4% na papierze oznacza, że jedna czarna seria go wyzeruje. Zanim skopiujesz — sprawdź, gdzie broker tego tradera trzyma pieniądze i jakie ma zabezpieczenia klientów. Odpowiedź często kończy rozmowę.
10. Algo dla detalisty — realistyczne oczekiwania
Co jest osiągalne
- Swing/position algo na D1/H4 — mean reversion lub trend-following. 3–8 transakcji/tydzień. 10–30% CAGR brzmi dobrze na papierze. Ale górny koniec tego zakresu osiąga niewielka część detalistów budujących własne systemy, a DD 25% to psychologicznie coś zupełnie innego niż DD 25% w arkuszu. Przy koncie 10 000 USD to 2 500 USD, które znikają. Większość traderów wyłącza system przy DD 12% — zanim system ma szansę odrobić. I uwaga: zjedzą cię ujemne swapy i rozszerzenia spreadu o północy (rollover). Jeśli backtest nie uwzględnia brutalnego kosztu przetrzymania pozycji przez noc, papierowe +15% zamieniają się w realny minus.
- Hybrydowe podejście: algo + discretionary — system generuje sygnały, trader decyduje o egzekucji na podstawie kontekstu (dane makro, reżim, COT — dział 7). Często skuteczniejsze niż czysty algo.
- Automatyzacja zarządzania ryzykiem — zarządzanie ryzykiem to nie wstawienie sztywnego SL na 30 pipsów. Prawdziwe algo dynamicznie skaluje pozycję do zmienności (ATR) i wycina ryzyko z rynku, gdy spread u brokera rozszerza się do poziomu, przy którym system traci ekonomiczny sens. Nawet bez automatyzacji wejść — automatyczny sizing, trailing i kill switch eliminują najgorsze decyzje emocjonalne.
Co NIE jest osiągalne
- HFT bez colocation — wymaga latencji w mikrosekundach i milionów USD. Na VPS za 30 USD z MT4 nie zrobisz HFT[6].
- Stałe 10% miesięcznie — żaden system nie daje stałych zwrotów. Kto obiecuje „stałe X% miesięcznie" — albo kłamie, albo używa martingale.
- „Set and forget" — system wymaga ciągłego monitoringu i rekalibracji.
Algo nie likwiduje twojego problemu z edge'em. Przenosi go do kodu i zaczyna go egzekwować z pełną konsekwencją — bez ani jednego momentu zawahania. Jeśli logika była głupia, masz teraz głupią, ale bardzo pracowitą maszynę. Algo nie daje edge'u — zabiera ci wymówkę, że zawiniły emocje. Od tej chwili winny jest kod, dane albo twoje założenia[10].
A-Book, B-Book i dlaczego twój EA musi to rozumieć
Twój EA nie handluje na Forex. Handluje na feedzie twojego brokera, w jego modelu routingu, w jego arkuszu kwotowań. To może być cokolwiek — ECN z LMAX/Currenex, hybryda PoP, internalizujący market maker (art. 2.7). Bez zrozumienia tego pisanie systemu jest zgadywaniem.
- B-Book — broker internalizuje flow (może, ale nie musi być bezpośrednią drugą stroną transakcji). Nie zakładaj, że broker „poluje" na twoje konto — zakładaj, że jego system zarządzania ryzykiem klasyfikuje flow. Toxic flow detection to identyfikowanie flow niosącego dla market makera lub LP wysokie ryzyko adverse selection — np. latency arbitrage, agresywny news trading, flow tuż przed zmianą kwotowania — i jest realnym elementem zarządzania ryzykiem egzekucji, a nie spiskową kategorią „klient zarabia". Jeśli twój styl pasuje do tej charakterystyki, warunki egzekucji mogą się zmienić nawet bez złej woli — przez routing, dobór LP, limity, opóźnienia i parametry serwera.
- A-Book — broker przekazuje zlecenia do LP. Brak konfliktu interesów, ale slippage zależy od głębokości booka LP i czasu routingu.
- Hybryda — większość brokerów detalicznych. Część flow internalizowana, część przekazywana. Nie wiesz, do której kategorii trafia twoje zlecenie.
Ta sama strategia może być zyskowna u jednego brokera i martwa u drugiego — nie dlatego, że „rynek się zmienił", tylko dlatego, że zmieniły się warunki egzekucji, filtracja flow albo polityka kwotowania. Jeśli twój EA jest zyskowny przez 3–6 miesięcy u brokera B-Book — monitoruj, czy warunki egzekucji nie pogarszają się wraz ze zmianą profilu twojego flow. Jak to zdiagnozować: analiza fill quality w czasie (rolling slippage per direction — czy systematycznie gorszy w jedną stronę?). Jeśli nie masz transparentności modelu: rozproszenie EA na 2–3 brokerów i porównanie rolling slippage między nimi daje ci empiryczny sygnał, kiedy jedna ze stron zaczyna gorzej wykonywać.
Fill quality analysis — jak mierzyć, czy broker cię karze
Transaction Cost Analysis (TCA) dla algo tradera detalicznego: po 50+ transakcjach porównaj requested price z fill price dla pozycji długich i krótkich osobno. Jeśli slippage jest systematycznie gorszy w jednym kierunku — masz problem strukturalny, nie rynkowy. MyFxBook ma „Trade Analysis" z kolumną entry/exit efficiency — ale większość traderów nie wie, jak to interpretować. Do przeliczenia kosztów egzekucji na pieniądze użyj naszych kalkulatorów kosztów, pipsów i spreadu.
| Metryka | Co mierzy | Czerwona flaga |
|---|---|---|
| Slippage per direction | Różnica fill vs request, long vs short | Asymetria na korzyść brokera (próg zależy od pary i stylu — np. >1 pip na majorsach dla scalpera) |
| Fill rate | % zrealizowanych zleceń / wysłanych | Wyraźnie niższy na live niż na demo (orientacyjnie: <95%) |
| Execution time | Czas od wysłania do filla | Systematycznie rośnie w czasie lub przy określonych typach zleceń |
| Spread at fill vs advertised | Realny spread w momencie filla | Wielokrotnie wyższy niż reklamowany w spokojnym rynku |
Korelacje i ekspozycja — pułapka „12 pozycji na skorelowanych parach"
EA, który jednocześnie trzyma long EUR/USD, short USD/CHF i long GBP/USD, nie ma trzech pozycji — ma jedną: zakład na słabość dolara w trzech opakowaniach. Jeśli dolar się umocni, wszystkie trzy tracą jednocześnie.
| Pozycja | Waluta dominująca | Kierunek USD | Kierunek risk-on/off |
|---|---|---|---|
| Long EUR/USD | USD | Short USD | Umiarkowany risk-on |
| Short USD/CHF | USD | Short USD | Risk-off / safe haven |
| Long GBP/USD | USD | Short USD | Risk-on |
| Long AUD/JPY | JPY / risk | Neutralny | Silny risk-on |
EA musi mieć filtr ekspozycji walutowej. Zamiast arbitralnego limitu „max N pozycji" — mierz ekspozycję netto na każdą walutę bazową: sumuj notional (wielkość pozycji × kierunek) dla każdej waluty osobno. Jeśli sumaryczna ekspozycja na USD przekracza np. 3% konta — nowe pozycje z dominacją USD są blokowane. Uproszczona metoda: policz, ile twoich otwartych pozycji ma tę samą walutę po tej samej stronie. 3× short USD w różnych parach = jedna duża pozycja short USD w trzech opakowaniach. Więcej o korelacjach i ekspozycji walutowej: dział 7 — analiza międzyrynkowa.
Przykład liczenia netto na trzech parach. Konto 10 000 USD, otwarte: long 0,5 lota EUR/USD (ryzyko 1%), short 0,5 lota USD/CHF (ryzyko 1%), long 0,3 lota GBP/USD (ryzyko 0,8%). Wygląda jak trzy różne pozycje z łącznym ryzykiem 2,8%. Liczenie netto walutowe:
- USD: long EUR/USD = short USD; short USD/CHF = short USD; long GBP/USD = short USD. Netto: −1,3 lota short USD (jednokierunkowy zakład na osłabienie dolara w trzech opakowaniach).
- EUR: +0,5 long.
- GBP: +0,3 long.
- CHF: +0,5 long (short USD/CHF = long CHF).
Realne ryzyko: jeśli DXY zyska 1% po jastrzębi Fed, wszystkie trzy pozycje tracą równocześnie. Sumaryczna strata będzie bliżej 2,8% niż 1% — bo to jedna decyzja w trzech ekspozycjach. Filtr w EA: blokuj nową pozycję, jeśli jej waluta dominująca już ma netto powyżej progu (np. ±2 loty na walutę bazową dla konta 10k USD).
Od pomysłu do live — mapa procesu
| Krok | Co robisz | Kryterium przejścia dalej |
|---|---|---|
| 1. Pomysł | Hipoteza + logika wejścia/wyjścia | Jasna reguła, którą da się zapisać w kodzie |
| 2. Backtest z kosztami | Spread zmienny, slippage, prowizja, dane tickowe | Expectancy netto > 0 po kosztach |
| 3. Overfitting check | Minimalizuj parametry, sprawdź plateau | Wynik stabilny przy małych zmianach parametrów |
| 4. Rolling WFA | Przesuwane okno IS/OOS | WFE > 50% (reguła robocza) |
| 5. Anchored WFA | Stały punkt startowy, rosnące IS | WFE zbliżony do rolling — system się stabilizuje |
| 6. Monte Carlo | 10 000 permutacji, rozkład DD i expectancy | 95. percentyl DD akceptowalny, expectancy > 0 |
| 7. Robustness | Spread +50%, latency +200ms, 1-bar delay, różne feedy | System nadal zyskowny po pogorszeniu warunków |
| 8. Demo | Test techniczny kodu, min. 50 transakcji | Kod działa, otwiera/zamyka/zarządza pozycjami |
| 9. Live mikrolot | Walidacja kosztów egzekucji, min. 30–50 transakcji | Expectancy live ≥ 50% backtesta (poniżej — wróć do diagnostyki egzekucji) |
| 10. Monitoring | Rolling metryki: hit rate, expectancy, slippage, swap | DD trigger = 1,5× max DD z backtesta lub 95. percentyl MC |
Każdy krok to brama — jeśli system nie przechodzi kryterium, wraca do kroku wcześniejszego. Większość pomysłów odpada na kroku 2 lub 3. To nie jest wada procesu — to jest jego cel.
Domknięcie tezy. Algo trading dla detalisty nie jest skrótem do bogactwa ani sposobem na wyłączenie myślenia. Jest dyscypliną pomiaru tam, gdzie ręczny trader bazuje na intuicji: pomiaru kosztów (spread, slippage, prowizja, swap, latency, friction VDP), pomiaru jakości egzekucji (asymetria filli, fill rate, czas wykonania), pomiaru robustness systemu (spread +50%, latency +200 ms, różne feedy) i pomiaru reżimu rynku (matryca trend × volatility × risk-on/off). Bez logu egzekucji, walk-forward i Monte Carlo prowadzisz tylko szybszego dawcę płynności dla brokera. Z tymi narzędziami masz szansę na coś, co przeżyje pierwszy regime change — a w cyklu dwóch lat to jest realny, ambitny benchmark dla detalicznego algo. Nie 20% miesięcznie. Bycie nadal w grze za dwa lata.
FAQ — najczęściej zadawane pytania
Czy potrzebuję umieć programować?
Tak — przynajmniej na poziomie czytania i modyfikacji kodu. Bez tego jesteś klientem czarnej skrzynki. Minimum: podstawy MQL5 lub Pythona. Czas nauki: 2–4 miesiące regularnej praktyki.
Ile kosztuje start z algo tradingiem?
Minimum: konto u brokera (1000–5000 USD), VPS (15–50 USD/miesiąc), MT4/MT5 (bezpłatne). Opcjonalnie: dane tickowe (100–500 USD/rok), profesjonalne platformy (50–200 USD/miesiąc). Największy koszt to czas — setki godzin na budowę, debugging, walidację i wyrzucanie pomysłów, które nie działają. Pieniądze na start to mniej niż to kosztuje w godzinach.
Jaki jest realistyczny zwrot?
Swing/position algo: 10–30% CAGR przy DD 15–25%. Nie 10% miesięcznie — 10–30% rocznie, z miesiącami ujemnymi. Porównaj: ETF na S&P 500 daje historycznie ~8–10% CAGR bez żadnej pracy.
Czy EA z MQL5 Market może być zyskowny?
Teoretycznie tak. Praktycznie: duża część to martingale, gridy bez SL lub systemy overfitowane na jednym reżimie rynku. Sprawdź: walk-forward (nie tylko backtest), konto live (nie demo), realistyczne DD (brak DD = ukryty tail risk), SL na każdym tradzie, track record przez różne reżimy. Jeśli nie potrafisz przeczytać kodu — nie kupuj. Patrz sekcja 9: tabela due diligence.
MQL4 czy MQL5?
Jeśli broker oferuje MT5 — ucz się MQL5 (lepszy backtester, lepsza architektura). Jeśli tylko MT4 — MQL4. To różne języki — nie ucz się obu jednocześnie. Znasz Pythona? Rozważ handel przez API brokera.
Jak rozpoznać overfitting?
Walk-forward: wynik OOS >50% gorszy niż IS = overfitting. Inne sygnały: działa tylko na jednej parze, mała zmiana parametru niszczy wynik, 6+ parametrów, equity curve „za gładka". Profilaktyka: minimalizuj parametry, zawsze testuj OOS.
Czy demo wystarczy do walidacji?
Nie. Demo waliduje technikę, nie wyniki. Fill na demo bywa znacznie bardziej korzystny i mniej reprezentatywny niż live — bez Last Look, bez LP-odrzutów, bez partial fills, bez dynamicznego rozszerzenia spreadu w momencie wyjścia. Na live koszty egzekucji obniżają expectancy często o 30–60% względem testu / demo. Demo to krok pierwszy (czy kod się kompiluje i otwiera/zamyka pozycje). Live z 0,01 lota to krok drugi — dopiero on daje realne dane o kosztach na twoim konkretnym koncie.
Kiedy wyłączyć tracący system?
Ustal przed live: drawdown trigger = 1,5× max DD z backtesta lub 95. percentyl Monte Carlo. Nie wyłączaj po 3 stratach z rzędu (normalny DD). Wyłącz, gdy DD przekroczy próg — i wróć do diagnostyki.
Python czy MQL do algo tradingu?
Python: lepsze narzędzia statystyczne, lepsze do research/walidacji. MQL: natywna integracja z MT4/MT5, wbudowany backtester, bezpośrednia egzekucja. Wielu algo traderów używa obu: Python do research, MQL do egzekucji.
Czy algo eliminuje emocje?
Eliminuje emocje z egzekucji — system nie ma FOMO. Ale emocje nie znikają — zmieniają formę. Zamiast gonić świecę, zaczynasz dłubać w parametrach po serii strat i psujesz system dokładnie wtedy, kiedy powinieneś go zostawić w spokoju. Typowy scenariusz: drawdown 14%, trader zmniejsza SL „żeby zmniejszyć ryzyko" — system przestaje trafiać w wyjścia. Dodaje filtr — system przestaje wchodzić. Po kilku tygodniach „optymalizacji w locie" ma system dopasowany do drawdownu, który i tak by odrobił. Nie emocje zabijają algo — zabija interwencja w system, gdy boli.
Źródła i bibliografia
Badania i publikacje akademickie
- ESMA, „Product Intervention Analysis: Measure on Contracts for Differences", decyzje interwencyjne 2018 (m.in. ESMA35-43-1135) — pierwotne źródło zakresu 74–89% rachunków detalicznych CFD tracących pieniądze, w ramach pakietu interwencji produktowej obejmującego limity dźwigni, margin close-out i ochronę przed ujemnym saldem; uzupełniająco „MiFID II/MiFIR — Q&A on Investor Protection Topics", 2023.
- Pardo, R., The Evaluation and Optimization of Trading Strategies, Wiley, 2nd ed., 2008 — walk-forward analysis, backtesting methodology, modelowanie kosztów transakcyjnych.
- Bailey, D.H., Borwein, J.M., López de Prado, M., Zhu, Q.J., „Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance", Notices of the AMS, Vol. 61, 2014 — matematyczny dowód fałszywie pozytywnych wyników z wielokrotnego testowania.
- Harvey, C.R., Liu, Y., Zhu, H., „…and the Cross-Section of Expected Returns", Review of Financial Studies, Vol. 29, 2016 — p-hacking w badaniach finansowych; progi istotności po uwzględnieniu wielokrotnego testowania.
- Pardo, R., „Walk-Forward Analysis: Definition, Protocol, and Application", konferencja Automated Trading Strategies, 2012 — protokół WFA; definicja walk-forward efficiency.
- Aldridge, I., High-Frequency Trading: A Practical Guide to Algorithmic Strategies, Wiley, 2nd ed., 2013 — mechanika HFT, wymagania infrastrukturalne, latency arbitrage.
Źródła branżowe i praktyczne
- López de Prado, M., Advances in Financial Machine Learning, Wiley, 2018 — backtest overfitting, combinatorially symmetric cross-validation; metody walidacji odporne na data snooping.
- MetaQuotes, „MQL5 Documentation — Strategy Tester", 2024 — dokumentacja Strategy Testera MT5; tryby testowania (Every tick, Real ticks).
- Bank for International Settlements, Triennial Central Bank Survey, 2022 — udział handlu algorytmicznego w obrotach FX (szacunkowo 70–80% wolumenu spot).
- Barber, B.M., Odean, T., „Trading is Hazardous to Your Wealth", Journal of Finance, Vol. 55, 2000 — aktywny trading u detalistów generuje niższe zwroty niż buy-and-hold po uwzględnieniu kosztów.
- Chan, E., Algorithmic Trading: Winning Strategies and Their Rationale, Wiley, 2013 — budowa systemów mean reversion i momentum na FX; sizing, koszty, backtesting.
- Kissell, R., The Science of Algorithmic Trading and Portfolio Management, Academic Press, 2013 — modelowanie slippage'u, TCA, impact rynkowy zleceń.
- Aronson, D., Evidence-Based Technical Analysis, Wiley, 2006 — statystyczne podejście do testowania strategii; problemy wielokrotnego testowania hipotez.
- CME Group, „Algorithmic Trading and Market Structure", 2023 — rola algo tradingu na rynkach futures; wpływ na płynność i price discovery.
- FCA, „Algorithmic Trading Compliance in Wholesale Markets", 2018 — wymogi regulacyjne dla handlu algorytmicznego pod MiFID II.
- BIS Markets Committee, „The sterling 'flash event' of 7 October 2016", styczeń 2017 — raport BIS przy współpracy banków centralnych (w tym Bank of England) opisujący mechanikę flash crashu GBP/USD: rola algorytmów, cienkiej płynności wczesnej sesji azjatyckiej, kaskady stop lossów i amplifikacji ruchu przez automaty.
- Global Foreign Exchange Committee, FX Global Code, 2021 (updated) — kodeks etyczny rynku FX OTC; Principle 17: „Market Participants employing Last Look should be transparent regarding its use." Definicja Last Look, hold time, symetrii odrzucania zleceń i obowiązków ujawnień LP.