Cette stratégie utilise un double système de moyennes mobiles lisses comme signal de négociation principal, combiné à l'indicateur de validation du volume TDFI pour le filtrage des signaux de négociation, afin de tirer parti des avantages des moyennes mobiles lisses tout en réduisant les transactions incorrectes sur les marchés non tendance.
La stratégie utilise deux ensembles de moyennes mobiles lisses avec des configurations de paramètres différentes comme signal de trading principal. Premièrement, une moyenne mobile rapide à 8 périodes est utilisée comme confirmation initiale, puis une moyenne mobile rapide à 16 périodes légèrement plus lente agit comme deuxième confirmation. Lorsque le MA rapide donne un signal d'achat, si le MA plus lent signale également dans le même sens dans les dernières 1-2 barres, une position longue est ouverte. Lorsque le MA rapide donne un signal de vente, si le MA plus lent signale également dans le même sens dans les dernières 1-2 barres, une position courte est ouverte. Les sorties sont déclenchées lorsque le deuxième MA de confirmation inverse la direction. En outre, l'indicateur de volume TDFI est utilisé pour détecter le volume de trading derrière les signaux de prix de volume pour filtrer les signaux trompeurs. Les transactions ne sont effectuées que lorsque le volume s'aligne avec les attentes.
Pour réduire les risques, les orientations d'optimisation suivantes pourraient être envisagées:
Dans l'ensemble, il s'agit d'une stratégie typique de suivi des tendances. Le double système MA lisse combiné avec le filtre de volume TDFI peut efficacement tirer parti de la capacité de suivi des tendances tout en réduisant les taux de signal incorrects sur les marchés non tendance. Grâce à l'optimisation des paramètres, il peut être adapté à différents délais et produits. Cependant, il repose davantage sur l'ajustement des paramètres que sur l'application mécanique.
/*backtest start: 2022-10-06 00:00:00 end: 2023-10-12 00:00:00 period: 2d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Designed per No Nonsense Forex VP rules //Made to be as modular as possible, so we can swap the indicators in and out. //Originated from causecelebre //Tried to put in as much VP rules as possible /////////////////////////////////////////////////// //Rules Implemented: /////////////////////////////////////////////////// // - SL 1.5 x ATR // - TP 1 x ATR // // - Entry conditions //// - Entry within first confirmation cross over and 1 candle of second confirmation + volume // - Exit conditions //// - Exit on exit indicator or when baseline or confirmation flip /////////////////////////////////////////////////// //Trades entries /////////////////////////////////////////////////// // - First entry L1 or S1 with standard SL and TP /////////////////////////////////////////////////// //Included Indicators and settings /////////////////////////////////////////////////// // - Confirmtion = SSL 8, 16 // - Volume = TDFI 6 /////////////////////////////////////////////////// //Credits // Strategy causecelebre https://www.tradingview.com/u/causecelebre/ // TDFI causecelebre https://www.tradingview.com/u/causecelebre/ // SSL Channel ErwinBeckers https://www.tradingview.com/u/ErwinBeckers/ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // strategy(title="NNFX Strategy 3 Indicator Template | jh", overlay = true, pyramiding=0, initial_capital=20000, currency=currency.USD, calc_on_order_fills=0,default_qty_type=strategy.fixed, default_qty_value=10000) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // **** Set the main stuff **** /////////////////////////////////////////////////// //Price price = close ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ATR stuff /////////////////////////////////////////////////// slMultiplier = input(1.5, "SL") tpMultiplier = input(1, "TP") atrlength = input(title="ATR Length", defval=14, minval=1) atrsmoothing = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"]) ma_function(source, atrlength) => if atrsmoothing == "RMA" rma(source, atrlength) else if atrsmoothing == "SMA" sma(source, atrlength) else if atrsmoothing == "EMA" ema(source, atrlength) else wma(source, atrlength) //plot(ma_function(tr(true), atrlength), title = "ATR", color=#991515, transp=0) atr = ma_function(tr(true), atrlength) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // **** Confirmation 1 Fast **** /////////////////////////////////////////////////// /////////////////////////////////////////////////// //SSL 6 /////////////////////////////////////////////////// ssllen1=input(title="SSL 1 Length Period", defval=8) smaHigh1=sma(high, ssllen1) smaLow1=sma(low, ssllen1) Hlv1 = na Hlv1 := close > smaHigh1 ? 1 : close < smaLow1 ? -1 : Hlv1[1] sslDown1 = Hlv1 < 0 ? smaHigh1: smaLow1 sslUp1 = Hlv1 < 0 ? smaLow1 : smaHigh1 plot(sslDown1, "SSL Down", linewidth=1, color=red) plot(sslUp1, "SSL Up", linewidth=1, color=lime) /////////////////////////////////////////////////// //Confirm Signals /////////////////////////////////////////////////// c_Up = sslUp1 c_Down =sslDown1 //Signals based on crossover c_cross_Long = crossover(c_Up, c_Down) c_cross_Short = crossover(c_Down, c_Up) //Signals based on signal position c_trend_Long = c_Up > c_Down ? 1 : 0 c_trend_Short = c_Down > c_Up ? 1 : 0 confirm_Long = c_cross_Long confirm_Short = c_cross_Short plotshape(c_cross_Long, color = green, style=shape.triangleup, location=location.top) plotshape(c_cross_Short, color = red, style=shape.triangledown, location=location.top) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // **** Confirmation 2 Slow **** /////////////////////////////////////////////////// /////////////////////////////////////////////////// //SSL 30 /////////////////////////////////////////////////// /////////////////////////////////////////////////// //SSL /////////////////////////////////////////////////// ssllen2=input(title="SSL 2 Length Period", defval=16) smaHigh2=sma(high, ssllen2) smaLow2=sma(low, ssllen2) Hlv2 = na Hlv2 := close > smaHigh2 ? 1 : close < smaLow2 ? -1 : Hlv2[1] sslDown2 = Hlv2 < 0 ? smaHigh2: smaLow2 sslUp2 = Hlv2 < 0 ? smaLow2 : smaHigh2 plot(sslDown2, "SSL Down", linewidth=1, color=orange) plot(sslUp2, "SSL Up", linewidth=1, color=blue) /////////////////////////////////////////////////// //Confirm Signals /////////////////////////////////////////////////// c2_Up = sslUp2 c2_Down = sslDown2 //Signals based on crossover c2_cross_Long = crossover(c2_Up, c2_Down) c2_cross_Short = crossover(c2_Down, c2_Up) //Signals based on signal position c2_trend_Long = c2_Up > c2_Down ? 1 : 0 c2_trend_Short = c2_Down > c2_Up ? 1 : 0 confirm2_Long = c2_trend_Long confirm2_Short = c2_trend_Short plotshape(c2_cross_Long, color = green, style=shape.triangleup, location=location.bottom) plotshape(c2_cross_Short, color = red, style=shape.triangledown, location=location.bottom) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // **** Volume Indicator Start **** /////////////////////////////////////////////////// /////////////////////////////////////////////////// //TDFI /////////////////////////////////////////////////// lookback = input(6, title = "TDFI Lookback") filterHigh = input(0.05, title = "Filter High") filterLow = input(-0.05, title = "Filter Low") mma = ema(price * 1000, lookback) smma = ema(mma, lookback) impetmma = mma - mma[1] impetsmma= smma - smma[1] divma = abs(mma - smma) averimpet = (impetmma + impetsmma) / 2 number = averimpet pow = 3 result = na for i = 1 to pow - 1 if i == 1 result := number result := result * number tdf = divma * result ntdf = tdf / highest(abs(tdf), lookback * 3) /////////////////////////////////////////////////// //Volume Signals /////////////////////////////////////////////////// v_Long = ntdf > filterHigh ? 1 : 0 v_Short = filterLow > ntdf ? 1 : 0 volumeLong = v_Long volumeShort = v_Short ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // **************************** Logic to handle NNFX rules **************************** ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Checking for confirmation indication with 1 candle difference for second confirmtion and volume enterLong = confirm_Long and (confirm2_Long[0] or confirm2_Long[1]) and (volumeLong[0] or volumeLong[1]) ? 1 : 0 enterShort = confirm_Short and (confirm2_Short[0] or confirm2_Short[1]) and (volumeShort[0] or volumeShort[1]) ? 1 : 0 exitLong = c_cross_Short or c2_cross_Short ? 1 : 0 exitShort = c_cross_Long or c2_cross_Long ? 1 : 0 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Entries and Exits ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if (year>2009) //Long entries with standard 1.5 ATR for SL, 1 ATR for TP long_sl = price - (atr * slMultiplier) long_tp = price + (atr * tpMultiplier) //Short entries with standard 1.5 ATR for SL, 1 ATR for TP short_sl = price + (atr * slMultiplier) short_tp = price - (atr * tpMultiplier) strategy.close("L1", when = exitLong) strategy.close("S1", when = exitShort) strategy.exit("L Limit Exit", "L1", stop = long_sl, limit = long_tp) strategy.exit("S Limit Exit", "S1", stop = short_sl, limit = short_tp) strategy.order("L1", strategy.long, when = enterLong) strategy.order("S1", strategy.short, when = enterShort) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //End //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////