Chiến lược mở rộng quy mô phòng ngừa động lượng RSI-EMA

RSI EMA TP SL
Ngày tạo: 2024-12-04 15:41:10 sửa đổi lần cuối: 2024-12-04 15:41:10
sao chép: 0 Số nhấp chuột: 514
1
tập trung vào
1617
Người theo dõi

Chiến lược mở rộng quy mô phòng ngừa động lượng RSI-EMA

Tổng quan

Đây là một chiến lược giao dịch bảo hiểm động lực dựa trên chỉ số RSI và đường trung bình EMA. Chiến lược này sử dụng chu kỳ thời gian RSI đôi ((RSI-14 và RSI-2) kết hợp với đường trung bình EMA ba ((50 , 100 , 200) để nắm bắt cơ hội đảo ngược xu hướng thị trường và thực hiện hiệu quả đối kháng thông qua quản lý vị trí động.

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

Chiến lược sử dụng chỉ số tương đối mạnh và yếu của RSI-14 và RSI-2 trong hai chu kỳ khác nhau, kết hợp với ba đường trung bình của EMA-50, EMA-100 và EMA-200 để xác định tín hiệu giao dịch. Điều kiện đa yêu cầu RSI-14 thấp hơn 31 và RSI-2 vượt lên 10, đồng thời yêu cầu ba đường trung bình có hàng đầu trống ((EMA-50 < EMA-100 < EMA-200).

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

  1. Xác thực chéo các chỉ số kỹ thuật đa tầng để tăng độ tin cậy tín hiệu
  2. Quản lý vị trí động, có thể điều chỉnh vị trí giữ linh hoạt theo tình hình thị trường
  3. Cơ chế giao dịch hai chiều, có thể kiếm được lợi nhuận ở cả hai hướng
  4. Tự thích nghi với điều kiện dừng chân, tránh rời khỏi sân sớm
  5. Giao diện đồ họa hiển thị rõ ràng các tín hiệu giao dịch và tình trạng thị trường
  6. Cơ chế bảo hiểm có thể làm giảm tiếp xúc với rủi ro một chiều
  7. Tính toán vị thế động dựa trên quyền lợi, kiểm soát rủi ro hợp lý hơn

Rủi ro chiến lược

  1. Lợi nhuận cao ((20 lần) có thể dẫn đến rủi ro bùng nổ lớn
  2. Vị trí tăng dần có thể gây thiệt hại nghiêm trọng khi thị trường biến động mạnh
  3. Không có điều kiện dừng lỗ, có thể có nguy cơ tiếp tục giảm
  4. Chỉ báo RSI có thể tạo ra tín hiệu sai trong thị trường đi ngang
  5. Sự kết hợp của nhiều chỉ số kỹ thuật có thể làm giảm cơ hội giao dịch
  6. Phương thức quản lý vị trí có thể tích lũy rủi ro lớn khi giao dịch đồng chiều liên tục

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

  1. Tiến hành các cơ chế dừng tự thích ứng, chẳng hạn như dừng động dựa trên ATR hoặc biến động
  2. Tối ưu hóa hệ số đòn bẩy, có thể xem xét điều chỉnh theo động thái biến động của thị trường
  3. Thêm bộ lọc thời gian để tránh giao dịch trong thời gian biến động thấp
  4. Tiến hành các chỉ số giao thông để tăng tín hiệu đáng tin cậy
  5. Tối ưu hóa số lần tăng vị trí, xem xét thiết lập giới hạn vị trí tối đa
  6. Đã thêm bộ lọc cường độ xu hướng để tránh giao dịch theo xu hướng yếu
  7. Cải thiện cơ chế quản lý rủi ro, chẳng hạn như thiết lập giới hạn tổn thất tối đa mỗi ngày

Tóm tắt

Đây là một chiến lược tổng hợp kết hợp động lực và xu hướng để nâng cao độ chính xác giao dịch bằng cách kết hợp nhiều chỉ số kỹ thuật. Điểm sáng tạo của chiến lược là sử dụng phương pháp quản lý vị thế động và cơ chế bảo hiểm, nhưng đồng thời mang lại rủi ro cao hơn. Bằng cách tối ưu hóa cơ chế kiểm soát rủi ro và giới thiệu nhiều điều kiện lọc hơn, chiến lược này có khả năng hoạt động tốt hơn trong giao dịch thực tế.

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

//@version=5
strategy("Custom RSI EMA Strategy Hedge", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1)

// Definování vstupních podmínek
rsi_14 = ta.rsi(close, 14)
rsi_2 = ta.rsi(close, 2)
ema_50 = ta.ema(close, 50)
ema_100 = ta.ema(close, 100)
ema_200 = ta.ema(close, 200)

// Pákový efekt
leverage = 20

// Podmínky pro long pozici
longCondition = (rsi_14[1] < 31) and ta.crossover(rsi_2, 10) and (ema_50 < ema_100) and (ema_100 < ema_200)

// Podmínky pro short pozici
shortCondition = (rsi_14[1] > 69) and ta.crossunder(rsi_2, 90) and (ema_50 > ema_100) and (ema_100 > ema_200)

// Identifikátory pozic
long_id = "Long"
short_id = "Short"

// Definování průměrné ceny pozice pro long a short
var float long_avg_price = na
var float short_avg_price = na

// Sledujeme, zda se velikost pozice změnila
var float last_long_position_size = na
var float last_short_position_size = na

// Přerušení průměrné ceny pozice při změně pozice
if (last_long_position_size != strategy.position_size and strategy.position_size > 0)
    long_avg_price := na
if (last_short_position_size != strategy.position_size and strategy.position_size < 0)
    short_avg_price := na

// Aktualizace průměrné ceny pozice
if (strategy.position_size > 0)
    long_avg_price := strategy.position_avg_price
else
    long_avg_price := na

if (strategy.position_size < 0)
    short_avg_price := strategy.position_avg_price
else
    short_avg_price := na

// Uložení aktuální velikosti pozice pro příští bar
if (strategy.position_size > 0)
    last_long_position_size := strategy.position_size
else if (strategy.position_size < 0)
    last_short_position_size := strategy.position_size

// Podmínky pro take profit
takeProfitLongCondition = (rsi_14 > 69) and (rsi_2 > 90) and (long_avg_price < close)
takeProfitShortCondition = (rsi_14 < 31) and (rsi_2 < 10) and (short_avg_price > close)

// Velikost pozice
new_long_position_size = strategy.position_size == 0 ? na : math.abs(strategy.position_size) * 2
new_short_position_size = strategy.position_size == 0 ? na : math.abs(strategy.position_size) * 2

// Úprava velikosti pozice s ohledem na pákový efekt
position_value = strategy.equity * leverage
trade_qty_long = position_value / close
trade_qty_short = position_value / close

// Vstup do long pozice s dvojnásobkem aktuální pozice nebo standardní velikostí při první pozici
if (longCondition)
    strategy.entry(long_id, strategy.long, qty=new_long_position_size == na ? trade_qty_long : new_long_position_size)

// Vstup do short pozice s dvojnásobkem aktuální pozice nebo standardní velikostí při první pozici
if (shortCondition)
    strategy.entry(short_id, strategy.short, qty=new_short_position_size == na ? trade_qty_short : new_short_position_size)

// Výstup z long pozice při splnění podmínek pro take profit
if (takeProfitLongCondition)
    strategy.close(long_id)

// Výstup z short pozice při splnění podmínek pro take profit
if (takeProfitShortCondition)
    strategy.close(short_id)

// Zvýraznění části grafu, kde platí podmínky pro long
highlightLongCondition = (ema_50 < ema_100) and (ema_100 < ema_200)
bgcolor(highlightLongCondition ? color.new(color.green, 90) : na)

// Zvýraznění části grafu, kde platí podmínky pro short
highlightShortCondition = (ema_50 > ema_100) and (ema_100 > ema_200)
bgcolor(highlightShortCondition ? color.new(color.red, 90) : na)

// Přidání bodů pozic do grafu
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, text="L")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, text="S")

// Vykreslení průměrné ceny pozice pro long a short pouze pokud pozice existuje
plot(strategy.position_size > 0 ? long_avg_price : na, title="Long Avg Price", color=color.blue, linewidth=2)
plot(strategy.position_size < 0 ? short_avg_price : na, title="Short Avg Price", color=color.orange, linewidth=2)

// Zvýraznění čtverců pro RSI14 > 70 (červeně) a RSI14 < 30 (zeleně)
var int rsi_above_70_start = na
var int rsi_below_30_start = na

var float top_value_above_70 = na
var float bottom_value_above_70 = na

var float top_value_below_30 = na
var float bottom_value_below_30 = na

// Identifikace začátku a konce období pro RSI14 > 70
if (rsi_14[1] > 70 and rsi_14[2] > 70)
    if na(rsi_above_70_start)
        rsi_above_70_start := bar_index
        top_value_above_70 := high
        bottom_value_above_70 := low
    else
        top_value_above_70 := math.max(top_value_above_70, high)
        bottom_value_above_70 := math.min(bottom_value_above_70, low)
else
    if not na(rsi_above_70_start)
        // box.new(left = rsi_above_70_start, right = bar_index - 1, top = top_value_above_70, bottom = bottom_value_above_70, border_color = color.red, border_width = 2, bgcolor=color.new(color.red, 90))
        rsi_above_70_start := na
        top_value_above_70 := na
        bottom_value_above_70 := na

// Identifikace začátku a konce období pro RSI14 < 30
if (rsi_14[1] < 30 and rsi_14[2] < 30)
    if na(rsi_below_30_start)
        rsi_below_30_start := bar_index
        top_value_below_30 := high
        bottom_value_below_30 := low
    else
        top_value_below_30 := math.max(top_value_below_30, high)
        bottom_value_below_30 := math.min(bottom_value_below_30, low)
else
    if not na(rsi_below_30_start)
        // box.new(left = rsi_below_30_start, right = bar_index - 1, top = top_value_below_30, bottom = bottom_value_below_30, border_color = color.green, border_width = 2, bgcolor=color.new(color.green, 90))
        rsi_below_30_start := na
        top_value_below_30 := na
        bottom_value_below_30 := na