Chiến lược giao dịch EMA-Squeeze với lệnh dừng lỗ động cho nhiều khung thời gian

EMA SQM CMF KC SL TP MTF
Ngày tạo: 2024-12-11 15:50:38 sửa đổi lần cuối: 2024-12-11 15:50:38
sao chép: 0 Số nhấp chuột: 435
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch EMA-Squeeze với lệnh dừng lỗ động cho nhiều khung thời gian

Tổng quan

Chiến lược này là một hệ thống giao dịch động dựa trên phân tích nhiều chu kỳ thời gian, kết hợp các chỉ số chuyển động trung bình (EMA), chỉ số động lượng Squeeze (SQM) và chỉ số dòng tiền (CMF) để tạo ra tín hiệu giao dịch. Cốt lõi của chiến lược là xác nhận xu hướng thông qua phân tích nhiều khung thời gian và sử dụng dừng động để tối ưu hóa quản lý rủi ro. Chiến lược này sử dụng chương trình dừng và thu lợi nhuận thích ứng, có thể tự động điều chỉnh tham số giao dịch theo biến động của thị trường.

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

Chiến lược sử dụng ba bộ chỉ số kỹ thuật chính để xác định cơ hội giao dịch. Đầu tiên, xác định hướng xu hướng của thị trường thông qua EMA 11 chu kỳ và chu kỳ 34. Tiếp theo, sử dụng chỉ số Squeeze Momentum phiên bản cải tiến để phát hiện áp lực thị trường và cơ hội đột phá tiềm năng, chỉ số này tính toán độ lệch giá thông qua phương pháp quay ngược tuyến tính. Cuối cùng, xác định hướng giao dịch thông qua chỉ số CMF cải tiến để đảm bảo có đủ tiền để hỗ trợ chuyển động giá.

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

  1. Xác nhận tín hiệu đa chiều: Giảm đáng kể nguy cơ tín hiệu giả bằng cách kết hợp nhiều chỉ số kỹ thuật và phân tích chu kỳ thời gian.
  2. Quản lý rủi ro thông minh: Hệ thống dừng lỗ động có thể tự động điều chỉnh theo biến động của thị trường, tránh ra sân sớm trong khi bảo vệ lợi nhuận.
  3. Tự thích ứng: Các tham số chiến lược có thể được điều chỉnh theo các điều kiện thị trường khác nhau và có khả năng thích ứng tốt.
  4. Vòng kín giao dịch hoàn chỉnh: Có các quy tắc rõ ràng từ tín hiệu nhập đến quản lý xuất, giảm ảnh hưởng của phán đoán chủ quan.
  5. Xác nhận dòng tiền: Bằng cách giám sát dòng tiền để xác minh chuyển động giá, tăng độ tin cậy của giao dịch.

Rủi ro chiến lược

  1. Tính nhạy cảm của tham số: Cài đặt tham số của nhiều chỉ số kỹ thuật cần được tối ưu hóa cẩn thận, tham số không đúng có thể dẫn đến giảm hiệu suất.
  2. Tùy thuộc vào môi trường thị trường: Chất lượng tín hiệu có thể bị ảnh hưởng trong môi trường thị trường biến động mạnh hoặc thiếu thanh khoản.
  3. Tính phức tạp của tính toán: tính toán nhiều chu kỳ thời gian có thể gây ra sự chậm trễ tín hiệu, ảnh hưởng đến hiệu quả giao dịch thực tế.
  4. Rủi ro điều chỉnh dừng lỗ: Động thái dừng lỗ có thể quá quyết liệt hoặc bảo thủ trong một số điều kiện thị trường.
  5. Yêu cầu quản lý tài chính: Chiến lược cần quản lý tài chính hợp lý để cân bằng rủi ro và lợi nhuận.

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

  1. Tiến hành tự điều chỉnh tỷ lệ dao động: Các tham số có thể được điều chỉnh động theo ATR hoặc các chỉ số tỷ lệ dao động khác để cải thiện khả năng thích ứng của chiến lược.
  2. Tối ưu hóa lọc tín hiệu: Bạn có thể thêm trọng lượng giao dịch hoặc lọc thời gian để cải thiện chất lượng tín hiệu.
  3. Cải thiện cơ chế dừng lỗ: có thể kết hợp các vị trí hỗ trợ và kháng cự để tối ưu hóa các thiết lập điểm dừng lỗ.
  4. Thêm phân tích môi trường thị trường: giới thiệu các chỉ số cường độ xu hướng thị trường, sử dụng các thiết lập tham số khác nhau trong các môi trường thị trường khác nhau.
  5. Quản lý tài chính hoàn thiện: Tiến hành các thuật toán quản lý vị trí, điều chỉnh tỷ lệ giữ vị trí theo cường độ tín hiệu và biến động thị trường.

Tóm tắt

