Przywitaj się z Pine Script v5

Oct 7, 2021

Dzisiaj nasz język programowania wskaźników i strategii Pine awansuje do wersji 5! Nowa wersja dodaje szereg długo oczekiwanych funkcji i ulepszeń. Pine jest teraz potężniejszy niż kiedykolwiek, a zmiany w v5 pomogą nam przenieść język na nowy poziom. Ten post przedstawia tylko kilka z najnowszych dostępnych funkcji. Aby poznać wszystkie nowe funkcje, zapoznaj się z sekcją Informacje o wersji oraz Przewodniku Migracji.

Konwersja v4 do v5

Istniejące skrypty Pine używające poprzednich wersji Pine będą nadal działać bez zmian, ale udostępniliśmy narzędzie do konwersji w edytorze Pine, aby pomóc programistom w konwersji ich skryptów v4 do v5. Przyszłe ulepszenia Pine będą wprowadzane wyłącznie dla v5, więc zalecamy konwersję wskaźników i strategii, jeśli chcesz korzystać z nowych funkcji. Narzędzie do konwersji v4 do v5 jest dostępne w rozwijanym menu po kliknięciu przycisku Więcej, gdy skrypt v4 jest załadowany w Edytorze:

Należy pamiętać, że nie każdy kod v4 może zostać przekonwertowany automatycznie. Jeśli napotkasz problemy z konwersją lub wolisz konwertować swoje skrypty ręcznie, sprawdź nasz Przewodnik Migracji, który dokumentuje wszystkie zmiany pomiędzy v4 i v5.

BIBLIOTEKI

Kluczowym dodatkiem do Pine, który pojawił się wraz z wersją v5 są biblioteki. Biblioteki są nowym typem publikacji, który pozwala na tworzenie własnych funkcji, które mogą być ponownie wykorzystane w innych skryptach. Kiedy biblioteka zostanie opublikowana, inne skrypty (wskaźniki, strategie, a nawet inne biblioteki) mogą ją zaimportować i używać zapisanych w niej funkcji. Biblioteki mogą zawierać złożone algorytmy lub często używane funkcje, dzięki czemu Ty i cała społeczność Pine, może z nich korzystać w przyszłości.

Aby rozpocząć pracę z bibliotekami, zobacz naszą stronę w podręczniku użytkownika poświęconą bibliotekom. Na końcu tego postu znajdziesz przykłady bibliotek opublikowane przez członków naszego zespołu PineCoders. Wszystkie opublikowane biblioteki znajdziesz tutaj.

WARTOŚCI DOMYŚLNE DLA FUNKCJI NIESTANDARDOWYCH

Ulepszenie, które idzie w parze z bibliotekami: można zdefiniować wartość domyślną dla parametrów w funkcjach definiowanych przez użytkownika, co efektywnie czyni je opcjonalnymi. W poniższym przykładzie deklarujemy funkcję customPow(), która podnosi podstawę do potęgi exp. Jeśli exp nie zostanie określone podczas wywoływania funkcji, użyta zostanie wartość 2:

//@version=5
indicator("")
customPow(base, exp = 2) =>
    result = 1
    for i = 1 to exp
        result *= base
plot(customPow(11)) // 11^2
plot(customPow(11, 4)) // 11^4

Switch

Nowa instrukcja switch jest odmianą znanej instrukcji if. Jeśli kiedykolwiek musiałeś tworzyć duże drzewo instrukcji if-else, z pewnością docenisz, o ile wygodniej jest osiągnąć pożądany rezultat za pomocą switch. Więcej informacji na ten temat znajdziesz w Dokumentacji Pine. Zobacz jak to działa w poniższym kodzie. To jest nasz wbudowany wskaźnik Average True Range, który teraz używa instrukcji switch, aby zapewnić różne algorytmy wygładzania w swoich obliczeniach:

//@version=5
indicator(title="Average True Range", shorttitle="ATR", timeframe="")
lengthInput = input.int(title="Length", defval=14, minval=1)
smoothingInput = input.string(title="Smoothing", defval="RMA", options = ["RMA", "SMA", "EMA", "WMA"])

maFunction(source, length) =>
    switch smoothingInput
        "RMA" => ta.rma(source, length)
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        => ta.wma(source, length)

