
Эта стратегия является основанной на двойной равномерной стратегии волатильности торговли. Она использует как сигнал к покупке и продаже перекрестку быстрого и медленного движущихся средних. Она генерирует сигнал к покупке, когда быстрое движущееся среднее пересекает медленное движущееся среднее снизу, и сигнал к продаже, когда быстрое движущееся среднее пересекает медленное движущееся среднее снизу.
Стратегия использует RMA длины 6 в качестве быстрого скользящего среднего значения, HMA длины 4 в качестве медленного скользящего среднего значения. Стратегия определяет ценовые тенденции и генерирует торговые сигналы через перекрестные линии быстрого и медленного движения.
Когда быстрая линия сверху пересекает медленную линию снизу, это означает, что цена в краткосрочной перспективе перевернулась вниз и входит в период чипового перевода, поэтому стратегия в это время производит сигнал покупки; когда быстрая линия сверху пересекает медленную линию снизу, это означает, что цена в краткосрочной перспективе перевернулась вниз и входит в период чипового перевода, поэтому стратегия в это время производит сигнал продажи.
Кроме того, стратегия также обнаруживает долгосрочные трендовые суждения, чтобы избежать обратной торговли. Фактические сигналы покупки и продажи будут генерироваться только в том случае, если долгосрочные трендовые суждения одновременно одобряют этот сигнал.
Эта стратегия имеет следующие преимущества:
Однако эта стратегия также несет в себе некоторые риски:
Двойная равнолинейная стратегия легко приводит к многократным небольшим прибылям, но один раз - к большим убыткам. Решение заключается в соответствующей корректировке уровня стоп-стоп-убытков.
В условиях волатильности часто встречаются торговые сигналы, которые могут привести к чрезмерной торговле. Решение заключается в том, чтобы соответственно ослабить условия торговли и уменьшить количество транзакций.
Параметры стратегии легко переоптимизируются, и их эффективность может быть низкой. Решение - это тестирование стабильности параметров.
Стратегии плохо работают в трендовых ситуациях. Решение заключается в добавлении модуля определения тренда или использовании его в комбинации с трендовыми стратегиями.
В этой стратегии мы можем сделать следующие улучшения:
Обновление среднелинейных показателей с использованием адаптивных фильтров, таких как Kalman.
Добавление модуля машинного обучения, который использует обучение ИИ для определения точек купли и продажи.
Добавление модуля управления капиталом, чтобы автоматизировать управление рисками.
В сочетании с высокочастотными факторами можно найти более сильные торговые сигналы.
Многоразовая арбитражная торговля.
Двухлинейная стратегия колебания в целом является типичной и практической стратегией количественного трейдинга. Она обладает высокой адаптивностью, и новички могут извлечь из нее много знаний о разработке стратегии. В то же время, она также имеет большое пространство для улучшения, которое может быть дополнительно оптимизировано в сочетании с большим количественным количеством методов, чтобы получить лучшие результаты стратегии.
/*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!")