DEMAとEMAのクロスオーバーをベースにしたモメント戦略とATR波動性フィルター

作者: リン・ハーンチャオチャン, 開催日:2024-01-08 14:14:57
タグ:

img

I. 戦略の概要

この戦略は,ATR波動性フィルター付きのDEMAとEMAクロスオーバーに基づくモメンタム戦略と呼ばれる.ATR波動性指数と組み合わせたDEMAとEMAクロスオーバーを検出することによって短期取引信号を生成する.DEMAがEMAを下回り,ATRが上昇するときに,セキュリティを短縮する.DEMAがEMAを下回ると,ポジションを閉じる.

戦略の論理

  1. DEMA指標を計算します.DEMAは,二重EMAを用いたダブル指数関数移動平均値で,短期間の市場騒音をフィルタリングし,信号の精度を向上させることができます.

  2. EMA指標を計算します. EMAは指数関数移動平均値で,価格変動により速く反応します.

  3. ATR波動性指数を計算する. ATRは市場の波動性とリスクレベルを測定する. ATRの上昇は,波動性の増加と短期的な引き下げの可能性が高いことを表しています.

  4. DEMAが EMAを下回り ATRが上回りすると 短期的な下落傾向が始まり 市場リスクが増加します この戦略はセキュリティを短縮します

  5. DEMAが EMAを再突破すると,価格サポートと上向きのブランスを示します. 戦略はショートポジションを閉じる.

III. 利点

  1. 双 EMA と EMA の組み合わせにより,信号の正確性が効果的に向上します.

  2. ATR波動性フィルターは低リスクのウィップソー取引を排除します

  3. 短期保有期間が短期的なモメントトラッキングに適しており,長期的なヘッジを避けます.

  4. シンプルで明快な論理で 分かりやすく実行できます

IV リスク

  1. 間違ったATRパラメータは取引機会を逃す可能性があります.

  2. 長信号と短信号を同時に監視する必要があり 操作が難しくなります

  3. 短期的な市場変動の影響を受けます

解決策: バックテストによるパラメータ最適化. 論理を単純化して片側に集中する. 適切なストップ損失レベルをリラックスさせる.

V.最適化の方向性

  1. 最適な組み合わせを見つけるために DEMAとEMAのパラメータを最適化します

  2. ATR 復習期間を最適化して最適な波動性基準を決定する.

  3. BOLL帯のような他の指標を追加して信号の精度を向上します

  4. ストップ・ロスを導入し 利益のルールを採用して より一貫した利益を確保します

結論

この戦略は,DEMA,EMAクロスオーバーおよびATR波動性指数を使用して,シンプルで効果的な短期取引システムを構築する.クリーンな論理と操作の容易さは,高周波のモメント取引に適している.さらなるパラメータと論理最適化は,より安定したパフォーマンスをもたらす可能性がある.


/*backtest
start: 2023-12-08 00:00:00
end: 2024-01-07 00:00:00
period: 1h
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/
// © Qorbanjf

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Qorbanjf

//@version=4
strategy("Qorban: DEMA/EMA & VOL Short ONLY", shorttitle="DEMA/EMA & VOL SHORT", overlay=true)

// DEMA
length = input(10, minval=1, title="DEMA LENGTH")
src = input(close, title="Source")
e1 = ema(src, length)
e2 = ema(e1, length)
dema1 = 2 * e1 - e2
plot(dema1, "DEMA", color=color.yellow)

//EMA
len = input(25, minval=1, title="EMA Length")
srb = input(close, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
ema1 = ema(srb, len)
plot(ema1, title="EMA", color=color.blue, offset=offset)

// get ATR VALUE
atr = atr(14)

//ATRP (Average True Price in precentage)

// Inputs
atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution)
atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer)
useMA = input(title = "Show Moving Average?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type")
maLength = input(defval = 20, title = "Moving Average Period", minval = 1)
slType = input(title="Stop Loss ATR / %", type=input.float, defval=5.0, step=0.1)
slMulti = input(title="SL Multiplier", type=input.float, defval=1.0, step=0.1)
minimumProfitPercent = input(title="Minimum profit %", type=input.float, defval=20.00)

// ATR Logic
// atrValue = atr(atrLookback)
// atrp = (atrValue/close)*100
// plot(atrp, color=color.white, linewidth=2, transp = 30)

atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback))
atrp = (atrValue/close)*100

// Moving Average Logic
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength))


// Determine percentage of open profit
var entry = 0.0
distanceProfit = low - entry
distanceProfitPercent = distanceProfit / entry

//Determin if we have a long entry signal OR a sell position signal
profitSignal = minimumProfitPercent == 0.0 or distanceProfitPercent >= minimumProfitPercent
shortSignal = crossunder(dema1, ema1) and atrp > maFilter and strategy.position_size == 0 and not na(atr)
exitSignal = profitSignal and strategy.position_size !=0 and  crossover(dema1, ema1)


// === INPUT BACKTEST RANGE ===
//FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
//FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
//FromYear  = input(defval = 2017, title = "From Year", minval = 2000)
//ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
//ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
//ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

//Invert trade direction & flipping 
//tradInvert = input(defval = false, title = "invert trade direction")
//MOM_MR = input(defval=1, title = "MOM = 1 / MR = -1", minval=-1, maxval=1)
//plots=input(false, title="Show plots?")

// Get stop loss (in pips AND percentage distance)
shortStop = highest(high, 4) - (atr * slMulti)
shortStopPercent = close - (close * slMulti)

// Save long stop & target prices (used for drawing data to the chart & deetermining profit)
var shortStopSaved = 0.0
var shortTargetSaved = 0.0
enterShort = false
if shortSignal
    shortStopSaved := slType ? shortStop : shortStopPercent
    enterShort:= true
    entry := close


// long conditions 
//enterLong = crossover(dema1, ema1) and atrp < maFilter
//exitSignal => crossunder(dema1, ema1)

//Enter trades when conditions are met
strategy.entry("short", strategy.short, when=enterShort, comment="SHORT")

//place exit orders (only executed after trades are active)
strategy.exit(id="Short exit",
 from_entry="short",
 limit=exitSignal ? close : na,
 stop=shortStopSaved,
 when=strategy.position_size > 0,
 comment="end short")
 

//short strategy
//goShort() => crossunder(dema1, ema1) and atrp > maFilter
//KillShort() => crossover(dema1, ema1) 
//strategy.entry("SHORT", strategy.short, when = goShort())
//strategy.close("COVER", when = KillShort())


もっと