これは複数の指数的な移動平均 (EMA) クロスオーバーとボリューム価格指標に基づいた包括的なモメンタム・トレーディング戦略である.この戦略は,高速および遅いEMA,ボリューム重量平均価格 (VWAP) およびスーパートレンドを含むさまざまな指標を組み合わせて取引信号を生成し,入口および出口点を制御するための日中の取引窓と価格動きの
この戦略は,5日および13日間のEMAを主要なトレンドインジケーターとして利用している. ショートポジションは,速 EMAがVWAP以上の閉値でスロー EMAを超えると起動し,ショートポジションは,速 EMAがVWAP以下の閉値でスロー EMAを下回ると起動する. この戦略には,トレンド確認とストップロスの決定のためのスーパートレンドインジケーターも組み込まれている. 前の日の閉値と日の高低レンジとの関係で価格動きを含む,異なる取引日ごとに異なるエントリー条件が設定されている.
この戦略は,複数の技術指標の包括的な使用を通じて,トレンドフォローとモメンタムトレーディングの組み合わせを達成する. 戦略設計は,異なる取引日ごとに差別化された取引規則を採用することによって,市場の多様性を完全に考慮する. 厳格なリスク制御と柔軟な利益とストップロスのメカニズムを通じて,この戦略は良い実用的な応用価値を示している. 将来の改善は,追加の技術指標を導入し,パラメータ設定を最適化することによって,戦略の安定性と収益性を向上させることができる.
/*backtest start: 2019-12-23 08:00:00 end: 2025-01-04 08:00:00 period: 1d basePeriod: 1d 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/ //@version=6 strategy("S1", overlay=true) fastEMA = ta.ema(close, 5) slowEMA = ta.ema(close,13) ema9 = ta.ema(close, 9) ema100 = ta.ema(close, 100) ema5 = ta.ema(close, 5) ema200 = ta.ema(close, 200) ma = ta.sma(close, 50) mult = input.float(defval=3) len = input.int(defval=11) [superTrend, dir] = ta.supertrend(mult, len) vwap1= ta.vwap(hlc3) plot(slowEMA,color = color.green) plot(fastEMA,color = color.black) plot(vwap1, color = color.blue) var dailyTaskDone = false var gapdown = false var gapup = false var runup = 0.0 var biggapdown = false var biggapup = false var prevDayClose = 0.0 var todayLow = 0.0 var todayHigh = 0.0 var noBuyNow = false var noSellNow = false var buyPrice = 0.0 var sellPrice = 0.0 var todayBuyDone = false var todaySellDone = false var dragonflyDoji = false var candleCount = 0 var candleCount1 = 0 var lastTrade = 9 var lastFiveCandles = false var lastSevenCandlesS = false var fiveEMACC = 0 candleCount := candleCount + 1 candleCount1 := candleCount1 + 1 if fiveEMACC > 0 fiveEMACC := fiveEMACC + 1 if fiveEMACC == 6 fiveEMACC := 0 if strategy.openprofit == 0 candleCount := 0 if hour == 9 and minute ==15 prevDayClose := close[1] todayLow := low todayHigh := high lastTrade := 9 if hour == 9 and minute ==15 and (open - close[1]) > close*0.01 gapup := true if hour == 9 and minute ==15 and (open - close[1]) < close*0.005*-1 gapdown := true if hour == 9 and minute ==15 and (close - close[1]) > 200 biggapup := true if hour == 9 and minute ==15 and (close - close[1]) < 200 biggapdown := true if low < todayLow todayLow := low candleCount1 := 0 if high > todayHigh todayHigh := high if close > todayLow + 200 noBuyNow := true if close < todayHigh - 200//0.01*close noSellNow := false lastFiveCandles := (close[4]<open[4] or close[3]<open[3] or close[2] < open[2] or close[1]<open[1]) lastSevenCandlesS := (close[6]>open[6] or close[5]>open[5] or close[4]>open[4] or close[3]>open[3] or close[2] > open[2] or close[1]>open[1]) if hour == 15 dailyTaskDone := false gapdown := false gapup := false biggapup := false biggapdown := false noBuyNow := false noSellNow := false todayLow := 0.0 todayHigh := 0.0 buyPrice := 0.0 sellPrice := 0.0 todayBuyDone := false todaySellDone := false dragonflyDoji := false lastTrade := 9 // if fastEMA < slowEMA and lastTrade == 1 and strategy.openprofit==0 // lastTrade := 9 if fastEMA > slowEMA and lastTrade == 0 and strategy.openprofit==0 lastTrade := 9 buy = (dayofweek==dayofweek.thursday and (fastEMA - slowEMA > close*0.001) and close > vwap1 and close[1] > vwap1[1]) or (dayofweek==dayofweek.monday and (fastEMA - slowEMA > close*0.001) and close > vwap1 and close[1] > vwap1[1] and close-prevDayClose < close*0.011) or (dayofweek==dayofweek.tuesday and (fastEMA - slowEMA > close*0.001) and close > vwap1 and close[1] > vwap1[1] and lastFiveCandles and close-prevDayClose < close*0.015 and close-todayLow < close*0.012) or (dayofweek==dayofweek.wednesday and (fastEMA - slowEMA > close*0.001) and close > vwap1 and close-prevDayClose < close*0.015 and (hour!=9 or minute>=35) and close-todayLow < close*0.012) or (dayofweek==dayofweek.friday and ((fastEMA - slowEMA > close*0.001))and close > vwap1 and close[1] > vwap1[1] and (hour!=9 or minute>=35)) sell= (dayofweek==dayofweek.thursday and (hour!=9 or minute>=35) and ((slowEMA - fastEMA > close*0.00089)) and close < vwap1 and lastSevenCandlesS and close[1] < vwap1[1]) or (dayofweek==dayofweek.monday and ((slowEMA - fastEMA > close*0.00089)) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and todayHigh-close < close*0.008 and todayHigh-close[1] < close * 0.01 ) or (dayofweek==dayofweek.tuesday and (hour!=9 or minute>=35) and (open - low < 2*(high-close)) and (close-open<10) and not dragonflyDoji and (slowEMA - fastEMA > close*0.00089) and close < vwap1 and close[1] < vwap1[1] and prevDayClose-close<close*0.012 and todayHigh-close < close*0.009 and todayHigh-close[1] < close * 0.009) or (dayofweek==dayofweek.wednesday and (hour!=9 or minute>=40) and close<open and (slowEMA - fastEMA > close*0.00089) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and (close-todayLow>30 or candleCount1<1) ) or (dayofweek==dayofweek.friday and ((slowEMA - fastEMA > close*0.00089)) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and (hour!=9 or minute>=55) ) // buy = (dayofweek==dayofweek.thursday and (fastEMA > slowEMA) and close > vwap1 and close[1] > vwap1[1]) or // (dayofweek==dayofweek.monday and (fastEMA > slowEMA) and close > vwap1 and close[1] > vwap1[1] and close-prevDayClose < close*0.011) or // (dayofweek==dayofweek.tuesday and (fastEMA > slowEMA) and close > vwap1 and close[1] > vwap1[1] and lastFiveCandles and close-prevDayClose < close*0.015 and close-todayLow < close*0.012) or // (dayofweek==dayofweek.wednesday and (fastEMA > slowEMA) and close > vwap1 and close-prevDayClose < close*0.015 and (hour!=9 or minute>=35) and close-todayLow < close*0.012) or // (dayofweek==dayofweek.friday and ((fastEMA > slowEMA))and close > vwap1 and close[1] > vwap1[1] and (hour!=9 or minute>=35)) // sell= (dayofweek==dayofweek.thursday and (hour!=9 or minute>=35) and ((slowEMA > fastEMA)) and close < vwap1 and lastSevenCandlesS and close[1] < vwap1[1]) or // (dayofweek==dayofweek.monday and ((slowEMA > fastEMA)) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and todayHigh-close < close*0.008 and todayHigh-close[1] < close * 0.01 ) or // (dayofweek==dayofweek.tuesday and (hour!=9 or minute>=35) and (open - low < 2*(high-close)) and (close-open<10) and not dragonflyDoji and (slowEMA > fastEMA) and close < vwap1 and close[1] < vwap1[1] and prevDayClose-close<close*0.012 and todayHigh-close < close*0.009 and todayHigh-close[1] < close * 0.009) or // (dayofweek==dayofweek.wednesday and (hour!=9 or minute>=40) and close<open and (slowEMA > fastEMA) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and (close-todayLow>30 or candleCount1<1) ) or // (dayofweek==dayofweek.friday and ((slowEMA > fastEMA)) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and (hour!=9 or minute>=55) ) dragonflyDoji:= false // (slowEMA - fastEMA > close*0.00089 or (slowEMA-fastEMA>close*0.00049 and (high[2]>vwap or high[1]>vwap))) if sellPrice != 0 and runup < sellPrice - low runup := sellPrice - low if buyPrice != 0 and runup < high - buyPrice //ourlabel = label.new(x=bar_index, y=na, text=tostring(runup), yloc=yloc.belowbar) runup := high - buyPrice NoBuySellTime = (hour == 15) or ((hour==14 and minute>=25)) or (hour==9 and minute<=35) or hour >= 14 //(fiveEMACC > 0 and low < fastEMA and close < vwap1) buyexit = fastEMA<slowEMA or (close<superTrend and close < vwap1 and close[1] < vwap1[1]) //or strategy.openprofit > 400 or strategy.openprofit < -5000 sellexit = slowEMA<fastEMA or (close > vwap1 and close[1] > vwap1[1] and close>superTrend) //or strategy.openprofit > 400 or strategy.openprofit < -5000 exitPosition = (dayofweek==dayofweek.thursday and buyPrice!=0.0 and (high - buyPrice) > 50) or (dayofweek==dayofweek.thursday and sellPrice!=0.0 and (sellPrice - low) > 80) or (dayofweek==dayofweek.monday and buyPrice !=0.0 and high-buyPrice > 30) or (dayofweek==dayofweek.monday and sellPrice!=0.0 and (sellPrice - low) > 30) or (dayofweek!=dayofweek.thursday and dayofweek!=dayofweek.monday and buyPrice!=0.0 and (high - buyPrice) > 30) or (dayofweek!=dayofweek.thursday and dayofweek!=dayofweek.monday and sellPrice!=0.0 and (sellPrice - low) > 30) //code such that 2 fastema is > than 2 slowema //exitPosition = (sellPrice!=0 and runup >21 and strategy.openprofit < -2000) or (candleCount > 18 and strategy.openprofit > 50 and strategy.openprofit < 1000) or (dayofweek==dayofweek.thursday and buyPrice!=0.0 and (high - buyPrice) > buyPrice * 0.007) or (dayofweek==dayofweek.thursday and sellPrice!=0.0 and (sellPrice - low) > sellPrice * 0.007) or (dayofweek==dayofweek.monday and buyPrice !=0.0 and high-buyPrice > 30) or (dayofweek!=dayofweek.thursday and dayofweek!=dayofweek.monday and buyPrice!=0.0 and (high - buyPrice) > buyPrice * 0.002) or (dayofweek!=dayofweek.thursday and sellPrice!=0.0 and (sellPrice - low) > sellPrice * 0.002) //(runup >21 and strategy.openprofit < -2000) or if buy and fastEMA>vwap1 and (not todayBuyDone or lastTrade != 1) and not NoBuySellTime// and not dailyTaskDone //and (dayofweek==dayofweek.friday or (close-prevDayClose)<150)//and not biggapup strategy.entry("buy", strategy.long) //dailyTaskDone := true if buyPrice == 0.0 fiveEMACC := 1 buyPrice := close //ourlabel = label.new(x=bar_index, y=na, text=tostring(todayLow + 500), yloc=yloc.belowbar9 todayBuyDone := true lastTrade := 1 runup := 0.0 if sell and (not todaySellDone or lastTrade != 0) and not NoBuySellTime// and not dailyTaskDone // and dayofweek!=dayofweek.friday //and (dayofweek==dayofweek.friday or (prevDayClose-close)<150)//and not biggapdown strategy.entry("sell", strategy.short) //dailyTaskDone := true if sellPrice == 0.0 fiveEMACC := 1 sellPrice := close todaySellDone := true lastTrade := 0 runup := 0.0 // if ((fastEMA-slowEMA>18 and close>vwap and close[1]>vwap[1] and (not todayBuyDone or candleCount>12)) or (slowEMA-fastEMA>10 and close < vwap and close[1]<vwap[1] and (not todaySellDone or candleCount > 12))) and strategy.openprofit==0 // ourlabel = label.new(x=bar_index, y=na, text=tostring(abs(prevDayClose-close)), yloc=yloc.belowbar) IntraDay_SquareOff = minute >=15 and hour >= 15 if true and (IntraDay_SquareOff or exitPosition) strategy.close("buy") strategy.close("sell") buyPrice := 0 sellPrice := 0 runup := 0.0 if buyexit strategy.close("buy") buyPrice := 0 if sellexit strategy.close("sell") sellPrice := 0 buy1 = ((dayofweek==dayofweek.thursday and (fastEMA - slowEMA > close*0.001) and close > vwap1 and close[1] > vwap1[1]) or (dayofweek==dayofweek.monday and (fastEMA - slowEMA > close*0.0013) and close > vwap1 and close[1] > vwap1[1]) or (dayofweek==dayofweek.tuesday and (fastEMA - slowEMA > close*0.0013) and close > vwap1 and close[1] > vwap1[1] and not gapup) or (dayofweek==dayofweek.wednesday and (fastEMA - slowEMA > close*0.0013) and close > vwap1 and close[1] > vwap1[1] and close-prevDayClose < close*0.0085) or (dayofweek==dayofweek.friday and (fastEMA - slowEMA > close*0.0013) and close > vwap1 and close[1] > vwap1[1] and close - todayLow < close*0.012)) and dayofweek!=dayofweek.friday and (not todayBuyDone or lastTrade != 1) and not NoBuySellTime// and not dailyTaskDone //and (dayofweek==dayofweek.friday or (close-prevDayClose)<150)//and not biggapup sell1= ((dayofweek==dayofweek.thursday and (slowEMA - fastEMA > close*0.00079) and close < vwap1 and close[1] < vwap1[1]) or (dayofweek==dayofweek.monday and (slowEMA - fastEMA > close*0.00079) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and todayHigh-close < close*0.01 and todayHigh-close[1] < close * 0.01) or (dayofweek==dayofweek.tuesday and (slowEMA - fastEMA > close*0.00079) and close < vwap1 and close[1] < vwap1[1] and not gapdown and not dragonflyDoji and todayHigh-close < close*0.009 and todayHigh-close[1] < close * 0.009) or (dayofweek==dayofweek.wednesday and (slowEMA - fastEMA > close*0.00079) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and prevDayClose-close < 0.005*close) or (dayofweek==dayofweek.friday and (slowEMA - fastEMA > close*0.00079) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and prevDayClose-close < 0.005*close)) and dayofweek!=dayofweek.friday and (not todaySellDone or lastTrade != 0) and not NoBuySellTime// and not dailyTaskDone // if buy1 and strategy.openprofit==0 // ourlabel = label.new(x=bar_index, y=na, text=tostring(fastEMA - slowEMA), yloc=yloc.belowbar) // if sell1 and strategy.openprofit==0 // ourlabel = label.new(x=bar_index, y=na, text=tostring(slowEMA - fastEMA), yloc=yloc.belowbar) // buy = ((fastEMA > slowEMA and fastEMA[1] < slowEMA[1]) and (fastEMA - slowEMA) > 10) or ((fastEMA > slowEMA and fastEMA[1] > slowEMA[1] and fastEMA[2] < slowEMA[2]) and (fastEMA - slowEMA) > 20) // sell= ((fastEMA < slowEMA and fastEMA[1] > slowEMA[1] ) and (slowEMA - fastEMA) > 10) or ((fastEMA < slowEMA and fastEMA[1] < slowEMA[1] and fastEMA[2] > slowEMA[2]) and (slowEMA - fastEMA) > 20) // buy = (fastEMA > slowEMA and fastEMA[1] < slowEMA[1]) // sell= (fastEMA < slowEMA and fastEMA[1] > slowEMA[1] ) // buy = ((fastEMA > slowEMA and fastEMA[1] < slowEMA[1]) and (fastEMA - slowEMA) > 10) or ((fastEMA > slowEMA and fastEMA[1] > slowEMA[1] and fastEMA[2] < slowEMA[2]) and (fastEMA - slowEMA) > 1) // sell= ((fastEMA < slowEMA and fastEMA[1] > slowEMA[1] ) and (slowEMA - fastEMA) > 5) // buy = fastEMA > slowEMA and fastEMA[1] > slowEMA[1] and fastEMA[2] < slowEMA[2] // sell= fastEMA < slowEMA and fastEMA[1] < slowEMA[1] and fastEMA[2] > slowEMA[2] //Daily chart // buyexit = (close + 40 < slowEMA)//rsi > 65 and fastEMA > ema9 // fastEMA > ema9// close < fastEMA//(rsi > 65 and close < fastEMA and fastEMA > ema3 and close > ema200) //strategy.openprofit < -10000 and slowEMA > ema3 and slowEMA[1] < ema3[1] and 1==2 // sellexit = (close - 40 > slowEMA)//rsi < 35 // and close > ema200) or (rsi < 35 and close < ema200 and fastEMA < ema3) //strategy.openprofit < -10000 and fastEMA < ema3 and fastEMA[1] > ema3[1] and 1==2 // buyexit = (close < superTrend)// and (close < vwap1 and close[1] < vwap1[1] and close < close[1])//and close[2] < vwap1[2]//rsi > 65 and close < fastEMA// fastEMA > ema9// close < fastEMA//(rsi > 65 and close < fastEMA and fastEMA > ema3 and close > ema200) //strategy.openprofit < -10000 and slowEMA > ema3 and slowEMA[1] < ema3[1] and 1==2 // sellexit = (close > superTrend)// and (close > vwap1 and close[1] > vwap1[1] and close > close[1]) //and close[2] > vwap1[2]//rsi < 35// and close > ema200) or (rsi < 35 and close < ema200 and fastEMA < ema3) //strategy.openprofit < -10000 and fastEMA < ema3 and fastEMA[1] > ema3[1] and 1==2 // buyexit = (close < superTrend and close < vwap1 and close[1] < vwap1[1] and close[1] < superTrend[1]) //or strategy.openprofit > 400 or strategy.openprofit < -5000 // sellexit = (close > superTrend and close > vwap1 and close[1] > vwap1[1] and close[1] > superTrend[1]) //or strategy.openprofit > 400 or strategy.openprofit < -5000