Стратегия следования за трендом с несколькими таймфреймами


Дата создания: 2024-01-26 15:54:45 Последнее изменение: 2024-01-26 15:54:45
Копировать: 0 Количество просмотров: 614
1
Подписаться
1617
Подписчики

Стратегия следования за трендом с несколькими таймфреймами

Обзор

Стратегия формирует основные ценовые каналы, представляющие собой долгосрочные трендовые направления, путем расчета максимальных и минимальных цен в течение разных временных периодов ((50 бар и 200 бар). При этом в сочетании с быстрыми и медленными сигнальными линиями определяется направление краткосрочных трендов.

Стратегический принцип

Во-первых, с помощью вычисления максимумов и минимумов за последние 50 бар, а также максимумов и минимумов за последние 200 бар, образуются два ценовых канала, представляющих собой долгосрочные тенденции.

Во-вторых, рассчитывается кратковременная тенденция к формированию быстрых сигнальных каналов в пределах последних 7 бар; рассчитывается более кратковременная тенденция к формированию медленных сигнальных каналов в пределах последних 20 бар.

Наконец, сигнал входа подсказывает, когда скоростной, медленный и длительный ценовые каналы совпадают. Например, все каналы находятся в восходящей тенденции, подсказывают покупку; все каналы находятся в нисходящей тенденции, подсказывают продажу.

Анализ преимуществ

Наибольшее преимущество этой стратегии заключается в том, что она позволяет идентифицировать долгосрочные и краткосрочные единые направления тренда. Посредством подтверждения ценовых каналов в разных временных периодах, можно эффективно избегать путаницы в краткосрочных рыночных шумах.

Кроме того, стратегия использует многократные временные рамки, чтобы гарантировать стабильность сигнала, даже если в краткосрочной перспективе произойдет обратный курс.

Анализ рисков

Основной риск этой стратегии заключается в том, что при переходе долгосрочных и краткосрочных тенденций, поскольку требуется подтверждение нескольких временных циклов, возникает некоторая задержка в создании сигнала. В этом случае слепое следование может привести к увеличению убытков.

Кроме того, они не дружелюбны к высокочастотным сделкам и не могут быстро реагировать на краткосрочные колебания цен. В случае экстремальных ситуаций неправильное установление условий остановки может привести к большим потерям.

Направление оптимизации

Можно рассмотреть возможность включения адаптивной динамической стратегии остановки убытков, которая эффективно контролирует риск, когда цена переходит через определенную пропорцию в неблагоприятном направлении.

Кроме того, можно добавить дополнительные ценовые каналы разной длины, чтобы определить окончательный сигнал путем голосования, что повысит точность суждения.

Или используйте алгоритмы машинного обучения, чтобы автоматически оптимизировать параметры канала, чтобы они соответствовали текущей рыночной среде.

Подвести итог

Общая концепция стратегии ясна и понятна, она позволяет оценивать рыночные тенденции с помощью ценовых каналов в нескольких временных рамках и эффективно устраняет краткосрочный рыночный шум. Однако необходимо усилить обработку обратных тенденций и контроль риска. В сочетании со стратегией остановки убытков и оптимизацией параметров можно еще больше повысить стабильность стратегии и эффективность на поле боя.

Исходный код стратегии
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-25 00:00:00
period: 1h
basePeriod: 15m
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/
// © ZoomerXeus

//@version=4
strategy("Swing High Low Price Channel V.1", overlay=true)

//========================= variable =================================//
dead_channel_source = input(title="Main swing channel source", defval="H/L", options=["H/L"])
fast_signal_length = input(title="Fast Slow Length", type=input.integer, defval=7, maxval=49, minval=1)
slow_signal_length = input(title="Slow Slow Length", type=input.integer, defval=20, maxval=49, minval=1)
is_show_only_dead_channel = input(title="Show main channel only", defval=true)
main_channel_width = input(title="Main line width", defval=2, minval=1)
signal_channel_width = input(title="Signal line width", defval=1, minval=1)

//========================= indicator function =================================//
dead_cross_high_50 = highest(high, 50) 
dead_cross_high_200 = highest(high, 200) 
//========================================
dead_cross_low_50 = lowest(low, 50) 
dead_cross_low_200 = lowest(low, 200) 
//========================================
medain_dead_cross_50 = ((dead_cross_high_50-dead_cross_low_50)*0.5)+dead_cross_low_50
medain_dead_cross_200 = ((dead_cross_high_200-dead_cross_low_200)*0.5)+dead_cross_low_200


//========================================
fasthighest = highest(high, fast_signal_length)
fastlowest = lowest(low, fast_signal_length)
//========================================
slowhighest = highest(high, slow_signal_length)
slowlowest = lowest(low, slow_signal_length)
//========================================

    
//========================= plot =================================//
plot(dead_channel_source == "H/L" ? dead_cross_high_50 : na,title="50 bar highest", color=color.red, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? dead_cross_high_200 : na,title="200 bar highest", color=color.aqua, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? dead_cross_low_50 : na,title="50 bar lowest", color=color.red, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? dead_cross_low_200 : na,title="200 bar lowest", color=color.aqua, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? medain_dead_cross_200 : na,title="200 bar middle lowest", color=color.orange, linewidth=main_channel_width)
plot(dead_channel_source == "H/L" ? medain_dead_cross_50 : na,title="50 bar middle lowest", color=color.lime, linewidth=main_channel_width)
//===========================================
plot(is_show_only_dead_channel == false ? fasthighest : na,title="fast signal highest", color=#ff00f9, linewidth=signal_channel_width)
plot(is_show_only_dead_channel == false ? fastlowest : na,title="fast signal lowest", color=#ff00f9, linewidth=signal_channel_width)
plot(is_show_only_dead_channel == false ? slowhighest : na,title="slow signal highest", color=color.white, linewidth=signal_channel_width)
plot(is_show_only_dead_channel == false ? slowlowest : na,title="slow signal lowest", color=color.white, linewidth=signal_channel_width)
//===========================================
plot(crossover(medain_dead_cross_50, medain_dead_cross_200) ? medain_dead_cross_200 : na, title="Dead cross buy plot", style=plot.style_circles, linewidth=6, color=color.lime)
plot(crossunder(medain_dead_cross_50, medain_dead_cross_200) ? medain_dead_cross_200 : na, title="Dead cross sell plot", style=plot.style_circles, linewidth=6, color=color.red)
plot(is_show_only_dead_channel and (medain_dead_cross_50 < medain_dead_cross_200) and high == slowhighest ? high : na, title="Follow trend short term  sell plot zone", style=plot.style_circles, linewidth=3, color=color.orange)
plot(is_show_only_dead_channel and (medain_dead_cross_50 > medain_dead_cross_200) and low == slowlowest ? low : na, title="Follow trend short term buy plot zone", style=plot.style_circles, linewidth=3, color=color.green)
plot(is_show_only_dead_channel and high == slowhighest and (high == dead_cross_high_200) ? high : na, title="Not follow trend short term  sell plot zone", style=plot.style_circles, linewidth=3, color=color.orange)
plot(is_show_only_dead_channel and low == slowlowest and (low == dead_cross_low_200) ? low : na, title="Not follow trend short term buy plot zone", style=plot.style_circles, linewidth=3, color=color.green)

//===================== open close order condition =========================================================//
strategy.entry("strong buy", true, 1, when=low == dead_cross_low_200)
strategy.exit("close strong buy 50%", "strong buy", qty_percent=50, when=high==slowhighest)
strategy.entry("strong sell", false, 1, when=high == dead_cross_high_200)
strategy.exit("close strong sell 50%", "strong sell", qty_percent=50, when=low==slowlowest)