plot(maFunction(ta.tr(true), lengthInput), title = "ATR", color=#B71C1C)

KOLEKCJE RYSUNKÓW

Znacząca poprawa jakości życia dla tych, którzy pracują z obiektami rysunkowymi w Pine: nowe zmienne line.all, label.all, box.all, i table.all zawsze zawierają identyfikatory wszystkich rysunków określonego typu narysowanych przez skrypt.

Można go wykorzystać np. do ograniczania liczby rysunków wyświetlanych na wykresie na podstawie zdefiniowanej przez użytkownika wartości. W poniższym skrypcie rysujemy linię na każdym nowym otwarciu dziennym (do limitu ~50, bazując na domyślnym limicie linii w skrypcie). Następnie sprawdzamy, czy liczba linii dozwolonych na podstawie danych wejściowych skryptu została przekroczona i jeśli tak, to usuwamy najstarszą linię:

//@version=5
indicator("Daily Open", overlay = true)

qtyOfLinesInput = input.int(10, "Draw only last n lines", minval = 0, maxval = 50)

if ta.change(time("1D"))
    line.new(bar_index, open, bar_index + 1, open, extend = extend.right)
    if array.size(line.all) > qtyOfLinesInput
        line.delete(array.get(line.all, 0))

While

Kolejną długo oczekiwaną funkcją Pine, która pojawiła się w v5 są pętle while. Instrukcja while tworzy pętlę, która zatrzyma się, gdy warunek jest fałszywy lub gdy w pętli zostanie użyta komenda break.

Jako przykład weźmy wskaźnik, który oblicza różnicę między średnią odległością, na którą musimy spojrzeć wstecz, aby znaleźć wolumen wzrostowy i spadkowy, równy całkowitej głośności ostatnich n słupków. Im dalej musimy spojrzeć wstecz, aby znaleźć rosnący lub spadający wolumen, tym bardziej niedźwiedzia lub bycza będzie jego wartość:

//@version=5
var int MAX_BARS_BACK = 500
indicator("Volume bias", max_bars_back = MAX_BARS_BACK)

int lookBackInput = input.int(20, "Volume Look Back (bars)", minval = 2, maxval = int(MAX_BARS_BACK / 4))

// Stop the script if the chart does not contain volume data.
bool noVol = na(volume) and nz(math.sum(nz(volume), 200) == 0, true)
if noVol
    runtime.error("No volume data.")

volumeBias(lookBack, maxLookBack) =>
    bool  barUp = ta.rising(close, 1)
    bool  barDn = ta.falling(close, 1)
    float upVolume = 0.
    float dnVolume = 0.
    float avgVolume = math.sum(nz(volume), lookBack)
    int[] upBarNos = array.new_int(0)
    int[] dnBarNos = array.new_int(0)
    int   bar = 1
    bool  volumeFound = false
    while (not volumeFound) and bar < maxLookBack
        if barUp[bar] and upVolume < avgVolume
            upVolume += nz(volume[bar])
            array.push(upBarNos, bar)
        else if barDn[bar] and dnVolume < avgVolume
            dnVolume += nz(volume[bar])
            array.push(dnBarNos, bar)
        bar += 1
        volumeFound := upVolume >= avgVolume and dnVolume >= avgVolume
    float volumeBias = bar >= maxLookBack ? na : array.avg(dnBarNos) - array.avg(upBarNos)

float bias = volumeBias(lookBackInput, MAX_BARS_BACK)
plot(bias, "Volume Bias", bias > 0 ? color.lime : color.fuchsia)
hline(0)

Pętla while w skrypcie jest wykonywana do momentu znalezienia wymaganego wolumenu (zarówno kupna, jak i sprzedaży) oraz dopóki nie zażądamy danych, które wykraczają poza maksymalną dozwoloną liczbę słupków. Skrypt demonstruje również inną funkcję dodaną w Pine v5: runtime.error().

runtime.error()

Funkcja runtime.error() umożliwia teraz zatrzymanie wykonywania skryptu i wyświetlenie komunikatu o błędzie w oparciu o dowolny warunek, który można zdefiniować w Pine. Przyda się to twórcom skryptów, którzy chcą zapobiec niepoprawnemu użyciu ich wskaźników przez użytkowników. Może być również użyta jako niekonwencjonalne narzędzie do debugowania, aby zatrzymać wykonanie skryptu podczas pętli lub wewnątrz funkcji.

Aby użyć nowej funkcji, wystarczy wywołać funkcję runtime.error(), gdy spełnione zostaną Twoje warunki. Jej wykonanie spowoduje zatrzymanie skryptu i wyświetlenie znanego wykrzyknika obok nazwy wskaźnika. Gdy użytkownik kliknie ikonę wykrzyknika, pojawi się komunikat, którego użyłeś w wywołaniu funkcji.

Poniższy kod jest wskaźnikiem VWAP z dwoma niestandardowymi błędami. Pierwszy z nich pojawia się, gdy symbol nie posiada żadnych danych dotyczących wolumenu: VWAP jest obliczany na podstawie wolumenu, więc jeśli nie ma wolumenu, skrypt nie może działać. Drugi pojawia się, kiedy interwał na wykresie to 1D lub wyższy. Podstawowe obliczenia VWAP kumulują dane średniej kroczącej ważonej wolumenem na każdym nowym słupku i resetują się na początku nowego dnia, więc wskaźnik jest użyteczny tylko na wykresach intraday.

//@version=5
indicator("VWAP with custom errors")
if na(volume) // Will be true on symbols with no volume data e.g. TVC:SPX
    runtime.error("There is no volume data for this symbol.")
else if timeframe.isdwm // Will be true on 1D and higher timeframes
    runtime.error("Session-based VWAP does not show meaningful data on timeframes >= 1D.
     Please switch to a lower timeframe.")
plot(ta.vwap)

NOWE PARAMETRY STRATEGII

Dobra wiadomość dla programistów strategii! Dodaliśmy mnóstwo nowych zmiennych i funkcji, które umożliwiają wyszukiwanie właściwości, statystyk i metryk handlowych. Ich wartości są aktualizowane, gdy emulator brokera wykonuje Twoje zlecenia, dzięki czemu możesz śledzić wartości na całym wykresie.

Kliknij tutaj, aby uzyskać szczegółowe informacje na temat każdej funkcji i zmiennej

strategy.closedtrades.entry_price() / strategy.opentrades.entry_price()

strategy.closedtrades.entry_bar_index() / strategy.opentrades.entry_bar_index()

strategy.closedtrades.entry_time() / strategy.opentrades.entry_time()

strategy.closedtrades.size() / strategy.opentrades.size()

strategy.closedtrades.profit() / strategy.opentrades.profit()

strategy.closedtrades.commission() / strategy.opentrades.commission()

strategy.closedtrades.max_runup() / strategy.opentrades.max_runup()

strategy.closedtrades.max_drawdown() / strategy.opentrades.max_drawdown()

strategy.closedtrades.exit_price()

strategy.closedtrades.exit_bar_index()

strategy.closedtrades.exit_time()

strategy.convert_to_account()

strategy.convert_to_symbol()

strategy.account_currency

 

NOWE PRZESTRZENIE NAZW

Nasza społeczność programistów Pine mówi nam, że docenia bezprecedensowe tempo dodawania nowych funkcji do Pine w ciągu ostatnich kilku lat i zamierzamy utrzymać to samo tempo w przyszłości. To jednak tworzy ciągły strumień nowych funkcji i wbudowanych zmiennych Pine. Aby ułatwić w przyszłości pracę z językiem, musieliśmy lepiej zorganizować ~600 obecnych nazw używanych w Pine. W tym celu dodaliśmy nowe przestrzenie nazw, aby pogrupować funkcje w sposób, który lepiej odzwierciedla ich zastosowanie. Zmieniono również nazwy wielu parametrów funkcji, aby ułatwić ich zrozumienie.

Przykładem nowej przestrzeni nazw jest ta., która zawiera teraz wszystkie zmienne i funkcje związane z analizą techniczną. Ułatwia to przeglądanie Dokumentacji Pine i znajdowanie wszystkich zmiennych i funkcji zwracających wartości popularnych wskaźników. Dlatego sma() nazywa się teraz ta.sma(). Zapamiętanie nowych przestrzeni nazw nie jest konieczne; jeśli wpiszesz w Edytorze starszą nazwę funkcji bez jej przestrzeni nazw i naciśniesz klawisz skrótu Autocomplete (Ctrl + Spacja, lub Cmd + Spacja w systemie MacOS), pojawi się okienko z sugestiami dopasowania: 

To samo dotyczy wyszukiwania w Dokumentacji Pine; wpisanie znanej nazwy funkcji bez jej przestrzeni nazw spowoduje wyświetlenie jej nowej nazwy. Możesz zobaczyć pełną listę zmian do v5 w naszym Przewodniku Migracji.

PRZYKŁADY BIBLIOTEK

Poniższe publikacje są przykładami bibliotek opublikowanych na TradingView przez zespół PineCoders, który pomaga nam testować nowe funkcje Pine:

ColorScheme autorstwa RicardoSantos

Matrix_Functions_Lib_JD autorstwa Duyck

Enchanced_ta autorstwa HeWhoMustNotBeNamed

Mamy nadzieję, że nowe funkcje okażą się dla Ciebie przydatne. Przesyłajcie nam swoje opinie i sugestie — tworzymy TradingView dla Was i z przyjemnością dowiemy się, co myślicie o aktualizacjach naszej platformy.

Look first Then leap

TradingView jest stworzony dla Ciebie. Upewnij się, że w pełni wykorzystujesz nasze niesamowite funkcje
Otwórz wykres