Chiến lược giao dịch sức mạnh xu hướng trung bình động đa dạng - Hệ thống giao dịch thông minh linh hoạt dựa trên độ lệch trung bình động

MA ATR HTF RR TP SL
Ngày tạo: 2024-12-11 17:46:33 sửa đổi lần cuối: 2024-12-11 17:46:33
sao chép: 0 Số nhấp chuột: 446
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch sức mạnh xu hướng trung bình động đa dạng - Hệ thống giao dịch thông minh linh hoạt dựa trên độ lệch trung bình động

Tổng quan

Chiến lược này là một hệ thống giao dịch thông minh dựa trên nhiều trung bình di chuyển và cường độ xu hướng. Nó đo cường độ của xu hướng thị trường bằng cách phân tích mức độ lệch giữa giá và các trung bình di chuyển theo chu kỳ khác nhau và kết hợp với chỉ số biến động ATR để quản lý vị trí và kiểm soát rủi ro. Chiến lược này có khả năng tùy chỉnh cao và có thể điều chỉnh các tham số một cách linh hoạt theo môi trường thị trường khác nhau và nhu cầu giao dịch.

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

Logic cốt lõi của chiến lược này dựa trên các khía cạnh sau:

  1. Sử dụng đường trung bình di chuyển với hai chu kỳ khác nhau (nhanh và chậm) để xác định hướng xu hướng và tín hiệu chéo
  2. Số lượng cường độ của xu hướng bằng cách tính toán độ lệch của giá so với đường trung bình di chuyển (được tính bằng điểm)
  3. Kết hợp hình dạng K-line ((đánh chìm, thỏ, sao bắn, sao thập tự, v.v.) làm tín hiệu xác nhận phụ trợ
  4. Tính năng tính toán mục tiêu dừng lỗ và lợi nhuận bằng chỉ số ATR
  5. Quản lý đơn đặt hàng bằng cách thu một phần lợi nhuận và theo dõi lỗ hổng

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

  1. Hệ thống có khả năng thích ứng mạnh mẽ, có thể điều chỉnh thông qua các tham số để thích ứng với các môi trường thị trường khác nhau
  2. Kiểm định cường độ của xu hướng bằng cách đo độ lệch, tránh giao dịch thường xuyên khi xu hướng yếu
  3. Kết hợp nhiều chỉ số kỹ thuật và xác nhận hình thức để tăng độ tin cậy của tín hiệu giao dịch
  4. Sử dụng phương pháp dừng động dựa trên ATR để kiểm soát rủi ro hợp lý
  5. Hỗ trợ hai phương thức quản lý tài chính: phục hồi và cố định
  6. Có chức năng dừng lợi nhuận và theo dõi lỗ, bảo vệ lợi nhuận hiệu quả

Rủi ro chiến lược

  1. Có thể tạo ra nhiều tín hiệu giả trong thị trường chấn động, nên thêm bộ lọc cho chỉ số chấn động
  2. Giao dịch đa chỉ số có thể làm mất cơ hội giao dịch
  3. Các tham số được tối ưu hóa quá mức có thể dẫn đến rủi ro quá phù hợp
  4. Trong một thị trường thiếu thanh khoản, giao dịch lớn có thể có nguy cơ trượt
  5. Cần thiết lập tỷ lệ dừng lỗ hợp lý để tránh thua lỗ quá mức

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

  1. Các chỉ số giao dịch có thể được thêm vào như là các chỉ số hỗ trợ xác nhận xu hướng
  2. Xem xét giới thiệu các chỉ số biến động thị trường để điều chỉnh tần số giao dịch động
  3. Bộ lọc tín hiệu dựa trên sự nhất quán của xu hướng trong các chu kỳ thời gian khác nhau
  4. Thêm nhiều tùy chọn dừng lỗ hơn, chẳng hạn như dừng thời gian
  5. Phát triển cơ chế tối ưu hóa các tham số thích ứng để nâng cao khả năng thích ứng của chiến lược

Tóm tắt

Chiến lược này xây dựng một hệ thống giao dịch toàn diện bằng cách kết hợp trung bình di chuyển, định lượng cường độ xu hướng, hình dạng K và quản lý rủi ro động. Nó không chỉ duy trì tính đơn giản của logic chiến lược mà còn tăng độ tin cậy của giao dịch thông qua cơ chế xác nhận nhiều lần. Tính khả năng tùy biến cao của chiến lược cho phép nó thích ứng với các phong cách giao dịch và môi trường thị trường khác nhau, nhưng cần chú ý đến tối ưu hóa tham số và kiểm soát rủi ro khi sử dụng.

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

//@version=5
strategy("Customizable Strategy with Signal Intensity Based on Pips Above/Below MAs", overlay=true)

// Customizable Inputs
// Account and Risk Management
account_size = input.int(100000, title="Account Size (USD)", minval=1)
compounded_results = input.bool(true, title="Compounded Results")
risk_per_trade = input.float(1.0, title="Risk per Trade (%)", minval=0.1, maxval=100) / 100

// Moving Averages Settings
ma1_length = input.int(50, title="Moving Average 1 Length", minval=1)
ma2_length = input.int(200, title="Moving Average 2 Length", minval=1)

// Higher Time Frame for Moving Averages
ma_htf = input.timeframe("D", title="Higher Time Frame for MA Delay")

// Signal Intensity Range based on pips
signal_intensity_min = input.int(0, title="Signal Intensity Start (Pips)", minval=0, maxval=1000)
signal_intensity_max = input.int(1000, title="Signal Intensity End (Pips)", minval=0, maxval=1000)

// ATR-Based Stop Loss and Take Profit
atr_length = input.int(14, title="ATR Length", minval=1)
atr_multiplier_stop = input.float(1.5, title="Stop Loss Size (ATR Multiplier)", minval=0.1)
atr_multiplier_take_profit = input.float(2.5, title="Take Profit Size (ATR Multiplier)", minval=0.1)

// Trailing Stop and Partial Profit
trailing_stop_rr = input.float(2.0, title="Trailing Stop (R:R)", minval=0)
partial_profit_percentage = input.float(50, title="Take Partial Profit (%)", minval=0, maxval=100)

// Trend Filter Settings
trend_filter_enabled = input.bool(true, title="Trend Filter Enabled")
trend_filter_sensitivity = input.float(50, title="Trend Filter Sensitivity", minval=0, maxval=100)

// Candle Pattern Type for Entry
entry_candle_type = input.string("Any", title="Entry Candle Type", options=["Any", "Engulfing", "Hammer", "Shooting Star", "Doji"])

// Moving Average Entry Conditions
ma_entry_condition = input.string("Both", title="MA Entry", options=["Fast Above Slow", "Fast Below Slow", "Both"])

// Trade Direction (Long, Short, or Both)
trade_direction = input.string("Both", title="Trade Direction", options=["Long", "Short", "Both"])

// ATR Calculation
atr_value = ta.atr(atr_length)

// Moving Average Calculations (using Higher Time Frame)
ma1_htf = ta.sma(request.security(syminfo.tickerid, ma_htf, close), ma1_length)
ma2_htf = ta.sma(request.security(syminfo.tickerid, ma_htf, close), ma2_length)

// Candle Pattern Conditions
is_engulfing = close[1] < open[1] and close > open and high > high[1] and low < low[1]
is_hammer = (high - low) > 3 * (close - open) and (close > open) and (low == ta.lowest(low, 5))
is_shooting_star = (high - low) > 3 * (open - close) and (open > close) and (high == ta.highest(high, 5))
is_doji = (close - open) <= ((high - low) * 0.1)

// Apply the selected candle pattern
candle_condition = false
if entry_candle_type == "Any"
    candle_condition := true
if entry_candle_type == "Engulfing"
    candle_condition := is_engulfing
if entry_candle_type == "Hammer"
    candle_condition := is_hammer
if entry_candle_type == "Shooting Star"
    candle_condition := is_shooting_star
if entry_candle_type == "Doji"
    candle_condition := is_doji

// Moving Average Entry Conditions
ma_cross_above = ta.crossover(ma1_htf, ma2_htf)
ma_cross_below = ta.crossunder(ma1_htf, ma2_htf)

// Calculate pips distance to MAs and normalize it for signal intensity
pip_size = syminfo.mintick * 10  // Assuming Forex; for other asset classes, modify as needed

// Calculate distances in pips between price and MAs
distance_to_ma1_pips = math.abs(close - ma1_htf) / pip_size
distance_to_ma2_pips = math.abs(close - ma2_htf) / pip_size

// Calculate signal intensity based on the pips distance
// Normalize the signal intensity between the user-specified min and max
signal_intensity = math.min(math.max((distance_to_ma1_pips + distance_to_ma2_pips), signal_intensity_min), signal_intensity_max)

// Trend Filter Condition (Optional)
trend_condition = false
if trend_filter_enabled
    trend_condition := ta.sma(close, ma2_length) > ta.sma(close, ma2_length + int(trend_filter_sensitivity))

// Entry Conditions Based on MA, Candle Patterns, and Trade Direction
long_condition = (trade_direction == "Long" or trade_direction == "Both") and (ma_entry_condition == "Fast Above Slow" or ma_entry_condition == "Both") and ma_cross_above and candle_condition and (not trend_filter_enabled or trend_condition) and signal_intensity > signal_intensity_min
short_condition = (trade_direction == "Short" or trade_direction == "Both") and (ma_entry_condition == "Fast Below Slow" or ma_entry_condition == "Both") and ma_cross_below and candle_condition and (not trend_filter_enabled or not trend_condition) and signal_intensity > signal_intensity_min

// Position Sizing Based on Risk Per Trade and ATR for Stop Loss
risk_amount = account_size * risk_per_trade
stop_loss_atr = atr_multiplier_stop * atr_value

// Calculate the position size based on the risk amount and ATR stop loss
position_size = risk_amount / stop_loss_atr

// If compounded results are not enabled, adjust position size for non-compounded returns
if not compounded_results
    position_size := position_size / account_size * 100000  // Adjust for non-compounded results

// Convert take profit and stop loss from ATR to USD
pip_value = syminfo.mintick * 10  // Assuming Forex; for other asset classes, modify as needed
take_profit_atr = atr_multiplier_take_profit * atr_value
take_profit_usd = (take_profit_atr * pip_value) * position_size
stop_loss_usd = (stop_loss_atr * pip_value) * position_size

// Trailing Stop
trail_stop_level = trailing_stop_rr * stop_loss_atr

// Initialize long_box_id and short_box_id as boxes (not ints)
var box long_box_id = na
var box short_box_id = na

// Track Monthly Profit
var float monthly_profit = 0.0
if (month(timenow) != month(timenow[1]))  // New month
    monthly_profit := 0

// Long Trade Management
if long_condition
    strategy.entry("Long", strategy.long, qty=position_size)
    // Partial Profit at 50% position close when 1:1 risk/reward
    strategy.exit("Partial Profit", from_entry="Long", limit=strategy.position_avg_price + stop_loss_atr, qty_percent=partial_profit_percentage / 100)
    // Full take profit and stop loss with trailing stop
    strategy.exit("Take Profit Long", from_entry="Long", limit=strategy.position_avg_price + take_profit_atr, stop=strategy.position_avg_price - stop_loss_atr, trail_offset=trail_stop_level)

    // Delete the old box if it exists
    if not na(long_box_id)
        box.delete(long_box_id)
    
    // Plot Take Profit and Stop Loss for Long Positions
    // long_box_id := box.new(left=bar_index - 1, top=strategy.position_avg_price + take_profit_atr, right=bar_index, bottom=strategy.position_avg_price - stop_loss_atr, bgcolor=color.new(color.green, 90), border_width=1, border_color=color.new(color.green, 0))

// Short Trade Management
if short_condition
    strategy.entry("Short", strategy.short, qty=position_size)
    // Partial Profit at 50% position close when 1:1 risk/reward
    strategy.exit("Partial Profit", from_entry="Short", limit=strategy.position_avg_price - stop_loss_atr, qty_percent=partial_profit_percentage / 100)
    // Full take profit and stop loss with trailing stop
    strategy.exit("Take Profit Short", from_entry="Short", limit=strategy.position_avg_price - take_profit_atr, stop=strategy.position_avg_price + stop_loss_atr, trail_offset=trail_stop_level)

    // Delete the old box if it exists
    // if not na(short_box_id)
    //     box.delete(short_box_id)

    // Plot Take Profit and Stop Loss for Short Positions
    // short_box_id := box.new(left=bar_index - 1, top=strategy.position_avg_price + stop_loss_atr, right=bar_index, bottom=strategy.position_avg_price - take_profit_atr, bgcolor=color.new(color.red, 90), border_width=1, border_color=color.new(color.red, 0))

// Plot MAs and Signals
plot(ma1_htf, color=color.blue, title="MA1 (HTF)")
plot(ma2_htf, color=color.red, title="MA2 (HTF)")
plotshape(series=long_condition, location=location.belowbar, color=color.green, style=shape.labelup, title="Buy Signal", text="BUY")
plotshape(series=short_condition, location=location.abovebar, color=color.red, style=shape.labeldown, title="Sell Signal", text="SELL")