これは,ダブルムービング・平均値に基づく振動トレード戦略である. 急速なMAと遅い移動平均値のクロスオーバーを買い・売る信号として使用する. 急速なMAが遅いMAを超えると,買い信号が生成される. 急速なMAが遅いMAを下回ると,売り信号が生成される. この戦略はレンジ・バインド市場と短期価格変動を捕捉するのに適している.
この戦略は,6期間のRMAを高速MAと4期間のHMAをスローMAとして使用します. 価格動向を判断し,高速線とスローラインのクロスオーバーに基づいて取引信号を生成します.
速い線がスローラインを越えると,短期の傾向の変化が上昇し,チップの移転のタイミングを示します.したがって,購入信号が生成されます.逆に,速い線がスローラインを下回ると,販売信号が生成されます.
さらに,長期トレンド判断は,トレンドに反する取引を避けるために行われます. 長期トレンドが信号と一致するときにのみ実際の買い/売シグナルが生成されます.
この戦略の利点は以下の通りです.
ダブルMAクロスオーバーは短期的な逆転点を効果的に特定します.
速度のMA長と遅さのMA長が合理的に組み合わせられ,正確な信号が発信される.
長期/短期トレンドフィルタリングにより ほとんどの誤った信号が削除されます
リスクを積極的に管理する ストップ・ロスの論理です
分かりやすく,初心者にも適しています.
リスクもあります:
小規模な利益が多く 大きな損失が多く TP/SLのレベルは微調整
取引条件を緩和する
オーバーフィット パラメーター 頑丈性テストが必要
トレンドモジュールを追加するか,トレンド戦略と組み合わせる.
戦略を最適化するためのいくつかの方向性:
アダプタブルカルマンフィルターなどで 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!")