Xu hướng trung bình động định lượng theo chiến lược

Tác giả:ChaoZhang, Ngày: 2023-09-18 13:23:52
Tags:

Tổng quan

Chiến lược này tính toán hai mức trung bình động được cân nhắc theo khối lượng là đường nhanh và đường chậm. Nó xác định hướng xu hướng dựa trên sự khác biệt giữa hai đường và có các vị trí dài hoặc ngắn phù hợp. Chiến lược này đơn giản và hiệu quả trong việc theo dõi xu hướng thị trường.

Chiến lược logic

  1. Tính toán các đường nhanh và chậm bằng cách sử dụng các đường trung bình động được cân nhắc khối lượng dựa trên các giai đoạn nhanh và chậm được xác định bởi người dùng.

  2. Tính toán sự khác biệt giữa các đường nhanh và chậm.

  3. Xác định hướng xu hướng: Chuyến qua đường nhanh trên đường chậm cho thấy xu hướng tăng và đường qua bên dưới cho thấy xu hướng giảm.

  4. Phát ra tín hiệu dài / ngắn. Đi dài khi đường nhanh vượt qua đường chậm. Đi ngắn khi đường nhanh vượt qua đường chậm.

  5. Đặt stop loss dựa trên tỷ lệ phần trăm cố định hoặc ATR động được xác định bởi người dùng.

  6. Quy tắc thoát: đóng vị trí nếu dừng mất mát được nhấn hoặc tín hiệu đảo ngược xảy ra.

Ưu điểm

  1. Sử dụng chỉ số định lượng để xác định xu hướng và tránh sự đột phá sai.

  2. Kết hợp đường dây nhanh và chậm lọc ra tiếng ồn thị trường và tránh giao dịch quá mức.

  3. Stop loss có hiệu quả kiểm soát rủi ro giảm.

  4. Đơn giản và dễ hiểu về logic.

  5. Các tham số có thể tùy chỉnh cho các sản phẩm và khung thời gian khác nhau.

Rủi ro

  1. Cài đặt tham số không chính xác có thể gây ra quá mức giao dịch hoặc xu hướng bỏ lỡ.

  2. Đặt dừng lỗ cố định có thể quá cứng nhắc cho các điều kiện thị trường thay đổi.

  3. Những thay đổi trong mối quan hệ khối lượng và giá có thể ảnh hưởng đến hiệu quả.

  • Nguy cơ 1 có thể được giảm thiểu thông qua tối ưu hóa tham số.

  • Rủi ro 2 có thể được giải quyết thông qua ATR stop loss động.

  • Nguy cơ 3 cần theo dõi thay đổi âm lượng.

Cơ hội gia tăng

  1. Kiểm tra các kết hợp tham số đường nhanh và chậm khác nhau.

  2. Hãy thử các chỉ số giá khối lượng khác như OBV, Williams %R v.v.

  3. Thêm dừng dựa trên biến động.

  4. Đánh giá kết hợp với các chỉ số khác.

  5. Kiểm tra hiệu quả trên các công cụ giao dịch khác nhau.

Kết luận

Chiến lược này sử dụng các đường trung bình di chuyển nhanh và chậm để theo dõi xu hướng với logic đơn giản. Các thông số có thể được tối ưu hóa và ngăn chặn rủi ro. Các đánh giá thêm về kết hợp các chỉ số có thể cải thiện hiệu quả.


/*backtest
start: 2023-08-18 00:00:00
end: 2023-09-17 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("EVWMA 6HR", overlay=false, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
// Credit to QuantNomad for the main idea behind this code
/////////////// Time Frame ///////////////
_1 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// EVWMA /////////////
_2 = input(false,  "════════ EVMA ═══════")

fast_sum_length = input(5, title = "Fast Sum Length",  type = input.integer)
slow_sum_length = input(11, title = "Slow Sum Length",  type = input.integer)

fast_vol_period = sum(volume, fast_sum_length)
slow_vol_period = sum(volume, slow_sum_length)

fast_evwma = 0.0
fast_evwma := ((fast_vol_period - volume) * nz(fast_evwma[1], close) + volume * close) / (fast_vol_period)
slow_evwma = 0.0
slow_evwma := ((slow_vol_period - volume) * nz(slow_evwma[1], close) + volume * close) / (slow_vol_period)

diff = fast_evwma - slow_evwma

///////////////  Strategy  /////////////// 
long = fast_evwma > slow_evwma 
short = fast_evwma < slow_evwma 

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
_4 = input(false,  "════════ Stop Loss ═══════")
SL_type = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inp = input(9.0, title='Fixed Stop Loss %') / 100
atrLkb = input(20, minval=1, title='ATR Stop Period')
atrMult = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop1 = 0.0
longStop1 :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop1[1]
shortStop1 = 0.0
shortStop1 := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop1[1]

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

_5 = input(false,  "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")

/////////////// Execution ///////////////
if testPeriod()
    if useLongs
        strategy.entry("L", strategy.long, when=long)
        strategy.exit("L SL", "L", stop = SL_type == "Fixed" ? long_sl : longStop1, when=since_longEntry > -1)
    if useShorts
        strategy.exit("S SL", "S", stop = SL_type == "Fixed" ? short_sl : shortStop1, when=since_shortEntry > -1)
        strategy.entry("S", strategy.short, when=short)
    if not useShorts
        strategy.close("L", when=short)
    if not useLongs
        strategy.close("S", when=long)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
p1 = plot(diff, title = "Delta", color = long ? color.lime : short ? color.red : na, transp=0)
p2 = plot(0, color = color.white)
fill(p1, p2, color = long ? color.lime : short ? color.red : na, transp=60)

Thêm nữa