Chiến lược giao dịch định lượng đột phá nhiều khoảng SMA và khóa lợi nhuận động

SMA
Ngày tạo: 2024-12-20 16:28:54 sửa đổi lần cuối: 2024-12-20 16:28:54
sao chép: 0 Số nhấp chuột: 441
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch định lượng đột phá nhiều khoảng SMA và khóa lợi nhuận động

Tổng quan

Đây là một chiến lược giao dịch theo dõi xu hướng động dựa trên chỉ số SMA, kết hợp với khung giá, chỉ số ngẫu nhiên và cơ chế bảo vệ lợi nhuận nhiều. Chiến lược này bằng cách theo dõi chuyển động của giá trong các khung khác nhau, kết hợp với tín hiệu chéo của đường trung bình di chuyển ngắn hạn và dài hạn, đồng thời sử dụng chỉ số ngẫu nhiên để xác định trạng thái thị trường và cường độ xu hướng, để nắm bắt xu hướng hiệu quả.

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

Logic cốt lõi của chiến lược bao gồm những phần chính sau:

  1. Xây dựng khung xu hướng bằng 19 chu kỳ và 74 chu kỳ SMA
  2. Xác định tình trạng thị trường thông qua chỉ số ngẫu nhiên 60 chu kỳ, phân chia màu sắc của SMA thành bốn trạng thái vàng, xanh lá cây, đỏ và vàng
  3. 5 mức quan trọng trong phạm vi giá để đánh giá giá mạnh hoặc yếu
  4. Các điều kiện tham gia phải được đáp ứng cùng lúc:
    • SMA là màu xanh lá cây hoặc màu vàng
    • Giá vượt qua vùng màu cam
    • Giá đóng cửa trên SMA ngắn hạn
  5. Có hai loại hệ thống ngăn chặn:
    • Tỷ lệ phần trăm thu hồi bảo vệ dựa trên giá cao nhất
    • Giữ lợi nhuận dựa trên số điểm cố định

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

  1. Các hệ thống xác nhận đa dạng đã giảm tín hiệu giả
  2. Phân vùng năng động thích ứng với môi trường thị trường khác nhau
  3. Cơ chế ngăn chặn kép cung cấp kiểm soát rủi ro tốt hơn
  4. Phân loại rõ ràng tình trạng thị trường giúp nắm bắt nhịp độ thị trường
  5. Giám sát tình trạng giao dịch trong thời gian thực giúp thiết lập chiến lược
  6. Kết hợp các chỉ số kỹ thuật và phân tích hành vi giá cả

Rủi ro chiến lược

  1. Có thể xảy ra quá nhiều giao dịch trong thị trường bất ổn
  2. Đặt điểm dừng có thể bị bỏ lỡ
  3. Tối ưu hóa tham số có thể dẫn đến quá khớp
  4. Một số lợi nhuận có thể bị mất khi thị trường thay đổi nhanh chóng
  5. Điều kiện xác nhận nhiều lần có thể bỏ lỡ một số cơ hội giao dịch Giải pháp:
  • Thêm bộ lọc tỷ lệ dao động
  • Hoạt động điều chỉnh các tham số dừng
  • Tăng cường cơ chế nhận diện môi trường thị trường
  • Tối ưu hóa thời gian ra sân

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

  1. Giới thiệu tham số điều chỉnh động của chỉ số dao động
  2. Điều chỉnh điều kiện dừng tùy theo tình trạng thị trường
  3. Thêm cơ chế xác nhận khối lượng giao dịch
  4. Thêm bộ lọc cường độ xu hướng
  5. Tối ưu hóa phương pháp phân chia theo khu vực, tính đến đặc điểm thị trường
  6. Cải thiện cơ chế quản lý rủi ro, như:
    • Hạn lỗ hàng ngày
    • Kiểm soát rút tối đa
    • Hạn chế thời gian giữ

Tóm tắt

Chiến lược này xây dựng một hệ thống giao dịch hoàn chỉnh bằng cách sử dụng tổng hợp nhiều chỉ số kỹ thuật và phương pháp phân tích hành vi giá. Ưu điểm của chiến lược là có nhiều cơ chế xác nhận và hệ thống dừng linh hoạt, nhưng cũng cần chú ý đến tác động của môi trường thị trường đối với hiệu suất chiến lược.

