Динамический Размер Позиции в Pine Script v5: Расчет % от Капитала

Динамический Размер Позиции в Pine Script v5: Расчет % от Капитала Pine Script
Узнайте, как рассчитать динамический размер позиции в процентах от капитала для strategy.entry в Pine Script v5. Подробное руководство с примером кода и объяснениями.
Суть: Расчет динамического размера позиции в Pine Script v5 для strategy.entry путем определения количества контрактов/акций на основе заданного процента риска от текущего капитала и расстояния до стоп-лосса. Это позволяет эффективно управлять риском, адаптируя объем сделки к волатильности и размеру вашего капитала.

Исходный код

Представленный ниже код демонстрирует, как реализовать динамический расчет размера позиции в Pine Script v5. Он учитывает заданный процент риска от текущего капитала и расстояние до стоп-лосса, чтобы определить оптимальное количество акций или контрактов для входа в сделку. Это позволяет поддерживать постоянный уровень риска на каждую сделку, независимо от цены актива или размера стоп-лосса.


//@version=5
strategy(
    title='Dynamic Position Sizing',
    overlay=true,
    initial_capital=10000,
    default_qty_type=strategy.cash,
    default_qty_value=100,
    commission_type=strategy.commission.percent,
    commission_value=0.1
)

// --- Входные параметры --- 
riskPct = input.float(1.0, 'Процент риска от капитала (%)', minval=0.1, maxval=10.0, step=0.1)
stopLossPct = input.float(2.0, 'Стоп-лосс от цены входа (%)', minval=0.1, maxval=10.0, step=0.1)
useFixedQty = input.bool(false, 'Использовать фиксированное количество (для сравнения)')
fixedQty = input.int(10, 'Фиксированное количество', minval=1)

// --- Функция для расчета цены стоп-лосса ---
calcStopLossPrice(entryPrice, isLong) =>
    isLong ? entryPrice * (1 - stopLossPct / 100) : entryPrice * (1 + stopLossPct / 100)

// --- Функция для расчета динамического количества контрактов/акций ---
calcDynamicQty(entryPrice, stopLossPrice) =>
    // Используем текущий капитал для динамического расчета
    currentCapital = strategy.equity 
    // Сумма, которой мы рискуем в этой сделке
    riskAmount = currentCapital * (riskPct / 100)
    
    // Расстояние до стоп-лосса в валюте
    stopLossDistance = math.abs(entryPrice - stopLossPrice)
    
    // Избегаем деления на ноль или очень маленького стоп-лосса
    if stopLossDistance == 0
        stopLossDistance := entryPrice * 0.0001 // Минимальное расстояние для избежания ошибки
    
    // Расчет "сырого" количества контрактов/акций
    rawQty = riskAmount / stopLossDistance
    
    // Корректировка количества с учетом точности инструмента и минимального размера ордера
    float qtyStep = syminfo.qty_step // Например, 1 для акций, 0.001 для некоторых криптовалют
    float minOrderContracts = syminfo.minordercontracts // Например, 1 для акций, 0.001 для некоторых криптовалют

    // Округляем до ближайшего шага количества
    float adjustedQty = math.round(rawQty / qtyStep) * qtyStep
    
    // Убеждаемся, что количество не меньше минимального размера ордера
    if adjustedQty < minOrderContracts
        adjustedQty := minOrderContracts
    
    adjustedQty

// --- Пример торговой логики (простые скользящие средние) ---
longCondition = ta.crossover(ta.sma(close, 10), ta.sma(close, 20))
shortCondition = ta.crossunder(ta.sma(close, 10), ta.sma(close, 20))

// Цены входа для расчета стоп-лосса
var float longEntryPrice = na
var float shortEntryPrice = na

if longCondition
    longEntryPrice := close
    longStopLossPrice = calcStopLossPrice(longEntryPrice, true)
    
    // Выбираем между фиксированным и динамическим количеством
    calculatedQty = useFixedQty ? fixedQty : calcDynamicQty(longEntryPrice, longStopLossPrice)
    
    if strategy.opentrades == 0 // Входим только если нет открытых сделок
        strategy.entry('Long', strategy.long, qty=calculatedQty)
        strategy.exit('Long Exit', from_entry='Long', stop=longStopLossPrice)

