この戦略は,トレンドフォローと継続の方法で指数関数移動平均値 (EMA) とストカスティックオシレータを組み合わせ,いくつかのクールな機能も備えています.私はこの戦略を特にアルトコインの取引のために設計しましたが,ビットコイン自体やいくつかのフォレックスペアでも同様にうまく機能しています.
戦略は,取引信号をロック解除するための4つの必須条件を持っています.以下のロングトレードのためにこれらの条件を見つけます (ショート向けに正反対に動作します)
この戦略は,中長期取引に適したトレンドの開始と継続を効果的に把握するために,EMAとストカスティックの利点を組み合わせています.同時に,この戦略は,ユーザーが取引スタイルと市場の特徴に基づいて調整できる多くのカスタマイズ可能なパラメータを提供します.
具体的には,この戦略の利点は以下のとおりです.
この戦略の主なリスクは以下のものです.
上記リスクを軽減するために,次の措置を講じることができます.
この戦略は,次の側面でさらに最適化できます.
この戦略は,より高いタイムフレーム市場環境と現在の価格行動の両方を考慮して,トレンドフォローと平均リバースの両方のメリットを統合しています.これはリアルタイムで追跡およびテストする価値のある効果的な戦略です.パラメータの継続的な最適化,トレンド判断モジュール等を追加することにより,パフォーマンス改善のための大きな余地があります.より多くの研究努力を注ぎ込む価値があります.
/*backtest start: 2023-11-18 00:00:00 end: 2023-12-18 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/ // © LucasVivien // Since this Strategy may have its stop loss hit within the opening candle, consider turning on 'Recalculate : After Order is filled' in the strategy settings, in the "Properties" tabs //@version=5 strategy("Stochastic Moving Average", shorttitle="Stoch. EMA", overlay=true, default_qty_type= strategy.cash, initial_capital=10000, default_qty_value=100) //============================================================================== //============================== USER INPUT ================================ //============================================================================== var g_tradeSetup = " Trade Setup" activateLongs = input.bool (title="Long Trades" , defval=true , inline="A1", group=g_tradeSetup, tooltip="") activateShorts = input.bool (title="Short Trades" , defval=true , inline="A1", group=g_tradeSetup, tooltip="") rr = input.float(title="Risk : Reward" , defval=1 , minval=0, maxval=100 , step=0.1, inline="" , group=g_tradeSetup, tooltip="") RiskEquity = input.bool (title="Risk = % Equity ", defval=false , inline="A2", group=g_tradeSetup, tooltip="Set stop loss size as a percentage of 'Initial Capital' -> Strategy Parameter -> Properties tab (Low liquidity markets will affect will prevent to get an exact amount du to gaps)") riskPrctEqui = input.float(title="" , defval=1 , minval=0, maxval=100 , step=0.1, inline="A2", group=g_tradeSetup, tooltip="") RiskUSD = input.bool (title="Risk = $ Amount " , defval=false , inline="A3", group=g_tradeSetup, tooltip="Set stop loss size as a fixed Base currency amount (Low liquidity markets will affect will prevent to get an exact amount du to gaps)") riskUSD = input.float(title="" , defval=1000, minval=0, maxval=1000000000, step=100, inline="A3", group=g_tradeSetup, tooltip="") var g_stopLoss = " Stop Loss" atrMult = input.float(title="ATR Multiplier", defval=1 , minval=0, maxval=100 , step=0.1, tooltip="", inline="", group=g_stopLoss) atrLen = input.int (title="ATR Lookback" , defval=14, minval=0, maxval=1000, step=1 , tooltip="", inline="", group=g_stopLoss) var g_stochastic = " Stochastic" Klen = input.int (title="K%" , defval=14, minval=0, maxval=1000, step=1, inline="S2", group=g_stochastic, tooltip="") Dlen = input.int (title=" D%" , defval=3 , minval=0, maxval=1000, step=1, inline="S2", group=g_stochastic, tooltip="") OBstochLvl = input.int (title="OB" , defval=80, minval=0, maxval=100 , step=1, inline="S1", group=g_stochastic, tooltip="") OSstochLvl = input.int (title=" OS" , defval=20, minval=0, maxval=100 , step=1, inline="S1", group=g_stochastic, tooltip="") OBOSlookback = input.int (title="Stoch. OB/OS lookback", defval=0 , minval=0, maxval=100 , step=1, inline="" , group=g_stochastic, tooltip="This option allow to look 'x' bars back for a value of the Stochastic K line to be overbought or oversold when detecting an entry signal (if 0, looks only at current bar. if 1, looks at current and previous and so on)") OBOSlookbackAll = input.bool (title="All must be OB/OS" , defval=false , inline="" , group=g_stochastic, tooltip="If turned on, all bars within the Stochastic K line lookback period must be overbought or oversold to return a true signal") entryColor = input.color(title=" " , defval=#00ffff , inline="S3", group=g_stochastic, tooltip="") baseColor = input.color(title=" " , defval=#333333 , inline="S3", group=g_stochastic, tooltip="Will trun to designated color when stochastic gets to opposite extrem zone of current trend / Number = transparency") transp = input.int (title=" " , defval=50, minval=0, maxval=100, step=10, inline="S3", group=g_stochastic, tooltip="") var g_ema = " Exp. Moving Average" ema1len = input.int (title="Fast EMA ", defval=21, minval=0, maxval=1000, step=1, inline="E1", group=g_ema, tooltip="") ema2len = input.int (title="Slow EMA ", defval=50, minval=0, maxval=1000, step=1, inline="E2", group=g_ema, tooltip="") ema1col = input.color(title=" " , defval=#0066ff , inline="E1", group=g_ema, tooltip="") ema2col = input.color(title=" " , defval=#0000ff , inline="E2", group=g_ema, tooltip="") var g_referenceMarket =" Reference Market" refMfilter = input.bool (title="Reference Market Filter", defval=false , inline="", group=g_referenceMarket) market = input (title="Market" , defval="BTC_USDT:swap", inline="", group=g_referenceMarket) res = input.timeframe(title="Timeframe" , defval="30" , inline="", group=g_referenceMarket) len = input.int (title="EMA Length" , defval=50 , inline="", group=g_referenceMarket) //============================================================================== //========================== FILTERS & SIGNALS ============================= //============================================================================== //------------------------------ Stochastic -------------------------------- K = ta.stoch(close, high, low, Klen) D = ta.sma(K, Dlen) stochBullCross = ta.crossover(K, D) stochBearCross = ta.crossover(D, K) OSstoch = false OBstoch = false for i = 0 to OBOSlookback if K[i] < OSstochLvl OSstoch := true else if OBOSlookbackAll OSstoch := false for i = 0 to OBOSlookback if K[i] > OBstochLvl OBstoch := true else if OBOSlookbackAll OBstoch := false //---------------------------- Moving Averages ----------------------------- ema1 = ta.ema(close, ema1len) ema2 = ta.ema(close, ema2len) emaBull = ema1 > ema2 emaBear = ema1 < ema2 //---------------------------- Price source -------------------------------- bullRetraceZone = (close < ema1 and close >= ema2) bearRetraceZone = (close > ema1 and close <= ema2) //--------------------------- Reference market ----------------------------- ema = ta.ema(close, len) emaHTF = request.security(market, res, ema [barstate.isconfirmed ? 0 : 1]) closeHTF = request.security(market, res, close[barstate.isconfirmed ? 0 : 1]) bullRefMarket = (closeHTF > emaHTF or closeHTF[1] > emaHTF[1]) bearRefMarket = (closeHTF < emaHTF or closeHTF[1] < emaHTF[1]) //-------------------------- SIGNAL VALIDATION ----------------------------- validLong = stochBullCross and OSstoch and emaBull and bullRetraceZone and activateLongs and (refMfilter ? bullRefMarket : true) and strategy.position_size == 0 validShort = stochBearCross and OBstoch and emaBear and bearRetraceZone and activateShorts and (refMfilter ? bearRefMarket : true) and strategy.position_size == 0 //============================================================================== //=========================== STOPS & TARGETS ============================== //============================================================================== SLdist = ta.atr(atrLen) * atrMult longSL = close - SLdist longSLDist = close - longSL longTP = close + (longSLDist * rr) shortSL = close + SLdist shortSLDist = shortSL - close shortTP = close - (shortSLDist * rr) var SLsaved = 0.0 var TPsaved = 0.0 if validLong or validShort SLsaved := validLong ? longSL : validShort ? shortSL : na TPsaved := validLong ? longTP : validShort ? shortTP : na //============================================================================== //========================== STRATEGY COMMANDS ============================= //============================================================================== if validLong strategy.entry("Long", strategy.long, qty = RiskEquity ? ((riskPrctEqui/100)*strategy.equity)/longSLDist : RiskUSD ? riskUSD/longSLDist : na) if validShort strategy.entry("Short", strategy.short, qty = RiskEquity ? ((riskPrctEqui/100)*strategy.equity)/shortSLDist : RiskUSD ? riskUSD/shortSLDist : na) strategy.exit(id="Long Exit" , from_entry="Long" , limit=TPsaved, stop=SLsaved, when=strategy.position_size > 0) strategy.exit(id="Short Exit", from_entry="Short", limit=TPsaved, stop=SLsaved, when=strategy.position_size < 0) //============================================================================== //============================= CHART PLOTS ================================ //============================================================================== //---------------------------- Stops & Targets ----------------------------- plot(strategy.position_size != 0 or (strategy.position_size[1] != 0 and strategy.position_size == 0) ? SLsaved : na, color=color.red , style=plot.style_linebr) plot(strategy.position_size != 0 or (strategy.position_size[1] != 0 and strategy.position_size == 0) ? TPsaved : na, color=color.green, style=plot.style_linebr) //--------------------------------- EMAs ----------------------------------- l1 = plot(ema1, color=#0066ff, linewidth=2) l2 = plot(ema2, color=#0000ff, linewidth=2) //-------------------------- Stochastic gradient --------------------------- // fill(l1, l2, color.new(color.from_gradient(K, OSstochLvl, OBstochLvl, // emaBull ? entryColor : emaBear ? baseColor : na, // emaBull ? baseColor : emaBear ? entryColor : na), transp)) //---------------------------- Trading Signals ----------------------------- plotshape(validLong, color=color.green, location=location.belowbar, style=shape.xcross, size=size.small) plotshape(validShort, color=color.red , location=location.abovebar, style=shape.xcross, size=size.small) //---------------------------- Reference Market ---------------------------- bgcolor(bullRefMarket and refMfilter ? color.new(color.green,90) : na) bgcolor(bearRefMarket and refMfilter ? color.new(color.red ,90) : na)