Торговая стратегия на основе адаптивного супертрендового канала


Дата создания: 2023-09-20 15:17:51 Последнее изменение: 2023-09-20 15:17:51
Копировать: 0 Количество просмотров: 509
1
Подписаться
1166
Подписчики

Обзор

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

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

  1. Расчет стандартной разницы цены и волатильности ATR с корректировкой ширины траншеи на фоне волатильности.

  2. Построение двухслойных сверхтенденционных каналов, внутренний канал более чувствителен, внешний канал более стабилен.

  3. Сигнал покупки или продажи возникает, когда цена прорывает внутренний или внешний канал сверх тренда.

  4. Используя двухслойную канальную структуру, можно отфильтровать некоторые ложные прорывы.

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

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

  1. Сверхтройный канал прост в использовании и позволяет лучше отслеживать тренды.

  2. Двухслойная структура канала позволяет улучшить качество сигнала, фильтруя ложные прорывы.

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

  4. Простая реализация и легкость настройки параметров.

  5. Визуализация каналов и прорывов, формирование интуитивно понятных торговых сигналов.

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

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

  2. “Я не могу определить направление тренда, существует риск обратной торговли”.

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

  4. Неправильная оптимизация параметров может привести к чрезмерной оптимизации.

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

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

  1. Тестирование влияния различных параметров на эффекты адаптации каналов.

  2. Попытайтесь определить направление тенденции, используя такие показатели, как средняя линия.

  3. Оптимизация механизма подтверждения прорыва, чтобы избежать ложных прорывов.

  4. Добавление стратегии стоп-лосса для контроля одиночных убытков

  5. Оценка влияния на частоту сделок корректировки параметров канала.

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

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

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

Исходный код стратегии
/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SuperTrend Cloud Strategy", shorttitle="SuperTrend Cloud Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital = 1000)

//Inputs
multi = input(title="Multiplier", type=input.float, step=0.1, defval=3, minval=1)
period = input(title="Period", type=input.integer, step=1, defval=10, minval=1)
SelfAdjust = input(title="Self-Adjusting", type=input.bool, defval = false)


////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2019, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true
 
////////////////////////////////////////////////////////////////////////////////

dev = stdev(close, period)
stdDev = (dev / close) * 100 + 1
MultDev = SelfAdjust ? multi * stdDev : multi

up_lev1 = hl2 - MultDev * atr(period)
dn_lev1 = hl2 + MultDev * atr(period)
up_lev2 = hl2 - (MultDev * 2 * atr(period))
dn_lev2 = hl2 + (MultDev * 2 * atr(period))

up_trend1 = 0.0
up_trend1 := close[1] > up_trend1[1] ? max(up_lev1, up_trend1[1]) : up_lev1
up_trend2 = 0.0
up_trend2 := close[1] > up_trend2[1] ? max(up_lev2, up_trend2[1]) : up_lev2

down_trend1 = 0.0
down_trend1 := close[1] < down_trend1[1] ? min(dn_lev1, down_trend1[1]) : dn_lev1
down_trend2 = 0.0
down_trend2 := close[1] < down_trend2[1] ? min(dn_lev2, down_trend2[1]) : dn_lev2

trend1 = 0
trend1 := close > down_trend1[1] ? 1: close < up_trend1[1] ? -1 : nz(trend1[1], 1)
trend2 = 0
trend2 := close > down_trend2[1] ? 1: close < up_trend2[1] ? -1 : nz(trend2[1], 1)

st_line1 = trend1 == 1 ? up_trend1 : down_trend1
st_line2 = trend2 == 1 ? up_trend2 : down_trend2

// Plotting
plot1 = plot(st_line1, color = trend1 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 1")
plot2 = plot(st_line2, color = trend2 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 2")
fill(plot1, plot2, color = color.aqua, title = "Cloud")

buy = crossover(close, st_line1) and close > st_line2 or crossover(close, st_line2) and close > st_line1
sell = crossunder(close, st_line1) and close < st_line2 or crossunder(close, st_line2) and close < st_line1

if(buy and time_cond)
    strategy.entry("long", long = true , comment="long")

if (close < st_line1 and time_cond or close < st_line2 and time_cond)
    strategy.close("long")
    
if (not time_cond)
    strategy.close_all()