Chiến lược giao dịch biến động của SMA

Tác giả:ChaoZhang, Ngày: 2023-12-19 10:52:10
Tags:

img

Tổng quan chiến lược

Chiến lược này sử dụng trung bình động đơn giản (SMA) và một số tính toán toán học để xác định điểm mua / bán. Chúng tôi giữ một đường SMA 100 ngày làm cơ sở của chúng tôi. Nếu giá đóng dưới đường này, chúng tôi xác định vị trí mở dựa trên tỷ lệ phần trăm giá dưới đường (giảm bù), có thể cấu hình. Tương tự, chúng tôi đặt tỷ lệ phần trăm bù cao trên đường SMA 100 ngày trước khi đóng các vị trí dài. Nếu chúng tôi cố gắng đóng quá sớm trong khi giá vẫn đang tăng, lệnh dừng lỗ sẽ được kích hoạt.

Chiến lược logic

Chiến lược sử dụng ba đường SMA: đường nhanh (thất định 14 ngày), đường chậm (thất định 100 ngày) và đường tham chiếu (thất định 30 ngày).

Nó đi dài khi giá đóng dưới đường tham chiếu, tỷ lệ phần trăm dưới đường chậm (giải phóng thấp) lớn hơn giá trị được cấu hình, đường nhanh đang tăng và đường chậm đang giảm.

Nó đóng dài khi giá đóng trên đường tham chiếu, tỷ lệ phần trăm trên đường chậm (truyền cao) lớn hơn giá trị cấu hình, giá đóng tăng trong 3 ngọn nến liên tiếp, chúng tôi có lợi nhuận mở và đường nhanh nằm trên đường chậm.

Kích thước lệnh dựa trên tỷ lệ phần trăm của tổng vốn chủ sở hữu, điều này kiểm soát kích thước vị trí của chúng tôi.

Phân tích lợi thế

  1. Sử dụng lợi thế của SMA có thể làm mịn biến động giá và lọc tiếng ồn thị trường.
  2. SMA crossover có một số khả năng dự đoán sự thay đổi xu hướng.
  3. Thiết lập độ chênh lệch tránh sự phá vỡ sai của đường SMA.
  4. Kết hợp các chỉ số xu hướng và chéo cải thiện độ chính xác của tín hiệu giao dịch.
  5. Việc dừng lỗ theo dõi khóa lợi nhuận và ngăn chặn rút tiền.

Phân tích rủi ro

  1. Bản thân SMA có sự chậm trễ và có thể bỏ lỡ các điểm chuyển đổi giá.
  2. Chế độ thay đổi không đúng có thể làm cho chiến lược quá hung hăng hoặc quá bảo thủ.
  3. Các thông số stop loss không chính xác có thể dừng quá sớm hoặc tỷ lệ stop loss quá lớn.
  4. Không thể đối phó với sự biến động giá cả dữ dội.

Những cải tiến tương ứng:

  1. Thêm các chỉ số hàng đầu khác vào các mục lọc.
  2. Kiểm tra lại và tối ưu hóa offsets.
  3. Kiểm tra lại và tìm các thông số dừng lỗ tối ưu.
  4. Giảm kích thước vị trí trong thời gian biến động cao.

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

  1. Kiểm tra SMA của các giai đoạn khác nhau để tìm các thông số tối ưu.
  2. Thêm các chỉ số khác để xác định cấu trúc và xu hướng thị trường.
  3. Tối ưu hóa các thông số dừng lỗ để khóa thêm lợi nhuận.
  4. Điều chỉnh kích thước vị trí dựa trên biến động thị trường.
  5. Áp dụng chiến lược cho nhiều sản phẩm đồng thời để đa dạng hóa.

Kết luận

Chiến lược giao dịch biến động SMA Offset xác định các điểm vào tối ưu bằng cách thiết lập sự bù đắp dựa trên các đường SMA khác nhau. Cơ chế thoát đặt một lỗ dừng lại để khóa lợi nhuận. Chiến lược này rất đơn giản để hiểu và thực hiện. Bằng cách tối ưu hóa các thông số như thời gian SMA, bù đắp, mức dừng lỗ, có thể đạt được kết quả tốt hơn. Nó phù hợp với các nhà đầu tư trung dài tìm kiếm lợi nhuận ổn định.


/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4
// Author: Sonny Parlin (highschool dropout)
strategy(shorttitle="SMA+Strategy", title="SMA Offset Strategy",
                                      overlay=true,  currency=currency.USD,
                                      initial_capital=10000)

// Inputs and variables
ss = input(14, minval=10, maxval=50, title="SMA Fast (days)")
ff = input(100, minval=55, maxval=200, title="SMA Slow (days)")
ref = input(30, minval=20, maxval=50, title="SMA Reference (days)")
lowOffset = input(0.001, "Low Offset (%)", minval=0, step=0.001)
highOffset = input(0.0164, "High Offset (%)", minval=0, step=0.0001)
orderStake = input(0.96, "Order Stake (%)", minval=0, step=0.01)

// SMA
smaFast = sma(close, ss)
smaSlow = sma(close, ff)
smaRef = sma(close, ref)
distanceLow = (close - smaSlow) / close
distanceHigh = (close - smaSlow) / close

// Set up SMA plot but don't show by default
plot(smaFast, "smaFast", color=#00ff00, display = 0)
plot(smaSlow, "smaSlow", color=#ff0000, display = 0)
plot(smaRef, "smaRef", color=#ffffff, display = 0)

// The buy stratey:
// guard that the low is under our sma low reference line by our lowOffset %, 
// default is 0.001. (low < smaRef) and (distanceLow > lowOffset)
// SMA fast is on the rise and SMA slow is falling and they are very likely
// to cross. (rising(smaFast,1)) and (falling(smaSlow, 1)) 
enterLong = (low < smaRef) and (distanceLow > lowOffset) and (rising(smaFast,1)) and (falling(smaSlow, 1)) 

// The sell Strategy:
// Guard that close is higher than our sma high reference line by our 
// highOffset %, default is 0.0164. (close > smaRef) and (distanceHigh > highOffset)
// Guard that close has risen by 3 candles in a row (rising(close,3)) 
// Guard that we currently have profit (strategy.openprofit > 0)
// Guard that SMA fast is higher than smaSlow (smaFast > smaSlow)
// If it keeps going up past our close position the trailing stoploss will kick in!
enterShort = (close > smaRef) and (distanceHigh > highOffset) and (rising(close,3)) and (strategy.openprofit > 0) and (smaFast > smaSlow)

// Order size is based on total equity
// Example 1:
// startingEquity = 2000
// close = 47434.93
// orderStake = 0.45
// (2,000 × orderStake) / close = orderSize = 0.0189733599 = approx $900

// Example 2:
// startingEquity = 2000
// close = 1.272
// orderStake = 0.45
// (startingEquity × orderStake) / close = orderSize = 707.5471698113 = approx $900
orderSize = (strategy.equity * orderStake) / close

// Trailing Stoploss
// I'm using 1.35 as my default value, play with this for different results.
longTrailPerc = input(title="Trailing Stoploss (%)",
     type=input.float, minval=0.0, step=0.1, defval=1.35) * 0.01
     
longStopPrice = 0.0

longStopPrice := if (strategy.position_size > 0)
    stopValue = close * (1 - longTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0

if (enterLong)
    strategy.entry("Open Long Position", strategy.long, orderSize, when=strategy.position_size <= 0)
    
if (enterShort)
    strategy.exit(id="Close Long Position", stop=longStopPrice)


//plot(strategy.equity)

Thêm nữa