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

Chiến lược giao dịch đảo ngược điểm xoay kép nâng cao

Tác giả:ChaoZhang, Ngày: 2024-12-05 15:06:15
Tags:ATRPPRSISLTPRR

 Enhanced Dual Pivot Point Reversal Trading Strategy

Tổng quan

Chiến lược này là một hệ thống giao dịch tiên tiến dựa trên phân tích điểm pivot dự đoán sự đảo ngược xu hướng tiềm năng bằng cách xác định các điểm chuyển đổi quan trọng trên thị trường. Chiến lược sử dụng phương pháp pivot of pivot sáng tạo kết hợp với chỉ số ATR để quản lý vị trí, tạo thành một hệ thống giao dịch hoàn chỉnh. Chiến lược có thể áp dụng cho nhiều thị trường và có thể được tối ưu hóa theo các đặc điểm thị trường khác nhau.

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

Lòng cốt của chiến lược là xác định các cơ hội đảo ngược thị trường thông qua hai mức phân tích điểm trục. Các điểm trục cấp một là mức cao và thấp cơ bản, trong khi các điểm trục cấp hai là các điểm chuyển đổi quan trọng được chọn từ các điểm trục cấp một. Các tín hiệu giao dịch được tạo ra khi giá vượt qua các mức chính này. Chiến lược cũng sử dụng chỉ số ATR để đo biến động thị trường để xác định mức dừng lỗ, mức lợi nhuận và kích thước vị trí.

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

  1. Khả năng thích nghi cao: Chiến lược có thể thích nghi với môi trường thị trường khác nhau bằng cách điều chỉnh các tham số phù hợp với các mức biến động khác nhau.
  2. Quản lý rủi ro toàn diện: Sử dụng ATR cho các thiết lập dừng lỗ năng động, tự động điều chỉnh các biện pháp bảo vệ dựa trên biến động thị trường.
  3. Xác nhận đa cấp: Giảm rủi ro thoát sai thông qua phân tích điểm pivot hai lớp.
  4. Quản lý vị trí linh hoạt: Điều chỉnh động kích thước vị trí dựa trên kích thước tài khoản và biến động thị trường.
  5. Quy tắc nhập cảnh rõ ràng: Có các cơ chế xác nhận tín hiệu rõ ràng, làm giảm phán đoán chủ quan.

Rủi ro chiến lược

  1. Rủi ro trượt: Có thể phải đối mặt với trượt đáng kể trên các thị trường biến động cao.
  2. Rủi ro phá vỡ sai: Có thể tạo ra các tín hiệu sai trong quá trình củng cố thị trường.
  3. Rủi ro đòn bẩy quá mức: Sử dụng đòn bẩy không đúng cách có thể dẫn đến tổn thất nghiêm trọng.
  4. Rủi ro tối ưu hóa tham số: Tối ưu hóa quá mức có thể dẫn đến quá phù hợp.

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

  1. Bộ lọc tín hiệu: Thêm bộ lọc xu hướng để giao dịch chỉ theo hướng xu hướng chính.
  2. Các thông số động: tự động điều chỉnh các thông số điểm pivot dựa trên điều kiện thị trường.
  3. Nhiều khung thời gian: Thêm xác nhận nhiều khung thời gian để cải thiện độ chính xác.
  4. Stop-Loss thông minh: Phát triển các chiến lược stop-loss thông minh hơn, chẳng hạn như trailing stops.
  5. Kiểm soát rủi ro: Thêm thêm các biện pháp kiểm soát rủi ro, chẳng hạn như phân tích tương quan.

Tóm lại

Đây là một chiến lược giao dịch đảo ngược xu hướng được thiết kế tốt xây dựng một hệ thống giao dịch mạnh mẽ thông qua phân tích điểm pivot hai lớp và quản lý biến động ATR. Sức mạnh của chiến lược nằm trong khả năng thích nghi và quản lý rủi ro toàn diện, nhưng các nhà giao dịch vẫn cần sử dụng đòn bẩy một cách thận trọng và liên tục tối ưu hóa các tham số. Thông qua các hướng tối ưu hóa được đề xuất, chiến lược có thể cải thiện. Chiến lược này phù hợp với các nhà giao dịch bảo thủ và là một hệ thống giao dịch đáng để nghiên cứu và thực hành sâu sắc.


