Начало работы
Настройте PineBag один раз, а затем подготовьтесь к первому тесту за несколько минут.
Вам нужны три вещи
- Google Chrome 116 или более поздней версии.
- Войти в учетную запись TradingView с доступом к символам, которые вы хотите протестировать.
- Файл Pine Script, который объявляет
strategy(), не толькоindicator().
Установите и откройте PineBag
-
Установите расширение.
Используйте кнопку установки PineBag. Закрепите расширение, если вам нужен быстрый доступ. -
Откройте диаграмму TradingView.
Сначала войдите в систему, затем откройте любой поддерживаемый рынок и таймфрейм. -
Обновите вкладку диаграммы.
Сделайте это после установки или обновления PineBag, чтобы график мог подключиться. -
Открыть PineBag.
Выберите значок PineBag. Когда диаграмма будет готова, индикатор подключения станет зеленым.
Боковая панель, управление с помощью элементов управления
Числа в реальном интерфейсе соответствуют пояснениям. Ничто на этом изображении не является макетом.
1
2
3
4
5
6
7
8
9
10
11
- 1Стратегия
Загруженная стратегия. Нажмите на карточку, чтобы открыть её в редакторе; корзина в заголовке раздела удаляет её.
- 2Выполнить сводку
Период, капитал, размер ордера и комиссия, которые будут использоваться.
- 3Поиск
Открывает поиск символов TradingView, чтобы вы могли добавить тикер, соответствующий бирже.
- 4Мешок для копирования
Копирует каждый тикер, один
EXCHANGE:SYMBOLпо строке. - 5Вставить мешок
Принимает строки, запятые, точки с запятой или пробелы и игнорирует дубликаты.
- 6Очистить
Просит второе нажатие, копирует тикеры и очищает список — «Вставить тикеры» вернёт его.
- 7Тикерные теги
Показывает текущую сумку. Используйте ×, чтобы удалить один символ; добавьте до 500.
- 8Запустить бэктест
Проверяет настройку и запускает последовательный запуск портфеля.
- 9Отчёты
Сохраните последние 50 отчетов локально и экспортируйте JSON или CSV.
- 10Оставшееся количество дней
Active days: 05— Оставшееся количество дней. - 11Поддержка
Поддержка доступна по техническим вопросам, запросам на выставление счетов, лицензированию и конфиденциальности.
Загрузить стратегию
- Выберите источник.
Удалить.pineфайла в Strategy или откройте редактор и вставьте код. - Исправьте любое сообщение о проверке.
Скрипт должен работать содержатьstrategy(). PineBag отображает явную ошибку, если его невозможно использовать. - Проверьте сводку.
Подтвердите имя скрипта, таймфрейм, капитал и размер ордера, указанные выше «Запуск».
indicator()преобразуйте его в стратегию перед запуском PineBag.Шаблон стратегии
Каждому полю вкладки Properties в TradingView соответствует аргумент strategy(). Храните значения в именованных константах в начале скрипта: с приоритетом скрипта каждый тикер тестируется с одинаковыми допущениями.
TIMEFRAMEТаймфрейм
INITIAL_CAPITAL · CURRENCYНачальный капитал
ORDER_SIZE · ORDER_SIZE_TYPEРазмер ордера по умолчанию
PYRAMIDINGПирамидинг
BAR_MAGNIFIERДетализация баров
CALC_EVERY_TICK · CALC_ON_FILLSИсполнение скрипта
COMMISSION · COMMISSION_TYPEКомиссия
MARGIN_LONG · MARGIN_SHORTКредитное плечо для лонга и шорта
SLIPPAGEПроскальзывание
LIMIT_FILL_TICKSИсполнение лимитных ордеров
FILL_ON_BAR_CLOSEЗадержка исполнения ордеров
runtime.error()Останавливает скрипт на любом другом таймфрейме.
//@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))
Значения TIMEFRAME
Укажите в кавычках один из стандартных интервалов TradingView. Какие из них загружаются, зависит от вашего тарифа TradingView, как указано на tradingview.com/pricing.
Дни, недели и месяцы.
"1D" "1W" "1M" "3M" "6M" "12M"
Минуты, часы и рейндж-бары. У минут нет буквы; один час — это 60.
"1" "3" "5" "15" "30" "45""60" "120" "180" "240""1R" "10R" "100R" "1000R"
Секундные интервалы.
"1S" "5S" "10S" "15S" "30S" "45S"
Тиковые интервалы.
"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
Размер ордера: процент, сумма или количество
ORDER_SIZE задаёт число, а ORDER_SIZE_TYPE — что оно означает. Вместе они заполняют поле Order size на вкладке Properties в TradingView.
strategy.percent_of_equity
Процент от текущего капитала. 10 — это 10% капитала на сделку.
strategy.cash
Сумма в валюте стратегии. 1000 — это 1000 USD на сделку.
strategy.fixed
Количество контрактов, акций или монет. 0.5 — это 0,5 BTC на сделку.
qty = …
Размер по умолчанию применяется только к ордерам без собственного qty. Вход с qty = … использует это значение.
// 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
Собственные переменные
Настройки собственной логики стратегии держите в отдельном блоке INPUT SETTINGS. Каждый вызов input.int(), input.float() или input.bool() становится полем на вкладке Inputs в TradingView, и его можно менять без правки кода.
// ----------------------------------------------------------------------------
// 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)