この戦略では,まず速移動平均線ma_fastと遅移動平均線ma_slowを計算し,その後FRAMA適応型移動平均線と組み合わせます. ma_fastがma_slowを横切るとロングになり,ma_slowがma_fastを下回るとまたはFRAMAが閉値を下回るとポジションを閉じます.
13日間の単純な移動平均 ma_fast と 26日間の単純な移動平均 ma_slow を計算します
FRAMA 適応型移動平均線を計算する. FRAMA 公式は複雑で,主なアイデアは,価格の最高,最低,波動性に基づいて移動平均のスムーズさ α を動的に調整することです.
ma_fast が ma_slow を横切ったとき,ロングに行く.これは短期移動平均が上昇し,長期平均よりも速く動いて,トレンド特性に一致することを示します.
ma_slowがma_fast以下を横切るか,FRAMAが閉じる価格を下回るとき,ポジションを閉じる.これらはトレンド逆転のシグナルを示します.
二重移動平均システムと適応型移動平均システムの利点を組み合わせます. 双 MA システムはトレンドを把握するのに優れています. 一方,適応型 MA システムはノイズをよりよくフィルターします.
FRAMA インジケーターはパラメータを自動的に調整し,マニュアルパラメータ調整の主観性を回避します.
2つの出口信号を使うことで 傾向の逆転を 及時に見つけることができます
二重移動平均のクロスオーバーは,断続的な損失をもたらすウィップソーを持つ可能性があります.
アダプティブ・移動平均値は より多くのパラメータを導入し 過剰なフィットメントのリスクがあります
取引量フィルターなしで価格要因のみを考慮し,機会を逃す可能性があります.
最適な組み合わせを見つけるために,異なる MA 期間をテストします.
誤った信号を避けるため,音量確認を追加します.例えば,音量ピークが必要になります.
戦略をより堅牢にするために,入力と終了のルールを最適化します.例えば,継続パターンでのシグナルのみを取ります.
この戦略は,二重移動平均クロスオーバーとFRAMA適応移動平均を組み合わせ,パラメータを動的に調整することによって市場条件に自動的に適応する.二重MAはトレンドを捉えるのに優れているが,FRAMAはノイズをフィルタリングする.二つの出口信号を使用することで,戦略もより堅牢になる.次のステップはパラメータのさらなる最適化およびそれを改善するためにボリュームフィルターを追加することが可能である.
/*backtest start: 2023-01-14 00:00:00 end: 2024-01-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Fractal Adaptive Moving Average",shorttitle="FRAMA",overlay=true) ma_fast = sma(close,13) ma_slow = sma(close,26) plot(ma_fast,color = green) plot(ma_slow, color = yellow) price = input(hl2) len = input(defval=16,minval=1) FC = input(defval=1,minval=1) SC = input(defval=198,minval=1) len1 = len/2 w = log(2/(SC+1)) H1 = highest(high,len1) L1 = lowest(low,len1) N1 = (H1-L1)/len1 H2 = highest(high,len)[len1] L2 = lowest(low,len)[len1] N2 = (H2-L2)/len1 H3 = highest(high,len) L3 = lowest(low,len) N3 = (H3-L3)/len dimen1 = (log(N1+N2)-log(N3))/log(2) dimen = iff(N1>0 and N2>0 and N3>0,dimen1,nz(dimen1[1])) alpha1 = exp(w*(dimen-1)) oldalpha = alpha1>1?1:(alpha1<0.01?0.01:alpha1) oldN = (2-oldalpha)/oldalpha N = (((SC-FC)*(oldN-1))/(SC-1))+FC alpha_ = 2/(N+1) alpha = alpha_<2/(SC+1)?2/(SC+1):(alpha_>1?1:alpha_) out = (1-alpha)*nz(out[1]) + alpha*price plot(out,title="FRAMA",color=purple,transp=0) entry() => crossover(ma_fast, ma_slow) and (out < close) exit() => crossover(ma_slow, ma_fast) or crossunder(out, close) strategy.entry(id= "MA cross", long = true, when = entry()) strategy.close(id= "MA cross", when = exit())