Skrypt lub strategia daje inne wyniki po odświeżeniu strony (repainting)
Dane historyczne nie zawierają informacji o ruchach ceny wewnątrz słupka. Informują jedynie o cenie otwarcia, maksimum, minimum i cenie zamknięcia (OHLC). Prowadzi to do tego, że skrypt czasami działa inaczej na danych historycznych niż na danych w czasie rzeczywistym, gdzie znany jest tylko poziom otwarcia, a cena zazwyczaj zmienia się wiele razy, zanim ustalona zostanie wartość maksimum, minimum i cena zamknięcia po zamknięciu słupka w czasie rzeczywistym.
Jeśli dodamy skrypt do wykresu, poczekamy, aż przeprowadzi obliczenia na kilku słupkach w czasie rzeczywistym, a następnie przeładujemy stronę, czasami będziemy świadkami nieznacznych zmian wykresu skryptu. Takie zachowanie jest jednym z kilku różnych rodzajów zachowań powszechnie określanych jako repainting wskaźników. Używając określenia repainting będziemy się odnosić właśnie do tego zjawiska. Wynika to z faktu, że gdy w skryptach wykorzystywane są pewne funkcje, będą one obliczać inaczej na słupkach historycznych i inaczej na słupkach w czasie rzeczywistym.
Inne rodzaje zachowań słusznie lub niesłusznie określane jako repainting obejmują wykreślanie poprzednich słupków z negatywnym przesunięciem oraz używanie inaczej niedostępnych przyszłych informacji otrzymanych przez błędnie zrozumiane wywołania funkcji security, które mogą wprowadzić dane niedostępne w czasie rzeczywistym do obliczeń skryptu.
Nie wszystkie wskaźniki podlegają zjawisku repaintingu, które tutaj omawiamy. W większości przypadków zależy to od tego, czy w kodzie używane są pewne funkcje lub konstrukcje językowe. Zjawisko repaintingu nie jest błędem, tylko wynikiem nieodłącznych różnic pomiędzy słupkami historycznymi a informacjami słupków w czasie rzeczywistym na TradingView.
Repainting zaobserwujemy w następujących przypadkach:
1. Strategie korzystające z calc_on_every_tick=true. Strategia z parametrem calc_on_every_tick = false także może być podatna na repainting, ale w mniejszym stopniu.
2. Korzystając z funkcji security do żądania danych z interwału wyższego niż interwał głównego symbolu wykresu:
// Add this study on 1 minute chart
//@version=4
study("My Script")
c = security(syminfo.tickerid, "5", close)
plot(close)
plot(c, color=color.red)
Niezależnie od wartości parametru lookahead, ten wskaźnik będzie obliczał inaczej dla danych w czasie rzeczywistym i inaczej dla historycznych (więcej informacji na temat parametru lookahead przeczytasz tutaj).
3. Korzystając z funkcji security do żądania danych z interwału niższego niż interwał głównego symbolu wykresu (więcej informacji tutaj):
// Add this study on 5 minute chart
//@version=3
study("My Script")
c = security(tickerid, "1", close, lookahead=false)
plot(close)
plot(c, color=red)
Wystąpi repainting jeżeli lookahead=false. Repainting jest mniej prawdopodobny gdy lookahead=true. Może jednak wystąpić gdy aktualizacje 1 i 5 minutowe będą się nawzajem wyprzedzać.
4. Wszystkie skrypty z obliczeniami zależnymi od punktu początkowego. Dane intraday są wyrównywane do początku tygodnia, miesiąca lub roku, w zależności od interwału. W związku z tym wyniki uzyskiwane przez takie skrypty mogą się od czasu do czasu różnić. Są to przypadki, w których skrypty będą opierały się na punkcie początkowym:
- gdy korzystają z funkcji valuewhen, barssince lub ema (ze względu na specyfikę algorytmu)
- każda strategia backtestingowa (niezależnie od tego, jak zdefiniowany jest parametr calc_on_every_tick)
Istnieje zależność między interwałem a wyrównaniem punktu startowego:
- 1–14 minut — wyrównuje do początku tygodnia
- 15–29 minut — wyrównuje do początku miesiąca
- od 30 minut w górę — wyrównuje do początku roku
Następujące ograniczenia długości historii są brane pod uwagę podczas przetwarzania danych:
- 40000 słupków historycznych dla planów Ultimate
- 30000 słupków historycznych dla planów Elite
- 25000 słupków historycznych dla planów Expert
- 20000 słupków historycznych dla planów Premium
- 10000 słupków historycznych dla planów Pro i Pro+
- 5000 słupków historycznych dla innych planów
5. Zmiany w danych historycznych, na przykład z powodu splitu.
6. Obecność w skrypcie poniższych zmiennych zazwyczaj prowadzi do repaintingu: