Chiến lược theo dõi xu hướng 5 phút dựa trên sự giao nhau của EMA nhanh và chậm


Ngày tạo: 2023-11-16 15:36:36 sửa đổi lần cuối: 2023-11-16 15:36:36
sao chép: 0 Số nhấp chuột: 828
1
tập trung vào
1617
Người theo dõi

Chiến lược theo dõi xu hướng 5 phút dựa trên sự giao nhau của EMA nhanh và chậm

Tổng quan

Chiến lược này dựa trên khung thời gian 5 phút của hệ thống EMA giao thoa nhanh, kết hợp với lệnh giới hạn và theo dõi xu hướng tự động bắt lỗ. Chiến lược này phù hợp với giao dịch xu hướng đường ngắn trung tâm, thông qua bộ lọc EMA để đánh giá hướng xu hướng tổng thể, sau đó kết hợp với giao thoa EMA nhanh để định vị thời gian nhập cảnh cụ thể. Ưu điểm của nó là chính xác trong việc đánh giá xu hướng, có thể theo dõi xu hướng một cách hiệu quả; Nhược điểm là có một số phá vỡ giả, dễ bị mắc kẹt.

Nguyên tắc chiến lược

  1. Sử dụng EMA nhanh và EMA chậm, làm nhiều hơn khi mặc EMA chậm trên EMA nhanh và trống khi mặc
  2. Sử dụng bộ lọc vĩ mô EMA, chỉ có thể làm nhiều hơn khi giá trên EMA và trống dưới EMA để tránh phá vỡ giả
  3. Sử dụng bảng giá giới hạn để đảm bảo giá đạt đến vị trí mong muốn và sau đó nhập cảnh
  4. Sử dụng động theo dõi dừng lỗ sau khi nhập, khóa lợi nhuận, dừng lỗ khi thoát ra

Ghi chú:

  1. Tính toán EMA nhanh dựa trên độ dài của EMA nhanh và EMA chậm
  2. Nếu bạn bật bộ lọc EMA, bạn chỉ có thể làm nhiều hơn khi giá cao hơn EMA và trống khi giá thấp hơn EMA
  3. Làm nhiều hơn khi EMA nhanh vượt qua EMA chậm; làm trống khi EMA nhanh vượt qua EMA chậm
  4. Giới hạn thấp khi nhập học nhiều lần, giới hạn cao khi nhập học bằng vé rỗng
  5. Bắt đầu theo dõi dừng lỗ sau khi vào, theo dõi, dừng lỗ và dừng lại theo giá cao nhất hoạt động

Đây là logic giao dịch cơ bản của chiến lược này.

Lợi thế chiến lược

  1. Sử dụng EMA để đánh giá xu hướng tổng thể, tránh giao dịch ngược
  2. EMA nhanh chóng kết hợp với giá giới hạn, có thể ngăn chặn hiệu quả việc theo đuổi giá cao và giảm
  3. Động thái theo dõi dừng lỗ, có thể khóa lợi nhuận tốt
  4. Rủi ro được kiểm soát, mỗi lệnh dừng lỗ được cố định ở mức khoảng 2%
  5. Những người tham gia có xu hướng rút lui ít hơn và nắm bắt được xu hướng tốt hơn.
  6. Chiến lược đơn giản, rõ ràng, dễ hiểu và tối ưu hóa

Rủi ro chiến lược

  1. Có một số nguy cơ phá vỡ xu hướng giả mạo, có thể bị mắc kẹt
  2. EMA không được thiết lập đúng chu kỳ có thể dẫn đến xu hướng bị bỏ lỡ
  3. Cài đặt stop loss quá lớn, có thể bị dừng ngoài phạm vi dao động bình thường
  4. Theo dõi dừng lại quá cấp tiến, có thể ra đi sớm
  5. Thiết lập tỷ lệ dừng và dừng không hợp lý, có thể bỏ lỡ một tình huống lớn hơn

Phản ứng:

  1. Tối ưu hóa tham số EMA để tìm ra độ dài chu kỳ tối ưu
  2. Giảm mức độ lỗ hổng một cách thích hợp để tránh lỗ hổng quá thường xuyên
  3. Thiết lập cẩn thận điểm bắt đầu và mức độ theo dõi
  4. Kiểm tra các tỷ lệ dừng lỗ khác nhau để tìm các tham số tối ưu

Hướng tối ưu hóa chiến lược

  1. Tối ưu hóa tham số EMA chu kỳ để tìm các tham số kết hợp tốt nhất
  2. Thử các loại EMA khác nhau, chẳng hạn như trung bình di chuyển có trọng lượng
  3. Kiểm tra các chỉ số khác như MACD để xem có thể tăng hiệu quả hay không
  4. Cố gắng lọc EMA trong khung thời gian cao hơn
  5. Tối ưu hóa giới hạn giá tại thời điểm nhập học
  6. Tối ưu hóa điểm và tỷ lệ dừng lỗ
  7. Cố gắng theo dõi và ngăn chặn các tổn thất phức tạp hơn.
  8. Tham gia chỉ số xu hướng để đánh giá xu hướng mạnh mẽ
  9. Xem xét thêm bộ lọc để tránh đột phá giả

Tóm tắt

Chiến lược này nói chung là một chiến lược rất thích hợp cho giao dịch xu hướng đường ngắn trung bình, EMA giao thoa đánh giá thời gian nhập cảnh, giá giới hạn đơn giản tránh theo đuổi cao và giảm, động theo dõi dừng lỗ khóa lợi nhuận quá trình rất rõ ràng, hợp lý, dễ vận hành. Bằng cách tối ưu hóa một số tham số, bạn có thể nâng cao hơn nữa chiến thắng của chiến lược và lợi nhuận. Tất nhiên, cũng cần phải chú ý đến việc phòng ngừa nguy cơ không đúng chu kỳ EMA, dừng lỗ quá thường xuyên. Nói chung, chiến lược này đơn giản, hiệu quả và rất phù hợp cho giao dịch xu hướng định lượng.

Mã nguồn chiến lược
/*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)