Mã nguồn chiến lược
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="SMA Color Strategy", 
     overlay=true, 
     initial_capital=10000,
     max_bars_back=5000,
     max_labels_count=500,
     max_boxes_count=500,
     default_qty_type=strategy.fixed,
     default_qty_value=1,
     currency=currency.NONE,
     process_orders_on_close=true)

// === INPUTS ===
zoneLength = input.int(20, "Price Zone Length", minval=5)
profitLockPct = input.float(50, "Profit Lock Percentage", minval=1, maxval=100, step=5) / 100
ticksToLock = input.int(12, "Ticks to Activate Lock", minval=1, tooltip="Number of ticks price must move up to activate tick-based lock")
ticksToSecure = input.int(10, "Ticks to Secure", minval=1, tooltip="Number of ticks to lock in once activated")

// Calculate tick values
tickSize = syminfo.mintick
ticksToLockPoints = ticksToLock * tickSize
ticksToSecurePoints = ticksToSecure * tickSize

// Calculate price zones
h = ta.highest(high, zoneLength)
l = ta.lowest(low, zoneLength)
priceRange = h - l
lvl5 = h
lvl4 = l + (priceRange * 0.75)  // Orange line
lvl3 = l + (priceRange * 0.50)  // Yellow line
lvl2 = l + (priceRange * 0.25)  // Green line
lvl1 = l

// Calculate SMAs
sma19 = ta.sma(close, 19)
sma74 = ta.sma(close, 74)

// Stochastic calculation for color logic
k = ta.stoch(close, high, low, 60)
d = ta.sma(k, 10)

// SMA Color Logic with state tracking
var color currentSMAColor = color.orange
var color previousSMAColor = color.orange
var string currentColorName = "ORANGE"
var string previousColorName = "ORANGE"

smaColor = if d >= 80 or d <= 20
    color.rgb(255, 215, 0)
else if d > d[1]
    color.green
else if d < d[1]
    color.red
else
    color.orange

// Update color state and names
if smaColor != currentSMAColor
    previousSMAColor := currentSMAColor
    currentSMAColor := smaColor
    previousColorName := currentColorName
    currentColorName := if smaColor == color.rgb(255, 215, 0)
        "YELLOW"
    else if smaColor == color.green
        "GREEN"
    else if smaColor == color.red
        "RED"
    else
        "ORANGE"

// Color logic for SMA74
sma74Color = if smaColor == color.rgb(255, 215, 0)
    color.rgb(255, 215, 0)                          
else if sma74 < sma19                               
    color.green
else                                                
    color.red

// === ENTRY CONDITIONS ===
smaIsGreen = smaColor == color.green
greenCandle = close > open
candleAboveOrange = close > lvl4
candleAboveSMA = close > sma19
crossedAboveOrange = ta.crossover(close, lvl4)
smaIsYellow = smaColor == color.rgb(255, 215, 0)

longCondition1 = smaIsGreen and greenCandle and candleAboveOrange and candleAboveSMA and crossedAboveOrange
longCondition2 = smaIsYellow and crossedAboveOrange and candleAboveSMA

// === PROFIT LOCK SYSTEM ===
var float entryPrice = na
var float maxPrice = na
var float profitLockLevel = na
var bool tickLockActivated = false
var float tickBasedLockLevel = na

// Reset variables on new trade entry
if (longCondition1 or longCondition2)
    entryPrice := close
    maxPrice := close
    profitLockLevel := close * (1 - profitLockPct)
    tickLockActivated := false
    tickBasedLockLevel := na

// Update maximum price and profit locks when in a trade
if strategy.position_size > 0
    maxPrice := math.max(maxPrice, high)
    profitLockLevel := math.max(profitLockLevel, maxPrice * (1 - profitLockPct))
    
    // Check if price has moved up enough to activate tick-based lock
    if not tickLockActivated and (maxPrice - entryPrice) >= ticksToLockPoints
        tickLockActivated := true
        tickBasedLockLevel := entryPrice + ticksToSecurePoints

// === EXIT CONDITIONS ===
exitOnYellowLine = close < lvl3
exitOnProfitLock = low < profitLockLevel and strategy.position_size > 0
exitOnTickLock = tickLockActivated and low < tickBasedLockLevel

// === TRADE MANAGEMENT ===
if (longCondition1 or longCondition2)
    strategy.entry("Long", strategy.long)

