Đây là một chiến lược giao dịch động lực toàn diện dựa trên nhiều đường chéo trung bình chuyển động theo cấp số nhân (EMA) và các chỉ số giá khối lượng. Chiến lược tạo ra tín hiệu giao dịch bằng cách kết hợp các chỉ số khác nhau bao gồm EMA nhanh và chậm, Giá trung bình cân nhắc khối lượng (VWAP) và SuperTrend, trong khi kết hợp cửa sổ giao dịch trong ngày và ngưỡng chuyển động giá để kiểm soát các điểm vào và ra.
Chiến lược này sử dụng EMA 5 ngày và 13 ngày làm chỉ số xu hướng chính. Các vị trí dài được kích hoạt khi EMA nhanh vượt qua EMA chậm với giá đóng trên VWAP, trong khi các vị trí ngắn được kích hoạt khi EMA nhanh vượt qua EMA chậm với giá đóng dưới VWAP. Chiến lược cũng kết hợp chỉ số SuperTrend để xác nhận xu hướng và xác định stop-loss. Các điều kiện nhập cảnh khác nhau được thiết lập cho các ngày giao dịch khác nhau, bao gồm chuyển động giá tương đối với ngày trước.
Chiến lược này đạt được sự kết hợp của xu hướng theo dõi và giao dịch động lực thông qua việc sử dụng toàn diện nhiều chỉ số kỹ thuật. Thiết kế chiến lược xem xét đầy đủ sự đa dạng của thị trường bằng cách áp dụng các quy tắc giao dịch khác nhau cho các ngày giao dịch khác nhau. Thông qua kiểm soát rủi ro nghiêm ngặt và cơ chế lấy lợi nhuận và dừng lỗ linh hoạt, chiến lược chứng minh giá trị ứng dụng thực tế tốt. Những cải tiến trong tương lai có thể tăng cường tính ổn định và lợi nhuận của chiến lược bằng cách giới thiệu các chỉ số kỹ thuật bổ sung và tối ưu hóa cài đặt tham số.
/*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