EMAの振動逆転システム戦略

作者: リン・ハーンチャオチャン,日付: 2023年10月18日12時23分13秒
タグ:

img

概要

この戦略は,トレンド方向を決定するために移動平均システムを使用し,低波動性振動市場を避けるため,トレードを管理するためにチェンデリア出口を組み合わせます.

原則

この戦略は,急速な移動平均値と遅い移動平均値を比較することによってトレンド方向を判断する.高速MAが遅いMAを超えると長行し,高速MAが遅いMAを下回ると短行する.振動する市場を避けるために,この戦略にはボリンジャーバンドも組み込まれている.BB幅の変化率が限界を超えると取引信号を生成する.最後に,この戦略は,レンジ・バインド市場に閉じ込まれるのを避けるために,シャンデリア出口をストップ・ロストとして使用する.

具体的には,取引の論理は次のとおりです.

  1. 速度のMA (デフォルト20日) と遅さのMA (デフォルト50日) を計算する.

  2. 波リンジャー・バンド (デフォルト40日,2つの標準偏差) の幅の変化率を計算する.

  3. 速やかなMAが遅いMAを超え,BB幅の変化率はデフォルトの9%を超えるとロングになる.

  4. 速度のMAが遅いMAを下回り,BB幅の変化率はデフォルトの9%を超えるとショートする.

  5. チェンデリアの長所と短所を計算します

  6. ロングストップは最高高 ATR * マルチプリキュア.ショートストップは最低低 + ATR * マルチプリキュア.

利点

  1. MAシステムでは 効率的に動向を追跡できます

  2. BB幅の変更は振動をフィルタリングし,不必要な取引を減らす.

  3. チェンデリアは 間に合うストップ損失を出し 罠にはまりません

  4. 最適化のための複数の調整可能なパラメータ

  5. 論理が明確で 分かりやすく実行できます

リスク

  1. MA遅延は,急速な逆転を見逃す可能性があります.

  2. BB パラメータが不適切なら 正確な信号をフィルターする可能性があります

  3. 過剰なチェンデリア出口は 過剰な取引を引き起こします

  4. パラメータの最適化が不十分であれば リスクが持たれます

  5. 大事な出来事による 極端な市場変化に適応できない

最適化

  1. 最適なパラメータを見つけるために,異なるMA組み合わせをテストする.

  2. 最適な揮発性フィルターのために異なるBB期間をテストする.

  3. 入国確認のための他の指標を追加します.

  4. 市場をより良く追跡するために ダイナミックストップを導入します

  5. 変化する市場のために自動最適化するために 機械学習を利用します

概要

この戦略は,MAシステム,BBインジケーターおよびチェンデリアの出口を統合して比較的安定したトレンドフォローシステムを形成する.適切なパラメータ最適化は良い結果を達成することができます.しかし,トレンド逆転と振動のリスクは残っています.機械学習は強度をさらに高めることができます.全体として学習のための良い戦略です.


/*backtest
start: 2022-10-11 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © juanchez

//@version=4
strategy("CHI", overlay = true, close_entries_rule = "ANY")

n = input(title= "highest high o lowest low period", defval= 22)
f= input(title= "multiplicador", defval= 4)
long = highest(high, n) - atr(n)*f
short= lowest(low, n) + atr(n)*f
plot(long, color= color.red)
plot(short, color= color.green)

//moving averages
period= input(title= "moving averages period", defval= 50)
period2= input(title= "moving averages period2", defval= 20)
type= input(title= "moving averages type", options= ["sma", "ema"], defval= "ema")

//moving average function
mo(p, t) =>
    if t == "sma"
        sma(close[barstate.islast ? 1: 0], p)
    else  if t== "ema"
        ema(close[barstate.islast ? 1: 0], p)

m= mo(period, type)
m2= mo(period2, type)

trend= m2 > m 

plot(m, color = color.maroon, linewidth = 3)
plot(m2, linewidth= 3)


//BOLLINGER BANDS ENTRIES
bb1_period= input(title= "Bollinger bands 1 period", defval=40, minval=1)
bb1_source=input(title="Bollinger band 1 source", defval=close)
bb1_multi=input(title="Bollinger Bands 1 factor", defval=2, minval=1, step=0.1)
show_bb1= input(title="Show Bollinger bands 1", defval=false)
//BOLLINGER BANDS
_bb(src, lenght, multi)=>
    float moving_avg= sma(src[barstate.islast? 1: 0], lenght)
    float deviation= stdev(src[barstate.islast? 1: 0], lenght)
    float lowerband = moving_avg - deviation*multi
    float upperband = moving_avg + deviation*multi
    
    [moving_avg, lowerband, upperband]
    
[bb1, lowerband1, upperband1]= _bb(bb1_source,  bb1_period, bb1_multi)

//FIRST BAND    
plot(show_bb1? bb1 : na, title="BB1 Moving average", linewidth= 3, color= color.fuchsia)
plot(show_bb1? upperband1 : na, title="BB1 Upper Band", linewidth= 3, color= color.green)
plot(show_bb1? lowerband1 : na, title="BB1 Lower Band", linewidth= 3, color= color.red)

//BB's Width threshold 
thresh= input(title= "widen %", defval= 9, minval = 0, step = 1, maxval= 100)

widht= (upperband1 - lowerband1)/bb1
roc= change(widht)/widht[1]*100
cross=crossover(roc, thresh)

// entry
//long
elong= input(true, title= "enable long")
longcondition= m2 > m and cross and elong

//short
eshort= input(true, title= "enable short")
shortcondition= m2 < m and cross and eshort


plotshape(longcondition? true: false , location= location.belowbar, style= shape.labelup, size= size.small, color= color.green, text= "Buy", textcolor= color.white)
plotshape(shortcondition? true: false , location= location.abovebar, style= shape.labeldown, size= size.small, color= color.red, text= "Sell", textcolor= color.white)

out= crossunder(close, long)
outt= crossover(close, short)

strategy.entry("long", strategy.long, when = longcondition)
strategy.close("long", when = out)

strategy.entry("short", strategy.short, when = shortcondition)
strategy.close("short", when = outt)

もっと