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-объект с соответствующим статусом и сообщением.
Как запустить интеграцию
Выполните следующие шаги, чтобы настроить и запустить интеграцию:
-
Создайте новую Google Sheet:
- Перейдите на Google Sheets и создайте новую пустую таблицу.
- Вы можете переименовать первый лист в
Trade Logsили оставить имя по умолчанию, но тогда измените переменнуюsheetNameв Apps Script.
-
Откройте Google Apps Script:
- В вашей новой Google Sheet перейдите в меню
Расширения->Apps Script. Откроется новый проект Apps Script.
- В вашей новой Google Sheet перейдите в меню
-
Вставьте код Apps Script:
- Удалите весь существующий код в файле
Code.gsи вставьте туда код Google Apps Script, приведенный выше. - Сохраните проект (иконка дискеты или
Ctrl+S/Cmd+S).
- Удалите весь существующий код в файле
-
Разверните 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.
- В редакторе Apps Script нажмите кнопку
-
Настройте Pine Script:
- Откройте TradingView, перейдите в Pine Editor и вставьте код Pine Script v5, приведенный выше.
- Сохраните скрипт и добавьте его на график.
- Откройте настройки стратегии на графике (иконка шестеренки).
- В разделе
Webhook Settingsвставьте скопированныйURL веб-приложенияв полеGoogle Apps Script Webhook URL. - Убедитесь, что
Включить логирование через Webhookактивировано.
-
Запустите стратегию и проверьте логи:
- Запустите стратегию на графике (например, в режиме бэктеста или на реальном времени).
- Каждый раз, когда стратегия будет открывать или закрывать позицию, она будет отправлять данные в ваш Google Sheet.
- Вернитесь в Google Sheet, и вы увидите, как новые строки с логами сделок автоматически добавляются.
Заключение
Эта интеграция открывает широкие возможности для автоматизации сбора данных о вашей торговой активности. Вы можете расширить функционал, добавляя больше полей данных в JSON-объект Pine Script (например, текущий баланс, PnL сделки, индикаторы в момент сделки) и соответствующим образом модифицируя Apps Script для их обработки. Это мощный инструмент для любого Quant Developer, стремящегося к более глубокому анализу и оптимизации своих торговых стратегий.




