request.security() для получения данных с более высокого таймфрейма. Это гарантирует, что расчеты CMF основаны на уже закрытых барах выбранного MTF, предотвращая перерисовку.Как Senior Quant Developer, я часто сталкиваюсь с задачами, требующими не только точного расчета индикаторов, но и их стабильной работы на различных таймфреймах без искажений. Индикатор Chaikin Money Flow (CMF) — это осциллятор, который измеряет давление покупателей и продавцов, основываясь на цене закрытия относительно диапазона бара и объеме. Его мульти-таймфреймовая (MTF) версия позволяет анализировать динамику денежного потока на более высоких таймфреймах, не переключая график, что критически важно для принятия взвешенных торговых решений. Главная задача при этом — избежать перерисовки (repainting), когда значения индикатора меняются на уже закрытых барах.
В этой статье мы подробно рассмотрим, как реализовать CMF с поддержкой MTF и гарантией отсутствия перерисовки в Pine Script v5. Мы будем использовать функцию request.security(), которая является краеугольным камнем для создания MTF-индикаторов, не подверженных перерисовке, поскольку она по умолчанию возвращает данные только с закрытых баров запрашиваемого таймфрейма. Это особенно полезно при создании сложных торговых систем, например, для поиска дивергенций, как в статье Скрипт Pine Script v5: Поиск скрытой медвежьей дивергенции по RSI с request.security.
Исходный код
Ниже представлен полный исходный код индикатора Chaikin Money Flow (CMF) для Pine Script v5. Он включает в себя все необходимые компоненты: определение индикатора, пользовательские входы для длины и таймфрейма, логику расчета CMF с использованием request.security() и визуализацию на графике. Также предусмотрена базовая логика для алертов, что может быть полезно для интеграции с внешними системами, например, для отправки уведомлений в Discord, как описано в статье Pine Script v5 и Discord: Отправка графиков через Webhook при алертах.
//@version=5
indicator('Chaikin Money Flow (CMF) MTF No Repaint', shorttitle='CMF MTF NR', overlay=false, timeframe='', timeframe_gaps=true)
// --- Входные параметры --- //
i_length = input.int(20, 'CMF Length', minval=1, group='Настройки CMF')
i_timeframe = input.timeframe('60', 'MTF Timeframe', group='Настройки MTF') // По умолчанию 1 час
i_show_zero_line = input.bool(true, 'Показать нулевую линию', group='Визуализация')
i_alert_enabled = input.bool(false, 'Включить алерты', group='Алерты')
i_alert_threshold = input.float(0.2, 'Порог алерта', group='Алерты')
// --- Получение данных с MTF без перерисовки --- //
// Используем request.security для получения high, low, close, volume с выбранного таймфрейма.
// По умолчанию request.security возвращает данные с закрытых баров, что предотвращает перерисовку.
[high_tf, low_tf, close_tf, volume_tf] = request.security(syminfo.tickerid, i_timeframe, [high, low, close, volume])
// --- Расчет Chaikin Money Flow (CMF) --- //
// 1. Рассчитываем Money Flow Multiplier (MFM) на данных MTF
// Обрабатываем деление на ноль, если high_tf == low_tf
var float mfm_tf = na
float range_tf = high_tf - low_tf
if range_tf != 0
mfm_tf := ((close_tf - low_tf) - (high_tf - close_tf)) / range_tf
else
mfm_tf := 0.0 // Если диапазон равен нулю, MFM также равен нулю
// 2. Рассчитываем Money Flow Volume (MFV) на данных MTF
float mfv_tf = mfm_tf * volume_tf
// 3. Суммируем MFV и Volume за i_length периодов на данных MTF
float sum_mfv = ta.sum(mfv_tf, i_length)
float sum_volume = ta.sum(volume_tf, i_length)
// 4. Рассчитываем CMF
float cmf_value = sum_volume != 0 ? sum_mfv / sum_volume : 0.0
// --- Визуализация --- //
plot(cmf_value, 'CMF', color.blue, linewidth=2)
// Нулевая линия
plot(i_show_zero_line ? 0 : na, 'Zero Line', color.gray, style=plot.style_stepline, linewidth=1)
// --- Алерты --- //
// Пример алерта: CMF пересекает порог вверх
alert_condition_up = i_alert_enabled and ta.cross(cmf_value, i_alert_threshold) and cmf_value > i_alert_threshold
if alert_condition_up
alert('CMF MTF пересек порог ' + str.tostring(i_alert_threshold) + ' вверх на ' + i_timeframe + ' ТФ. Текущее значение: ' + str.tostring(cmf_value), alert.freq_once_per_bar_close)
// Пример алерта: CMF пересекает порог вниз
alert_condition_down = i_alert_enabled and ta.cross(cmf_value, i_alert_threshold) and cmf_value < i_alert_threshold
if alert_condition_down
alert('CMF MTF пересек порог ' + str.tostring(i_alert_threshold) + ' вниз на ' + i_timeframe + ' ТФ. Текущее значение: ' + str.tostring(cmf_value), alert.freq_once_per_bar_close)
// Дополнительные алерты можно добавить по аналогии, например, для пересечения нулевой линии.
Разбор параметров
Каждый параметр индикатора разработан для обеспечения гибкости и настройки под индивидуальные торговые стратегии. Понимание их назначения поможет вам максимально эффективно использовать CMF MTF.
CMF Length: Определяет количество периодов, используемых для расчета Chaikin Money Flow. Стандартное значение обычно составляет 20 или 21. Увеличение этого значения сделает индикатор более сглаженным и менее чувствительным к краткосрочным колебаниям, в то время как уменьшение сделает его более реактивным.MTF Timeframe: Этот параметр позволяет выбрать таймфрейм, на котором будет рассчитываться CMF. Например, если ваш текущий график 15-минутный, вы можете установить здесь '60' для расчета CMF на часовом таймфрейме. Это ключевой элемент для реализации мульти-таймфреймового анализа без перерисовки.Показать нулевую линию: Логический переключатель для отображения или скрытия нулевой линии на графике индикатора. Нулевая линия часто используется как ключевой уровень для интерпретации CMF (положительные значения указывают на давление покупателей, отрицательные — на давление продавцов).Включить алерты: Логический переключатель, активирующий или деактивирующий систему алертов. Если этот параметр включен, индикатор будет генерировать уведомления при выполнении заданных условий.Порог алерта: Числовое значение, которое определяет уровень, при пересечении которого CMF будет генерировать алерт. Например, значение 0.2 может быть использовано для сигнализации сильного давления покупателей, а -0.2 — сильного давления продавцов.
Как запустить
Чтобы добавить и использовать этот индикатор на вашем графике TradingView, следуйте этим простым шагам:
-
Откройте TradingView и перейдите на любой график.
-
Нажмите кнопку 'Pine Editor' в нижней части экрана.
-
Удалите весь существующий код в редакторе.
-
Скопируйте предоставленный выше исходный код и вставьте его в 'Pine Editor'.
-
Нажмите кнопку 'Добавить на график' (Add to Chart) в правом верхнем углу 'Pine Editor'.
-
Индикатор появится в отдельной панели под вашим основным графиком. Вы можете настроить его параметры (длину CMF, таймфрейм MTF, настройки алертов) через меню 'Настройки' (шестеренка) рядом с названием индикатора на графике.
Использование request.security() для получения данных с более высокого таймфрейма является стандартной практикой для создания надежных индикаторов без перерисовки. Это позволяет вам интегрировать данные с различных таймфреймов, что может быть полезно не только для CMF, но и для других сложных расчетов, таких как интеграция данных Open Interest, как показано в статье Интеграция Open Interest из Binance Futures в Pine Script v5 через request.seed. Успешной торговли!




