Xu hướng sau chiến lược chuyển đổi EMA 5 phút

Tác giả:ChaoZhang, Ngày: 2023-11-16 15:36:36
Tags:

img

Tổng quan

Đâ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ả.

Chiến lược logic

  1. Sử dụng đường EMA nhanh và chậm, đi dài khi EMA nhanh vượt qua EMA chậm, đi ngắn khi vượt qua dưới
  2. Áp dụng bộ lọc macro EMA, chỉ mua dài trên EMA và ngắn dưới EMA để tránh tín hiệu sai
  3. Nhập giao dịch với lệnh giới hạn để đảm bảo giá nhập cảnh lý tưởng được đáp ứng
  4. Áp dụng lệnh dừng lỗ theo dõi động sau khi nhập để khóa lợi nhuận và cắt giảm lỗ

Cụ thể:

  1. Tính toán EMA nhanh và chậm dựa trên các giai đoạn được chọn
  2. Chỉ thực hiện các vị trí dài / ngắn khi giá trên / dưới EMA nếu bộ lọc được bật
  3. Đi dài khi EMA nhanh vượt qua EMA chậm, đi ngắn khi chéo xuống
  4. Đặt lệnh mua giới hạn cho dài và giới hạn lệnh bán cho ngắn
  5. Bắt đầu dừng lỗ theo dõi dựa trên mức cao nhất / thấp nhất sau khi nhập cảnh

Điều trên bao gồm logic giao dịch cơ bản của chiến lược này.

Ưu điểm

  1. Bộ lọc EMA xác định xu hướng tổng thể, ngăn chặn giao dịch chống lại xu hướng chính
  2. EMA nhanh / chậm với giới hạn ngăn chặn theo đuổi đỉnh / đáy
  3. Động lực kéo theo dừng khóa trong lợi nhuận hiệu quả
  4. Kiểm soát rủi ro tốt với mức dừng lỗ ~ 2%
  5. Tỷ lệ rút tiền nhỏ hơn, tốt để theo dõi xu hướng
  6. Đơn giản và dễ hiểu logic, tối ưu hóa

Rủi ro

  1. Whipsaws và rủi ro thoát sai, khả năng bị mắc kẹt
  2. Thời gian EMA không chính xác có thể gây ra xu hướng bỏ lỡ
  3. Stop loss quá rộng, có thể vượt quá biến động bình thường
  4. Đỗ xe quá hung hăng, có thể thoát ra sớm
  5. Tỷ lệ dừng lỗ / lấy lợi nhuận kém tối ưu, bỏ lỡ các động thái lớn

Giải pháp:

  1. Tối ưu hóa các thông số EMA để tìm các giai đoạn tốt nhất
  2. Mở rộng các điểm dừng một cách vừa phải để ngăn chặn các điểm dừng quá mức
  3. Chọn cẩn thận điểm bắt đầu và tỷ lệ phần trăm đường mòn
  4. Kiểm tra các tỷ lệ dừng / lấy khác nhau để tìm ra tối ưu

Cơ hội tối ưu hóa

  1. Tối ưu hóa thời gian EMA để tìm kết hợp tốt nhất
  2. Hãy thử các loại EMA khác nhau như đường trung bình động cân nhắc
  3. Kiểm tra các chỉ số khác như MACD để cải thiện hiệu suất
  4. Cố gắng lọc EMA trong khung thời gian dài hơn
  5. Tối ưu hóa phạm vi giá nhập lệnh giới hạn
  6. Tối ưu hóa điểm dừng lỗ và tỷ lệ lấy lợi nhuận
  7. Thử nghiệm với các phương pháp theo dõi tiên tiến hơn
  8. Thêm chỉ số sức mạnh xu hướng để nhận thức tình huống
  9. Xem xét nhiều bộ lọc hơn để tránh thêm tín hiệu sai

Kết luận

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)


Thêm nữa