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


Дата создания: 2024-01-08 16:29:21 Последнее изменение: 2024-01-08 16:29:21
Копировать: 0 Количество просмотров: 716
1
Подписаться
1617
Подписчики

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

Обзор

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

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

Стратегия использует RMA длины 6 в качестве быстрого скользящего среднего значения, HMA длины 4 в качестве медленного скользящего среднего значения. Стратегия определяет ценовые тенденции и генерирует торговые сигналы через перекрестные линии быстрого и медленного движения.

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

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

Стратегические преимущества

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

  1. Используя двумерный скрещивающий суждение, можно эффективно идентифицировать кратковременные ценовые переломные точки.
  2. Рациональное сочетание длины быстрых и медленных линий позволяет получить более точный торговый сигнал.
  3. В сочетании с оценкой долгосрочных и краткосрочных тенденций можно отфильтровать большую часть шумных торговых сигналов.
  4. Внедрены логика стоп-стоп-лосс, позволяющая активно избегать риска.
  5. Простые для понимания и применения, подходят для начинающих в количественной торговле.

Риски и решения

Однако эта стратегия также несет в себе некоторые риски:

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

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

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

  4. Стратегии плохо работают в трендовых ситуациях. Решение заключается в добавлении модуля определения тренда или использовании его в комбинации с трендовыми стратегиями.

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

В этой стратегии мы можем сделать следующие улучшения:

  1. Обновление среднелинейных показателей с использованием адаптивных фильтров, таких как Kalman.

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

  3. Добавление модуля управления капиталом, чтобы автоматизировать управление рисками.

  4. В сочетании с высокочастотными факторами можно найти более сильные торговые сигналы.

  5. Многоразовая арбитражная торговля.

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

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

Исходный код стратегии
/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-07 00:00:00
period: 3m
basePeriod: 1m
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/
// © dc_analytics
// https://datacryptoanalytics.com/


//@version=5
strategy("Scalping Trading", overlay=true)

//  INPUTS  //
bar_color       = input(true, title='Bar Color', group='⚙ Settings',tooltip='Color chart bars.', inline = "1")
mostrar         = input(true, 'Show Alerts', group='⚙ Settings', inline = "1")
tempo           = input.timeframe('60', group='⚙ Settings', title='🕗 Timeframe', options=['1', '5', '15', '30', '60', '120', '240', '360', '720', 'D', 'W'])

i_position      = input.string("Bottom Center", title = "⚙ D-Panel Location", 
 options = ["Top Right", "Bottom Center", "Bottom Right"], group='⚙ D-Panel Settings️',
 tooltip='Choose the location of the information table on the chart.(D-Panel) ')

position        = i_position == "Top Right" ? position.top_right : i_position == "Bottom Center" ? position.bottom_center : position.bottom_right

i_tam           = input.string('Big', title = '⚙ D-Painel Size', 
 options = ["Tiny", "Small", "Big"], group='⚙ D-Panel Settings️',tooltip='Choose the size of the information panel (D-Panel).')

tamanho         = i_tam == "Tiny" ? size.tiny : i_tam == "Small" ? size.small : size.normal

show_tp_sl      = input(true, title='Show Take Profit/Stop Loss', group='⚙ Settings',tooltip='Show Take Profit/Stop Loss.')
TP              = input.float(defval=4500, title='Take Profit:',group='⚙ Risk Management',tooltip='Choose amount of profit')
SL              = input.float(defval=2500, title='Stop Loss:', group='⚙ Risk Management',tooltip='Choose amount of loss') 
//  END INPUTS  //


//  DECLARATIONS  //
t_up    = '📈'
t_down  = '📉'

c_buy   = 'Long ⇡'
c_sell  = 'Short ⇣'

// _DECLARATION TREND
t_sma       = ta.hma(close, 200)
tend_sma    = ta.sma(close, 12)

tendencia   = request.security(syminfo.tickerid, timeframe.period, t_sma, barmerge.gaps_off, barmerge.lookahead_off)
tend_tabela = request.security(syminfo.tickerid, timeframe.period, tend_sma, barmerge.gaps_off, barmerge.lookahead_off)
// _END DECLARATION TREND

circle = plot.style_circles
//  END DECLARATIONS  //


