Dziś z radością ogłaszamy premierę Pine Script® v6! Ta zaktualizowana wersja naszego języka programowania dla traderów zawiera szereg optymalizacji i długo oczekiwanych ulepszeń funkcji, które zwiększają efektywność i użyteczność dla programistów Pine Script®. Nowa wersja wyznacza kierunek dalszego rozwoju języka, otwierając nowe możliwości.
W tym artykule przedstawiamy kilka najważniejszych nowości w Pine v6. Szczegóły dotyczące zmian znajdziesz w sekcji Informacje o wydaniu, gdzie również możesz śledzić kolejne aktualizacje.
Narzędzie konwersji do v6
Podobnie jak w przypadku wcześniejszych wersji, aktualizacja do Pine v6 nie wpływa na osobiste ani opublikowane skrypty napisane w poprzednich wersjach. Wszystkie nowe funkcje będą dostępne wyłącznie w najnowszej wersji Pine, dlatego zalecamy konwersję skryptów do v6, jeśli chcesz korzystać z nowych możliwości. Najprostszym sposobem jest użycie nowego narzędzia konwersji do v6, które znajdziesz w menu Pine Editor pod opcją Manage script – wybierz Convert code to v6.
Warto jednak pamiętać, że nie wszystkie skrypty mogą być automatycznie przekształcone do v6. W niektórych przypadkach konieczne będą ręczne poprawki, aby upewnić się, że skrypt działa zgodnie z oczekiwaniami. Jeśli napotkasz problemy z automatyczną konwersją lub preferujesz ręczne przekształcanie, zajrzyj do naszego praktycznego Przewodnika po migracji.
Dynamiczne zapytania
TradingView zapewnia dostęp do dziesiątek tysięcy symboli dla instrumentów handlowych, wskaźników finansowych i wskaźników ekonomicznych z całego świata. Rodzina funkcji request.*() umożliwia skryptom Pine pobieranie danych dla dowolnego dostępnego symbolu w różnych ramach czasowych, niezależnie od symbolu i ramy czasowej używanej przez wykres.
Te funkcje to potężne narzędzia o licznych przypadkach użycia. Jednak wcześniej miały znaczące ograniczenie: wymagały użycia wartości „prostego ciągu” w celu określenia symbolu i przedziału czasowego żądania, co oznaczało, że kontekst musiał być znany w pierwszym takcie i nie mógł zostać zmieniony później. Ponadto wszystkie wywołania request.*() były zmuszane do wykonywania ściśle w globalnym zakresie skryptu. Innymi słowy, każda pojedyncza instancja request.*() w kodzie mogła pobierać dane tylko dla jednego symbolu i przedziału czasowego, a żadne wywołania request.*() nie były dozwolone wewnątrz pętli, struktur warunkowych ani eksportowanych funkcji bibliotecznych.
W Pine Script® v6 usunęliśmy te ograniczenia. Teraz skrypty mogą używać wartości „ciągu serii” do definiowania kontekstu dowolnego wywołania request.*(). Ponadto wywołania request.*() są teraz dozwolone w zakresach lokalnych. Dzięki tym zmianom możesz obliczać lub modyfikować symbole na dowolnym pasku historycznym i dynamicznie żądać ich danych, tworzyć zbiory symboli i pobierać ich dane w pętlach oraz wykonywać wiele innych czynności za pomocą funkcji request.*() , które wcześniej nie były możliwe. Aby dowiedzieć się więcej, zapoznaj się z sekcją Żądania dynamiczne w naszym Podręczniku użytkownika.
Przykład tego, co możesz zrobić z dynamicznymi żądaniami, znajdziesz w wewnętrznym działaniu wbudowanego wskaźnika Performance. Dzieli on listy symboli i ciągów ram czasowych rozdzielonych przecinkami na tablice, a następnie wywołuje request.security() dynamicznie wewnątrz pętli, aby pobrać wartości z każdego zestawu danych. W przeszłości skrypt tego typu wymagałby wielu wywołań input.symbol() i input.timeframe(), a każda kombinacja symbolu i ramy czasowej wymagałaby oddzielnego wywołania request.security() w kodzie:
Aby uzyskać dodatkowe informacje, zapoznaj się z tymi skryptami opublikowanymi na koncie TradingView, które również wykorzystują dynamiczne żądania w celu pobierania danych z innych kontekstów.
- Forex Heatmap. Ten wskaźnik tworzy identyfikatory tickerów dla kombinacji par walutowych na podstawie określonej przez użytkownika listy kodów walutowych. Dynamicznie żąda danych dla każdej kombinacji par w pętlach, a następnie używa danych do wypełnienia tabeli kodowanej kolorami.
- Ticker Tape. Ten wskaźnik tworzy tablicę identyfikatorów tickerów z listy symboli zdefiniowanej przez użytkownika. Dynamicznie żąda informacji o cenie i dziennej zmianie dla każdego identyfikatora tickera z tablicy w pętli, a następnie używa danych do aktualizacji obrotowego wyświetlacza „taśmy”.
- LibraryCOT. Wcześniej ta biblioteka udostępniała tylko narzędzia do tworzenia identyfikatorów tickerów w celu żądania danych CFTC Commitment of Traders (COT), ponieważ biblioteki nie mogły eksportować funkcji zawierających wywołania request.*(). W przypadku żądań dynamicznych to ograniczenie już nie obowiązuje. Biblioteka eksportuje teraz funkcję requestCommitmentOfTraders(), która wywołuje wewnętrznie request.security() w celu bezpośredniego pobrania danych COT, zapewniając programistom większą wygodę i wszechstronność.
Ponadto wszystkie kody raportów CFTC były wcześniej przechowywane wewnątrz instrukcji switch, aby zwracać „proste” wartości, co znacznie ograniczało tickery dostępne dla żądania. W przypadku dynamicznych żądań identyfikatory tickerów „prostego ciągu” nie są już wymagane, co pozwala bibliotece przechowywać kody raportów na mapie i zapewnia obsługę większej liczby symboli.
Boolean optimization
Jedno z najbardziej godnych uwagi ulepszeń w Pine Script® v6 może nie być widoczne na pierwszy rzut oka, ale prawdopodobnie zauważysz różnicę w wydajności kodu. Przerobiliśmy wewnętrzną implementację wartości „bool” w Pine i wprowadziliśmy ocenę zwarciową (lub „leniwą”), umożliwiając operacjom and i or zatrzymanie oceny dalszych wyrażeń, gdy nie są one wymagane do określenia wyniku.
These changes improve the performance of most scripts on TradingView. The difference in efficiency is especially noticeable with relatively large scripts that rely heavily on conditions and use many „bool” values, as we confirmed in our tests on some of the most popular open-source Community scripts.
Jako bonus, leniwa ocena „bool” często pozwala na czystszy, bardziej zwięzły kod. Na przykład, jeśli masz warunek, który polega na elementach z tablicy, możesz musieć sprawdzić rozmiar tablicy, aby upewnić się, że indeks elementu istnieje, ponieważ skrypt zatrzyma się i zgłosi błąd, jeśli indeks będzie poza zakresem. Pine v6, z jej leniwą oceną, pozwala na utworzenie pojedynczego wyrażenia warunkowego, które sprawdza tablicę przed próbą dostępu do elementu, co nie było możliwe w v5.
//@version=6 indicator("Lazy evaluation demo") //@variable A "bool" array without a fixed size. array<bool> myArray = array.new<bool>() // Push a new value into `myArray` when the `close` is above the `open`. if close > open myArray.push(true) // Line 13 causes an error in v5 because `myArray.first()` always executes, even if the first expression is `false`. // It works in v6 though because `myArray.first()` executes only if the first expression evaluates to `true`. if myArray.size() != 0 and myArray.first() label.new(bar_index, high, "Test")
Rozmiar i formatowanie tekstu
Wszystkie typy rysunków wyświetlające tekst (pola, etykiety i tabele) mogą teraz używać rozmiarów tekstu określonych w punktach typograficznych — tych samych punktach, które są używane w standardowych edytorach tekstu. Wcześniej trzeba było wybierać między dowolnymi stałymi size.*, takimi jak size.large (24) i size.huge (36). Teraz, dzięki nowej specyfikacji punktów typograficznych, możesz mieć pewność, że rozmiar tekstu będzie dokładnie taki, jakiego chcesz. Możesz nawet tworzyć ogromne rozmiary tekstu, których nie można było osiągnąć w poprzednich wersjach Pine.
Dodatkowo wprowadziliśmy dla tych typów rysunków nowy parametr text_formatting, za pomocą którego można zmienić styl tekstu na kursywę, pogrubienie lub oba te style.
//@version=6 indicator("Text size showcase", overlay = true) var t = table.new(position.bottom_center, 1, 2, bgcolor = color.yellow, frame_color = color.black, frame_width = 1) if barstate.islastconfirmedhistory t.cell(0, 0, "text_size = size.huge", text_size = size.huge) t.cell(0, 1, "text_size = 60, bold & italicized", text_size = 60, text_formatting = text.format_bold + text.format_italic)
Strategy order trimming
Aktywni użytkownicy skryptu strategii mogą wiedzieć, że w Pine v5 strategia może symulować do 9000 transakcji przed zatrzymaniem obliczeń i wygenerowaniem błędu, chyba że używasz trybu Deep Backtesting. To ograniczenie jest szczególnie niewygodne w przypadku strategii, które symulują częste transakcje i tworzą wyzwalacze alertów.
W Pine Script® v6 strategie nie zatrzymują już obliczeń ani nie zgłaszają błędu po osiągnięciu limitu 9000 transakcji. Zamiast tego strategia przycina najstarsze zlecenia, aby zrobić miejsce na nowe. Przycięte zlecenia nie pojawiają się w Testerze Strategii, ale strategia kontynuuje obliczenia bez problemu. Aby sprawdzić indeks transakcji najstarszego nieprzyciętego zlecenia, możesz użyć nowej zmiennej strategy.closedtrades.first_index. Indeksu można używać jako argumentu trade_num w wywołaniach funkcji strategy.closedtrades.*().
Indeksy tablic ujemnych
W Pine v6 funkcje array.get(), array.set(), array.insert() i array.remove() mogą teraz akceptować ujemne argumenty index w celu odwołania się do elementów, zaczynając od końca tablicy, co zapewnia bardziej zwięzły, wygodny sposób odwoływania się do elementów tablicy w odwrotnej kolejności. Na przykład wywołanie array.get(myArray, -2) pobiera przedostatni element w myArray, co jest równoważne z array.get(myArray, array.size(myArray) – 2).
Aby być na bieżąco z najnowszymi ulepszeniami w środowisku Pine Script®, śledź Notatki o wydaniu w Podręczniku użytkownika — jego sekcja dotycząca wersji 6 zawiera nawet dodatkowe zmiany, które nie zostały uwzględnione w tym wpisie na blogu.
Mamy nadzieję, że te funkcje okażą się dla Ciebie tak przydatne, jak nam się wydaje, i prosimy o dalsze przesyłanie nam opinii i sugestii, abyśmy mogli uczynić platformę najlepszą, jaką tylko można. Tworzymy TradingView dla Ciebie i zawsze chętnie wysłuchamy Twoich opinii.
— Zespół TradingView