Стратегия следования за трендом с использованием полос Боллинджера и двойной скользящей средней


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

Стратегия следования за трендом с использованием полос Боллинджера и двойной скользящей средней

Обзор

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

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

Стратегия применяет одновременно две версии: простую и усиленную.

Средняя траектория для расчета SMA с использованием простого бринга для ценообразования, средняя траектория для расчета EMA с использованием усиленного бринга для ценообразования.

Вычисляется стандартное расхождение ±N-кратного среднего орбитального отклонения.

Стратегия определяет тренд на основе расстояния между верхней и нижней полосами Бринского пояса (spread), когда спред меньше установленного порога, что означает, что он входит в трендовый диапазон, и можно торговать по тренду.

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

Целевая прибыль зависит от выбора плавающей позиции вблизи средней или верхней полосы.

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

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

Эта стратегия имеет следующие преимущества:

  1. Объединение двойных поясов Брин для эффективного принятия решений

Используйте простые и усиленные ленты, чтобы сравнить эффекты двух типов лент, выбрать лучшую версию и повысить эффективность принятия решений.

  1. Насколько тенденция определяется шириной коридора Брин

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

  1. Гибкий способ остановки убытков

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

  1. Защитные механизмы от убытков

Продажа может предотвратить увеличение убытков только при условии обеспечения прибыли.

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

Также существуют следующие риски:

  1. Риск отступления

Тренд-торговля сопряжена с определенным риском отступления, а также с психологическим стрессом, связанным с постоянными потерями.

  1. Риск потрясений

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

  1. Риск возникновения сбоев

Фиксированный процентный стоп может быть слишком радикальным и требует адаптации к более умеренным методам стоп, таким как ATR стоп.

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

Эта стратегия может быть оптимизирована в следующих аспектах:

  1. Оптимизация параметров Брин-полосы

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

  1. Фильтрация в сочетании с другими показателями

На основе сигнала по Брин-полосе можно добавлять фильтры для таких показателей, как MACD, KD и т. д., чтобы уменьшить торговлю на волатильных рынках.

  1. Оптимизация стратегии стоп-стоп

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

  1. Оптимизация управления капиталом

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

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

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

Исходный код стратегии
/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-31 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/
// © JCGMarkets 

//@version=4
strategy("B.Bands | Augmented | Intra-range | Long-Only", shorttitle = "BB|A|IR|L", initial_capital=5000, commission_value=0.075, slippage = 1, overlay = true)

//Technical Indicators Data
show_simp   = input(false, title="Trade on Simple Bollinger Bands ", type= input.bool, group="Select Strategy System")
show_augm   = input(true, title="Trade on Augmented Bollinger Bands", type= input.bool, group="Select Strategy System") 
periods     = input(20, title="Periods for Moving Average", type =input.integer, minval = 2, step = 1, group="Technical Inputs")
std         = input(2, title="Std", type = input.float, minval=0.1 , step = 0.1, group="Technical Inputs")

// Strategy data
max_spread_bb   = input(20000.0, title="Max Spread Tolerance Beetween Bands", type=input.float, step=0.1, group="Strategy Inputs")
entry_source    = input(close, title="Entry data source", type=input.source, group="Strategy Inputs")
exit_source     = input(high, title="Exit data source", type=input.source, group="Strategy Inputs")
take_profit     = input("middle", title = "Profit to band:", options = ["middle", "opposite"], group="Strategy Inputs")
stop_loss       = input(3.00, title="Stop Loss %", type=input.float, step=0.05, group="Strategy Inputs")
trailing        = input(false, title="Activate trailing stop?", type = input.bool, group="Strategy Inputs")
stop_perc       = input(6.00, title="Trailing %", type=input.float, step=0.125, group="Strategy Inputs") * 0.01
sell_profit     = input(false, title="Only sell in profit (Stop Loss still active) ", type= input.bool, group="Strategy Inputs")


var SL = 0.0
var SLT= 0.0


//Simple BB Calculation -> adapt if needed with different std for upper-lower, sma-ema, etc 
middle_sim = sma(close, periods)

//Augmented BB Calculation -> adapt if needed with different std for upper lower, etc
middle_augm  = ema(close, periods)
middle_upp = ema(high, periods)
middle_low = ema(low, periods)

//Multiplier
dev      = stdev(close, periods) * std

//Upper & Lower Bands
upper = (middle_sim + dev)
lower = (middle_sim - dev)

