Chiến lược giao dịch xu hướng Heikin-Ashi PSAR

Tác giả:ChaoZhang, Ngày: 2023-09-12 15:16:17
Tags:

Chiến lược này kết hợp các ngọn nến Heikin-Ashi và chỉ số PSAR để xác định xu hướng và tín hiệu giao dịch. Nó sử dụng lọc tiếng ồn Heikin-Ashi với PSAR để phát hiện sự đảo ngược xu hướng, nhằm mục đích nắm bắt xu hướng trung hạn và dài hạn.

Chiến lược logic:

  1. Tính toán Heikin-Ashi mở, đóng, cao và thấp.

  2. Màu nến xác định xu hướng tăng/giảm.

  3. Tính toán PSAR và xác định sự đảo ngược xu hướng khi nó vượt qua giá Heikin-Ashi.

  4. Đi dài trên xu hướng giảm PSAR và ngắn trên xu hướng tăng PSAR.

  5. PSAR thích nghi dựa trên mức cao / thấp mới và yếu tố gia tốc.

Ưu điểm:

  1. Sự kết hợp cải thiện độ chính xác - Heikin-Ashi lọc tiếng ồn, PSAR bắt được sự đảo ngược.

  2. PSAR thích nghi có thể điều chỉnh cho các điều kiện thị trường thay đổi.

  3. Các quy tắc rõ ràng có lợi cho tối ưu hóa tham số.

Rủi ro:

  1. Heikin-Ashi và PSAR có thể bỏ lỡ những mục xuất sắc nhất.

  2. PSAR dễ bị tín hiệu sai trong xu hướng bất ổn.

  3. Quản lý rủi ro nghiêm ngặt cần thiết để bảo vệ chống lại whipsaws.

Tóm lại, chiến lược này kết hợp Heikin-Ashi cho bối cảnh xu hướng với PSAR cho thời gian.


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

//@version=4
strategy("QuantNomad - Heikin-Ashi PSAR Strategy", shorttitle = "HA-PSAR[QN]", overlay = false)

////////////
// INPUTS //

start      = input(0.02, title = "PSAR Start")
increment  = input(0.02, title = "PSAR Increment")
maximum    = input(0.2,  title = "PSAR Max")

start_year  = input(2018, 'Start Year',  input.integer)
start_month = input(1,    'Start Month', input.integer)
start_day   = input(1,    'Start Day',   input.integer)

end_year  = input(2100, 'End Year',  input.integer)
end_month = input(1,    'End Month', input.integer)
end_day   = input(1,    'End Day',   input.integer)

date_start = timestamp(start_year, start_month, start_day, 00, 00)
date_end   = timestamp(end_year,   end_month,   end_day,   00, 00)

// if time is in correct period
time_cond = time >= date_start and time <= date_end

// Calculation HA Values 
haopen  = 0.0
haclose = (open + high + low + close) / 4
haopen := na(haopen[1]) ? (open + close) / 2 : (haopen[1] + haclose[1]) / 2
hahigh  = max(high, max(haopen, haclose))
halow   = min(low,  min(haopen, haclose))

// HA colors
hacolor = haclose > haopen ? color.green : color.red

psar        = 0.0 // PSAR
af          = 0.0 // Acceleration Factor
trend_dir   = 0   // Current direction of PSAR
ep          = 0.0 // Extreme point
trend_bars  = 0

sar_long_to_short = trend_dir[1] == 1  and haclose <= psar[1] // PSAR switches from long to short
sar_short_to_long = trend_dir[1] == -1 and haclose >= psar[1] // PSAR switches from short to long

trend_change = barstate.isfirst[1] or sar_long_to_short or sar_short_to_long

// Calculate trend direction
trend_dir    := barstate.isfirst[1] and haclose[1] > haopen[1] ? 1 : 
   barstate.isfirst[1] and haclose[1] <= haopen[1] ? -1 : 
   sar_long_to_short ? -1 : 
   sar_short_to_long ?  1 : nz(trend_dir[1])

trend_bars := sar_long_to_short ? -1 : 
              sar_short_to_long ?  1 : 
              trend_dir ==  1   ? nz(trend_bars[1]) + 1 : 
              trend_dir == -1   ? nz(trend_bars[1]) - 1 : 
              nz(trend_bars[1])

// Calculate  Acceleration Factor
af := trend_change ? start : 
   (trend_dir == 1 and hahigh > ep[1]) or  
   (trend_dir == -1 and low < ep[1]) ? 
   min(maximum, af[1] + increment) : 
   af[1]

// Calculate extreme point
ep := trend_change and trend_dir == 1 ? hahigh :  
   trend_change and trend_dir == -1 ? halow : 
   trend_dir == 1 ? max(ep[1], hahigh) : 
   min(ep[1], halow)

// Calculate PSAR
psar := barstate.isfirst[1] and haclose[1] > haopen[1] ? halow[1] : 
   barstate.isfirst[1] and haclose[1] <= haopen[1] ? hahigh[1] : 
   trend_change ? ep[1] :    
   trend_dir == 1 ? psar[1] + af * (ep - psar[1]) : psar[1] - af * (psar[1] - ep) 

plotcandle(haopen, hahigh, halow, haclose, title = "HA", color = hacolor)
plot(psar, style=plot.style_cross, color=trend_dir == 1 ? color.green : color.red,  linewidth = 2)

// Strategy
strategy.entry("long",  true,  when = sar_short_to_long and time_cond)
strategy.entry("short", false, when = sar_long_to_short and time_cond)


Thêm nữa