Swap w backteście liczony po dzisiejszych stawkach
Tester nalicza swap, ale na podstawie wartości obowiązujących dziś, nie w dniu testowanej transakcji. Przy strategiach trzymających pozycje dłużej to zmienia wynik.
2 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
Pytanie wraca regularnie: czy tester strategii w ogóle liczy swap? Odpowiedź brzmi tak — i właśnie dlatego warto wiedzieć, jak go liczy.
Skąd tester bierze stawki
Z bieżących właściwości instrumentu: SYMBOL_SWAP_LONG, SYMBOL_SWAP_SHORT i SYMBOL_SWAP_MODE. Nie ma historii tych wartości — ani terminal, ani serwer jej nie przechowuje.
W praktyce znaczy to, że test transakcji sprzed pięciu lat jest obciążany kosztem finansowania obowiązującym dzisiaj. Stawki swapowe idą za stopami procentowymi, a te zmieniły się w ostatnich latach o kilka punktów procentowych. Dla strategii wewnątrzdniowej to bez znaczenia. Dla strategii trzymającej pozycje tygodniami koszt finansowania bywa większy niż cała zakładana przewaga.
Tryb decyduje o jednostce
Sama liczba nic nie znaczy bez SYMBOL_SWAP_MODE. Ta sama wartość bywa punktami, procentem w skali roku, kwotą w walucie depozytu albo w walucie zysku.
double swapDlugi = SymbolInfoDouble(symbol, SYMBOL_SWAP_LONG);
double swapKrotki = SymbolInfoDouble(symbol, SYMBOL_SWAP_SHORT);
long tryby = SymbolInfoInteger(symbol, SYMBOL_SWAP_MODE);
long dzienPotrojny = SymbolInfoInteger(symbol, SYMBOL_SWAP_ROLLOVER3DAYS);
PrintFormat("%s: swap dlugi %.3f, krotki %.3f, tryb %d, potrojny w dniu %d",
symbol, swapDlugi, swapKrotki, (int)tryby, (int)dzienPotrojny);Przeliczanie tych liczb na pieniądze bez sprawdzenia trybu daje wynik losowy — opisaliśmy to przy SYMBOL_SWAP_LONG.
Potrójne naliczenie
Raz w tygodniu naliczany jest swap za trzy dni, żeby pokryć weekend. Dzień tygodnia podaje SYMBOL_SWAP_ROLLOVER3DAYS i zwykle jest to środa, ale nie u każdego brokera i nie na każdym instrumencie.
Strategia, która trzyma pozycje przez noc, ma w tym dniu trzykrotnie wyższy koszt. Jeśli twoja przewaga jest niewielka, to jeden dzień w tygodniu decyduje o znaku wyniku.
Jak sprawdzić wpływ swapu na własny wynik
Nie zgaduj, zmierz. OnTester ma dostęp do statystyk przebiegu, a historia transakcji do konkretnych naliczeń.
double OnTester()
{
double zysk = TesterStatistics(STAT_PROFIT);
double sumaSwapow = 0.0;
double sumaProwizji = 0.0;
if(HistorySelect(0, TimeCurrent()))
for(int i = 0; i < HistoryDealsTotal(); i++)
{
ulong bilet = HistoryDealGetTicket(i);
if(bilet == 0)
continue;
sumaSwapow += HistoryDealGetDouble(bilet, DEAL_SWAP);
sumaProwizji += HistoryDealGetDouble(bilet, DEAL_COMMISSION);
}
PrintFormat("wynik %.2f | swapy %.2f | prowizje %.2f",
zysk, sumaSwapow, sumaProwizji);
return zysk;
}