Strategi ini mengenal pasti trend harga menggunakan penunjuk osilator yang diluruskan khusus dan berdagang berdasarkan prinsip trend berikut.
Strategi ini menggunakan pengayun licin tersuai yang mengira harga penutupan terbalik yang diperlukan untuk membalikkan warna lilin Heikin Ashi dari merah ke hijau dan sebaliknya. Penutupan terbalik ini kemudiannya disederhanakan menggunakan purata bergerak untuk mendapatkan garis pengayun akhir. Perdagangan harga di atas (di bawah) garis menandakan trend menaik (downtrend).
Strategi ini memasuki perdagangan berdasarkan penembusan garis penunjuk. Dagangan panjang dimulakan apabila harga pecah di atas garis manakala perdagangan pendek dimulakan pada pemecahan di bawah garis. Stop loss ditetapkan pada peratusan tetap dari harga kemasukan untuk mengunci keuntungan dan mengawal risiko.
Strategi ini menunjukkan trend yang jelas mengikuti pendekatan menggunakan penunjuk osilator tersuai. Hasil ujian belakang adalah menggalakkan, menunjukkan potensi untuk perdagangan langsung. Walau bagaimanapun, hanya bergantung pada satu penunjuk lukisan semula dan kekurangan pengesahan kualiti isyarat adalah kebimbangan. Mekanik kehilangan berhenti juga memerlukan ujian dan penyesuaian tambahan. Secara keseluruhan, konsep strategi kelihatan layak tetapi lebih banyak kerja diperlukan untuk menjadikannya boleh digunakan secara boleh dipercayai untuk perdagangan langsung.
/*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)