トリプルスーパートレンドEMA ADXフィルター戦略


作成日: 2023-09-18 14:02:12 最終変更日: 2023-09-18 14:02:12
コピー: 1 クリック数: 1696
1
フォロー
1617
フォロワー

概要

これは,三重超トレンド,EMAとADXの指標を融合した量化取引戦略である.これは,三重超トレンドシステムを利用して取引信号を発信し,EMAとADXをフィルタリング条件として組み合わせて取引頻度を制御し,取引信号の質を向上させる.

戦略原則

  • 3組の異なるパラメータを使用した超トレンドシステムで,3組の超トレンドが同方向であるときに取引信号が生成されます.
  • EMAをトレンドフィルターとして使用し,閉盘価格がEMAより高い場合にのみ多めにし,閉盘価格がEMAより低い場合に空っぽにする.
  • ADXをトレンド強弱のフィルターとして使用し,ADXが設定された値より高い場合にのみ取引する.
  • 収益性や損失のリスクを制御する.

具体的には,長入場条件は3重超トレンドが看板に変換され,閉じる価格がEMAより高く,ADXが設定値より高いときに多ポジションを開く.短入場条件は3重超トレンドが看板に変換され,閉じる価格がEMAより低く,ADXが設定値より高いときに空いたポジションを開く.平仓条件は,任意の超トレンドが現在のポジションを平にする.

この戦略は,3つの超トレンドのサポート・レジスタンスラインを同時に描き,トレンドの方向を判断するのに役立ちます.

優位分析

  • 三重超トレンドシステムは偽突破をフィルターし,入場精度を向上させる.
  • EMAとADXのダブルフィルターは,whipsawによる損失を軽減し,損失停止能力を強化する.
  • 再入学の選択が許され,個人のリスクの好みに応じて戦略を調整できる収益性.
  • 視覚的な超トレンドと組み合わせたレジスタンスラインは,トレンドの方向を判断するのに役立ちます.

リスク分析

  • 超トレンドなどの指標が遅滞しているため,遅い入場,早めの出場が発生する可能性があります.
  • フィルタリング条件が厳格すぎると チャンスを逃してしまう.
  • 縮小した市場では,ウィップソーが形成されやすいので,損失を伴う.
  • 取引の頻度やスライドポイントのコストが増加します.

これらのリスクは,パラメータの組み合わせを調整し,フィルタリング条件を最適化する方法などによって軽減することができます.

最適化の方向

この戦略は以下の点で最適化できます.

  • 異なるパラメータの組み合わせをテストし,最適な超トレンドとEMAパラメータを見つけます.
  • ADXの値を最適化し,偽信号を低減する.
  • 波動率,取引量などの他の指標をフィルターします.
  • 異なる品種に合わせてパラメータを最適化し,適応性を向上させる.
  • ダイナミック・ストップ・メカニズムを確立し,リスクを積極的にコントロールする.
  • 機械学習のような手法で より良い出入りのルールを模索する

要約する

この戦略は,三重超トレンドシステムの優位性を最大限に活用し,EMAとADXのダブルフィルタリングを補足することで,取引信号の質を効果的に向上させ,リスクを制御できます.パラメータ最適化,フィルタリング条件の追加,ダイナミックストップなどの方法により,戦略の強さと適応性をさらに強化できます.トレンド判断と組み合わせると,この戦略は,取引の量化に有効な入場と出場信号を提供します.

ストラテジーソースコード
/*backtest
start: 2023-08-18 00:00:00
end: 2023-09-17 00:00:00
period: 2h
basePeriod: 15m
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/
// ©kunjandetroja


//@version=5
strategy('Triple Supertrend with EMA and ADX', overlay=true)

m1 = input.float(1,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 1')
m2 = input.float(2,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 2')
m3 = input.float(3,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 3')
p1 = input.int(10,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 1')
p2 = input.int(15,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 2')
p3 = input.int(20,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 3')
len_EMA = input.int(200,"EMA Len",minval = 5,maxval= 250,step=1)
len_ADX = input.int(14,"ADX Len",minval = 1,maxval= 25,step=1)
len_Di = input.int(14,"Di Len",minval = 1,maxval= 25,step=1)
adx_above = input.float(25,"adx filter",minval = 1,maxval= 50,step=0.5)
var bool long_position = false
adx_filter = input.bool(false, "Add Adx & EMA filter")
renetry = input.bool(true, "Allow Reentry")

f_getColor_Resistance(_dir, _color) =>
    _dir == 1 and _dir == _dir[1] ? _color : na
f_getColor_Support(_dir, _color) =>
    _dir == -1 and _dir == _dir[1] ? _color : na

[superTrend1, dir1] = ta.supertrend(m1, p1)
[superTrend2, dir2] = ta.supertrend(m2, p2)
[superTrend3, dir3] = ta.supertrend(m3, p3)
EMA = ta.ema(close, len_EMA)
[diplus,diminus,adx] = ta.dmi(len_Di,len_ADX)

// ADX Filter
adxup = adx > adx_above and close > EMA
adxdown = adx > adx_above and close < EMA

sum_dir = dir1 + dir2 + dir3

dir_long = if(adx_filter == false)
    sum_dir == -3
else
    sum_dir == -3 and adxup
dir_short = if(adx_filter == false)
    sum_dir == 3
else
    sum_dir == 3 and adxdown
Exit_long = dir1 == 1 and dir1 != dir1[1]
Exit_short = dir1 == -1 and dir1 != dir1[1]

// BuySignal = dir_long and dir_long != dir_long[1]
// SellSignal = dir_short and dir_short != dir_short[1]
// if BuySignal
//     label.new(bar_index, low, 'Long', style=label.style_label_up)
// if SellSignal
//     label.new(bar_index, high, 'Short', style=label.style_label_down)

longenter = if(renetry == false)
    dir_long and long_position == false
else
    dir_long
shortenter = if(renetry == false)
    dir_short and long_position == true
else
    dir_short
if longenter
    long_position := true
if shortenter
    long_position := false

strategy.entry('BUY', strategy.long, when=longenter)
strategy.entry('SELL', strategy.short, when=shortenter)   
strategy.close('BUY', Exit_long)
strategy.close('SELL', Exit_short)

buy1 = ta.barssince(dir_long)
sell1 = ta.barssince(dir_short)

colR1 = f_getColor_Resistance(dir1, color.red)
colS1 = f_getColor_Support(dir1, color.green)

colR2 = f_getColor_Resistance(dir2, color.orange)
colS2 = f_getColor_Support(dir2, color.yellow)

colR3 = f_getColor_Resistance(dir3, color.blue)
colS3 = f_getColor_Support(dir3, color.maroon)

plot(superTrend1, 'R1', colR1, linewidth=2)
plot(superTrend1, 'S1', colS1, linewidth=2)

plot(superTrend2, 'R1', colR2, linewidth=2)
plot(superTrend2, 'S1', colS2, linewidth=2)

plot(superTrend3, 'R1', colR3, linewidth=2)
plot(superTrend3, 'S1', colS3, linewidth=2)

// // Intraday only
// var int new_day = na
// var int new_month = na
// var int new_year = na
// var int close_trades_after_time_of_day = na

// if dayofmonth != dayofmonth[1]
//     new_day := dayofmonth
// if month != month[1]
//     new_month := month
// if year != year[1]
//     new_year := year
// close_trades_after_time_of_day := timestamp(new_year,new_month,new_day,15,15)

// strategy.close_all(time > close_trades_after_time_of_day)