Moduł 1 z 2
TradingView Pine Script od Zera
Pine Script to najszybsze laboratorium dla tradera systemowego. W 20 linijkach możesz przetestować pomysł, który w Excelu zająłby 2 godziny, a w Pythonie wymagałby pobierania danych. To nie jest język do pisania botów HFT. To jest język do szybkiej weryfikacji hipotez,...
- Autor
- Zordon Intelligence Sp. z o.o.
- Aktualizacja
- Czas czytania
- 7 min
- Źródła
- 2
Wstęp
Pine Script to najszybsze laboratorium dla tradera systemowego. W 20 linijkach możesz przetestować pomysł, który w Excelu zająłby 2 godziny, a w Pythonie wymagałby pobierania danych. To nie jest język do pisania botów HFT. To jest język do szybkiej weryfikacji hipotez, wizualizacji reguł i budowy prototypu systemu przed głębszym backtestem.
W tej lekcji nauczysz się Pine Script v5 od zera w ujęciu systemowym: jak pisać strategię zamiast wskaźnika, jak mierzyć R, jak uniknąć błędów które fałszują backtest i jak zbudować szablon, który będziesz używał w każdej kolejnej lekcji.
Pine Script - fundamenty których nie pomijaj
Pine ma 4 stany pracy: wskaźnik (indicator), strategia (strategy), biblioteka (library). Dla tradera systemowego interesuje nas strategy. Tylko ona ma silnik broker emulatora, zlecenia, statystyki.
//@version=5
strategy("Moj Pierwszy System - Kurs 21", overlay=true, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.05, slippage=1)
//@version=5
strategy("SMA Cross Template", overlay=true, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.05)
fastLen = input.int(20, "Fast SMA")
slowLen = input.int(50, "Slow SMA")
riskPct = input.float(1.0, "Risk % per trade", step=0.1)
fast = ta.sma(close, fastLen)
slow = ta.sma(close, slowLen)
longCondition = ta.crossover(fast, slow)
shortCondition = ta.crossunder(fast, slow)
// Ryzyko w R - szablon
atr = ta.atr(14)
stopDistance = atr * 1.5
if (longCondition)
strategy.entry("Long", strategy.long)
strategy.exit("Long Exit", from_entry="Long", stop=close - stopDistance, limit=close + stopDistance*2)
if (shortCondition)
strategy.entry("Short", strategy.short)
strategy.exit("Short Exit", from_entry="Short", stop=close + stopDistance, limit=close + stopDistance*2)
Kluczowe parametry w strategy():
| Parametr | Dlaczego ważny |
|---|---|
commission_type + commission_value | Bez tego backtest jest fikcją. Ustaw 0.05% dla akcji/ETF, 0.02-0.04% dla futures/crypto |
slippage | 1-2 ticki. Bez poślizgu każdy system na M1-M5 wygląda zyskownie |
initial_capital | Potrzebny do % risk, ale nie używaj go do oceny w PLN, tylko R i % |
pyramiding | Domyślnie 0. Zostaw 0 dopóki nie masz kontroli nad pozycją |
calc_on_every_tick vs calc_on_order_fills | Zostaw false na start, inaczej wprowadzisz lookahead |
Wejście, stop loss i wyjście w R
W Pine większość nowicjuszy pisze tylko strategy.entry. System bez zdefiniowanego SL i TP to nie system.
Prawidłowy szablon:
// Definicja ryzyka R
atrLen = input.int(14, "ATR Length")
atrMultSL = input.float(1.5, "ATR SL")
atrMultTP = input.float(3.0, "ATR TP")
atrVal = ta.atr(atrLen)
longSL = close - atrVal*atrMultSL
longTP = close + atrVal*atrMultTP
// Warunek wejścia z kontekstem
trendFilter = close > ta.sma(close, 200)
pullback = close < ta.sma(close, 20)
longSignal = trendFilter and pullback and ta.rsi(close,14) < 40
if (longSignal and strategy.position_size == 0)
strategy.entry("Long", strategy.long)
// R zdefiniowane przez odległość SL
strategy.exit("L-Exit", from_entry="Long", stop=longSL, limit=longTP, comment_profit="TP 2R", comment_loss="SL 1R")
Formuła R w Pine:
R_multiple = (close - entry_price) / (entry_price - stop_price) dla longa
Przechowuj entry_price = strategy.position_avg_price
Dzięki temu w Performance Summary zobaczysz nie tylko $ ale też możesz wyeksportować R.
Jak uniknąć repaint i lookahead
To jest 90% fałszywych backtestów w TradingView.
- Repaint wskaźnika: wskaźnik zmienia wartość historyczną po fakcie. Np. ZigZag, niektóre Volume Profile.
- Repaint strategii: używasz
request.securityzlookahead=barmerge.lookahead_onlub bezbarstate.isconfirmed. - Bar close vs open: Domyślnie strategia liczy na zamknięciu bara. Wejście na
closew backteście jest nierealne na M1 w realu.
Zasady anty-repaint:
| Błąd | Poprawka |
|---|---|
close w warunku i entry na tym samym barze | Używaj barstate.isconfirmed i process_orders_on_close=false lub entry na open next bar |
request.security(sym, "D", close, lookahead=on) | Zawsze lookahead=barmerge.lookahead_off dla strategii |
ta.highest(high, 10) bez offsetu | Jeśli wejście ma być po wybiciu high[1], używaj high[1] nie high |
| Wskaźnik maluje przeszłość | Testuj w Replay Mode bar po barze, patrz czy sygnał znika |
// Bezpieczny higher timeframe bez lookahead
htfClose = request.security(syminfo.tickerid, "60", close, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
htfTrend = htfClose > request.security(syminfo.tickerid, "60", ta.sma(close,50), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
Pomiar systemu w Pine - co eksportować
Pine ma strategy.* wbudowane:
Wbudowane metryki:
strategy.wintrades, strategy.losstrades, strategy.wintrades / strategy.closedtrades
strategy.grossprofit, strategy.grossloss, strategy.netprofit
strategy.max_drawdown, strategy.openprofit
Dodaj własne logowanie R:
// Logowanie R po zamknięciu transakcji
var float totalR = 0.0
if (strategy.closedtrades > strategy.closedtrades[1])
lastProfit = strategy.closedtrades.profit(strategy.closedtrades - 1)
lastEntry = strategy.closedtrades.entry_price(strategy.closedtrades - 1)
// Przybliżone R jeśli masz stały ATR SL, w realu licz z zachowanego SL
r = lastProfit / (atrVal*atrMultSL * syminfo.pointvalue)
totalR += r
Eksport: zakładka Performance Summary -> Export -> analizuj w Excelu (Lekcja 4) aby policzyć PF, SQN, EV w R.
Kiedy plan mówi nie handluj
- Gdy używasz
calc_on_every_tick=trueilookahead_on: Twój backtest jest fałszywy. Napraw kod, nie handluj. - Gdy testujesz strategię na < 200 barach na interwale decyzyjnym: Za mało by ocenić dystrybucję. Dla H1 to ~ 1 miesiąc danych - za mało.
- Gdy prowizja = 0 i slippage = 0 w ustawieniach: Każda strategia wygląda dobrze. Ustaw realne koszty przed oceną.
- Gdy sygnał występuje 5 razy na jednej świecy w Replay: Masz repaint. Pauza do naprawy.
- Gdy piszesz strategię bez
strategy.exitze SL: To nie jest system, tylko generator wejść. Brak kontroli R.
Błędy które kosztują najwięcej
- Pisanie wskaźnika zamiast strategii. Wskaźnik maluje strzałki, strategia ma silnik pozycji. Jeśli nie używasz
strategy.*, nie mierzysz edge. securitybez zabezpieczeń. Jeden błędnyrequest.securityz lookahead potrafi dodać +30% do equity curve z powietrza.- Optymalizacja w oknie Inputs bez OOS. Przesuwanie SMA 20->21->22 żeby krzywa rosła to overfitting. Każdy parametr musi mieć logiczne uzasadnienie poza Pine.
- Brak warunku
strategy.position_size == 0. System otwiera 10 pozycji piramidujących i fałszuje drawdown i PF. - Ufanie List of Trades zamiast eksportu do Excela. TradingView liczy inaczej niż broker. PF w TV jest brutto bez poślizgu na stopach. Zawsze eksport + własny audyt.
Ćwiczenie mierzalne
Cel: Zbudować szablon strategii R i przejść test anty-repaint.
Zadanie 60 min:
- Skopiuj szablon z lekcji (SMA Cross + ATR SL/TP + filtr SMA200).
- Ustaw w Properties: commission 0.05%, slippage 2 ticki, initial capital 10000.
- Na BTCUSD H1 dodaj strategię. Uruchom TradingView Bar Replay od 2023-01-01. Przejdź 100 barów ręcznie - sprawdź czy sygnały się nie przemieszczają.
- Wyeksportuj Performance Summary do CSV.
- Policz w Excelu:
N = liczba transakcji
WinRate = wygrane / N
AvgR = średnia R (zysk / ryzyko ATR)
PF = suma zysków / |suma strat|
- Jeśli PF < 1.2 - nie optymalizuj na siłę. Zanotuj: “To nie jest edge, to prototyp”. To jest poprawny wynik ćwiczenia.
Sprawdź się
- Czym różni się
indicator()odstrategy()i dlaczego tylko strategy ma sens dla backtestu systemowego? - Co robi
lookahead=barmerge.lookahead_oni dlaczego jest zakazany w systemach? - Dlaczego musisz ustawić commission i slippage zanim ocenisz system?
- Napisz w 2 linijkach: jak zdefiniować SL jako 1.5 ATR w Pine v5 i jak wyliczyć R-multiple pozycji.
- Masz 3 sygnały long na tej samej świecy w historii - co jest błędem w kodzie i jak go naprawić?
Częste pytania
Czy Pine Script wystarczy do zarabiania? Pine służy do prototypowania i walidacji pomysłów, nie do HFT. Dla swing D1/H1 i prostych botów przez webhook jest wystarczający. Dla M1 z mikrostrukturą potrzebujesz Pythona i dedykowanego silnika.
Czy mogę handlować automatycznie bezpośrednio z TradingView? TradingView nie wysyła zleceń na giełdę sam. Wysyła alert webhook który musisz przechwycić botem, brokerem który ma integrację TV (np. na futures) lub mostkiem. Sama strzałka to nie automat.
Jak duży code może być w Pine zanim zwolni?
Limit 64KB skryptu, 900 linii efektywnie, max 64 security. Dla systemu 2-3 filtry + ATR + jeden HTF to ok. Jeśli piszesz 10 wskaźników i 5 HTF - przepisz do Pythona.
Czy strategia w Pine może używać danych z innych giełd?
Tak przez request.security("BINANCE:BTCUSDT", ...). Ale wtedy dodajesz ryzyko korelacji danych i lookahead. Testuj tylko na tym samym tickerze na którym handlujesz.
Gdzie trzymać wersje strategii? Używaj “Save as” z numerem wersji: v01_raw, v02_costs, v03_no_repaint. Każdy test eksportuj do CSV z datą. Bez wersjonowania nie wrócisz do działającej wersji po overfittowaniu.
Reklama
Najważniejsze wnioski
- Pine Script to najszybsze laboratorium dla tradera systemowego. W 20 linijkach możesz przetestować pomysł, który w Excelu zająłby 2 godziny, a w Pythonie wymagałby pobierania danych. To nie jest język do pisania botów HFT. To jest język do szybkiej weryfikacji hipotez,...
Źródła i dokumenty
Materiał opieramy na dokumentach źródłowych. Wartości zmienne — opłaty, limity, wskaźniki regulacyjne — sprawdź u źródła przed podjęciem decyzji.
- TradingView — Pine Script reference
- Python for Finance — Yves Hilpisch
Zastrzeżenie
- KursTradera.pl to serwis edukacyjny o charakterze informacyjnym. Nie prowadzimy działalności maklerskiej, nie przyjmujemy i nie przekazujemy zleceń, nie zarządzamy portfelem, nie oferujemy instrumentów finansowych i nie świadczymy usług doradztwa inwestycyjnego w rozumieniu ustawy o obrocie instrumentami finansowymi. Materiały opisują mechanizmy rynkowe i proces decyzyjny — nie są instrukcją kupna lub sprzedaży jakiegokolwiek instrumentu.
- Żadna z publikowanych treści nie stanowi rekomendacji inwestycyjnej, informacji rekomendującej ani rekomendacji w rozumieniu Rozporządzenia Parlamentu Europejskiego i Rady (UE) nr 596/2014 (MAR) oraz aktów wykonawczych. Nie jest też ofertą nabycia lub zbycia instrumentów finansowych ani zaproszeniem do składania ofert. Wszelkie przykłady, wykresy, zrzuty ekranu i liczby mają charakter ilustracyjny i odnoszą się do sytuacji hipotetycznych lub historycznych.
- Inwestowanie i trading wiążą się z ryzykiem utraty części lub całości zainwestowanego kapitału. Wyniki osiągnięte w przeszłości — w tym wyniki przedstawione w materiałach edukacyjnych, backtestach i przykładach — nie gwarantują wyników przyszłych i nie są ich wiarygodnym wskaźnikiem. Żadna opisana metoda ani strategia nie eliminuje ryzyka. Decyzje inwestycyjne podejmujesz samodzielnie, na własną odpowiedzialność i po zapoznaniu się z aktualnymi dokumentami swojego brokera.
- Instrumenty z dźwignią (CFD, kontrakty terminowe, opcje, transakcje typu margin) mogą generować straty przewyższające wartość wpłaconych środków — możesz stracić więcej, niż zainwestowałeś, i zostać wezwanym do uzupełnienia depozytu (margin call). W Unii Europejskiej dźwignia dla klientów detalicznych handlujących CFD na głównych parach walutowych jest ograniczona decyzją ESMA (interwencja produktowa w sprawie CFD i opcji binarnych), ale ograniczenie dźwigni nie usuwa ryzyka. Odsetek rachunków detalicznych przynoszących straty różni się między brokerami i zmienia się w czasie — aktualną wartość odczytaj z ostrzeżenia ryzyka u swojego brokera i zapisz razem z datą.
- Backtesty, symulacje i przykładowe wyniki nie są rzeczywistymi wynikami transakcyjnymi. Powstają w warunkach odtwarzanych z danych historycznych, nie uwzględniają w pełni poślizgu cenowego, płynności, spreadu, prowizji, swapu, wpływu własnych zleceń na rynek ani czynnika psychologicznego — a wszystkie te elementy pogarszają wynik w praktyce. Wyniki historyczne nie chronią przed przyszłymi stratami.
Kto to pisze i jak to sprawdzamy
Materiały pisze i weryfikuje Redakcja Kurs Tradera — zasady opisuje o serwisie: każda liczba ma źródło, a braki pokazujemy jawnie. Błąd merytoryczny zgłosisz przez kontakt — poprawki opisujemy w treści.
Postęp zapisujemy wyłącznie w tej przeglądarce (localStorage) — nie ma konta ani kopii na serwerze. Wyczyszczenie danych witryny go usunie. Zarządzaj swoimi danymi