Интеграция Pine Script v5 с Google Sheets: Webhook для логов сделок

Интеграция Pine Script v5 с Google Sheets: Webhook для логов сделок Pine Script
Подробная инструкция по отправке логов сделок из Pine Script v5 в Google Sheets через Webhook и Google Apps Script. Автоматизируйте сбор данных о стратегии.
Суть: Интеграция Pine Script v5 с Google Sheets позволяет автоматически отправлять логи сделок вашей торговой стратегии в реальном времени. Это достигается путем использования функции httprequest.post() в Pine Script для отправки данных через Webhook на Google Apps Script, который затем записывает эти данные в указанную таблицу Google Sheets.

Как Senior Quant Developer, я часто сталкиваюсь с необходимостью не только разрабатывать сложные торговые стратегии, но и эффективно отслеживать их производительность, логировать сделки и анализировать данные. TradingView Pine Script v5 предоставляет мощные инструменты для создания стратегий, но его встроенные возможности логирования ограничены. Интеграция с Google Sheets через Webhook и Google Apps Script открывает двери для создания кастомизированных систем мониторинга, анализа и даже бэктестинга, позволяя вам собирать данные о каждой сделке вашей стратегии в удобном и доступном формате.

В этой статье мы рассмотрим пошаговую инструкцию по настройке такой интеграции. Мы создадим простую стратегию на Pine Script v5, которая будет отправлять детали каждой сделки (открытие/закрытие позиции) в Google Sheet. Это позволит вам в дальнейшем анализировать данные, строить отчеты и принимать более обоснованные решения.

Исходный код Pine Script v5

Ниже представлен пример стратегии на Pine Script v5, которая использует скользящие средние для генерации сигналов и отправляет данные о сделках через Webhook. Мы будем логировать время, символ, тип действия (вход/выход), цену, количество и комментарий.


// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FinFluct

//@version=5
strategy("Webhook Logger Strategy", overlay=true,
     pyramiding=0, initial_capital=10000, default_qty_type=strategy.cash,
     default_qty_value=1000, commission_type=strategy.commission.percent,
     commission_value=0.1)

// --- Inputs ---
string webhookUrl = input.string("", "Google Apps Script Webhook URL", group="Webhook Settings", tooltip="URL вашего развернутого Google Apps Script Webhook")
bool enableLogging = input.bool(true, "Включить логирование через Webhook", group="Webhook Settings")

int fastLength = input.int(9, "Fast MA Length", minval=1)
int slowLength = input.int(21, "Slow MA Length", minval=1)

// --- Moving Averages ---
fastMA = ta.sma(close, fastLength)
slowMA = ta.sma(close, slowLength)

plot(fastMA, color=color.blue, title="Fast MA")
plot(slowMA, color=color.red, title="Slow MA")

// --- Strategy Logic ---
longCondition = ta.crossover(fastMA, slowMA)
shortCondition = ta.crossunder(fastMA, slowMA)

if longCondition
    strategy.entry("Long", strategy.long, comment="MA Crossover Buy")

if shortCondition
    strategy.entry("Short", strategy.short, comment="MA Crossunder Sell")

// --- Webhook Logging Function ---
// Отправка данных о сделке через Webhook
// Используем функцию для отправки POST-запроса
// Обратите внимание, что httprequest.post() может быть вызвана только один раз на бар
// Для логирования нескольких событий на одном баре, нужно агрегировать данные

var string lastEntryId = na
var string lastExitId = na

// Log entry events
if strategy.opentrades > 0 and strategy.opentrades.entry_id(strategy.opentrades - 1) != lastEntryId
    if enableLogging and str.length(webhookUrl) > 0
        tradeTime = str.format("{0,date,yyyy-MM-dd HH:mm:ss}", time)
        tradeSymbol = syminfo.tickerid
        tradeAction = "ENTRY"
        tradePrice = strategy.opentrades.entry_price(strategy.opentrades - 1)
        tradeQty = strategy.opentrades.qty(strategy.opentrades - 1)
        tradeComment = strategy.opentrades.comment(strategy.opentrades - 1)
        
        jsonPayload = '{ "time": "' + tradeTime + '", "symbol": "' + tradeSymbol + '", "action": "' + tradeAction + '", "price": ' + str.tostring(tradePrice) + ', "qty": ' + str.tostring(tradeQty) + ', "comment": "' + tradeComment + '" }'
        
        httprequest.post(webhookUrl, "application/json", jsonPayload)
        lastEntryId := strategy.opentrades.entry_id(strategy.opentrades - 1)