//  COLORS  //
color gray   = color.gray
color red    = color.new(#ff8c05, 0)
color orange = color.new(#ff8c05, 0)
color silver = color.silver
color up_vol = color.new(color.green, 0)
color dn_vol = color.new(color.purple, 0)

color orange_tranp  = color.new(#ff8c05, 95)
// END COLORS //

//  SCANNER MARKET MAKERS  //
periodo  = input.int(20, 'Period Volume', group='⚙️ Scanner Market Makers Settings')
fator    = input.float(1.85, 'Proportion to the mean: (1.25 = 125% of the mean)', minval=0, group='⚙️ Scanner Market Makers Settings')
vol_up   = close > open
vol_down = open > close
vol      = volume
pesado   = volume > ta.ema(volume, periodo) * fator

palette  = pesado and vol_up ? gray : pesado and vol_down ? orange : vol_up ? silver : gray
//  END SCANNER MARKET MAKERS  //


//  LOGIC ONE  //
s = ta.rma(close, 6)
v = ta.hma(close, 4)

//  TREND  
t_baixa     = tendencia > tendencia[1]
t_alta      = tendencia < tendencia[1]

te_d        = tend_tabela > tend_tabela[1]
trend       = te_d ? t_up : t_down
//  END TREND  

a = request.security(syminfo.tickerid, tempo, s)
b = request.security(syminfo.tickerid, tempo, ohlc4)

c_dn   = a > b and a[1] < b[1]
c_up   = b > a and b[1] < a[1]

compra = mostrar and c_up ? a : na
venda  = mostrar and c_dn ? a : na

s_sell = venda and t_alta
s_buy  = compra and t_baixa
c_vela = b > a and te_d ? gray : orange

s_up = false
s_dw = false

b_sinal = not s_up and s_buy
s_sinal = not s_dw and s_sell

if b_sinal
    s_dw := false
    s_up := true
    s_up

if s_sinal
    s_dw := true
    s_up := false
    s_up

// END LOGIC ONE //


//  DATA TABLE  //
c = b > a ? orange : gray 
c_sinal = b > a ? c_buy : c_sell
//  END DATA TABLE  //


//  PLOT/BARCOLOR  //
c_barcolor = pesado and vol_up ? up_vol : pesado and vol_down ? dn_vol : vol_up ? c : c

barcolor(bar_color ? c_barcolor : na)
plot(a, color=orange_tranp, style=circle)
//  END PLOT/BARCOLOR  //


//  TABLE  //
var dash = table.new(position=position, columns=2, rows=3, border_width=1)
if barstate.islast
    table.cell(table_id=dash, column=1, row=2, text='Scalping DCA', bgcolor=orange)
    table.cell(table_id=dash, column=1, row=0, text='Trade: ' + c_sinal)
    table.cell(table_id=dash, column=1, row=1, text='Trend: ' + trend)
//  END TABLE  //


//  SETTINGS STRATEGY  //
exitPrice = strategy.closedtrades.exit_price(strategy.closedtrades - 1)

// OPEN ORDER
if (b_sinal)
    strategy.order("Long", strategy.long , comment = "Entry: " + str.tostring(close, "#.####"))
//    strategy.exit("EXIT", trail_points = 1000, trail_offset = 0, comment_trailing = "Close with Profit: " + str.tostring(close, "#.####"))
//    strategy.entry("long", strategy.long)

if (s_sinal)
    strategy.order("Short", strategy.short , comment = "Entry: " + str.tostring(close, "#.####"))
//    strategy.exit("EXIT", trail_points = 1000, trail_offset = 0, comment_trailing = "Close with Profit: " + str.tostring(close, "#.####"))
//    strategy.entry("short", strategy.short)

//  TP/SL ORDERS
if strategy.position_size > 0
    strategy.exit('Long_Close', 'Long',profit = TP , loss=SL, qty_percent=100, comment_profit = "Profit Long: " + str.tostring(exitPrice, "#.####"), comment_loss = "Stop Long: " + str.tostring(exitPrice, "#.####"))
//if  strategy.position_size > 0
//    strategy.exit("Long", "Long", stop = longSL, limit = longTP, comment_profit = "Profit Long: " + str.tostring(exitPrice, "#.####"), comment_loss = "Stop Long: " + str.tostring(exitPrice, "#.####"))
    
if strategy.position_size < 0
    strategy.exit('Short_Close', 'Short',profit = TP, loss=SL, qty_percent=100, comment_profit = "Profit Short: " + str.tostring(exitPrice, "#.####"), comment_loss = "Stop Short: " + str.tostring(exitPrice, "#.####"))
//if strategy.position_size < 0
//    strategy.exit("Short", "Short", stop = shortSL, limit = shortTP, comment_profit = "Profit Short: "+ str.tostring(exitPrice, "#.####"), comment_loss = "Stop Short: " + str.tostring(exitPrice, "#.####")) 

//  END SETTINGS STRATEGY  //

// LOGS 
// if strategy.opentrades > 10
//     log.warning("{0} positions opened in the same direction in a row. Try adjusting `bracketTickSizeInput`", strategy.opentrades)

// last10Perc = strategy.initial_capital / 10 > strategy.equity
// if (last10Perc and not last10Perc[1])
//     log.error("The strategy has lost 90% of the initial capital!")