Xu hướng Heikin Ashi trơn tru theo chiến lược

Tác giả:ChaoZhang, Ngày: 2023-12-27 15:41:37
Tags:

img

Tổng quan

Chiến lược này xác định xu hướng giá bằng cách sử dụng chỉ số dao động trơn tùy chỉnh và giao dịch dựa trên các nguyên tắc theo xu hướng.

Chiến lược logic

Chiến lược này sử dụng một bộ dao động trơn tru tùy chỉnh tính toán giá đóng ngược cần thiết để chuyển màu nến Heikin Ashi từ màu đỏ sang màu xanh lá cây và ngược lại.

Chiến lược này tham gia vào các giao dịch dựa trên sự phá vỡ của đường chỉ số. Các giao dịch dài được bắt đầu khi giá phá vỡ trên đường trong khi các giao dịch ngắn được bắt đầu khi phá vỡ dưới đường. Các lỗ dừng được đặt ở một tỷ lệ phần trăm cố định từ giá nhập để khóa lợi nhuận và kiểm soát rủi ro.

Ưu điểm

  1. Chỉ số tùy chỉnh xác định xu hướng với kết quả backtest tốt
  2. Cách tiếp cận theo xu hướng phù hợp với các lý thuyết định lượng
  3. Thực hiện dừng lỗ thúc đẩy quản lý rủi ro

Rủi ro

  1. Khả năng sơn lại dẫn đến hiệu suất sống kém
  2. Việc dựa vào một chỉ số duy nhất có nguy cơ tín hiệu xấu
  3. Cài đặt dừng lỗ đòi hỏi tối ưu hóa thêm

Cơ hội gia tăng

  1. Tích hợp các bộ lọc bổ sung như Bollinger Bands, RSI vv
  2. Kiểm tra các thông số chỉ số khác nhau
  3. Tối ưu hóa vị trí dừng lỗ
  4. Thử nghiệm nhiều hơn trên các dụng cụ và khung thời gian

Kết luận

Chiến lược này cho thấy một xu hướng rõ ràng sau cách tiếp cận sử dụng chỉ số dao động tùy chỉnh. Kết quả thử nghiệm ngược là đáng khích lệ, cho thấy tiềm năng giao dịch trực tiếp. Tuy nhiên, sự phụ thuộc duy nhất vào một chỉ số tái sơn và thiếu xác minh chất lượng tín hiệu là mối quan tâm. Cơ chế dừng lỗ cũng yêu cầu kiểm tra và điều chỉnh bổ sung. Nhìn chung, khái niệm chiến lược có vẻ khả thi nhưng cần nhiều công việc hơn để làm cho nó có thể triển khai đáng tin cậy cho giao dịch trực tiếp.


