Cette stratégie identifie les tendances des prix à l'aide d'un indicateur d'oscillateur lissé personnalisé et des transactions basées sur les principes suivants tendance.
La stratégie utilise un oscillateur lissé personnalisé qui calcule le prix de clôture inverse nécessaire pour faire basculer la couleur de la bougie Heikin Ashi du rouge au vert et vice versa. Cette clôture inverse est ensuite lissée en utilisant des moyennes mobiles pour obtenir la ligne d'oscillateur finale.
La stratégie consiste à entrer dans des transactions basées sur des ruptures de la ligne d'indicateur. Les transactions longues sont initiées lorsque le prix dépasse la ligne tandis que les transactions courtes sont initiées sur des ruptures en dessous de la ligne. Les pertes d'arrêt sont fixées à un pourcentage fixe du prix d'entrée pour verrouiller les bénéfices et contrôler le risque.
La stratégie démontre une tendance claire en suivant une approche utilisant un indicateur d'oscillateur personnalisé. Les résultats des backtests sont encourageants, indiquant un potentiel pour le trading en direct. Cependant, la seule dépendance à un indicateur de repeinture et le manque de vérification de la qualité du signal sont des préoccupations. La mécanique de stop loss nécessite également des tests et des ajustements supplémentaires. Dans l'ensemble, le concept de stratégie semble faisable, mais plus de travail est nécessaire pour le rendre fiable pour le trading en direct.
/*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)