// Log exit events
if strategy.closedtrades > 0 and strategy.closedtrades.entry_id(strategy.closedtrades - 1) != lastExitId
    if enableLogging and str.length(webhookUrl) > 0
        tradeTime = str.format("{0,date,yyyy-MM-dd HH:mm:ss}", time)
        tradeSymbol = syminfo.tickerid
        tradeAction = "EXIT"
        tradePrice = strategy.closedtrades.exit_price(strategy.closedtrades - 1)
        tradeQty = strategy.closedtrades.qty(strategy.closedtrades - 1)
        tradeComment = strategy.closedtrades.comment(strategy.closedtrades - 1)
        
        jsonPayload = '{ "time": "' + tradeTime + '", "symbol": "' + tradeSymbol + '", "action": "' + tradeAction + '", "price": ' + str.tostring(tradePrice) + ', "qty": ' + str.tostring(tradeQty) + ', "comment": "' + tradeComment + '" }'
        
        httprequest.post(webhookUrl, "application/json", jsonPayload)
        lastExitId := strategy.closedtrades.entry_id(strategy.closedtrades - 1)

// Пример использования других функций Pine Script v5, которые могут быть полезны для более сложных стратегий:
// Для динамического трейлинг-стопа: Динамический трейлинг-стоп по ATR в Pine Script v5: Инструкция
// Для анализа объемов: Скрипт профиля рынка (Market Profile) с разделением на TPO в Pine Script v5
// Для алгоритмического исполнения: Скрипт TWAP на Pine Script v5: Алгоритмическое исполнение

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

  • webhookUrl: Строковый параметр, куда вы вставите URL вашего развернутого Google Apps Script Webhook. Это критически важный параметр для работы интеграции.
  • enableLogging: Булевый переключатель для включения/отключения отправки логов. Полезно для тестирования или когда логирование не требуется.
  • fastLength: Длина быстрой скользящей средней.
  • slowLength: Длина медленной скользящей средней.
  • strategy.entry(): Функция для открытия позиции. Параметр comment используется для добавления описания к сделке, которое затем будет отправлено в Google Sheets.
  • httprequest.post(): Ключевая функция для отправки HTTP POST запросов. Она принимает URL, тип контента (в нашем случае application/json) и тело запроса в виде строки JSON.
  • Логирование входов/выходов: Код отслеживает новые открытые и закрытые сделки, используя strategy.opentrades и strategy.closedtrades, чтобы отправлять данные только один раз за сделку.

Исходный код Google Apps Script

Этот скрипт будет слушать входящие POST-запросы от Pine Script, парсить JSON-данные и добавлять их в новую строку в вашей Google Sheet.


function doPost(e) {
  var sheetName = 'Trade Logs'; // Имя листа, куда будут записываться данные
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);

  // Если лист не существует, создаем его и добавляем заголовки
  if (!sheet) {
    sheet = ss.insertSheet(sheetName);
    sheet.appendRow(['Time', 'Symbol', 'Action', 'Price', 'Quantity', 'Comment']);
  }

  try {
    // Парсим входящие JSON данные
    var data = JSON.parse(e.postData.contents);

    // Извлекаем данные
    var tradeTime = data.time;
    var tradeSymbol = data.symbol;
    var tradeAction = data.action;
    var tradePrice = data.price;
    var tradeQty = data.qty;
    var tradeComment = data.comment;

    // Добавляем новую строку в таблицу
    sheet.appendRow([tradeTime, tradeSymbol, tradeAction, tradePrice, tradeQty, tradeComment]);

    // Возвращаем успешный ответ
    return ContentService.createTextOutput(JSON.stringify({ 'status': 'success', 'message': 'Data logged successfully' })).setMimeType(ContentService.MimeType.JSON);

  } catch (error) {
    // Логируем ошибку и возвращаем сообщение об ошибке
    Logger.log('Error processing webhook: ' + error.toString());
    return ContentService.createTextOutput(JSON.stringify({ 'status': 'error', 'message': error.toString() })).setMimeType(ContentService.MimeType.JSON);
  }
}

