Đây là một chiến lược theo xu hướng khung thời gian 5 phút dựa trên giao dịch EMA nhanh và chậm, với các lệnh giới hạn và dừng lỗ để tự động nắm bắt xu hướng. Nó phù hợp với giao dịch xu hướng trung hạn, sử dụng bộ lọc EMA để xác định hướng xu hướng tổng thể và giao dịch EMA nhanh / chậm để xác định thời gian nhập khẩu cụ thể. Ưu điểm của nó là đánh giá xu hướng chính xác và theo xu hướng hiệu quả.
Cụ thể:
Điều trên bao gồm logic giao dịch cơ bản của chiến lược này.
Giải pháp:
Nhìn chung, đây là một chiến lược theo xu hướng trung hạn rất hiệu quả. Logic rõ ràng của nó là sử dụng EMA crossover cho các mục nhập, giới hạn lệnh để ngăn chặn theo đuổi và dừng lại để khóa lợi nhuận là đơn giản và mạnh mẽ. Với điều chỉnh tham số thích hợp, nó có thể đạt được tỷ lệ thắng cao hơn và lợi nhuận. Những rủi ro như thời gian EMA không phù hợp và dừng quá mức cần được theo dõi. Nhưng nói chung đây là một hệ thống giao dịch xu hướng có thể định lượng hiệu quả.
/*backtest start: 2022-11-09 00:00:00 end: 2023-11-15 00:00:00 period: 1d basePeriod: 1h 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/ // © jordanfray //@version=5 strategy(title="5 Minute EMA Strategy", overlay=true, max_bars_back=500, default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.05, backtest_fill_limits_assumption=2) // Indenting Classs indent_1 = " " indent_2 = " " indent_3 = " " indent_4 = " " // Group Titles group_one_title = "EMA Settings" group_two_title = "Entry Settings" group_three_title = "Trade Filters" // Input Tips ocean_blue = color.new(#0C6090,0) sky_blue = color.new(#00A5FF,0) green = color.new(#2DBD85,0) red = color.new(#E02A4A,0) light_blue = color.new(#00A5FF,85) light_green = color.new(#2DBD85,85) light_red = color.new(#E02A4A,85) light_yellow = color.new(#FFF900,85) white = color.new(#ffffff,0) light_gray = color.new(#000000,70) transparent = color.new(#000000,100) // Strategy Settings - EMA fast_EMA_length = input.int(defval=20, minval=1, title="Fast Length", group=group_one_title) fast_EMA_type = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title=indent_4+"Type", group=group_one_title) fast_EMA_source = input.source(defval=close, title=indent_4+"Source", group=group_one_title) fast_EMA = switch fast_EMA_type "EMA" => ta.ema(fast_EMA_source, fast_EMA_length) "SMA" => ta.sma(fast_EMA_source, fast_EMA_length) "RMA" => ta.rma(fast_EMA_source, fast_EMA_length) "WMA" => ta.wma(fast_EMA_source, fast_EMA_length) => na plot(fast_EMA, title="Fast EMA", linewidth=1, color=green, editable=true) slow_EMA_length = input.int(defval=100, minval=1, title="Slow Length", group=group_one_title) slow_EMA_type = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title=indent_4+"Type", group=group_one_title) slow_EMA_source = input.source(defval=close, title=indent_4+"Source", group=group_one_title) slow_EMA = switch slow_EMA_type "EMA" => ta.ema(slow_EMA_source, slow_EMA_length) "SMA" => ta.sma(slow_EMA_source, slow_EMA_length) "RMA" => ta.rma(slow_EMA_source, slow_EMA_length) "WMA" => ta.wma(slow_EMA_source, slow_EMA_length) => na plot(slow_EMA, title="Slow EMA", linewidth=1, color=sky_blue, editable=true) // EMA Macro Filter enable_EMA_filter = input.bool(defval=false, title="Use EMA Filter", group=group_three_title) EMA_filter_timeframe = input.timeframe(defval="", title=indent_4+"Timeframe", group=group_three_title) EMA_filter_length = input.int(defval=300, minval=1, step=10, title=indent_4+"Length", group=group_three_title) EMA_filter_source = input.source(defval=hl2, title=indent_4+"Source", group=group_three_title) ema_filter = ta.ema(EMA_filter_source, EMA_filter_length) ema_filter_smoothed = request.security(syminfo.tickerid, EMA_filter_timeframe, ema_filter[barstate.isrealtime ? 1 : 0], gaps=barmerge.gaps_on) plot(enable_EMA_filter ? ema_filter_smoothed: na, title="EMA Macro Filter", linewidth=2, color=white, editable=true) // Entry Settings stop_loss_val = input.float(defval=2.0, title="Stop Loss (%)", step=0.1, group=group_two_title)/100 take_profit_val = input.float(defval=2.0, title="Take Profit (%)", step=0.1, group=group_two_title)/100 long_entry_limit_lookback = input.int(defval=3, title="Long Entry Limit Lookback", minval=1, step=1, group=group_two_title) short_entry_limit_lookback = input.int(defval=3, title="Short Entry Limit Lookback", minval=1, step=1, group=group_two_title) limit_order_long_price = ta.lowest(low, long_entry_limit_lookback) limit_order_short_price = ta.highest(high, short_entry_limit_lookback) start_trailing_after = input.float(defval=1, title="Start Trailing After (%)", step=0.1, group=group_two_title)/100 trail_behind = input.float(defval=1, title="Trail Behind (%)", step=0.1, group=group_two_title)/100 long_start_trailing_val = strategy.position_avg_price + (strategy.position_avg_price * start_trailing_after) short_start_trailing_val = strategy.position_avg_price - (strategy.position_avg_price * start_trailing_after) long_trail_behind_val = close - (strategy.position_avg_price * (trail_behind/100)) short_trail_behind_val = close + (strategy.position_avg_price * (trail_behind/100)) currently_in_a_long_postion = strategy.position_size > 0 currently_in_a_short_postion = strategy.position_size < 0 long_profit_target = strategy.position_avg_price * (1 + take_profit_val) long_stop_loss = strategy.position_avg_price * (1.0 - stop_loss_val) short_profit_target = strategy.position_avg_price * (1 - take_profit_val) short_stop_loss = strategy.position_avg_price * (1 + stop_loss_val) bars_since_entry = bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) plot(bars_since_entry, editable=false, title="Bars Since Entry", color=green) long_run_up = currently_in_a_long_postion and bars_since_entry > 0 ? ta.highest(high, bars_since_entry) : high long_trailing_stop = currently_in_a_long_postion and bars_since_entry > 0 and long_run_up > long_start_trailing_val ? long_run_up - (long_run_up * trail_behind) : long_stop_loss long_run_up_line = plot(long_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? green : transparent) long_trailing_stop_line = plot(long_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? long_trailing_stop > strategy.position_avg_price ? green : red : transparent) short_run_up = currently_in_a_short_postion and bars_since_entry > 0 ? ta.lowest(low, bars_since_entry) : low short_trailing_stop = currently_in_a_short_postion and bars_since_entry > 0 and short_run_up < short_start_trailing_val ? short_run_up + (short_run_up * trail_behind) : short_stop_loss // short_run_up_line = plot(short_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? green : transparent) short_trailing_stop_line = plot(short_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? short_trailing_stop < strategy.position_avg_price ? green : red : transparent) // Trade Conditions fast_EMA_cross_down_slow_EMA = ta.crossunder(fast_EMA,slow_EMA) fast_EMA_cross_up_slow_EMA = ta.crossover(fast_EMA,slow_EMA) plotshape(fast_EMA_cross_down_slow_EMA ? close : na, title="Short Entry Symbol", color=red, style=shape.triangledown, location=location.belowbar) plotshape(fast_EMA_cross_up_slow_EMA ? close : na, title="Long Entry Symbol", color=green, style=shape.triangleup, location=location.abovebar) fast_EMA_is_above_slow_EMA = fast_EMA > slow_EMA fast_EMA_is_below_slow_EMA = fast_EMA < slow_EMA ema_macro_filter_longs_only = fast_EMA > ema_filter_smoothed and slow_EMA > ema_filter_smoothed ema_macro_filter_shorts_only = fast_EMA < ema_filter_smoothed and slow_EMA < ema_filter_smoothed long_position_take_profit = ta.cross(close, long_trailing_stop) or close > long_profit_target short_position_take_profit = ta.cross(close, short_trailing_stop) or close > short_profit_target long_conditions_met = enable_EMA_filter ? ema_macro_filter_longs_only and fast_EMA_cross_up_slow_EMA and fast_EMA_is_above_slow_EMA and not currently_in_a_short_postion : fast_EMA_cross_up_slow_EMA and not currently_in_a_short_postion short_conditions_met = enable_EMA_filter ? ema_macro_filter_shorts_only and fast_EMA_cross_down_slow_EMA and fast_EMA_is_below_slow_EMA and not currently_in_a_long_postion : fast_EMA_cross_down_slow_EMA and fast_EMA_is_below_slow_EMA and not currently_in_a_long_postion // Long Entry strategy.entry(id="Long", direction=strategy.long, limit=limit_order_long_price, when=long_conditions_met) strategy.cancel(id="Cancel Long", when=ta.crossover(fast_EMA,slow_EMA)) strategy.exit(id="Close Long", from_entry="Long", stop=long_trailing_stop, limit=long_profit_target, when=long_position_take_profit) // Short Entry strategy.entry(id="Short", direction=strategy.short, limit=limit_order_short_price, when=short_conditions_met) strategy.cancel(id="Cancel Short", when=ta.crossunder(fast_EMA,slow_EMA)) strategy.exit(id="Close Short", from_entry="Short", stop=short_trailing_stop, limit=short_profit_target, when=short_position_take_profit) entry = plot(strategy.position_avg_price, editable=false, title="Entry", style=plot.style_stepline, color=currently_in_a_long_postion or currently_in_a_short_postion ? color.blue : transparent, linewidth=1) fill(entry,long_trailing_stop_line, editable=false, color=currently_in_a_long_postion ? long_trailing_stop > strategy.position_avg_price ? light_green : light_red : transparent) fill(entry,short_trailing_stop_line, editable=false, color=currently_in_a_short_postion ? short_trailing_stop < strategy.position_avg_price ? light_green : light_red : transparent) //ltp = plot(currently_in_a_long_postion ? long_profit_target : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_long_postion ? green : transparent, linewidth=1) //lsl = plot(currently_in_a_long_postion ? long_stop_loss : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_long_postion ? red : transparent, linewidth=1) //fill(entry,ltp, color= currently_in_a_long_postion ? light_green : light_red) //fill(entry,lsl, color= currently_in_a_long_postion ? light_red : light_green) //stp = plot(currently_in_a_short_postion ? short_profit_target : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_short_postion ? green : transparent, linewidth=1) //ssl = plot(currently_in_a_short_postion ? short_stop_loss : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_short_postion ? red : transparent, linewidth=1) //fill(entry,stp, color= currently_in_a_short_postion ? light_green : light_red) //fill(entry,ssl, color= currently_in_a_short_postion ? light_red : light_green)