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

Trung bình động hai xu hướng theo chiến lược với hệ thống quản lý rủi ro dựa trên ATR

Tác giả:ChaoZhang, Ngày: 2024-11-29 14:56:43
Tags:SMAATRTPSLHTF

img

Tổng quan

Chiến lược này kết hợp theo xu hướng trung bình động hai cổ điển với quản lý rủi ro động dựa trên ATR. Nó cung cấp hai chế độ giao dịch: chế độ cơ bản sử dụng chéo trung bình động đơn giản để theo xu hướng, và chế độ nâng cao kết hợp lọc xu hướng khung thời gian cao hơn và cơ chế dừng lỗ động dựa trên ATR. Các nhà giao dịch có thể chuyển đổi giữa các chế độ thông qua một menu thả xuống đơn giản, phục vụ cho cả người mới bắt đầu dễ sử dụng và các nhà giao dịch có kinh nghiệm nhu cầu quản lý rủi ro.

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

Chiến lược 1 (Chế độ cơ bản) sử dụng một hệ thống trung bình động kép 21 và 49 ngày, tạo ra tín hiệu dài khi MA nhanh vượt qua trên MA chậm. Các mục tiêu lợi nhuận có thể được đặt dưới dạng tỷ lệ phần trăm hoặc điểm, với một điểm dừng theo dõi tùy chọn để khóa lợi nhuận. Chiến lược 2 (Chế độ nâng cao) thêm bộ lọc xu hướng khung thời gian hàng ngày, chỉ cho phép nhập chỉ khi giá vượt quá trung bình động khung thời gian cao hơn. Nó kết hợp một lệnh dừng lỗ động dựa trên ATR 14 giai đoạn điều chỉnh theo biến động của thị trường và bao gồm chức năng lấy lợi nhuận một phần để bảo vệ lợi nhuận.

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

  1. Chiến lược thích nghi cao có thể linh hoạt với kinh nghiệm của thương nhân và điều kiện thị trường
  2. Phân tích nhiều khung thời gian trong chế độ nâng cao cải thiện chất lượng tín hiệu
  3. Các điểm dừng động dựa trên ATR thích nghi với sự biến động thị trường khác nhau
  4. Phân tích lợi nhuận một phần bảo vệ lợi nhuận với sự tiếp tục xu hướng
  5. Cấu hình tham số linh hoạt cho các đặc điểm thị trường khác nhau

Rủi ro chiến lược

  1. Hệ thống MA kép có thể tạo ra các tín hiệu sai thường xuyên trong các thị trường khác nhau
  2. Việc lọc xu hướng có thể gây ra sự chậm trễ tín hiệu, bỏ lỡ một số cơ hội giao dịch
  3. Các điểm dừng ATR có thể không thích nghi đủ nhanh với sự biến động
  4. Lợi nhuận một phần có thể giảm kích thước vị trí quá sớm trong xu hướng mạnh

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

  1. Thêm các chỉ số khối lượng và biến động để lọc tín hiệu sai
  2. Xem xét thực hiện điều chỉnh tham số động dựa trên điều kiện thị trường
  3. Tối ưu hóa thời gian tính toán ATR để cân bằng độ nhạy và ổn định
  4. Thêm mô-đun nhận dạng trạng thái thị trường để chọn chế độ chiến lược tự động
  5. Đưa ra nhiều tùy chọn dừng lỗ hơn như dừng lại và thoát dựa trên thời gian

Tóm lại

Đây là một hệ thống giao dịch được thiết kế tốt và toàn diện. Sự kết hợp của hai xu hướng trung bình di chuyển theo dõi và quản lý rủi ro dựa trên ATR đảm bảo cả độ tin cậy và kiểm soát rủi ro hiệu quả. Thiết kế hai chế độ đáp ứng nhu cầu của các cấp độ giao dịch khác nhau, trong khi các thiết lập tham số phong phú cung cấp nhiều cơ hội tối ưu hóa. Các nhà giao dịch được khuyên nên bắt đầu với các tham số bảo thủ trong giao dịch trực tiếp và dần dần tối ưu hóa cho kết quả tốt nhất.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-27 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © shaashish1

//@version=5
strategy("Dual Strategy Selector V2 - Cryptogyani", overlay=true, pyramiding=0, 
         default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100000)

//#region STRATEGY SELECTION
strategyOptions = input.string(title="Select Strategy", defval="Strategy 1", options=["Strategy 1", "Strategy 2"], group="Strategy Selection")
//#endregion STRATEGY SELECTION

// ####################### STRATEGY 1: Original Logic ########################
//#region STRATEGY 1 INPUTS
s1_fastMALen = input.int(defval=21, title="Fast SMA Length (S1)", minval=1, group="Strategy 1 Settings", inline="S1 MA")
s1_slowMALen = input.int(defval=49, title="Slow SMA Length (S1)", minval=1, group="Strategy 1 Settings", inline="S1 MA")
s1_takeProfitMode = input.string(defval="Percentage", title="Take Profit Mode (S1)", options=["Percentage", "Pips"], group="Strategy 1 Settings")
s1_takeProfitPerc = input.float(defval=7.0, title="Take Profit % (S1)", minval=0.05, step=0.05, group="Strategy 1 Settings") / 100
s1_takeProfitPips = input.float(defval=50, title="Take Profit Pips (S1)", minval=1, step=1, group="Strategy 1 Settings")
s1_trailingTakeProfitEnabled = input.bool(defval=false, title="Enable Trailing (S1)", group="Strategy 1 Settings")
//#endregion STRATEGY 1 INPUTS

