Spread w backteście: świece M1 kontra tiki
W skrócie: test na świecach M1 (tryb “1 minuta OHLC”) liczy koszt ze spreadu zapisanego przy każdej świecy. Ta liczba bywa sztuczna. Na Nasdaq u jednego brokera przez trzy lata wynosiła równo 7,0 punktu, a z tików wychodzi 7,7-7,9, w 2026 nawet 10,4 przy 8,1 ze świec. Przed zaufaniem backtestowi sprawdzam spread z tików, i tylko w godzinach, w których bot handluje.
Co zmierzyłem
Pokażę to na indeksie Nasdaq (symbol NDX) na koncie demo Darwinex, na danych z lat 2018-2026. Wybrałem tego brokera, bo ma długą historię tików bez dziur, od stycznia 2018.
Zrobiłem dwa pomiary. Pierwszy: średni spread ze świec M1, czyli to, co widzi tester w trybie “1 minuta OHLC”. Drugi: spread z każdego tiku, czyli ask minus bid, z całego maja każdego roku. W maju 2026 to było 10,8 mln tików.
Na tym symbolu 1 punkt to 0,1 punktu indeksu. Spread 7 punktów oznacza więc 0,7 punktu indeksu między ceną kupna a sprzedaży.
Wynik: maj każdego roku
| Maj | Spread ze świec M1 | Spread z tików | Najmniejszy / największy |
|---|---|---|---|
| 2018 | 5,1 | 6,1 | -30 / 124 |
| 2019 | 14,8 | 11,2 | 0 / 120 |
| 2020 | 7,1 | 7,0 | 6 / 118 |
| 2021 | 8,3 | 8,1 | 6 / 301 |
| 2022 | 6,6 | 7,8 | 6 / 128 |
| 2023 | 7,0 | 7,8 | 6 / 199 |
| 2024 | 7,0 | 7,7 | 7 / 218 |
| 2025 | 7,0 | 7,9 | 7 / 250 |
| 2026 | 8,1 | 10,4 | 6 / 234 |
Wartości w punktach, spread z tików to średnia po wszystkich tikach miesiąca.
W latach 2020-2021 oba pomiary się zgadzają. Od 2022 świece M1 pokazują mniej niż tiki, o 0,7 do 2,3 punktu. Test na OHLC jest wtedy tańszy niż rzeczywistość.
Równe 7,0 przez 36 miesięcy
Kiedy rozbiłem spread ze świec na miesiące, lata 2023-2025 wyglądały podejrzanie: prawie idealnie 7,0 w każdym miesiącu, przez trzy lata. Do tego bez różnic między nocą a dniem. Prawdziwy spread tak się nie zachowuje. To wartość wpisana do historii, a nie zmierzona.
Tiki z tych samych lat pokazują 7,7-7,9 punktu średnio i skoki do 200-250 punktów w pojedynczych chwilach. Świeca M1 ma jedno pole na spread i takiego skoku nie pokaże. A właśnie w takiej chwili stop loss pozycji sprzedaży zamyka się dalej, niż wynika z wykresu.
Lata 2018-2019: dane do wyrzucenia
W maju 2018 najmniejszy spread z tików to -30 punktów. Ujemny spread nie istnieje, cena kupna nie może być niższa od ceny sprzedaży. W maju 2019 jest 1044 tików ze spreadem równym zero. W historii świec styczeń i luty 2018 mają spread 0.
Bot testowany na takich danych handluje za darmo albo z dopłatą. Wyniku z lat 2018-2019 na tym symbolu nie biorę pod uwagę przy ocenie kosztów. Sama obecność danych w terminalu nie znaczy, że są dobre.
Spread zależy od godziny
Średnia z całej doby też wprowadza w błąd, tylko w drugą stronę. Maj 2026, tiki, czas serwera (Nowy Jork plus 7 godzin):
- noc, godziny 01-03: 12-14 punktów,
- dzień w Europie, godziny 04-14: około 11,
- sesja w Nowym Jorku, godziny 16-22: około 8,9,
- cała doba: 10,4.
Bot, który handluje tylko w sesji nowojorskiej, płaci około 15% mniej, niż mówi średnia dobowa. Bot nocny płaci wyraźnie więcej. Koszt liczę więc z godzin, w których bot naprawdę otwiera i zamyka pozycje.
Świece M1 od 2022 roku tych różnic nie pokazują wcale. Spread jest w nich stały przez całą dobę.
Ile to kosztuje
Przykład, liczby dla uproszczenia. Pozycja, na której 1 punkt indeksu to 10 USD. Spread 8,1 punktu ze świec to 0,81 punktu indeksu, czyli 8,10 USD kosztu na transakcję. Spread 10,4 z tików to 10,40 USD. Różnica: 2,30 USD na każdej transakcji.
Przy 300 transakcjach rocznie test OHLC pokazuje wynik o około 690 USD lepszy niż prawdziwy. Dla bota z krótkim stop lossem i małym zyskiem na transakcję to potrafi być różnica między plusem a zerem. Dla bota, który bierze kilkaset punktów na transakcji, to drobiazg.
Jak sprawdzić u siebie
Najprościej uruchomić w testerze ten sam krótki okres dwa razy: raz w trybie “1 minuta OHLC”, raz “Każdy tik na podstawie realnych ticków”, i porównać wynik. Jeśli chcesz zobaczyć sam spread, wystarczy mały EA, który go liczy z tików:
// Średni spread z tików w punktach - wynik w raporcie testera (OnTester)
double g_spreadSum = 0;
long g_tickCount = 0;
void OnTick()
{
MqlTick tick;
if(!SymbolInfoTick(_Symbol, tick))
return;
g_spreadSum += (tick.ask - tick.bid) / _Point;
g_tickCount++;
}
double OnTester()
{
return (g_tickCount > 0) ? g_spreadSum / g_tickCount : 0.0;
}
Uruchomiony na realnych tikach pokaże prawdziwą średnią. Uruchomiony na “1 minuta OHLC” pokaże to, co tester bierze ze świec. Miesiąc tików na indeksie liczy się u mnie kilka minut, więc nie robię tego dla całej historii, tylko dla jednego miesiąca z każdego roku.
Ja na co dzień testuję i optymalizuję na OHLC, bo jest wielokrotnie szybciej. Pomiar spreadu z tików robię raz dla symbolu i brokera, żeby wiedzieć, o ile test jest za tani.
Checklista
- spread ze świec M1 porównany ze spreadem z tików, przynajmniej dla jednego miesiąca na rok,
- w historii nie ma lat ze spreadem zerowym, ujemnym albo idealnie stałym,
- koszt policzony z godzin pracy bota, nie z całej doby,
- różnica przeliczona na USD na transakcję i pomnożona przez liczbę transakcji w roku,
- pomiar zrobiony u brokera, u którego bot ma działać.
Powiązane
- Luka cenowa i stop loss
- MetaQuotes-Demo - do czego się nadaje, a do czego nie
- Przerwa dobowa indeksów i złota
- Film: Bot stracił 125 USD zamiast 100 USD - poślizg kontra backtest M1
- Pojęcia z artykułu: słowniczek, skorowidz
Ostrzeżenie: handel CFD i forex wiąże się z wysokim ryzykiem utraty kapitału. Wyniki pomiarów dotyczą jednego symbolu u jednego brokera i nie przenoszą się wprost na inne konta. Artykuł ma charakter edukacyjny i nie jest rekomendacją inwestycyjną.