Создание кастомной таблицы статистики в Pine Script v5: Winrate и Profit Factor

Создание кастомной таблицы статистики в Pine Script v5: Winrate и Profit Factor Pine Script
Пошаговое руководство по созданию кастомной информационной панели (таблицы) в Pine Script v5 для вывода ключевых метрик стратегии: Winrate, Profit Factor и чистой прибыли.
Суть: В этой статье мы разберем, как создать кастомную информационную панель на графике TradingView с помощью объекта table.new в Pine Script v5. Мы научимся рассчитывать такие важные метрики эффективности, как Winrate (процент прибыльных сделок) и Profit Factor (фактор прибыльности), и динамически выводить их в красивую таблицу в реальном времени.

Исходный код

Для демонстрации работы кастомной таблицы мы напишем полноценную стратегию на базе пересечения экспоненциальных скользящих средних (EMA). В конце кода мы добавим блок расчета статистики по закрытым сделкам и отрисовку таблицы в правом верхнем углу графика.

Визуализация статистики прямо на рабочем пространстве значительно упрощает анализ. Например, при создании сложных систем, таких как Создание Heatmap Волатильности Криптопар с Нормализованным ATR в Pine Script v5 или при работе с Кастомным ZigZag с фильтрацией по объему в Pine Script v5, оперативный вывод метрик позволяет моментально оценивать влияние фильтров на результаты торговли.

//@version=5
strategy('Custom Stats Table Strategy', overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// Простая стратегия на пересечении EMA
fast_ema = ta.ema(close, 9)
slow_ema = ta.ema(close, 21)

plot(fast_ema, color=color.blue, title='Fast EMA')
plot(slow_ema, color=color.orange, title='Slow EMA')

if ta.crossover(fast_ema, slow_ema)
    strategy.entry('Long', strategy.long)
if ta.crossunder(fast_ema, slow_ema)
    strategy.close('Long')

// Инициализация таблицы на первом баре
var table stats_table = table.new(position=position.top_right, columns=2, rows=5, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.gray)

if barstate.islast
    int closed_count = strategy.closedtrades
    int winning_trades = 0
    float gross_profit = 0.0
    float gross_loss = 0.0

    if closed_count > 0
        for i = 0 to closed_count - 1
            float profit = strategy.closedtrades.profit(i)
            if profit > 0
                winning_trades += 1
                gross_profit += profit
            else
                gross_loss += math.abs(profit)

    float winrate = closed_count > 0 ? (winning_trades / closed_count) * 100 : 0.0
    float profit_factor = gross_loss > 0 ? gross_profit / gross_loss : (gross_profit > 0 ? 999.9 : 0.0)
    float net_profit = strategy.netprofit

    // Заполнение заголовков
    table.cell(stats_table, 0, 0, 'Метрика', bgcolor=color.gray, text_color=color.white, text_size=size.small)
    table.cell(stats_table, 1, 0, 'Значение', bgcolor=color.gray, text_color=color.white, text_size=size.small)

    // Чистая прибыль
    table.cell(stats_table, 0, 1, 'Net Profit', text_color=color.white, text_size=size.small, text_align=text.align_left)
    table.cell(stats_table, 1, 1, str.tostring(net_profit, '#.##') + ' ' + syminfo.currency, text_color=net_profit >= 0 ? color.green : color.red, text_size=size.small, text_align=text.align_right)

    // Winrate
    table.cell(stats_table, 0, 2, 'Winrate', text_color=color.white, text_size=size.small, text_align=text.align_left)
    table.cell(stats_table, 1, 2, str.tostring(winrate, '0.0') + '%', text_color=winrate >= 50 ? color.green : color.orange, text_size=size.small, text_align=text.align_right)

    // Profit Factor
    table.cell(stats_table, 0, 3, 'Profit Factor', text_color=color.white, text_size=size.small, text_align=text.align_left)
    table.cell(stats_table, 1, 3, str.tostring(profit_factor, '0.00'), text_color=profit_factor >= 1.5 ? color.green : (profit_factor >= 1.0 ? color.orange : color.red), text_size=size.small, text_align=text.align_right)

    // Всего сделок
    table.cell(stats_table, 0, 4, 'Total Trades', text_color=color.white, text_size=size.small, text_align=text.align_left)
    table.cell(stats_table, 1, 4, str.tostring(closed_count), text_color=color.white, text_size=size.small, text_align=text.align_right)

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

Давайте подробно разберем ключевые функции и переменные, которые мы использовали для создания таблицы и расчета метрик:

  • table.new(): Функция инициализирует новый объект таблицы. Мы указываем ее позицию на экране (position.top_right), количество колонок (2) и строк (5), а также цвет фона и границы.
  • table.cell(): Заполняет конкретную ячейку таблицы. Принимает координаты колонки и строки (индексация начинается с 0), текст, цвет текста, размер и выравнивание.
  • strategy.closedtrades: Встроенная переменная Pine Script, возвращающая общее количество закрытых сделок на текущий момент.
  • strategy.closedtrades.profit(): Функция, возвращающая чистую прибыль или убыток по конкретной закрытой сделке по ее индексу. Мы используем ее в цикле для расчета валовой прибыли и валового убытка.
  • barstate.islast: Логический флаг, который гарантирует, что ресурсоемкие вычисления (цикл по всем закрытым сделкам) и отрисовка таблицы будут происходить только на самом последнем (актуальном) баре, что оптимизирует производительность скрипта.

Если вы внедряете продвинутый мани-менеджмент, например, настраиваете Частичный Take Profit в Pine Script v5: Пошаговое руководство, кастомная таблица поможет вам наглядно увидеть, как фиксация частей позиции влияет на итоговый Profit Factor и Winrate.

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

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

  • Откройте график любой валютной пары или криптовалюты на TradingView.
  • В нижней панели выберите вкладку Pine Editor (Редактор Pine).
  • Удалите стандартный шаблон кода и вставьте скопированный выше исходный код.
  • Нажмите кнопку Save (Сохранить), укажите название скрипта и нажмите Add to chart (Добавить на график).
  • В правом верхнем углу вашего графика появится аккуратная таблица со статистикой работы стратегии в реальном времени.

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