/*backtest
start: 2023-12-19 00:00:00
end: 2023-12-26 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// © TraderHalai
// This is a backtest of the Smoothed Heikin Ashi Trend indicator, which computes the reverse candle close price required to flip a heikin ashi trend from red to green and vice versa. Original indicator can be found on the scripts section of my profile.

// Default testing parameters are 10% of equity position size, with a 1% stop loss on short and long strategy.opentrades.commission

// This particular back test uses this indicator as a Trend trading tool with a tight stop loss. The equity curve as tested seems promising but requires further work to refine. Note in an actual trading setup, you may wish to use this with volatilty filters as most of the losses are in sideways, low volatility markets.


//@version=5
strategy("Smoothed Heikin Ashi Trend on Chart - TraderHalai BACKTEST", " SHA Trend - BACKTEST", overlay=true)
//Inputs

i_useSmooth =       input ( true, "Use smoothing Heikin Ashi")
i_smoothingMethod = input.string("SMA", "Method", options=["SMA", "EMA", "HMA", "VWMA", "RMA"])
i_smoothingPeriod = input ( 10, "Smoothing period")

i_infoBox   =       input ( true, "Show Info Box"        )
i_decimalP  =       input ( 2,    "Prices Decimal Places") 
i_boxOffSet =       input ( 5,    "Info Box Offset"      )
i_repaint   =       input (false,  "Repaint -  Keep on for live / Off for backtest")

i_longLossPerc = input.float(title="Long Stop Loss (%)",minval=0.0, step=0.1, defval=1) * 0.01

i_shortLossPerc = input.float(title="Short Stop Loss (%)", minval=0.0, step=0.1, defval=1) * 0.01


timeperiod = timeframe.period

//Security functions to avoid repaint, as per PineCoders
f_secureSecurity(_symbol, _res, _src) => request.security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on)
f_security(_symbol, _res, _src, _repaint) => request.security(_symbol, _res, _src[_repaint ? 0 : barstate.isrealtime ? 1 : 0])[_repaint ? 0 : barstate.isrealtime ? 0 : 1]
f_secSecurity2(_symbol, _res, _src) => request.security(_symbol, _res, _src[1])


candleClose = f_security(syminfo.tickerid, timeperiod, close, i_repaint)
candleOpen = f_security(syminfo.tickerid, timeperiod, open, i_repaint)
candleLow = f_security(syminfo.tickerid, timeperiod, low, i_repaint)
candleHigh = f_security(syminfo.tickerid, timeperiod, high, i_repaint)

haTicker = ticker.heikinashi(syminfo.tickerid)
haClose = f_security(haTicker, timeperiod, close, i_repaint)
haOpen = f_security(haTicker, timeperiod, open, i_repaint)
haLow = f_security(haTicker, timeperiod, low, i_repaint)
haHigh= f_security(haTicker, timeperiod, high, i_repaint)


reverseClose = (2 * (haOpen[1] + haClose[1])) - candleHigh - candleLow - candleOpen

if(reverseClose < candleLow)
    reverseClose := (candleLow + reverseClose) / 2

if(reverseClose > candleHigh)
    reverseClose := (candleHigh + reverseClose) / 2
    
//Smoothing
    
smaSmoothed = ta.sma(reverseClose, i_smoothingPeriod)
emaSmoothed = ta.ema(reverseClose, i_smoothingPeriod)
hmaSmoothed = ta.hma(reverseClose, i_smoothingPeriod)
vwmaSmoothed = ta.vwma(reverseClose, i_smoothingPeriod)
rmaSmoothed = ta.rma(reverseClose, i_smoothingPeriod)

shouldApplySmoothing = i_useSmooth and i_smoothingPeriod > 1 

smoothedReverseClose = reverseClose

if(shouldApplySmoothing)
    if(i_smoothingMethod == "SMA")
        smoothedReverseClose := smaSmoothed
    else if(i_smoothingMethod == "EMA")
        smoothedReverseClose := emaSmoothed
    else if(i_smoothingMethod == "HMA")
        smoothedReverseClose := hmaSmoothed
    else if(i_smoothingMethod == "VWMA")
        smoothedReverseClose := vwmaSmoothed
    else if(i_smoothingMethod == "RMA")
        smoothedReverseClose := rmaSmoothed
    else 
        smoothedReverseClose := reverseClose // Default to non-smoothed for invalid smoothing type
    
haBull = candleClose >= smoothedReverseClose
haCol = haBull ? color.green : color.red


//Overall trading strategy
if(ta.crossover(candleClose, smoothedReverseClose))
    strategy.entry("LONG", strategy.long, stop=smoothedReverseClose)
else
    strategy.cancel("LONG")

if(ta.crossunder(candleClose, smoothedReverseClose))
    strategy.entry("SHORT", strategy.short, stop=smoothedReverseClose)
else
    strategy.cancel("SHORT")
    

longStopPrice  = strategy.position_avg_price * (1 - i_longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + i_shortLossPerc)



plot(series=(strategy.position_size > 0) ? longStopPrice : na,
     color=color.red, style=plot.style_cross,
     linewidth=2, title="Long Stop Loss")
plot(series=(strategy.position_size < 0) ? shortStopPrice : na,
     color=color.red, style=plot.style_cross,
     linewidth=2, title="Short Stop Loss")
     
plot(smoothedReverseClose, color=haCol)

if (strategy.position_size > 0)
    strategy.exit(id="XL STP", stop=longStopPrice)

if (strategy.position_size < 0)
    strategy.exit(id="XS STP", stop=shortStopPrice)


Thêm nữa