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

Phá vỡ khu vực Multi-SMA với chiến lược giao dịch định lượng khóa lợi nhuận động

Tác giả:ChaoZhang, Ngày: 2024-12-20 16:28:54
Tags:SMA

img

Tổng quan

Đây là một chiến lược giao dịch theo xu hướng năng động dựa trên các chỉ số SMA, kết hợp các vùng giá, chỉ số chứng khoán và nhiều cơ chế bảo vệ lợi nhuận. Chiến lược theo dõi các biến động giá trên các vùng khác nhau, tích hợp các tín hiệu chéo trung bình động ngắn hạn và dài hạn và sử dụng các chỉ số chứng khoán để xác định điều kiện thị trường và sức mạnh xu hướng để nắm bắt xu hướng hiệu quả. Chiến lược kết hợp cả cơ chế lấy lợi nhuận dựa trên tỷ lệ phần trăm và điểm cố định để cân bằng hiệu quả lợi nhuận và rủi ro.

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

Logic cốt lõi bao gồm một số thành phần chính:

  1. Sử dụng SMA 19 giai đoạn và 74 giai đoạn để xây dựng khung xu hướng
  2. Sử dụng chỉ số stochastic 60 giai đoạn để đánh giá điều kiện thị trường, phân loại màu SMA thành màu vàng, xanh lá cây, đỏ và màu cam
  3. Phân chia các vùng giá thành 5 cấp độ quan trọng để xác định sức mạnh giá
  4. Các điều kiện nhập cảnh yêu cầu:
    • SMA ở trạng thái màu xanh lá cây hoặc màu vàng
    • Giá vượt qua vùng màu cam
    • Giá đóng trên SMA ngắn hạn
  5. Thực hiện hai cơ chế lợi nhuận:
    • Bảo vệ rút tiền dựa trên tỷ lệ phần trăm từ giá cao nhất
    • Khóa lợi nhuận định giá

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

  1. Các cơ chế xác nhận nhiều lần làm giảm tín hiệu sai
  2. Phân vùng năng động thích nghi với môi trường thị trường khác nhau
  3. Các cơ chế lợi nhuận kép cung cấp kiểm soát rủi ro tốt hơn
  4. Việc 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. Theo dõi tình trạng giao dịch theo thời gian thực tạo điều kiện cho việc gỡ lỗi chiến lược
  6. Kết hợp các chỉ số kỹ thuật với phân tích hành động giá

Rủi ro chiến lược

  1. Có thể tạo ra giao dịch quá mức trên các thị trường khác nhau
  2. Lợi nhuận cố định có thể bỏ lỡ xu hướng lớn hơn
  3. Parameter tối ưu hóa có thể dẫn đến quá phù hợp
  4. Mất lợi nhuận tiềm năng khi thị trường đảo ngược nhanh chóng
  5. Nhiều điều kiện xác nhận có thể bỏ lỡ một số cơ hội giao dịch Giải pháp:
  • Thêm bộ lọc biến động
  • Điều chỉnh động các tham số thu lợi nhuận
  • Tăng cường nhận thức về môi trường thị trường
  • Tối ưu hóa các quyết định thời gian thoát

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

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

Tóm lại

Chiến lược xây dựng một hệ thống giao dịch toàn diện thông qua việc sử dụng tích hợp nhiều chỉ số kỹ thuật và phương pháp phân tích hành động giá. Sức mạnh của nó nằm trong nhiều cơ chế xác nhận và hệ thống thu lợi nhuận linh hoạt, trong khi phải 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. Thông qua tối ưu hóa liên tục và quản lý rủi ro được cải thiện, chiến lược cho thấy tiềm năng duy trì hiệu suất ổn định trong các điều kiện thị trường khác nhau.


/*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)

Có liên quan

Thêm nữa