トレンドを追う短期取引戦略


作成日: 2024-01-04 17:52:21 最終変更日: 2024-01-04 17:52:21
コピー: 0 クリック数: 588
1
フォロー
1621
フォロワー

トレンドを追う短期取引戦略

概要

この戦略は,トレンド判断指標ADX平均トレンド指数および均線組合せに基づいて,トレンドの判断と追跡を実現します. 判断がトレンドの逆転が発生したとき,突破操作を採用し,ショートライン取引を行います.

戦略原則

  1. ADXの平均トレンド指数を使ってトレンドの方向を判断する.ADXが20より大きいときは,現在トレンド状態にあることを示している.
  2. EMAはトレンド判断指標として,EMA金叉は上昇傾向を示し,死叉は下降傾向を示している.
  3. VWAPは重要な参照価格として,VWAPの上の価格は多頭市場,下の価格は空頭市場である.
  4. 上記の複数の指標に基づいて市場トレンドと逆転状況を総合的に判断し,突破操作を行い,トレンドを追跡し,ショートライン取引を行う.

優位分析

  1. 複数の指標を組み合わせてトレンドの方向を判断し,大きなトレンドを正確に判断する.
  2. VWAPは重要な基準価格であり,無効区域での取引を避ける.
  3. ADXは,トレンドが存在すると判断し,その後に操作し,無効取引を減らす.
  4. 突破作戦の成功率は高い.

リスク分析

  1. 突破の失敗が止損につながる可能性は存在する.止損位置を最適化することでリスクを軽減することができる.
  2. 取引回数が多く,単一取引で損失が発生する可能性があります. ポジション数を適切に調整して,単一損失の割合を減らすことができます.
  3. 取引時間と取引品種の選択は,戦略のパフォーマンスにも影響する.異なる取引時間と異なる取引品種をテストすることができます.

最適化の方向

  1. ADXパラメータを最適化して,トレンドとADX値の整合をよりよく識別する.
  2. 平均線パラメータの組み合わせを最適化して,トレンドを代表するより良い平均線組み合わせを見つけます.
  3. 停止位置の最適化. 停止範囲の適切な放寬,停止コストの過高を避ける.
  4. ポジションのサイズを最適化する. 単一取引のリスクを減らす.

要約する

この戦略は,均線指標,トレンド判断指標および重要な参照価格を総合的に使用し,大きなトレンドを正確に判断し,トレンドが逆転すると判断し,突破操作を使用してトレンドを追跡し,ショートライン取引を実現します.パラメータを最適化することで,戦略のパフォーマンスをさらに向上させることができます.

