Chiến lược đảo ngược hàng ngày của Super Trend


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

Chiến lược đảo ngược hàng ngày của Super Trend

Tổng quan

Chiến lược đảo ngược hàng ngày của siêu xu hướng là một chiến lược giao dịch định lượng sử dụng chỉ số siêu xu hướng để xác định xu hướng thị trường, kết hợp với giá phá vỡ và tính toán dừng chân trong phạm vi biến động thực tế trung bình, và sử dụng chỉ số thay đổi tỷ lệ giá để lọc tín hiệu siêu xu hướng. Chiến lược này áp dụng cho đường nét và chu kỳ thời gian cao hơn, có thể được sử dụng cho các thị trường như tiền kỹ thuật số và cổ phiếu.

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

Chỉ số trung tâm của chiến lược này là chỉ số siêu xu hướng (Super Trend Indicator). Chỉ số siêu xu hướng dựa trên phạm vi biến động thực tế trung bình (ATR), có thể đánh giá rõ ràng hơn về hướng của xu hướng thị trường.

Chiến lược này đi kèm với việc sử dụng chỉ số tỷ lệ thay đổi giá ((ROC) để lọc các chỉ số siêu xu hướng, tránh tín hiệu không hiệu quả. Chỉ tham gia tín hiệu siêu xu hướng khi giá dao động lớn, nếu không thì không tham gia.

Về dừng lỗ, chiến lược này cung cấp hai cách dừng lỗ: tỷ lệ dừng cố định và dừng thu nhỏ tự động dựa trên ATR. Đặt dừng là đơn giản và trực tiếp, dừng ATR có thể điều chỉnh phạm vi dừng tùy theo biến động của thị trường.

Điều kiện nhập là chỉ số siêu xu hướng đảo ngược và chỉ số tỷ lệ biến đổi giá qua bộ lọc. Điều kiện ra là siêu xu hướng đảo ngược một lần nữa hoặc phá vỡ đường dừng. Chiến lược này tuân theo nguyên tắc theo dõi xu hướng, chỉ cho phép một vị trí mỗi hướng.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là sử dụng chỉ số xu hướng siêu xu hướng để xác định hướng xu hướng với độ rõ ràng và ổn định cao hơn, và có ít tiếng ồn hơn so với trung bình di chuyển thông thường. Ngoài ra, chiến lược đã thêm chỉ số tỷ lệ thay đổi giá để lọc một số tín hiệu giả.

ATR cũng cho phép chiến lược này thích ứng với môi trường thị trường rộng lớn hơn. Khi biến động tăng lên, dừng sẽ tự động nới lỏng, tối đa hóa lợi nhuận.

Từ kết quả thử nghiệm, chiến lược này hoạt động tốt trong thị trường bò. Trong xu hướng đường dài có khối lượng lớn, tỷ lệ thắng cao, chu kỳ lợi nhuận liên tục dài.

Phân tích rủi ro

Rủi ro chính đối với chiến lược này là sai lầm trong phán đoán xu hướng đảo ngược, do đó có thể bỏ lỡ tín hiệu đảo ngược hoặc tạo ra tín hiệu đảo ngược không cần thiết. Điều này thường xảy ra khi giá liên tục sắp xếp ngang quanh vùng hỗ trợ hoặc kháng cự quan trọng.

Ngoài ra, thiết lập dừng lỗ quá thoải mái cũng có thể dẫn đến tổn thất mở rộng. Đặt dừng ATR được điều chỉnh theo biến động của thị trường, do đó, dừng lỗ có thể kéo rộng hơn trong trường hợp bất ngờ của thị trường.

Đối với các rủi ro trên, có thể rút ngắn chu kỳ tính toán ATR thích hợp hoặc điều chỉnh hệ số nhân của ATR dừng. Các chỉ số bổ sung cũng có thể được thêm vào để xác định các vùng kháng cự hỗ trợ quan trọng, tránh các vùng phát ra tín hiệu sai lệch.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Điều chỉnh các tham số của chỉ số siêu xu hướng, tối ưu hóa chu kỳ ATR và nhân ATR, làm cho đường siêu xu hướng mịn hơn.

  2. Điều chỉnh các tham số của chỉ số tỷ lệ biến đổi giá, tối ưu hóa chu kỳ và ngưỡng biến đổi, giảm tín hiệu sai.

  3. Thử các cơ chế dừng khác nhau, chẳng hạn như theo dõi dừng hoặc tối ưu hóa mức dừng của dừng cố định.

  4. Thêm các chỉ số phán đoán bổ sung, xác định các kháng cự hỗ trợ quan trọng, tránh sai lầm trong phán đoán xu hướng đảo ngược.

  5. Kiểm tra các thiết lập và hiệu quả của các tham số khác nhau để tìm ra sự kết hợp tham số tối ưu.

  6. Các thiết lập tham số tối ưu hóa để tìm ra các thiết lập tham số tối ưu nhất.

Tóm tắt

Chiến lược đảo ngược đường nét siêu xu hướng là một chiến lược theo dõi xu hướng ổn định và đáng tin cậy hơn. Nó kết hợp các chỉ số siêu xu hướng và chỉ số tỷ lệ biến đổi giá để lọc và có thể xác định hiệu quả hướng của xu hướng đường dài và dài. Cơ chế dừng lỗ tự điều chỉnh của ATR cũng giúp nó thích nghi với hầu hết các môi trường thị trường.

Mã nguồn chiến lược
/*backtest
start: 2024-01-22 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Super Trend Daily BF 🚀", overlay=true, 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)

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

///////////// Super Trend /////////////
_2 = input(false,  "══════ Super Trend ══════")
length = input(title="ATR Period", type=input.integer, defval=3)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=1.3)

atr = mult * atr(length)

longStop = hl2 - atr
longStopPrev = nz(longStop[1], longStop)
longStop :=  close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = hl2 + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and close > shortStopPrev ? 1 : dir == 1 and close < longStopPrev ? -1 : dir

///////////// Rate Of Change ///////////// 
_3 = input(false,  "══════ Rate of Change ══════")
source = close
roclength = input(30, "ROC Length",  minval=1)
pcntChange = input(6, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

///////////////  Strategy  /////////////// 
long = dir == 1 and dir[1] == -1 and isMoving()
short = dir == -1 and dir[1] == 1 and isMoving()

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(6.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

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

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(isMoving() ? dir == 1 ? color.lime : color.red : color.white , transp=80)