Разбор функций Google Apps Script

  • doPost(e): Это специальная функция в Google Apps Script, которая автоматически вызывается при получении HTTP POST запроса. Объект e содержит всю информацию о запросе, включая тело запроса.
  • sheetName: Переменная, определяющая имя листа в вашей Google Sheet, куда будут записываться логи. Если такого листа нет, скрипт его создаст.
  • SpreadsheetApp.getActiveSpreadsheet(): Получает ссылку на активную Google Sheet, к которой привязан скрипт.
  • sheet.appendRow(): Добавляет новую строку данных в конец указанного листа.
  • JSON.parse(e.postData.contents): Парсит строку JSON, полученную из тела POST-запроса, в объект JavaScript, что позволяет легко получить доступ к отдельным полям данных.
  • ContentService.createTextOutput().setMimeType(): Используется для формирования ответа на HTTP-запрос. В случае успеха или ошибки возвращается JSON-объект с соответствующим статусом и сообщением.

Как запустить интеграцию

Выполните следующие шаги, чтобы настроить и запустить интеграцию:

  1. Создайте новую Google Sheet:

    • Перейдите на Google Sheets и создайте новую пустую таблицу.
    • Вы можете переименовать первый лист в Trade Logs или оставить имя по умолчанию, но тогда измените переменную sheetName в Apps Script.
  2. Откройте Google Apps Script:

    • В вашей новой Google Sheet перейдите в меню Расширения -> Apps Script. Откроется новый проект Apps Script.
  3. Вставьте код Apps Script:

    • Удалите весь существующий код в файле Code.gs и вставьте туда код Google Apps Script, приведенный выше.
    • Сохраните проект (иконка дискеты или Ctrl+S / Cmd+S).
  4. Разверните Web App:

    • В редакторе Apps Script нажмите кнопку Развернуть (Deploy) в правом верхнем углу и выберите Новое развертывание (New deployment).
    • В поле Тип (Type) выберите Веб-приложение (Web app).
    • В поле Выполнять как (Execute as) выберите Я (My self).
    • В поле Кто имеет доступ (Who has access) выберите Любой (Anyone). Это важно, так как Pine Script будет отправлять запросы без аутентификации.
    • Нажмите Развернуть (Deploy).
    • При первом развертывании вам может потребоваться авторизовать скрипт. Нажмите Авторизовать доступ (Authorize access), выберите свой аккаунт Google и разрешите необходимые разрешения.
    • После успешного развертывания вы получите URL веб-приложения (Web app URL). Скопируйте этот URL. Он будет выглядеть примерно так: https://script.google.com/macros/s/AKfycb.../exec.
  5. Настройте Pine Script:

    • Откройте TradingView, перейдите в Pine Editor и вставьте код Pine Script v5, приведенный выше.
    • Сохраните скрипт и добавьте его на график.
    • Откройте настройки стратегии на графике (иконка шестеренки).
    • В разделе Webhook Settings вставьте скопированный URL веб-приложения в поле Google Apps Script Webhook URL.
    • Убедитесь, что Включить логирование через Webhook активировано.
  6. Запустите стратегию и проверьте логи:

    • Запустите стратегию на графике (например, в режиме бэктеста или на реальном времени).
    • Каждый раз, когда стратегия будет открывать или закрывать позицию, она будет отправлять данные в ваш Google Sheet.
    • Вернитесь в Google Sheet, и вы увидите, как новые строки с логами сделок автоматически добавляются.

Заключение

Эта интеграция открывает широкие возможности для автоматизации сбора данных о вашей торговой активности. Вы можете расширить функционал, добавляя больше полей данных в JSON-объект Pine Script (например, текущий баланс, PnL сделки, индикаторы в момент сделки) и соответствующим образом модифицируя Apps Script для их обработки. Это мощный инструмент для любого Quant Developer, стремящегося к более глубокому анализу и оптимизации своих торговых стратегий.

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