移動平均リボン戦略は,複数の移動平均をベースとしたトレンドフォロー戦略である. 移動平均リボン戦略は,高速および遅い移動平均を同時にモニターし,価格が移動平均リボンを通過すると取引信号を生成する. この戦略は,トレンド決定と過剰購入/過剰販売指標を組み合わせ,中長期のトレンドを効果的に把握することができます.
この戦略は5つの高速移動平均線 (5日線,8日線,13,20日線および30日線) と4つの遅い移動平均線 (45日線,7日線,105日線および150日線) を使用する.高速線は内側移動平均線リボンを形成し,遅い線は外側移動平均線リボンを形成する.価格が内側リボンを超えると購入信号が生成され,価格が内側リボンを下回ると販売信号が生成される.偽のブレイクをフィルタリングするには,価格が3連續のろうそくで内側リボンを通過し,高速移動平均線の多くは取引信号を生成する前に同期的に突破する必要があります.
また,この戦略は長期的傾向も評価する.価格が200日移動平均値を超える場合にのみ購入信号を生成することを考慮する.逆に,価格が200日移動平均値を下回る場合にのみ販売信号を生成することを考慮する.長期的傾向を決定することで,統合中に閉じ込められることを防ぐ.
この戦略には以下の利点があります.
多動平均のデザインは,トレンド方向を正確に決定することができる. 中期から長期間のトレンドを特定するのに,内側と外側移動平均のリボンと速い線と遅い線の組み合わせがうまく機能する.
連続ブレイクメカニズムは誤ったブレイクを効果的にフィルタリングすることができます.一方,ほとんどの高速移動平均値がブレイクすることを必要とすることは,トレンドが変化していることを保証します.
長期トレンドを判断すると,統合の際に罠にはまらない. 200日線を使用して判断すると,トレンドが逆転し始めるときにのみポジションを開くことができます.
トレンドフォローと過剰購入/過剰販売の条件をバランスする.移動平均値自体は傾向フォロー能力を有し,過剰購入/過剰販売の指標を組み合わせてストップ・ロストポイントを設定することで,良いリスク制御が保証される.
この戦略の主なリスクは以下のとおりです.
失敗した脱出リスク 偽の脱出が起こると 戦略は完全に損失を回避することはできません
市場が長期間にわたって変動している場合,ストップ・ロスは頻繁に発生し,損失が大きくなります.
パラメータ最適化リスク.移動平均パラメータの誤った設定は,取引信号のエラーにつながり,損失が増加する可能性があります.
対応する解は次のとおりです.
適切なストップ・ロスト・ポイントを広げ,価格に十分な動きの余地を与える.またはストップ・ロスト・ラインが価格をフォローできるように,ストップ・ロスト・メソッドを採用する.
統合中に方向性のないポジションを確立するのを避けるために,傾向判断指標を追加します.例えば,DMI,MACD,その他の指標でフィルタリングします.
過去のバックテストとパラメータ最適化方法を使用して,最適なパラメータ組み合わせを選択します.また,実際の取引におけるパラメータの有効性を追跡し,ダイナミックな最適化を行います.
戦略は以下の側面で最適化できます.
最適なサイクル数を選択するために移動平均パラメータを最適化する.最適なパラメータ組み合わせを見つけるために異なるサイクル番号で移動平均をバックテストする.
フィルタリングのためにトレンド判断指標を追加します.過剰購入/過剰販売のRSI,チャネルブレイクのためのボリンジャー帯など.トレンドが不明確である場合,盲目的にポジションを確立することを避ける.
アダプティブ・ムービング・メアージャーを採用する. 変動する市場状況と変動に応じて動的に移動平均パラメータを最適化して,現在の市場状態により良く適合させる.
傾向確率を判断するために機械学習モデルを組み合わせます. 成功したブレイクアウトの可能性を評価するために確率モデルを確立し,理想的なエントリータイミングを判断する意思決定システムを支援します.
ストップ・ロスの戦略を最適化して価格をより正確に追跡する.ストップ・ロスの追跡やストップ・ロスのダイナミック・ポジション・サイジングなど,ストップ・ロスのラインをよりインテリジェントにする.
移動平均リボン戦略は,より一般的なトレンドフォロー戦略の1つです.中期および長期のトレンドを判断するために,速い線と遅い線を組み合わせ,エントリを決定するための連続したブレイクアウトメカニズムを設定します.この戦略はトレンドフォローとオーバーバイト/オーバーセール条件をバランスします.パラメータ最適化と指標強化により,そのパフォーマンスはさらに改善できます.中期から長期のポジションを持つ投資家に適しています.
//@version=4 strategy(title="Moving Average Ribbon", shorttitle="MA Ribbon", overlay=true) src = input(close, type=input.source, title="Source") matype = input(title="Input one in lowercase: sma, ema, wma, trima, zlema, dema, tema, or hma", type=input.string, defval="trima") // possible values: sma, ema, wma, trima, zlema, dema, tema, hma (hull ma) trima(_src, _len) => sma(sma(_src, _len), _len) hma(_src, _len) => wma(2 * wma(_src, _len / 2) - wma(_src, _len), round(sqrt(_len))) dema(_src, _len) => 2 * ema(_src, _len) - ema(ema(_src, _len), _len) tema(_src, _len) => 3 * ema(_src, _len) - 3 * ema(ema(_src, _len), _len) + ema(ema(ema(_src, _len), _len), _len) zlema(_src, _len) => ema(_src, _len) + ema(_src, _len) - ema(ema(_src, _len), _len) ma(_src, _len) => hma__1 = hma(_src, _len) ema_1 = ema(_src, _len) sma_1 = sma(_src, _len) wma_1 = wma(_src, _len) trima__1 = trima(_src, _len) zlema__1 = zlema(_src, _len) dema__1 = dema(_src, _len) tema__1 = tema(_src, _len) matype == "hma" ? hma__1 : matype == "ema" ? ema_1 : matype == "sma" ? sma_1 : matype == "wma" ? wma_1 : matype == "trima" ? trima__1 : matype == "zlema" ? zlema__1 : matype == "dema" ? dema__1 : tema__1 ma05 = ma(src, 5) ma08 = ma(src, 8) ma13 = ma(src, 13) ma20 = ma(src, 20) ma30 = ma(src, 30) ma45 = ma(src, 45) ma70 = ma(src, 70) ma105 = ma(src, 105) ma150 = ma(src, 150) ma200 = ma(src, 200) maColor(ma, maRef) => if change(ma) <= 0 and ma05 < maRef color.new(color.red, 20) else if change(ma) >= 0 and ma05 > maRef color.new(color.navy, 20) else if change(ma) < 0 and ma05 > maRef color.new(color.red, 20) else if change(ma) >= 0 and ma05 < maRef color.new(color.navy, 20) else color.gray aboveConfirmed(x,maRef)=> above=true for i=1 to x if close[i]<maRef[i] and not (close[i]>ma200[i]*1.01) and not (ma05[i]>ma105[i]*1.015) above:=false above aboveMost(x,len)=> above=0 boolean=false if close[len]>ma05[len] above:=above+1 if close[len]>ma08[len] above:=above+1 if close[len]>ma13[len] above:=above+1 if close[len]>ma20[len] above:=above+1 if close[len]>ma30[len] above:=above+1 if close[len]>ma45[len] above:=above+1 if close[len]>ma70[len] above:=above+1 if close[len]>ma105[len] above:=above+1 if close[len]>ma150[len] above:=above+1 if close[len]>ma200[len] above:=above+1 if(above>=x) boolean:=true boolean belowMost(x,len)=> above=0 boolean=false if close[len]<ma05[len] above:=above+1 if close[len]<ma08[len] above:=above+1 if close[len]<ma13[len] above:=above+1 if close[len]<ma20[len] above:=above+1 if close[len]<ma30[len] above:=above+1 if close[len]<ma45[len] above:=above+1 if close[len]<ma70[len] above:=above+1 if close[len]<ma105[len] above:=above+1 if close[len]<ma150[len] above:=above+1 if close[len]<ma200[len] above:=above+1 if(above>=x) boolean:=true boolean belowConfirmed(x,maRef)=> below=true for i=1 to x if close[i]>maRef[i] and not (close[i]<maRef[i]*0.99) and not (ma05[i]<ma105[i]*0.985) below:=false below //plotshape(aboveConfirmed(5,ma150),color=color.navy,location=location.abovebar,style=shape.triangleup,size=size.large,title="above",text="above") plot(ma05, color=maColor(ma05, ma150), style=plot.style_line, title="MMA05", linewidth=2) plot(ma08, color=maColor(ma08, ma150), style=plot.style_line, title="MMA08", linewidth=1) plot(ma13, color=maColor(ma13, ma150), style=plot.style_line, title="MMA13", linewidth=1) plot(ma20, color=maColor(ma20, ma150), style=plot.style_line, title="MMA20", linewidth=1) plot(ma30, color=maColor(ma30, ma150), style=plot.style_line, title="MMA30", linewidth=1) plot(ma45, color=maColor(ma45, ma200), style=plot.style_line, title="MMA45", linewidth=1) plot(ma70, color=maColor(ma70, ma200), style=plot.style_line, title="MMA70", linewidth=2) plot(ma105, color=maColor(ma105, ma200), style=plot.style_line, title="MMA105", linewidth=2) plot(ma150, color=maColor(ma150, ma200), style=plot.style_line, title="MMA150", linewidth=3) plot(ma200, color=maColor(ma200, ma200), style=plot.style_line, title="MM200", linewidth=3) closeLong=belowMost(6,1) and belowMost(6,2) and belowMost(6,3) closeShort=aboveMost(6,1) and aboveMost(6,2) and aboveMost(6,3) isAbove=aboveConfirmed(5,ma200) strategy.entry("short", false, when=belowConfirmed(3,ma200) and belowMost(8,1) and belowMost(8,2) and belowMost(8,3)) strategy.entry("long", true, when=aboveConfirmed(3,ma200) and aboveMost(8,1) and aboveMost(8,2) and aboveMost(8,3)) strategy.close("long",when=closeLong) strategy.close("short",when=closeShort)