Pierwsze kroki
Skonfiguruj PineBag raz, a następnie przygotuj pierwszy test w ciągu kilku minut.
Potrzebujesz trzech rzeczy
- Google Chrome 116 lub nowszy.
- Zalogowane konto TradingView z dostępem do symboli, które chcesz przetestować.
- Plik Pine Script, który deklaruje
strategy(), nie tylkoindicator().
Zainstaluj i otwórz PineBag
-
Zainstaluj rozszerzenie.
Użyj przycisku instalacji PineBag. Przypnij rozszerzenie, jeśli chcesz mieć szybki dostęp. -
Otwórz wykres TradingView.
Najpierw zaloguj się, a następnie otwórz dowolny obsługiwany rynek i ramy czasowe. -
Załaduj ponownie kartę wykresu.
Zrób to po zainstalowaniu lub aktualizacji PineBag, aby możliwe było połączenie wykresu. -
Otwórz torbę PineBag.
Wybierz ikonę PineBag. Wskaźnik połączenia zmieni kolor na zielony, gdy karta będzie gotowa.
Panel boczny, sterowanie za sterowaniem
Liczby na rzeczywistym interfejsie odpowiadają objaśnieniom. Nic na tym zdjęciu nie jest makietą.
1
2
3
4
5
6
7
8
9
10
11
- 1Strategia
Wczytana strategia. Kliknij kartę, aby otworzyć ją w edytorze; kosz w nagłówku sekcji ją usuwa.
- 2Podsumowanie przebiegu
Ramy czasowe, kapitał, wielkość zamówienia i prowizja, która zostanie wykorzystana.
- 3Szukaj
Otwiera wyszukiwanie symboli TradingView, dzięki czemu możesz dodać ticker zakwalifikowany do giełdy.
- 4Torba na kopie
Kopiuje każdy ticker, jeden
EXCHANGE:SYMBOLw wierszu. - 5Torebka z pastą
Akceptuje linie, przecinki, średniki lub spacje i ignoruje duplikaty.
- 6Wyczyść
Prosi o drugie kliknięcie, kopiuje tickery, a potem czyści listę — „Wklej tickery” ją przywróci.
- 7Tagi giełdowe
Pokazuje aktualną torbę. Użyj ×, aby usunąć jeden symbol; dodaj do 500.
- 8Uruchom backtest
Zatwierdza konfigurację i rozpoczyna sekwencyjne uruchamianie portfela.
- 9Raporty
Zapisz lokalnie 50 ostatnich raportów i wyeksportuj JSON lub CSV.
- 10Pozostało dni
Active days: 05— Pozostało dni. - 11Wsparcie
Dostępna jest pomoc techniczna, rozliczeniowa, licencyjna i dotycząca prywatności.
Załaduj strategię
- Wybierz źródło.
Upuść a.pinedo Strategy lub otwórz Edytor i wklej kod. - Napraw każdy komunikat weryfikacyjny.
Skrypt musi zawieraćstrategy(). PineBag pokazuje wyraźny błąd, jeśli nie można go użyć. - Sprawdź podsumowanie.
Potwierdź nazwę skryptu, ramy czasowe, kapitał i wielkość zamówienia pokazane powyżej Uruchom.
indicator(), przekonwertuj go na strategię przed uruchomieniem PineBag.Szablon strategii
Każde pole zakładki Properties w TradingView odpowiada argumentowi strategy(). Trzymaj wartości jako nazwane stałe na początku skryptu: z priorytetem skryptu każdy ticker jest testowany przy tych samych założeniach.
TIMEFRAMEInterwał
INITIAL_CAPITAL · CURRENCYKapitał początkowy
ORDER_SIZE · ORDER_SIZE_TYPEDomyślna wielkość zlecenia
PYRAMIDINGPiramidowanie
BAR_MAGNIFIERSzczegółowość świec
CALC_EVERY_TICK · CALC_ON_FILLSWykonanie skryptu
COMMISSION · COMMISSION_TYPEProwizja
MARGIN_LONG · MARGIN_SHORTDźwignia dla long i short
SLIPPAGEPoślizg
LIMIT_FILL_TICKSRealizacja zleceń limit
FILL_ON_BAR_CLOSEOpóźnienie realizacji zleceń
runtime.error()Zatrzymuje skrypt na każdym innym interwale.
//@version=6
// ============================================================================
// Trend breakout · ATR risk — PineBag strategy template
// ============================================================================
// ----------------------------------------------------------------------------
// STRATEGY PROPERTIES (TradingView: Settings → Properties)
// ----------------------------------------------------------------------------
// TIMEFRAME takes a standard TradingView interval. Paste one of these, by the
// lowest TradingView plan that has it (tradingview.com/pricing, Charts):
// Basic days "1D" "1W" "1M" "3M" "6M" "12M"
// Essential minutes "1" "3" "5" "15" "30" "45"
// hours "60" "120" "180" "240"
// ranges "1R" "10R" "100R" "1000R"
// Premium seconds "1S" "5S" "10S" "15S" "30S" "45S"
// Ultimate ticks "1T" "10T" "100T" "1000T"
// Other intervals are custom and not used: a week is "1W", not "7D".
const string TIMEFRAME = "1D" // Chart timeframe
const float INITIAL_CAPITAL = 100000 // Initial capital
const string CURRENCY = currency.USD // Initial capital currency
const float ORDER_SIZE = 100 // Default order size
const string ORDER_SIZE_TYPE = strategy.percent_of_equity // Order size: % of equity
const int PYRAMIDING = 1 // Pyramiding
const bool BAR_MAGNIFIER = false // Bar detalization: Default (4 ticks per bar)
const bool CALC_EVERY_TICK = false // Script execution: On bar close
const bool CALC_ON_FILLS = false // Script execution: no recalculation after fills
const float COMMISSION = 0 // Commission
const string COMMISSION_TYPE = strategy.commission.percent // Commission: Percent
const float MARGIN_LONG = 100 // Long leverage 1x (leverage = 100 / margin)
const float MARGIN_SHORT = 100 // Short leverage 1x
const int SLIPPAGE = 0 // Slippage, ticks
const int LIMIT_FILL_TICKS = 0 // Limit order execution: Requested price
const bool FILL_ON_BAR_CLOSE = false // Order execution delay: One tick
strategy("Trend breakout · ATR risk", overlay = true,
initial_capital = INITIAL_CAPITAL,
currency = CURRENCY,
default_qty_type = ORDER_SIZE_TYPE,
default_qty_value = ORDER_SIZE,
pyramiding = PYRAMIDING,
use_bar_magnifier = BAR_MAGNIFIER,
calc_on_every_tick = CALC_EVERY_TICK,
calc_on_order_fills = CALC_ON_FILLS,
commission_type = COMMISSION_TYPE,
commission_value = COMMISSION,
margin_long = MARGIN_LONG,
margin_short = MARGIN_SHORT,
slippage = SLIPPAGE,
backtest_fill_limits_assumption = LIMIT_FILL_TICKS,
process_orders_on_close = FILL_ON_BAR_CLOSE)
// Stops with a clear message on any other timeframe; PineBag reads TIMEFRAME
// and selects it for the run.
if timeframe.period != TIMEFRAME
runtime.error("Switch the chart to the " + TIMEFRAME + " timeframe.")
// ----------------------------------------------------------------------------
// INPUT SETTINGS (TradingView: Settings → Inputs)
// ----------------------------------------------------------------------------
fastLength = input.int(20, "Fast EMA", minval = 1)
slowLength = input.int(50, "Slow EMA", minval = 2)
breakoutLength = input.int(20, "Breakout lookback", minval = 2)
atrLength = input.int(14, "ATR length", minval = 1)
atrStop = input.float(2.0, "ATR stop multiplier", minval = 0.1, step = 0.1)
// ----------------------------------------------------------------------------
// CALCULATIONS
// ----------------------------------------------------------------------------
fast = ta.ema(close, fastLength)
slow = ta.ema(close, slowLength)
atr = ta.atr(atrLength)
highestBefore = ta.highest(high, breakoutLength)[1]
// ----------------------------------------------------------------------------
// ENTRIES AND EXITS
// ----------------------------------------------------------------------------
longSignal = fast > slow and close > highestBefore
if longSignal and strategy.position_size == 0
strategy.entry("Long", strategy.long)
stopPrice = strategy.position_avg_price - atr * atrStop
strategy.exit("ATR stop", "Long", stop = stopPrice)
// ----------------------------------------------------------------------------
// PLOTS
// ----------------------------------------------------------------------------
plot(fast, "Fast EMA", color = color.rgb(0, 153, 255))
plot(slow, "Slow EMA", color = color.rgb(123, 97, 255))
Wartości TIMEFRAME
Wpisz w cudzysłowie jeden ze standardowych interwałów TradingView. To, które się wczytają, zależy od Twojego planu TradingView, zgodnie z tradingview.com/pricing.
Dni, tygodnie i miesiące.
"1D" "1W" "1M" "3M" "6M" "12M"
Minuty, godziny i świece zakresowe. Minuty nie mają litery; jedna godzina to 60.
"1" "3" "5" "15" "30" "45""60" "120" "180" "240""1R" "10R" "100R" "1000R"
Interwały sekundowe.
"1S" "5S" "10S" "15S" "30S" "45S"
Interwały tickowe.
"1T" "10T" "100T" "1000T"
const string TIMEFRAME = "1D" // 1 day
// const string TIMEFRAME = "1W" // 1 week
// const string TIMEFRAME = "240" // 4 hours
// const string TIMEFRAME = "15" // 15 minutes
// const string TIMEFRAME = "30S" // 30 seconds, Premium and higher
Wielkość zlecenia: procent, kwota lub ilość
ORDER_SIZE zawiera liczbę, a ORDER_SIZE_TYPE określa, co ona oznacza. Razem wypełniają pole Order size na karcie Properties w TradingView.
strategy.percent_of_equity
Procent bieżącego kapitału. 10 oznacza 10% kapitału na transakcję.
strategy.cash
Kwota w walucie strategii. 1000 oznacza 1000 USD na transakcję.
strategy.fixed
Liczba kontraktów, akcji lub monet. 0.5 oznacza 0,5 BTC na transakcję.
qty = …
Domyślna wielkość dotyczy tylko zleceń bez własnego qty. Wejście z qty = … używa tej wartości.
// 10% of equity per trade
const float ORDER_SIZE = 10
const string ORDER_SIZE_TYPE = strategy.percent_of_equity
// 1,000 USD per trade (CURRENCY = currency.USD)
// const float ORDER_SIZE = 1000
// const string ORDER_SIZE_TYPE = strategy.cash
// 0.5 contracts, shares or coins per trade
// const float ORDER_SIZE = 0.5
// const string ORDER_SIZE_TYPE = strategy.fixed
Własne zmienne
Ustawienia własnej logiki strategii trzymaj w osobnym bloku INPUT SETTINGS. Każde wywołanie input.int(), input.float() lub input.bool() staje się polem w zakładce Inputs w TradingView, więc możesz je zmieniać bez edycji kodu.
// ----------------------------------------------------------------------------
// INPUT SETTINGS (TradingView: Settings → Inputs)
// ----------------------------------------------------------------------------
fastLength = input.int(20, "Fast EMA", minval = 1)
slowLength = input.int(50, "Slow EMA", minval = 2)
breakoutLength = input.int(20, "Breakout lookback", minval = 2)
atrLength = input.int(14, "ATR length", minval = 1)
atrStop = input.float(2.0, "ATR stop multiplier", minval = 0.1, step = 0.1)