
Основная идея этой стратегии заключается в том, чтобы реализовать стратегию отслеживания трендов, которая была бы максимально точной. Она оценивает вероятность сохранения текущей линейной тенденции, рассчитывая на некоторое количество закрытых цен в прошлом. Стратегия предполагает, что если доверие превысит определенный уровень, то существующая линейная тенденция будет более вероятно продолжаться.
Эта стратегия использует обычный метод линейной регрессии для вычисления линейного соответствия за последние N закрытых цен, чтобы получить скольжение k для линейного соответствия и стандартное отклонение от закрытых цен с разрывом σ ∈ . Затем определяется доверие к тренду как k / σ ∈ .
Когда доверие к тренду превышает отметку за превышение входной отметки, делается превышение; когда снижение доходит до отметки за превышение входной отметки, делается выравнивание. Точно так же, когда доверие к тренду ниже отметки за превышение входной отметки, делается выравнивание; когда превышает отметку за превышение входной отметки, делается выравнивание.
Таким образом, он может отфильтровывать сигналы, вызванные дикими ценовыми изменениями, которые не следуют четкой линейной тенденции.
Эта стратегия объединяет методы линейной регрессии отслеживания тенденций и статистики и позволяет избегать следования за краткосрочными ценовыми колебаниями и следовать только за долгосрочными тенденциями, что приводит к более низкой частоте торгов и более высокой выигрышной ставке.
Эта стратегия имеет большое пространство для настройки параметров и может быть использована для различных сортов и временных периодов, чтобы обеспечить хорошую генерализацию.
Существует риск, что стратегия может быть арбитражирована. При наличии очевидного обратного тренда в цене, стратегия может привести к большим потерям. Кроме того, неправильная настройка параметров может привести к чрезмерной торговле или упущенной возможности для торговли.
Можно установить стоп-лосс, чтобы контролировать риск потери. При этом необходимо тщательно оценить выбор параметров, чтобы избежать чрезмерной оптимизации.
Эта стратегия может быть улучшена в следующих областях:
Дополнительная логика стоп-лосса для блокировки прибыли и контроля риска
Добавление параметров для адаптации модуля оптимизации, чтобы параметры могли динамически корректироваться
Добавление моделей машинного обучения для определения переломов тенденций и дальнейшего повышения эффективности стратегий
Попытки адаптации к различным видам и временным периодам, повышение генерализации
Стратегия в целом является количественной стратегией, основанной на долгосрочных тенденциях, для управления рисками. Она сочетает в себе методы отслеживания тенденций и линейного возврата, которые могут отфильтровывать шумные торговые сигналы. Она может хорошо адаптироваться к различным сортам и периодам с помощью параметровой настройки и является эффективной стратегией, которая заслуживает внимания исследования и улучшения.
/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © carefulCamel61097
// ################################################################################################
// "This is a trend following strategy that performed very well on the past 5 years"
// "Intended to be used on BTC-USDT, 4hr timeframe"
// "A factor 2 Leverage can be added by changing Order Size to 200% of equity"
// "Higher leverage is not recommended due to big drawdowns"
// "Also seems to work on 1D timeframe, although ideal parameters may be different"
// "Also seems to work on ETH-USDT and some other altcoins, although ideal parameters are different"
// ################################################################################################
//@version=5
strategy("Trend Following based on Trend Confidence", overlay=false )
// Inputs
source = input(close)
since = input(timestamp('2000-01-01'), title='Start trading interval')
till = input(timestamp('2030-01-01'), title='End trading interval')
length = input(30, title='Length')
longs_on = input.bool(true, title='Longs')
shorts_on = input.bool(true, title='Shorts')
// Parameters for best performance 2018 - 2022
// long_entry = input.float(0.26, step=0.01, title='Long entry threshold')
// long_exit = input.float(-0.10, step=0.01, title='Long exit threshold')
// short_entry = input.float(-0.24, step=0.01, title='Short entry threshold')
// short_exit = input.float(-0.04, step=0.01, title='Short exit threshold')
long_entry = input.float(0.25, step=0.01, title='Long entry threshold')
long_exit = input.float(-0.10, step=0.01, title='Long exit threshold')
short_entry = input.float(-0.25, step=0.01, title='Short entry threshold')
short_exit = input.float(-0.05, step=0.01, title='Short exit threshold')
stop_loss = input.float(10, step=1, title='Stop loss (percentage)') / 100
// Trend Confidence
linreg = ta.linreg(source, length, 0)
linreg_p = ta.linreg(source, length, 0+1)
x = bar_index
slope = linreg - linreg_p
intercept = linreg - x*slope
deviationSum = 0.0
for i = 0 to length-1
deviationSum := deviationSum + math.pow(source[i]-(slope*(x-i)+intercept), 2)
deviation = math.sqrt(deviationSum/(length))
slope_perc = slope / source[0]
deviation_perc = deviation / source[0]
trend_confidence = slope_perc / deviation_perc
// Strategy
in_interval = true
sl_long = strategy.position_avg_price * (1 - stop_loss)
sl_short = strategy.position_avg_price * (1 + stop_loss)
if in_interval and longs_on and ta.crossover(trend_confidence, long_entry)
strategy.entry("TC Long Entry", strategy.long)
strategy.exit("TC Long Exit", stop=sl_long)
if in_interval and longs_on and ta.crossunder(trend_confidence, long_exit)
strategy.close("TC Long Entry")
if in_interval and shorts_on and ta.crossunder(trend_confidence, short_entry)
strategy.entry("TC Short Entry", strategy.short)
strategy.exit("TC Short Exit", stop=sl_short)
if in_interval and shorts_on and ta.crossover(trend_confidence, short_exit)
strategy.close("TC Short Entry")
// Plots
plot(trend_confidence, "Trend Confidence", color.rgb(255, 255, 255))
plot(long_entry, "", color.rgb(0, 255, 0), linewidth=1)
plot(long_exit, "", color.rgb(255, 0, 0), linewidth=1)
plot(short_entry, "", color=bar_index % 10 == 0 ? color.rgb(0, 255, 0) : #00000000, linewidth=1)
plot(short_exit, "", color=bar_index % 10 == 0 ? color.rgb(255, 0, 0) : #00000000, linewidth=1)