if shortCondition
    shortEntryPrice := close
    shortStopLossPrice = calcStopLossPrice(shortEntryPrice, false)
    
    // Выбираем между фиксированным и динамическим количеством
    calculatedQty = useFixedQty ? fixedQty : calcDynamicQty(shortEntryPrice, shortStopLossPrice)
    
    if strategy.opentrades == 0 // Входим только если нет открытых сделок
        strategy.entry('Short', strategy.short, qty=calculatedQty)
        strategy.exit('Short Exit', from_entry='Short', stop=shortStopLossPrice)

// --- Отображение для визуализации ---
plot(strategy.equity, title='Капитал', color=color.blue, linewidth=2)
plot(strategy.opentrades > 0 ? strategy.position_size : na, title='Размер позиции', color=color.orange, style=plot.style_columns)

// Отображение рассчитанного динамического количества (до входа)
var float lastCalculatedQty = na
if longCondition or shortCondition
    entryPriceForCalc = close // Используем текущую цену закрытия для отображения расчета
    isLongForCalc = longCondition ? true : false
    slPriceForCalc = calcStopLossPrice(entryPriceForCalc, isLongForCalc)
    lastCalculatedQty := calcDynamicQty(entryPriceForCalc, slPriceForCalc)

plot(lastCalculatedQty, title='Рассчитанное количество (до входа)', color=color.purple, style=plot.style_linebr)

Разбор параметров

  • riskPct: Процент от текущего капитала, которым вы готовы рискнуть в каждой сделке. Например, 1.0 означает 1% от вашего капитала. Это ключевой параметр для управления риском.
  • stopLossPct: Процентное расстояние от цены входа до стоп-лосса. Например, 2.0 означает, что стоп-лосс будет установлен на 2% ниже (для лонга) или выше (для шорта) цены входа.
  • useFixedQty: Булевый переключатель. Если true, стратегия будет использовать фиксированное количество контрактов/акций, заданное в fixedQty, игнорируя динамический расчет. Полезно для сравнения.
  • fixedQty: Фиксированное количество контрактов/акций для входа, используется, если useFixedQty установлено в true.
  • strategy.equity: Встроенная переменная Pine Script, которая возвращает текущий баланс вашего счета (начальный капитал + реализованная/нереализованная прибыль/убыток). Использование strategy.equity вместо strategy.initial_capital критически важно для динамического управления риском, так как оно позволяет размеру позиции адаптироваться к росту или уменьшению вашего капитала.
  • syminfo.qty_step: Встроенная переменная, представляющая минимальный шаг изменения количества для данного инструмента. Например, для акций это обычно 1, для некоторых криптовалют может быть 0.001 или 0.000001. Используется для корректного округления рассчитанного количества.
  • syminfo.minordercontracts: Встроенная переменная, указывающая минимальное количество контрактов/акций, которое можно разместить для данного инструмента. Рассчитанное количество не может быть меньше этого значения.

Как запустить

Чтобы использовать этот скрипт в TradingView и рассчитать динамический размер позиции, выполните следующие шаги:

  1. Откройте TradingView и перейдите в редактор Pine Script (обычно находится в нижней части экрана).
  2. Удалите весь существующий код и вставьте предоставленный выше исходный код.
  3. Нажмите кнопку ‘Добавить на график’ (Add to Chart).
  4. После добавления скрипта на график, вы можете открыть его настройки (значок шестеренки рядом с названием скрипта на графике).
  5. В разделе ‘Входы’ (Inputs) настройте параметры ‘Процент риска от капитала (%)’ и ‘Стоп-лосс от цены входа (%)’ в соответствии с вашей торговой стратегией и толерантностью к риску. Вы также можете переключить ‘Использовать фиксированное количество’ для сравнения.
  6. Перейдите на вкладку ‘Тестер стратегий’ (Strategy Tester) в нижней части экрана, чтобы просмотреть результаты бэктеста, включая изменения капитала и размер позиций. Обратите внимание, как размер позиции адаптируется к изменениям капитала и волатильности.
  7. Экспериментируйте с различными значениями параметров, чтобы найти оптимальные настройки для вашего инструмента и торгового стиля. Для более продвинутых стратегий, таких как Мульти-таймфреймный FVG в Pine Script v5: руководство без перерисовки, динамическое управление позицией становится еще более критичным.

Этот подход к расчету размера позиции является фундаментальным элементом профессионального управления капиталом и риском в алгоритмической торговле.

Оцените статью
FinFluct