トリプルSMA戦略は,トレンド識別とエントリのための異なる期間の3つの単純な移動平均値 (SMA) をベースとしたトレンドフォロー戦略である.トレンドの引き下げ時にトレンドを自動的に追跡し,ポジションを追加することができる.
この戦略は,200~400~600期間のSMAを含む,異なる期間の3つのSMAを主なトレンド指標として使用する.価格が3つのSMAを超えると,上昇傾向を示し,下落傾向は逆である.
エントリでは,ストークローズ・オシレーターと閉じる価格を組み合わせます.価格が三重SMAs
ストップ・ロスは,最も遅いSMAを下回る値に設定されます.
この戦略では 10 倍までピラミッド化が可能で 1%,2%および6%の利益で 3 つの利得レベルが組み込まれています
トリプルSMA戦略の最大の利点は,異なる期間の3つのSMAを組み合わせることで,トレンド方向と強さをよりよく特定できるということです.単一のSMA戦略よりも偽信号をフィルタリングする能力が強いです.
さらに,過剰購入/過剰売却分析に StochClose を組み込むことは,潜在的なトレンド逆転点周辺のシグナルを取ることを避けます.
最も遅いSMAに基づくストップ・ロスは,早期ストップアウトを最小限に抑えながら,トレンドを走る戦略の能力を最大化します.
ピラミッド構造を許可することで 戦略はトレンドに継続的に参加できます
この戦略の主なリスクは,三重SMAがすべての誤った信号を完全にフィルタリングできないことにある.SMAを突破してすぐにトレンドを形成できない場合,損失が発生する可能性があります.これはしばしば主要なサポート/レジスタンスレベル周辺で起こります.
また,StockClose自体は誤った信号を生成し,特に範囲市場では不適切なエントリにつながる可能性があります.
これらのリスクを軽減するために,SMA期間のようなパラメータを調整することができる.KDJやMACDなどのより多くの指標を追加して信号品質を改善することができる.
戦略は以下の側面で最適化できます.
特定の製品に適した最適値を見つけるために SMA 期間を追加/調整する
コンボフィルタリングとより良いエントリのためのKDJとMACDのような追加の指標を追加
ストップ損失を最適化し,市場変動範囲に適した利益基準を設定する
理想的なピラミッド戦略を見つけるためにピラミッド設定を最適化
異なる製品でテストし,より多くの製品にパラメータを適応させる
結論として,トリプルSMA戦略は,非常に実践的なトレンドフォローアプローチである.トリプルSMAとストッククローズを組み合わせることで,堅牢なトレンド識別を達成し,偽信号を回避する.ピラミディングを許可することでトレンドを追跡することも可能である.パラメータチューニングと最適化により,強力なトレンドトラッカーになることができます.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Tripla Sma with entries based on sma price closes ", shorttitle="TRIPLE SMA STRATEGY", overlay=true) ////resolution="" len = input(200, minval=1, title="sma 1 length") len1 = input(400, minval=1, title="sma 2 length") len2 = input(600, minval=1, title="sma 3 length") src = input(close, title="Source") //////////////////////////////////////////// smma = 0.0 smma := na(smma[1]) ? sma(src, len) : (smma[1] * (len - 1) + src) / len up = smma > smma [1] down =smma < smma[1] mycolor = up ? #64b5f6 : down ? #d32f2f : na fastma = sma(hl2, 1) fastplot = plot(fastma, color=#000000, transp=100, title='sma on candle') slowplot = plot(smma, color=mycolor, transp=55, title='sma1') //////////////////////////////////////////// smma1 = 0.0 smma1 := na(smma1[1]) ? sma(src, len1) : (smma1[1] * (len1 - 1) + src) / len1 up2 = smma1 > smma1 [1] down2 =smma1 < smma1[1] mycolor2 = up2 ? #64b5f6 : down2 ? #d32f2f : na slowplot2 = plot(smma1, color=mycolor2, transp=45, title='sma2') //////////////////////////////////////////// smma2 = 0.0 smma2 := na(smma2[1]) ? sma(src, len2) : (smma2[1] * (len2 - 1) + src) / len2 up3 = smma2 > smma2 [1] down3 =smma2 < smma2[1] mycolor3 = up3 ? #64b5f6 : down3 ? #d32f2f : na slowplot3 = plot(smma2, color=mycolor3, transp=35, title='sma3') //////////////////////////////////////////////////////////////////////////////////////// //Fill gaps fillData = smma > fastma fillData2 = smma < fastma fillDtat = smma1 > smma fillDtat2 = smma1 < smma fillDat = smma2 > smma1 fillDat2 = smma2 < smma1 fillCol1 = fillData ? #ef5350 : fillData2 ? #64b5f6 : na fillCol2 = fillDtat ? #ef5350 : fillDtat2 ? #64b5f6 : na fillCol3 = fillDat ? #ef5350 : fillDat2 ? #64b5f6 : na fill(slowplot, fastplot, color=fillCol1, transp=90, title="sma1 fill") fill(slowplot, slowplot2, color=fillCol2, transp=80, title="sma2 fill") fill(slowplot2, slowplot3, color=fillCol3, transp=60, title="sma3 fill") uc = (close > smma) and (close > smma1) dc = (close < smma) and (close < smma1) barColor = uc ? #64b5f6 : dc ? #e91e63 : #b2b5be barcolor(color=barColor) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //StochClose from @trendinvestpro periods = input(50, minval=1, title="length for the oscillator") smooth = input(5, minval=1, title="oscillator smoothing") hhc=highest(close,periods) llc=lowest(close,periods) StochClose = sma((close-llc)/(hhc-llc)*100, smooth) shortline = input(95, minval=0, title="signal when oscillator crosses above") longline = input(5, minval=0, title="signal when oscillator crosses below") //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// longs = close > smma2 shorts = close < smma2 long = longs == true and crossunder(StochClose, longline) short = shorts == true and crossover(StochClose, shortline) stoplong = close < smma and close < smma1 and close < smma2 stopshort = close > smma and close > smma1 and close > smma2 p1 = strategy.position_avg_price / 100 / syminfo.mintick maxx = input(2500, title="max orders filled on a day", minval=0) takeprofit1 = input(1, title="take profit level 1", minval=0) takeprofit2 = input(2, title="take profit level 2", minval=0) takeprofit3 = input(6, title="take profit level 3", minval=0) takeprofitqt1 = input(30, title="take profit quantity first", minval=0) takeprofitqt2 = input(30, title="take profit quantity second", minval=0) takeprofitqt3 = input(30, title="take profit quantity third", minval=0) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////Strategy entries///////////////////////////////////////////////////////////////////////////////////////// // strategy.risk.max_intraday_filled_orders(maxx) strategy.entry("long", strategy.long, when=long) strategy.exit("tpl1", "long", qty_percent = takeprofitqt1, profit = takeprofit1 * p1) strategy.exit("tpl2", "long", qty_percent = takeprofitqt2, profit = takeprofit2 * p1) strategy.exit("tpl3", "long", qty_percent = takeprofitqt3, profit = takeprofit3 * p1) strategy.close("long", when=stoplong == true) strategy.entry("short", strategy.short, when=short) strategy.exit("tpl1", "short", qty_percent = takeprofitqt1, profit = takeprofit1 * p1) strategy.exit("tpl2", "short", qty_percent = takeprofitqt2, profit = takeprofit2 * p1) strategy.exit("tpl3", "short", qty_percent = takeprofitqt3, profit = takeprofit3 * p1) strategy.close("short", when=stopshort == true)