// ####################### STRATEGY 2: Enhanced with Recommendations ########################
//#region STRATEGY 2 INPUTS
s2_fastMALen = input.int(defval=20, title="Fast SMA Length (S2)", minval=1, group="Strategy 2 Settings", inline="S2 MA")
s2_slowMALen = input.int(defval=50, title="Slow SMA Length (S2)", minval=1, group="Strategy 2 Settings", inline="S2 MA")
s2_atrLength = input.int(defval=14, title="ATR Length (S2)", group="Strategy 2 Settings", inline="ATR")
s2_atrMultiplier = input.float(defval=1.5, title="ATR Multiplier for Stop-Loss (S2)", group="Strategy 2 Settings", inline="ATR")
s2_partialTakeProfitPerc = input.float(defval=50.0, title="Partial Take Profit % (S2)", minval=10, maxval=100, step=10, group="Strategy 2 Settings")
s2_timeframeTrend = input.timeframe(defval="1D", title="Higher Timeframe for Trend Filter (S2)", group="Strategy 2 Settings")
//#endregion STRATEGY 2 INPUTS

// ####################### GLOBAL VARIABLES ########################
var float takeProfitPrice = na
var float stopLossPrice = na
var float trailingStopPrice = na
var float fastMA = na
var float slowMA = na
var float higherTimeframeTrendMA = na
var bool validOpenLongPosition = false

// Precalculate higher timeframe values (global scope for Strategy 2)
higherTimeframeTrendMA := request.security(syminfo.tickerid, s2_timeframeTrend, ta.sma(close, s2_slowMALen))

// ####################### LOGIC ########################
if (strategyOptions == "Strategy 1")
    // Strategy 1 Logic (Original Logic Preserved)
    fastMA := ta.sma(close, s1_fastMALen)
    slowMA := ta.sma(close, s1_slowMALen)
    openLongPosition = ta.crossover(fastMA, slowMA)
    validOpenLongPosition := openLongPosition and strategy.opentrades.size(strategy.opentrades - 1) == 0
    
    // Take Profit Price
    takeProfitPrice := if (s1_takeProfitMode == "Percentage")
        close * (1 + s1_takeProfitPerc)
    else
        close + (s1_takeProfitPips * syminfo.mintick)

    // Trailing Stop Price (if enabled)
    if (strategy.position_size > 0 and s1_trailingTakeProfitEnabled)
        trailingStopPrice := high - (s1_takeProfitPips * syminfo.mintick)
    else
        trailingStopPrice := na

else if (strategyOptions == "Strategy 2")
    // Strategy 2 Logic with Recommendations
    fastMA := ta.sma(close, s2_fastMALen)
    slowMA := ta.sma(close, s2_slowMALen)
    openLongPosition = ta.crossover(fastMA, slowMA) and close > higherTimeframeTrendMA
    validOpenLongPosition := openLongPosition and strategy.opentrades.size(strategy.opentrades - 1) == 0

    // ATR-Based Stop-Loss
    atr = ta.atr(s2_atrLength)
    stopLossPrice := close - (atr * s2_atrMultiplier)

    // Partial Take Profit Logic
    takeProfitPrice := close * (1 + (s2_partialTakeProfitPerc / 100))
//#endregion STRATEGY LOGIC

// ####################### PLOTTING ########################
plot(series=fastMA, title="Fast SMA", color=color.yellow, linewidth=1)
plot(series=slowMA, title="Slow SMA", color=color.orange, linewidth=1)
plot(series=takeProfitPrice, title="Take Profit Price", color=color.teal, linewidth=1, style=plot.style_linebr)

// Trailing Stop and ATR Stop-Loss Plots (Global Scope)
plot(series=(strategyOptions == "Strategy 1" and s1_trailingTakeProfitEnabled) ? trailingStopPrice : na, title="Trailing Stop", color=color.red, linewidth=1, style=plot.style_linebr)
plot(series=(strategyOptions == "Strategy 2") ? stopLossPrice : na, title="ATR Stop-Loss", color=color.red, linewidth=1, style=plot.style_linebr)
//#endregion PLOTTING

// ####################### POSITION ORDERS ########################
//#region POSITION ORDERS
if (validOpenLongPosition)
    strategy.entry(id="Long Entry", direction=strategy.long)

if (strategyOptions == "Strategy 1")
    if (strategy.position_size > 0)
        if (s1_trailingTakeProfitEnabled)
            strategy.exit(id="Trailing Take Profit", from_entry="Long Entry", stop=trailingStopPrice)
        else
            strategy.exit(id="Take Profit", from_entry="Long Entry", limit=takeProfitPrice)

else if (strategyOptions == "Strategy 2")
    if (strategy.position_size > 0)
        strategy.exit(id="Partial Take Profit", from_entry="Long Entry", qty_percent=s2_partialTakeProfitPerc, limit=takeProfitPrice)
        strategy.exit(id="Stop Loss", from_entry="Long Entry", stop=stopLossPrice)
//#endregion POSITION ORDERS


Có liên quan

Thêm nữa