ストラテジーソースコード
/*backtest
start: 2023-12-27 00:00:00
end: 2023-12-29 23:00:00
period: 3m
basePeriod: 1m
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/
// © mariocastel

//@version=5
strategy("Wave Rider", overlay=true, initial_capital = 100000)

session = input(defval = "1400-1500", title = "Session Time")
t = not na(time(timeframe.period,session))
RR = input.float(1.5, "Risk to reward", step=0.5)
var bool movetoBE = input(false, "Move to Break Even")
BE = input.float(1, "Break Even at", step=0.5)

vwap_mult = 0.001 * input(3, "VWAP Multiplier")
aboveVWAP = ta.vwap(close) * (1 + vwap_mult)
belowVWAP = ta.vwap(close) * (1 - vwap_mult)
sym = input("BTC_USDT:swap", "VWAP Source")

QQQaboveVWAP = request.security(sym, "3", aboveVWAP)
QQQbelowVWAP = request.security(sym, "3", belowVWAP)
QQQclose = request.security(sym, "3", close)

ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
ema60 = ta.ema(close, 60)
ema9 = ta.ema(close, 9)

opentrades = strategy.opentrades > 0

aboveEMA = close > ema60
belowEMA = close < ema60

uptrend = aboveEMA and aboveEMA[1] and aboveEMA[2] and aboveEMA[3] and aboveEMA[4] and aboveEMA[5] and aboveEMA[6] and aboveEMA[7] and aboveEMA[8] and aboveEMA[9] and aboveEMA[10] and aboveEMA[11] and aboveEMA[12] and aboveEMA[13] and aboveEMA[14] and aboveEMA[15] and aboveEMA[16] and aboveEMA[17] and aboveEMA[18] and aboveEMA[19] and aboveEMA[20] and aboveEMA[21] and aboveEMA[22] and aboveEMA[23] and aboveEMA[24] and aboveEMA[25] and aboveEMA[26] and aboveEMA[27] and aboveEMA[28] and aboveEMA[29]
downtrend = belowEMA and belowEMA[1] and belowEMA[2] and belowEMA[3] and belowEMA[4] and belowEMA[5] and belowEMA[6] and belowEMA[7] and belowEMA[8] and belowEMA[9] and belowEMA[10] and belowEMA[11] and belowEMA[12] and belowEMA[13] and belowEMA[14] and belowEMA[15] and belowEMA[16] and belowEMA[17] and belowEMA[18] and belowEMA[19] and belowEMA[20] and belowEMA[21] and belowEMA[22] and belowEMA[23] and belowEMA[24] and belowEMA[25] and belowEMA[26] and belowEMA[27] and belowEMA[28] and belowEMA[29]

buy = (low < ema20 and low > ema50 and close > ema9) and QQQclose > QQQaboveVWAP  or (low[1] < ema20 and low[1] > ema50 and close > ema9) and QQQclose > QQQaboveVWAP and uptrend
sell = (high > ema20 and high < ema50 and close < ema9) and QQQclose < QQQbelowVWAP  or (high[1] > ema20 and high[1] < ema50 and close < ema9) and QQQclose < QQQbelowVWAP and downtrend

var float entry = na
var float sl = na
var float qty = na
var float tp = na
var float be = na

if ema20 > ema50 and ema9 > ema20 
    if buy and not opentrades and t and uptrend
        alert("Wave Rider Setup")
        entry := close
        sl := ema50
        qty := 1000/(close - sl) * 1
        if close - sl > syminfo.mintick*300
            tp := close + ((close - sl)*1)
        else 
            tp := close + ((close - sl)*RR)
        be := close + ((close - sl)*BE)
        strategy.entry("Buy", strategy.long, qty=qty)
        strategy.exit("Close Buy", "Buy",qty=qty, stop=sl, limit=tp)

if ema20 < ema50 and ema9 < ema20 
    if sell and not opentrades and t and downtrend
        alert("Wave Rider Setup")
        entry := close
        sl := ema50
        qty := 1000/(sl - close) * 1
        if sl - close > syminfo.mintick*300
            tp := close - ((sl - close)*1)
        else
            tp := close - ((sl - close)*RR)
        be := close - ((sl - close)*BE)
        strategy.entry("Sell", strategy.short, qty=qty)
        strategy.exit("Close Sell", "Sell", qty=qty, stop=sl, limit=tp)

// Adjust BEs
if movetoBE == true
    if strategy.position_size > 0
        if high >= be
            sl := entry
            strategy.cancel("Close Buy")
            strategy.exit("Close Buy", "Buy", qty=qty, stop=sl, limit=tp)   
    if strategy.position_size < 0
        if low <= be
            sl := entry
            strategy.cancel("Close Sell")  
            strategy.exit("Close Sell", "Sell", qty=qty, stop=sl, limit=tp)  


EoD_time = timestamp(year, month, dayofmonth, 15, 58, 00)
EoD = time == EoD_time
if EoD
    strategy.close_all()

barcolor(color=buy ? color.rgb(191, 255, 131): na)
barcolor(color=sell ? color.rgb(255, 149, 149): na)
ema20plot = plot(ema20, color=color.rgb(168, 131, 131, 55))
ema50plot = plot(ema50, color=color.black)
fill(ema20plot, ema50plot, color=color.rgb(168, 131, 131, 85))
plot(ema9, color=color.red)
plot(ema60, color=color.purple)
plot(QQQaboveVWAP)
plot(QQQbelowVWAP)
plotshape(uptrend, style=shape.triangleup, location=location.belowbar, color=color.black)
plotshape(downtrend, style=shape.triangledown, location=location.abovebar, color=color.black)