
Эта стратегия является двукратной динамической стратегией по временным масштабам. Она определяет направление тренда с помощью простой скользящей средней (SMA) на высокоуровневом периоде времени и использует опорные точки (PivotLow и PivotHigh) на низкоуровневом периоде времени, чтобы определить обратную точку. Когда высокоуровневый период времени показывает тенденцию к повышению, а низкоуровневый период времени показывает позитивные опорные точки, то она открывается больше, а когда высокоуровневый период времени показывает тенденцию к снижению, а низкоуровневый период времени показывает отрицательные опорные точки.
Основной принцип этой стратегии заключается в том, что направление тренда в высокоуровневом временном цикле влияет на движение в низкоуровневом временном цикле. Когда высокоуровневый временный цикл показывает тенденцию к росту, обратный отклик в низкоуровневом временном цикле более вероятно, что это покупательская возможность; когда высокоуровневый временный цикл показывает тенденцию к снижению, обратный отклик в низкоуровневом временном цикле более вероятно, что это пустая возможность.
Движущаяся стратегия двойных временных масштабов использует связь между высокими и низкими временными циклами для определения направления тенденции в высоких временных циклах и захвата обратных точек в низких временных циклах, чтобы достичь следования тенденции и реверсивной торговли. Логика стратегии ясна, преимущества очевидны, но в то же время есть некоторые риски. В будущем можно оптимизировать стратегию с точки зрения определения параметров изменения тенденции, оптимизации параметров, управления рисками, слияния множественных факторов и т. Д.
/*backtest
start: 2023-04-19 00:00:00
end: 2024-04-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Riester
//@version=5
strategy("Dual Timeframe Momentum", overlay=true, precision=6, pyramiding=0, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=25.0, commission_value=0.05)
n = input.int(20, "Moving Average Period", minval=1)
src = input.source(close, "Source")
high_tf = input.timeframe("240", "Resolution")
pivot_l = input.int(5, "Pivot Let Bars")
pivot_r = input.int(2, "Pivot Right Bars")
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// Calculations
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// 1. Define low and high timeframe prices
low_src = src
high_src = request.security(syminfo.tickerid, high_tf, src)
// 2. Use simple moving average to determine trend of higher timeframe (up or down)
high_tf_ma = ta.sma(high_src, n)
plot(high_tf_ma, color=color.yellow)
high_tf_trend = high_tf_ma > high_tf_ma[1] ? 1 : -1
// 3. Use pivots to identify reversals on the low timeframe
low_tf_pl = ta.pivotlow(high_src, pivot_l, pivot_r)
plot(low_tf_pl, style=plot.style_line, linewidth=3, color= color.green, offset=-pivot_r)
low_tf_ph = ta.pivothigh(high_src, pivot_l, pivot_r)
plot(low_tf_ph, style=plot.style_line, linewidth=3, color= color.red, offset=-pivot_r)
bool long = low_tf_pl and high_tf_trend == 1
bool short = low_tf_ph and high_tf_trend == -1
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// Plots
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// this message is an alert that can be sent to a webhook, which allows for simple automation if you have a server that listens to alerts and trades programmatically.
enter_long_alert = '{"side": "Long", "order": "Enter", "price": ' + str.tostring(open) + ', "timestamp": ' + str.tostring(timenow) + '}'
exit_long_alert = '{"side": "Long", "order": "Exit", "price": ' + str.tostring(open) + ', "timestamp": ' + str.tostring(timenow) + '}'
if long
strategy.entry(id="Long", direction=strategy.long, limit=open, alert_message=enter_long_alert)
if short
strategy.close(id="Long", comment="Close Long", alert_message=exit_long_alert)