Tài nguyên đang được tải lên... tải...

Chiến lược giao dịch EMA-Squeeze nhiều khung thời gian

Tác giả:ChaoZhang, Ngày: 2024-12-11 15:50:38
Tags:EMASQMCMFKCSLTPMTF

img

Tổng quan

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

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

Chiến lược này sử dụng ba chỉ số kỹ thuật chính để xác định cơ hội giao dịch. Thứ nhất, nó sử dụng EMA 11 giai đoạn và 34 giai đoạn để xác định hướng xu hướng thị trường. Thứ hai, nó sử dụng chỉ số Squeeze Momentum được sửa đổi để phát hiện áp lực thị trường và cơ hội phá vỡ tiềm năng, được tính toán thông qua hồi quy tuyến tính của độ lệch giá. Cuối cùng, nó xác nhận hướng giao dịch thông qua chỉ số dòng tiền được sửa đổi, đảm bảo đủ vốn hỗ trợ các biến động giá. Chiến lược đặt mức dừng lỗ năng động sau khi xác nhận, tự động điều chỉnh khi lợi nhuận tăng, bảo vệ lợi nhuận trong khi cho phép biến động giá.

Ưu điểm chiến lược

  1. Xác nhận tín hiệu đa chiều: Giảm đáng kể các tín hiệu sai thông qua việc tích hợp nhiều chỉ số kỹ thuật và khung thời gian.
  2. Quản lý rủi ro thông minh: Hệ thống dừng lỗ động tự động điều chỉnh dựa trên biến động thị trường, bảo vệ lợi nhuận trong khi tránh thoát sớm.
  3. Khả năng thích nghi cao: Các thông số chiến lược có thể được điều chỉnh cho các điều kiện thị trường khác nhau.
  4. Chu kỳ giao dịch hoàn chỉnh: Các quy tắc rõ ràng từ bước vào đến lối ra quản lý giảm ảnh hưởng của phán đoán chủ quan.
  5. Xác nhận dòng tiền: Xác nhận xu hướng giá thông qua giám sát dòng tiền, cải thiện độ tin cậy thương mại.

Rủi ro chiến lược

  1. Độ nhạy của các tham số: Nhiều tham số chỉ số kỹ thuật đòi hỏi tối ưu hóa cẩn thận.
  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 các thị trường biến động cao hoặc thanh khoản thấp.
  3. Sự phức tạp của tính toán: Các tính toán nhiều khung thời gian có thể gây ra sự chậm trễ tín hiệu.
  4. Rủi ro điều chỉnh dừng lỗ: Dừng động có thể trở nên quá hung hăng hoặc bảo thủ trong một số điều kiện thị trường nhất định.
  5. Yêu cầu quản lý vốn: Chiến lược cần quản lý quỹ thích hợp để cân bằng rủi ro và lợi nhuận.

Hướng dẫn tối ưu hóa

  1. Thiết lập điều chỉnh biến động: Điều chỉnh động các tham số dựa trên ATR hoặc các chỉ số biến động khác.
  2. Tối ưu hóa lọc tín hiệu: Thêm trọng lượng âm lượng 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ỗ: Tối ưu hóa vị trí dừng lỗ bằng cách sử dụng các mức hỗ trợ và kháng cự.
  4. Phân tích môi trường thị trường nâng cao: giới thiệu các chỉ số sức mạnh xu hướng cho các điều kiện thị trường khác nhau.
  5. Quản lý vốn tinh tế: Thực hiện các thuật toán định kích thước vị trí dựa trên sức mạnh tín hiệu và biến động thị trường.

Tóm lại

Chiến lược này cung cấp cho các nhà giao dịch một cách tiếp cận 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. Sức mạnh cốt lõi của nó nằm trong việc kết hợp theo xu hướng với quản lý rủi ro năng động, nắm bắt cơ hội thị trường trong khi bảo vệ lợi nhuận. Mặc dù có những khía cạnh cần tối ưu hóa, chiến lược có thể phục vụ như một công cụ giao dịch hiệu quả với cài đặt tham số và kiểm soát rủi ro thích hợp. Các nhà giao dịch được khuyên nên tiến hành kiểm tra kỹ lưỡng và tối ưu hóa tham số trước khi thực hiện trực tiếp, dần dần tinh chỉnh hệ thống giao dịch dựa trên kinh nghiệm thị trường.


/*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")


Có liên quan

Thêm nữa