//Augmented Bands
upper_augm = (middle_upp + dev)
lower_augm = (middle_low - dev)

//Bands Spread
spread   = upper - lower
spread_augm   = upper_augm - lower_augm

//From date
filter_from    =   input(  true,    title="===> From", group="Date Control")
from_y         =   input(  2010,    title = "from year", group="Date Control")
from_m         =   input(     1,    title = "from month", minval =1, maxval=12, group="Date Control")
from_d         =   input(     1,    title = "from day",  minval=1, maxval=31, group="Date Control")

//To date
filter_to   =    input( true,   title="===> To", group="Date Control")
to_y        =    input( 2030,   title = "To year", group="Date Control")
to_m        =    input(    1,   title = "To month", minval =1, maxval=12, group="Date Control")
to_d        =    input(    1,  title = "To day",  minval=1, maxval=31, group="Date Control")

// Date Condition
In_date() =>  true

in_position = strategy.position_size > 0 

// Trailing stop 
SLT := if in_position and In_date()
    stop_inicial = entry_source * (1 - stop_perc)
    max(stop_inicial, SLT[1])
else
    0

slts = (low <= SLT) and (trailing == true)


//Essential Trade logics
entry_long = (entry_source <= lower) and (spread < max_spread_bb)
entry_long_augm = (entry_source <= lower_augm) and (spread_augm < max_spread_bb)

// Simple Bollinger Conditions

if (not in_position and show_simp and In_date())
    if entry_long
        // Trigger buy order
        position_size = round( strategy.equity / close ) // All available equity for this strategy example
        strategy.entry("Entry", strategy.long, qty = position_size )
        SL := close * (1 - (stop_loss / 100)) // You could determine wether or not implement stop loss with bool input and if condition here.


if in_position and show_simp and not sell_profit and In_date()
    //Exits if not sell in profit
    if take_profit == "middle" 
        strategy.exit("Target", "Entry", limit = middle_sim, stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry", limit = upper, stop = SL, comment="Exit")    

if in_position and show_simp and sell_profit and In_date()
    //Exits if sell in profit
    if take_profit == "middle" 
        strategy.exit("Target", "Entry", limit = (strategy.openprofit > 0 ? middle_sim: na), stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry", limit = (strategy.openprofit > 0 ? upper: na), stop = SL, comment="Exit")    



if in_position and show_simp and slts and In_date()
    //Trailing activation
    strategy.close("Entry", comment="SLT")

if not In_date()
    //Exit due out of date range
    strategy.close("Entry", comment="Out of date range")



// Augmented Bollinger Conditions

if (not in_position and show_augm and In_date()) 
    if entry_long_augm
        // Trigger buy order
        position_size = round( strategy.equity / close )
        strategy.entry("Entry_A", strategy.long, qty = position_size )
        SL := close * (1 - (stop_loss / 100) )

if in_position and show_augm and not sell_profit and In_date()
    //Exits and not sell in profit
    if take_profit == "middle"
        strategy.exit("Target", "Entry_A", limit = middle_augm, stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry_A", limit = upper_augm, stop = SL, comment="Exit")            
        

if in_position and show_augm and sell_profit and In_date() 
    //Exit only in profit
    if take_profit == "middle"
        strategy.exit("Target", "Entry_A", limit = (strategy.openprofit > 0 ? middle_augm:na), stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry_A", limit = (strategy.openprofit > 0 ? upper_augm: na) , stop = SL, comment="Exit") 


if in_position  and show_augm and slts and In_date()
    //Trigger trailing
    strategy.close("Entry_A", comment="SLT")
    
if not In_date()
    //Out of date trigger
    strategy.close("Entry_A", comment= "Out of date range")




// Plotting

plot(in_position ? SL > 0 ? SL : na : na , style = plot.style_circles, color = color.red, title = "Stop Loss")
plot(in_position ? trailing ? SLT > 0 ? SLT : na : na : na , style = plot.style_circles, color = color.blue, title = "Trailing Stop" )

s = plot(show_simp ? upper : na , color = color.aqua)
plot(show_simp ? middle_sim : na , color=color.red)
i = plot(show_simp ? lower : na , color = color.aqua)
fill(s,i, color=color.new(color.aqua,90))


plot(show_augm ? middle_augm : na , color=color.blue)
s_a = plot( show_augm ? upper_augm : na, color=color.orange)
i_a = plot( show_augm ? lower_augm : na, color= color.orange)
fill(s_a,i_a, color=color.new(color.orange, 90))