Chiến lược này cung cấp cho các nhà giao dịch một chương trình giao dịch có hệ thống thông qua phân tích kỹ thuật đa chiều và quản lý rủi ro thông minh. Ưu điểm cốt lõi của nó là kết hợp theo dõi xu hướng và quản lý rủi ro động, có thể nắm bắt cơ hội thị trường trong khi bảo vệ lợi nhuận. Mặc dù có một số khía cạnh cần được tối ưu hóa, chiến lược vẫn có thể là một công cụ giao dịch hiệu quả thông qua thiết lập tham số hợp lý và kiểm soát rủi ro.

Mã nguồn chiến lược
/*backtest
start: 2024-11-10 00:00:00
end: 2024-12-09 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("LL Crypto - SUI", overlay=true)

// Parâmetros de tempo para criptomoedas
fast_ema_len = input.int(11, minval=5, title="Fast EMA")
slow_ema_len = input.int(34, minval=20, title="Slow EMA")
sqm_lengthKC = input.int(20, title="SQM KC Length")
kauf_period = input.int(20, title="Kauf Period")
kauf_mult = input.float(2, title="Kauf Mult factor")
min_profit_sl = input.float(5, minval=0.01, maxval=100.0, title="Min profit to start moving SL [%]")
longest_sl = input.float(10, minval=0.01, maxval=100.0, title="Maximum possible of SL [%]")
sl_step = input.float(0.5, minval=0.0, maxval=1.0, title="Take profit factor")

// Parâmetros adaptados para criptomoedas
CMF_length = input.int(11, minval=1, title="CMF length")
show_plots = input.bool(true, title="Show plots")

// Definir intervalos de tempo para criptomoedas
selected_timeframe = input.string(defval="15", title="Intervalo de Tempo", options=["1", "15", "60"])

lower_resolution = timeframe.period == '1' ? '1' :
                   timeframe.period == '5' ? '15' :
                   timeframe.period == '15' ? '60' :
                   timeframe.period == '60' ? '240' :
                   timeframe.period == '240' ? 'D' :
                   timeframe.period == 'D' ? 'W' : 'M'

sp_close = close[barstate.isrealtime ? 1 : 0]
sp_high = high[barstate.isrealtime ? 1 : 0]
sp_low = low[barstate.isrealtime ? 1 : 0]
sp_volume = volume[barstate.isrealtime ? 1 : 0]

// Calcular Squeeze Momentum ajustado para criptomoedas
sqm_val = ta.linreg(sp_close - math.avg(math.avg(ta.highest(sp_high, sqm_lengthKC), ta.lowest(sp_low, sqm_lengthKC)), ta.sma(sp_close, sqm_lengthKC)), sqm_lengthKC, 0)
close_low = request.security(syminfo.tickerid, lower_resolution, sp_close, lookahead=barmerge.lookahead_on)
high_low = request.security(syminfo.tickerid, lower_resolution, sp_high, lookahead=barmerge.lookahead_on)
low_low = request.security(syminfo.tickerid, lower_resolution, sp_low, lookahead=barmerge.lookahead_on)
sqm_val_low = ta.linreg(close_low - math.avg(math.avg(ta.highest(high_low, sqm_lengthKC), ta.lowest(low_low, sqm_lengthKC)), ta.sma(close_low, sqm_lengthKC)), sqm_lengthKC, 0)

// CMF adaptado para criptomoedas
ad = sp_close == sp_high and sp_close == sp_low or sp_high == sp_low ? 0 : ((2 * sp_close - sp_low - sp_high) / (sp_high - sp_low)) * sp_volume
money_flow = math.sum(ad, CMF_length) / math.sum(sp_volume, CMF_length)

// Condições de entrada para criptomoedas
low_condition_long = (sqm_val_low > sqm_val_low[1])
low_condition_short = (sqm_val_low < sqm_val_low[1])
money_flow_min = (money_flow[4] > money_flow[2]) and (money_flow[3] > money_flow[2]) and (money_flow[2] < money_flow[1]) and (money_flow[2] < money_flow)
money_flow_max = (money_flow[4] < money_flow[2]) and (money_flow[3] < money_flow[2]) and (money_flow[2] > money_flow[1]) and (money_flow[2] > money_flow)
condition_long = ((sqm_val > sqm_val[1])) and money_flow_min and ta.lowest(sqm_val, 5) < 0
condition_short = ((sqm_val < sqm_val[1])) and money_flow_max and ta.highest(sqm_val, 5) > 0
enter_long = low_condition_long and condition_long
enter_short = low_condition_short and condition_short

// Stop conditions
var float current_target_price = na
var float current_sl_price = na
var float current_target_per = na
var float current_profit_per = na

set_targets(isLong, min_profit, current_target_per, current_profit_per) =>
    float target = na
    float sl = na
    if isLong
        target := sp_close * (1.0 + current_target_per)
        sl := sp_close * (1.0 - (longest_sl / 100.0))
    else
        target := sp_close * (1.0 - current_target_per)
        sl := sp_close * (1.0 + (longest_sl / 100.0))
    [target, sl]

target_reached(isLong, min_profit, current_target_per, current_profit_per) =>
    float target = na
    float sl = na
    float profit_per = na
    float target_per = na
    if current_profit_per == na
        profit_per := (min_profit * sl_step) / 100.0
    else
        profit_per := current_profit_per + ((min_profit * sl_step) / 100.0)
    target_per := current_target_per + (min_profit / 100.0)
    if isLong
        target := strategy.position_avg_price * (1.0 + target_per)
        sl := strategy.position_avg_price * (1.0 + profit_per)
    else
        target := strategy.position_avg_price * (1.0 - target_per)
        sl := strategy.position_avg_price * (1.0 - profit_per)
    [target, sl, profit_per, target_per]

hl_diff = ta.sma(sp_high - sp_low, kauf_period)
stop_condition_long = 0.0
new_stop_condition_long = sp_low - (hl_diff * kauf_mult)
if (strategy.position_size > 0)
    if (sp_close > current_target_price)
        [target, sl, profit_per, target_per] = target_reached(true, min_profit_sl, current_target_per, current_profit_per)
        current_target_price := target
        current_sl_price := sl
        current_profit_per := profit_per
        current_target_per := target_per
    stop_condition_long := math.max(stop_condition_long[1], current_sl_price)
else
    stop_condition_long := new_stop_condition_long

stop_condition_short = 99999999.9
new_stop_condition_short = sp_high + (hl_diff * kauf_mult)
if (strategy.position_size < 0)
    if (sp_close < current_target_price)
        [target, sl, profit_per, target_per] = target_reached(false, min_profit_sl, current_target_per, current_profit_per)
        current_target_price := target
        current_sl_price := sl
        current_profit_per := profit_per
        current_target_per := target_per
    stop_condition_short := math.min(stop_condition_short[1], current_sl_price)
else
    stop_condition_short := new_stop_condition_short

// Submit entry orders
if (enter_long and (strategy.position_size <= 0))
    if (strategy.position_size < 0)
        strategy.close(id="SHORT")
    current_target_per := (min_profit_sl / 100.0)
    current_profit_per := na
    [target, sl] = set_targets(true, min_profit_sl, current_target_per, current_profit_per)
    current_target_price := target
    current_sl_price := sl
    strategy.entry(id="LONG", direction=strategy.long)

    if show_plots
        label.new(bar_index, sp_high, text="LONG\nSL: " + str.tostring(stop_condition_long), style=label.style_label_down, color=color.green)





if (enter_short and (strategy.position_size >= 0))
    if (strategy.position_size > 0)
        strategy.close(id="LONG")
    current_target_per := (min_profit_sl / 100.0)
    current_profit_per := na
    [target, sl] = set_targets(false, min_profit_sl, current_target_per, current_profit_per)
    current_target_price := target
    current_sl_price := sl
    strategy.entry(id="SHORT", direction=strategy.short)
    if show_plots
        label.new(bar_index, sp_high, text="SHORT\nSL: " + str.tostring(stop_condition_short), style=label.style_label_down, color=color.red)

if (strategy.position_size > 0)
    strategy.exit(id="EXIT LONG", stop=stop_condition_long)

if (strategy.position_size < 0)
    strategy.exit(id="EXIT SHORT", stop=stop_condition_short)

// Plot anchor trend
plotshape(low_condition_long, style=shape.triangleup, location=location.abovebar, color=color.green)
plotshape(low_condition_short, style=shape.triangledown, location=location.abovebar, color=color.red)

plotshape(condition_long, style=shape.triangleup, location=location.belowbar, color=color.green)
plotshape(condition_short, style=shape.triangledown, location=location.belowbar, color=color.red)

plotshape(enter_long, style=shape.triangleup, location=location.bottom, color=color.green)
plotshape(enter_short, style=shape.triangledown, location=location.bottom, color=color.red)

// Plot emas
plot(ta.ema(close, 20), color=color.blue, title="20 EMA")
plot(ta.ema(close, 50), color=color.orange, title="50 EMA")
plot(ta.sma(close, 200), color=color.red, title="MA 200")

// Plot stop loss values for confirmation
plot(series=(strategy.position_size > 0) and show_plots ? stop_condition_long : na, color=color.green, style=plot.style_linebr, title="Long Stop")
plot(series=(strategy.position_size < 0) and show_plots ? stop_condition_short : na, color=color.green, style=plot.style_linebr, title="Short Stop")
plot(series=(strategy.position_size < 0) and show_plots ? current_target_price : na, color=color.yellow, style=plot.style_linebr, title="Short TP")
plot(series=(strategy.position_size > 0) and show_plots ? current_target_price : na, color=color.yellow, style=plot.style_linebr, title="Long TP")