スローハイケンアシ 指数関数移動平均取引戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-22 13:18:34
タグ:

img

概要

この戦略は,トレンドを特定し,トレンド市場中にロング/ショートトレードを行うために,遅いハイケンアシと指数的な移動平均を組み合わせます.価格は100日間のEMAを超えるとロングになり,価格が100日間のEMAを下回るとショートになり,特定の逆転信号でポジションを閉じる.

戦略の論理

戦略は以下の指標を用います

  1. スローハイケンアシ (Slow Heiken Ashi): 市場騒音をフィルタリングし,トレンドを特定し,前のバーの平均価格を使用して計算された特殊なタイプのキャンドルスタイク.ここで適応型KAMAフィルタを使用して実装される.

  2. 指数関数移動平均:指数関数加重が適用された平滑価格平均. 5 日から 100 日までの EMA を含む.

具体的な取引論理は:

  1. 価格が100日間のEMAを超えるとロングで100日間のEMAを下回るとショートします

  2. ハイケン・アシのオープン価格が閉じる価格 (潜在的な逆転信号) を越えるときにポジションを終了します.リバースクロスオーバーとショートポジションも同じようにロングポジションは閉鎖されます.

利点分析

この戦略はトレンドフォローと逆転信号を組み合わせ,トレンド市場における大きな価格変動を把握し,トレンド逆転時に過度の損失を回避する.

  1. EMAは市場の全体的な傾向方向を決定し,局所的な変動から注意をそらすのを防ぎます.

  2. ハイケン・アシ・クロスオーバーは 潜在的逆転を早期発見します

  3. KAMAフィルターは 偽信号を減らす

リスク分析

  1. 突発的な大きな EMA 突破は損失を増大させる可能性があります.より緊密な保持期間またはストップ損失を検討してください.

  2. 逆転信号が遅れるかもしれない リスクをコントロールするために ポジションサイズを低くする

  3. EMAのパラメータ化が不十分である場合,パフォーマンスに悪影響を及ぼします.パラメータは,異なる製品と市場環境に適応する必要があります.

オプティマイゼーションの方向性

  1. MACD と ボリンジャー帯のような追加指標を組み込むことで,同時 EMA/ハイケンアシのエラーを回避できます.

  2. 市場変動に基づいて EMA パラメータを動的に最適化し,それに応じてストップを締め/滑り容量を増やす.

  3. 機械学習を利用して パラメータを自動調整し フィルタールールを調整し 安定性を向上します

結論

この戦略は,傾向と逆転の両方の要素を組み合わせて,比較的シンプルで全体的に実践的です.よく調整されたパラメータとリスク制御により,良質な利益の可能性を保持しています.さらなる改善は,戦略をより適応できるように最適化方向性を構築することができます.


/*backtest
start: 2023-12-14 00:00:00
end: 2023-12-19 10:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("NoScoobies Slow Heiken Ashi and Exponential Moving average Strategy 2.2", overlay=true)

//SHA
p=input(6,title='Period')
fastend=input(0.666,step=0.001)
slowend=input(0.0645,step=0.0001)
kama(close,amaLength)=>
    diff=abs(close[0]-close[1])
    signal=abs(close-close[amaLength])
    noise=sum(diff, amaLength)
    efratio=noise!=0 ? signal/noise : 1
    smooth=pow(efratio*(fastend-slowend)+slowend,2)
    kama=nz(kama[1], close)+smooth*(close-nz(kama[1], close))
    kama
hakamaper=1
Om=sma(open,p)
Hm=sma(high,p)
Lm=sma(low,p)
Cm=sma(close,p)
vClose=(Om+Hm+Lm+Cm)/4
vOpen= kama(vClose[1],hakamaper)
vHigh= max(Hm,max(vClose, vOpen))
vLow=  min(Lm,min(vClose, vOpen))
asize=vOpen-vClose
size=abs(asize)

//MMAR
exponential = input(true, title="Exponential MA")
src = close
ma05 = exponential ? ema(src, 05) : sma(src, 05)
ma10 = exponential ? ema(src, 10) : sma(src, 10)
ma15 = exponential ? ema(src, 15) : sma(src, 15)
ma20 = exponential ? ema(src, 20) : sma(src, 20)
ma25 = exponential ? ema(src, 25) : sma(src, 25)
ma30 = exponential ? ema(src, 30) : sma(src, 30)
ma35 = exponential ? ema(src, 35) : sma(src, 35)
ma40 = exponential ? ema(src, 40) : sma(src, 40)
ma45 = exponential ? ema(src, 45) : sma(src, 45)
ma50 = exponential ? ema(src, 50) : sma(src, 50)
ma55 = exponential ? ema(src, 55) : sma(src, 55)
ma60 = exponential ? ema(src, 60) : sma(src, 60)
ma65 = exponential ? ema(src, 65) : sma(src, 65)
ma70 = exponential ? ema(src, 70) : sma(src, 70)
ma75 = exponential ? ema(src, 75) : sma(src, 75)
ma80 = exponential ? ema(src, 80) : sma(src, 80)
ma85 = exponential ? ema(src, 85) : sma(src, 85)
ma90 = exponential ? ema(src, 90) : sma(src, 90)
ma95 = exponential ? ema(src, 95) : sma(src, 95)
ma100 = exponential ? ema(src, 100) : sma(src, 100)

longcondition=src>ma100
shortcondition=src<ma100
long=longcondition and size<size[1] and (vOpen<vClose or vOpen>vClose)
short=shortcondition and size<size[1] and (vOpen>vClose or vOpen<vClose)
close_long=longcondition and crossunder(open, vClose)
close_short=shortcondition and crossover(open, vClose)
_close=close_long[2] or close_short[2]

if long
    strategy.entry("LONG", strategy.long)
    strategy.close("LONG", when = _close)
if short
    strategy.entry("SHORT", strategy.short)
    strategy.close("SHORT", when = _close)
    


もっと