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: