이것은 이중 이동 평균을 기반으로 하는 오시슬레이션 거래 전략이다. 빠른 이동 평균과 느린 이동 평균의 교차를 구매 및 판매 신호로 사용합니다. 빠른 MA가 느린 MA보다 높을 때 구매 신호가 생성됩니다. 빠른 MA가 느린 MA보다 낮을 때 판매 신호가 생성됩니다. 이 전략은 범위 제한 시장 및 단기 가격 변동을 포착하는 데 적합합니다.
이 전략은 6주기 RMA를 빠른 MA로, 4주기 HMA를 느린 MA로 사용하며 가격 추세를 판단하고 빠른 라인과 느린 라인의 교차를 기반으로 거래 신호를 생성합니다.
빠른 선이 느린 선 위에 넘어가면, 이는 지프 전송의 타이밍인 하락에서 상승으로의 단기 트렌드 변화를 나타냅니다. 따라서 구매 신호가 생성됩니다. 반대로 빠른 선이 느린 선 아래에 넘어가면 판매 신호가 생성됩니다.
또한, 장기 트렌드 판단은 트렌드에 반하는 거래를 피하기 위해 이루어집니다. 실제 구매/판매 신호는 장기 트렌드가 신호와 일치 할 때만 생성됩니다.
이 전략의 장점은 다음과 같습니다.
이중 MA 크로스오버는 단기적 반전 지점을 효과적으로 식별합니다.
빠른 MA 길이와 느린 MA 길이는 정확한 신호를 생산하기 위해 합리적으로 결합됩니다.
장기/단기 트렌드 필터링은 대부분의 잘못된 신호를 제거합니다.
수익을 취하고 손실을 멈추는 논리는 적극적으로 위험을 관리합니다.
이해하기 쉽고 적용하기 쉽고 초보자에도 적합합니다.
또한 몇 가지 위험이 있습니다.
작은 수익이 많지만 큰 손실이 있습니다.
빈번한 거래 범위 시장에서 거래 조건이 완화
부착된 매개 변수, 견고성 테스트가 필요해
트렌드 시장에서 낮은 성과. 트렌드 모듈을 추가하거나 트렌드 전략과 결합합니다.
전략을 최적화하는 몇 가지 방향:
어댑티브 칼만 필터 등으로 MA를 업그레이드하세요
신호 정확도를 높이기 위해 ML 모델을 추가합니다.
리스크 통제를 자동화하기 위해 자본 관리 모듈을 추가합니다
더 강한 신호를 얻기 위해 고주파 요인과 결합합니다.
제품 간 시장 중재.
결론적으로, 이 두 번째 MA 전략은 전형적이고 실용적인 양자 전략이다. 초보자가 배울 수있는 좋은 적응력을 가지고 있으며, 한편으로는 더 나은 결과를 위해 더 많은 양자 기술로 더 최적화 할 수있는 큰 잠재력을 가지고 있습니다.
/*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!")