if strategy.position_size > 0
    if exitOnYellowLine
        strategy.close("Long", comment="Close below yellow")
    if exitOnProfitLock
        strategy.close("Long", comment="Profit lock triggered")
    if exitOnTickLock
        strategy.close("Long", comment="Tick-based lock triggered")

// Plot indicators
plot(sma19, "SMA 19", color=smaColor, linewidth=2)
plot(sma74, "SMA 74", color=sma74Color, linewidth=2)
plot(lvl5, "Upper Zone Top", color=color.red, linewidth=2)
plot(lvl4, "Upper Zone Bottom", color=color.orange, linewidth=2)
plot(lvl3, "Middle Line", color=color.yellow, linewidth=2)
plot(lvl2, "Lower Zone Top", color=color.green, linewidth=2)
plot(lvl1, "Lower Zone Bottom", color=color.blue, linewidth=2)

// Plot profit lock levels
plot(strategy.position_size > 0 ? profitLockLevel : na, "Profit Lock Level", color=color.purple, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size > 0 and tickLockActivated ? tickBasedLockLevel : na, "Tick Lock Level", color=color.fuchsia, style=plot.style_linebr, linewidth=2)

// Fill zones
var p1 = plot(lvl5, display=display.none)
var p2 = plot(lvl4, display=display.none)
var p3 = plot(lvl2, display=display.none)
var p4 = plot(lvl1, display=display.none)
fill(p1, p2, color=color.new(color.red, 90))
fill(p3, p4, color=color.new(color.green, 90))

// Debug Table
if barstate.islast
    var table debugTable = table.new(position.top_right, 2, 13, bgcolor=color.new(color.black, 70), frame_width=1)
    
    table.cell(debugTable, 0, 0, "Current Color", text_color=color.white)
    table.cell(debugTable, 1, 0, currentColorName, text_color=currentSMAColor)
    
    table.cell(debugTable, 0, 1, "Previous Color", text_color=color.white)
    table.cell(debugTable, 1, 1, previousColorName, text_color=previousSMAColor)
    
    table.cell(debugTable, 0, 2, "Entry 1 (Green)", text_color=color.white)
    table.cell(debugTable, 1, 2, str.tostring(longCondition1), text_color=color.white)
    
    table.cell(debugTable, 0, 3, "Entry 2 (Yellow)", text_color=color.white)
    table.cell(debugTable, 1, 3, str.tostring(longCondition2), text_color=color.white)
    
    table.cell(debugTable, 0, 4, "Current Position", text_color=color.white)
    table.cell(debugTable, 1, 4, str.tostring(strategy.position_size), text_color=color.white)
    
    table.cell(debugTable, 0, 5, "Entry Price", text_color=color.white)
    table.cell(debugTable, 1, 5, str.tostring(entryPrice), text_color=color.white)
    
    table.cell(debugTable, 0, 6, "Max Price", text_color=color.white)
    table.cell(debugTable, 1, 6, str.tostring(maxPrice), text_color=color.white)
    
    table.cell(debugTable, 0, 7, "Profit Lock Level", text_color=color.white)
    table.cell(debugTable, 1, 7, str.tostring(profitLockLevel), text_color=color.white)
    
    table.cell(debugTable, 0, 8, "Tick Lock Active", text_color=color.white)
    table.cell(debugTable, 1, 8, str.tostring(tickLockActivated), text_color=color.white)
    
    table.cell(debugTable, 0, 9, "Tick Lock Level", text_color=color.white)
    table.cell(debugTable, 1, 9, str.tostring(tickBasedLockLevel), text_color=color.white)
    
    table.cell(debugTable, 0, 10, "Price Move (Ticks)", text_color=color.white)
    table.cell(debugTable, 1, 10, str.tostring(strategy.position_size > 0 ? (maxPrice - entryPrice) / tickSize : 0), text_color=color.white)
    
    table.cell(debugTable, 0, 11, "Locked Profit %", text_color=color.white)
    table.cell(debugTable, 1, 11, str.tostring(strategy.position_size > 0 ? ((maxPrice - entryPrice) / entryPrice * 100) : 0.0) + "%", text_color=color.white)
    
    table.cell(debugTable, 0, 12, "Exit Signals", text_color=color.white)
    table.cell(debugTable, 1, 12, "Y:" + str.tostring(exitOnYellowLine) + " P:" + str.tostring(exitOnProfitLock) + " T:" + str.tostring(exitOnTickLock), text_color=color.white)