/*backtest
start: 2024-11-04 00:00:00
end: 2024-12-04 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Pivot of Pivot Reversal Strategy [MAD]", shorttitle="PoP Reversal Strategy", overlay=true, commission_type=strategy.commission.percent, commission_value=0.1, slippage=3)

// Inputs with Tooltips
leftBars = input.int(4, minval=1, title='PP Left Bars', tooltip='Number of bars to the left of the pivot point. Increasing this value makes the pivot more significant.')
rightBars = input.int(2, minval=1, title='PP Right Bars', tooltip='Number of bars to the right of the pivot point. Increasing this value delays the pivot detection but may reduce false signals.')
atr_length = input.int(14, minval=1, title='ATR Length', tooltip='Length for ATR calculation. ATR is used to assess market volatility.')
atr_mult = input.float(0.1, minval=0.0, step=0.1, title='ATR Multiplier', tooltip='Multiplier applied to ATR for pivot significance. Higher values require greater price movement for pivots.')

allowLongs = input.bool(true, title='Allow Long Positions', tooltip='Enable or disable long positions.')
allowShorts = input.bool(true, title='Allow Short Positions', tooltip='Enable or disable short positions.')

margin_amount = input.float(1.0, minval=1.0, maxval=100.0, step=1.0, title='Margin Amount (Leverage)', tooltip='Set the leverage multiplier (e.g., 3x, 5x, 10x). Note: Adjust leverage in strategy properties for accurate results.')

risk_reward_enabled = input.bool(false, title='Enable Risk/Reward Ratio', tooltip='Enable or disable the use of a fixed risk/reward ratio for trades.')
risk_reward_ratio = input.float(1.0, minval=0.1, step=0.1, title='Risk/Reward Ratio', tooltip='Set the desired risk/reward ratio (e.g., 1.0 for 1:1).')
risk_percent = input.float(1.0, minval=0.1, step=0.1, title='Risk Percentage per Trade (%)', tooltip='Percentage of entry price to risk per trade.')

trail_stop_enabled = input.bool(false, title='Enable Trailing Stop Loss', tooltip='Enable or disable the trailing stop loss.')
trail_percent = input.float(0.5, minval=0.0, step=0.1, title='Trailing Stop Loss (%)', tooltip='Percentage for trailing stop loss.')

start_year  = input.int(2018, title='Start Year', tooltip='Backtest start year.')
start_month = input.int(1,    title='Start Month', tooltip='Backtest start month.')
start_day   = input.int(1,    title='Start Day',   tooltip='Backtest start day.')

end_year  = input.int(2100, title='End Year', tooltip='Backtest end year.')
end_month = input.int(1,    title='End Month', tooltip='Backtest end month.')
end_day   = input.int(1,    title='End Day',   tooltip='Backtest end day.')

date_start = timestamp(start_year, start_month, start_day, 00, 00)
date_end   = timestamp(end_year,   end_month,   end_day,   00, 00)
time_cond = time >= date_start and time <= date_end

// Pivot High Significant Function
pivotHighSig(left, right) =>
    pp_ok = true
    atr = ta.atr(atr_length)
    for i = 1 to left
        if high[right] < high[right + i] + atr * atr_mult
            pp_ok := false
    for i = 0 to right - 1
        if high[right] < high[i] + atr * atr_mult
            pp_ok := false
    pp_ok ? high[right] : na

// Pivot Low Significant Function
pivotLowSig(left, right) =>
    pp_ok = true
    atr = ta.atr(atr_length)
    for i = 1 to left
        if low[right] > low[right + i] - atr * atr_mult
            pp_ok := false
    for i = 0 to right - 1
        if low[right] > low[i] - atr * atr_mult
            pp_ok := false
    pp_ok ? low[right] : na

swh = pivotHighSig(leftBars, rightBars)
swl = pivotLowSig(leftBars, rightBars)

swh_cond = not na(swh)
var float hprice = 0.0
hprice := swh_cond ? swh : nz(hprice[1])

le = false
le := swh_cond ? true : (le[1] and high > hprice ? false : le[1])

swl_cond = not na(swl)
var float lprice = 0.0
lprice := swl_cond ? swl : nz(lprice[1])

se = false
se := swl_cond ? true : (se[1] and low < lprice ? false : se[1])

// Pivots of pivots
var float ph1 = 0.0
var float ph2 = 0.0
var float ph3 = 0.0
var float pl1 = 0.0
var float pl2 = 0.0
var float pl3 = 0.0
var float pphprice = 0.0
var float pplprice = 0.0

ph3 := swh_cond ? nz(ph2[1]) : nz(ph3[1])
ph2 := swh_cond ? nz(ph1[1]) : nz(ph2[1])
ph1 := swh_cond ? hprice     : nz(ph1[1])

pl3 := swl_cond ? nz(pl2[1]) : nz(pl3[1])
pl2 := swl_cond ? nz(pl1[1]) : nz(pl2[1])
pl1 := swl_cond ? lprice     : nz(pl1[1])

pphprice := swh_cond and ph2 > ph1 and ph2 > ph3 ? ph2 : nz(pphprice[1])
pplprice := swl_cond and pl2 < pl1 and pl2 < pl3 ? pl2 : nz(pplprice[1])

// Entry and Exit Logic
if time_cond
    // Calculate order quantity based on margin amount
    float order_qty = na
    if margin_amount > 0
        order_qty := (strategy.equity * margin_amount) / close

    // Long Position
    if allowLongs and le and not na(pphprice) and pphprice != 0
        float entry_price_long = pphprice + syminfo.mintick
        strategy.entry("PivRevLE", strategy.long, qty=order_qty, comment="PivRevLE", stop=entry_price_long)
        if risk_reward_enabled or (trail_stop_enabled and trail_percent > 0.0)
            float stop_loss_price = na
            float take_profit_price = na
            float trail_offset_long = na
            float trail_points_long = na
            if risk_reward_enabled
                float risk_amount = entry_price_long * (risk_percent / 100)
                stop_loss_price := entry_price_long - risk_amount
                float profit_target = risk_amount * risk_reward_ratio
                take_profit_price := entry_price_long + profit_target
            if trail_stop_enabled and trail_percent > 0.0
                trail_offset_long := (trail_percent / 100.0) * entry_price_long
                trail_points_long := trail_offset_long / syminfo.pointvalue
            strategy.exit("PivRevLE Exit", from_entry="PivRevLE",
                          stop=stop_loss_price, limit=take_profit_price,
                          trail_points=trail_points_long, trail_offset=trail_points_long)
    // Short Position
    if allowShorts and se and not na(pplprice) and pplprice != 0
        float entry_price_short = pplprice - syminfo.mintick
        strategy.entry("PivRevSE", strategy.short, qty=order_qty, comment="PivRevSE", stop=entry_price_short)
        if risk_reward_enabled or (trail_stop_enabled and trail_percent > 0.0)
            float stop_loss_price = na
            float take_profit_price = na
            float trail_offset_short = na
            float trail_points_short = na
            if risk_reward_enabled
                float risk_amount = entry_price_short * (risk_percent / 100)
                stop_loss_price := entry_price_short + risk_amount
                float profit_target = risk_amount * risk_reward_ratio
                take_profit_price := entry_price_short - profit_target
            if trail_stop_enabled and trail_percent > 0.0
                trail_offset_short := (trail_percent / 100.0) * entry_price_short
                trail_points_short := trail_offset_short / syminfo.pointvalue
            strategy.exit("PivRevSE Exit", from_entry="PivRevSE",
                          stop=stop_loss_price, limit=take_profit_price,
                          trail_points=trail_points_short, trail_offset=trail_points_short)

// Plotting
plot(lprice, color=color.new(color.red, 55), title='Low Price')
plot(hprice, color=color.new(color.green, 55), title='High Price')
plot(pplprice, color=color.new(color.red, 0), linewidth=2, title='Pivot Low Price')
plot(pphprice, color=color.new(color.green, 0), linewidth=2, title='Pivot High Price')


Có liên quan

Thêm nữa