Đây là robot BTCUSDTPERP 15 phút của tôi. Kết quả tốt nhất là trên BTCUSDTPERP tại binancefutures Kết quả phụ thuộc vào các chỉ số khối lượng cụ thể hoạt động tốt nhất tại binancefutures
15min bot là rất nhanh, nó khó để tìm một cấu hình tốt, bởi vì 15min backtesting mà ít nhất khoảng 3-4 tháng
bot này là specific có rất cao % giao dịch có lợi nhuận. lợi nhuận ròng cũng rất tốt. tuy nhiên 15min bot là cực kỳ khó sử dụng trong dài hạn, vì vậy tôi đã làm như deflaut thiết lập như tôi có thể.
Vậy thì, Robot này sử dụng 11 chỉ số khác nhau:
ADX
Bộ lọc phạm vi
SAR
RSI
TWAP
JMA
MACD
Volume DELTA
Đánh nặng khối lượng
MA và cuối cùng cho kết quả tốt hơn tại các biểu đồ qucik (15 phút) Tôi quyết định thêm:
STOCH
ADX - - làm cho một cái nhìn vững chắc đến xu hướng mà không có bất kỳ lừa đảo wick: dài chỉ trên các thanh xanh lá cây, ngắn chỉ trên các thanh đỏ.
RANGE FILTER - chỉ số này là để xem xét tốt hơn về xu hướng, xác định xu hướng, điều này rất quan trọng đối với mọi bẫy bò / gấu giúp ích rất nhiều vì xu hướng rất biến động.
SAR - Parabolic SAR là một chỉ số kỹ thuật được sử dụng để xác định hướng giá của một tài sản, cũng như thu hút sự chú ý đến khi hướng giá đang thay đổi.
Giá trị RSI giúp chiến lược dừng giao dịch đúng thời điểm. Khi RSI quá mua chiến lược không mở giao dịch dài mới, cũng khi RSI quá bán chiến lược không mở giao dịch ngắn mới
TWAP - có cùng một nhiệm vụ như bộ lọc phạm vi, chỉ để xem xu hướng tốt hơn, xác định xu hướng.
JMA - Chỉ số Jurik Moving Average là một trong những cách chắc chắn nhất để làm mịn đường cong giá trong một khoảng thời gian tối thiểu. Chỉ số cung cấp cho các nhà giao dịch tiền tệ một trong những bộ lọc giá tốt nhất trong thời gian chuyển động giá mạnh.
MACD - Moving average convergence divergence (MACD) là một chỉ số động lực theo xu hướng cho thấy mối quan hệ giữa hai trung bình động của giá chứng khoán. Ngày nay, MACD cũng như JMA là cần thiết để làm cho một robot có lợi nhuận.
Volume Delta - Một phương pháp tích lũy khối lượng Delta dựa trên chỉ số cân bằng Bull và Bear của Vadim Gimelfarb được xuất bản trong số tháng 10 năm 2003 của tạp chí S & C. Điều chỉnh chiều dài của đường trung bình động theo nhu cầu của bạn (Biểu tượng, khung thời gian, v.v.).
Volume Weight - là chỉ số quan trọng nhất cho chiến lược, để tránh giao dịch mở trên biểu đồ phẳng, các giao dịch mới được mở sau các thanh khối lượng mạnh.
MA 5-10-30 - giống như những người trước đây này là để xem xét tốt hơn về xu hướng, và xác định chính xác xu hướng, cũng Speed_MA đang sử dụng để dự đoán hành động giá trong tương lai.
Stochastic-stoch hữu ích để dự đoán sự đảo ngược xu hướng. Nó cũng tập trung vào động lực giá và có thể được sử dụng để xác định mức mua quá mức và bán quá mức
Tận hưởng nhé.
backtest
/*backtest start: 2022-05-20 00:00:00 end: 2022-06-18 23:59:00 period: 45m basePeriod: 5m 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/ // © wielkieef //@version=4 strategy("15MIN BTCUSDTPERP BOT", overlay=true, pyramiding=1,initial_capital = 10000, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0) //SOURCE ================================================================================================================================================================================================================================================================== src = input(ohlc4) // INPUTS ================================================================================================================================================================================================================================================================== //ADX ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Act_ADX = input(true, title = "AVERAGE DIRECTIONAL INDEX", type = input.bool) ADX_options = input("MASANAKAMURA", title = "ADX OPTION", options = ["CLASSIC", "MASANAKAMURA"]) ADX_len = input(11, title = "ADX LENGTH", type = input.integer, minval = 1) th = input(12, title = "ADX THRESHOLD", type = input.float, minval = 0, step = 0.5) //Range Filter---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- length0 = input(13, title="Range Filter lenght"),mult = input(1, title="Range Filter mult") //SAR------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- start = input(title="SAR Start", type=input.float, step=0.001, defval=0) increment = input(title="SAR Increment", type=input.float, step=0.001, defval=0.006) maximum = input(title="SAR Maximum", type=input.float, step=0.01, defval=1) width = input(title="SAR Point Width", type=input.integer, minval=1, defval=1) //RSI--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- len_3 = input(70, minval=1, title="RSI lenght") src_3 = input(close, "RSI Source") //TWAP Trend -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- smoothing = input(title="TWAP Smoothing", defval= 10) resolution = input("0", "TWAP Timeframe") //JMA------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ inp = input(title="JMA Source", type=input.source, defval=close) reso = input(title="JMA Resolution", type=input.resolution, defval="") rep = input(title="JMA Allow Repainting?", type=input.bool, defval=false) src0 = security(syminfo.tickerid, reso, inp[rep ? 0 : barstate.isrealtime ? 1 : 0])[rep ? 0 : barstate.isrealtime ? 0 : 1] lengths = input(title="JMA Length", type=input.integer, defval=4, minval=1) //MACD------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ fast_length = input(title="MACD Fast Length", type=input.integer, defval=25) slow_length = input(title="MACD Slow Length", type=input.integer, defval=50) signal_length = input(title="MACD Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) //Volume Delta ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- periodMa = input(title="Delta Length", minval=1, defval=45) //Volume weight------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ maLength = input(title="Volume Weight Length", type=input.integer, defval=100, minval=1) maType = input(title="Volume Weight Type", type=input.string, defval="SMA", options=["EMA", "SMA", "HMA", "WMA", "DEMA"]) rvolTrigger = input(title="Volume To Trigger Signal", type=input.float, defval=1.5, step=0.1 , minval=0.1) //MA---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- length = input(51, minval=1, title="MA Length") matype = input(5, minval=1, maxval=5, title="AvgType") //Momentum------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ tmolength = input(45, title="Momentum Length") calcLength = input(12, title="Momentum Calc length") smoothLength = input(9, title="Momentum Smooth length") //INDICATORS ============================================================================================================================================================================================================================================================== //ADX---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- calcADX(_len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, _len) _plus = fixnan(100 * rma(plusDM, _len) / truerange) _minus = fixnan(100 * rma(minusDM, _len) / truerange) sum = _plus + _minus _adx = 100 * rma(abs(_plus - _minus) / (sum == 0 ? 1 : sum), _len) [_plus,_minus,_adx] calcADX_Masanakamura(_len) => SmoothedTrueRange = 0.0 SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementMinus = 0.0 TrueRange = max(max(high - low, abs(high - nz(close[1]))), abs(low - nz(close[1]))) DirectionalMovementPlus = high - nz(high[1]) > nz(low[1]) - low ? max(high - nz(high[1]), 0) : 0 DirectionalMovementMinus = nz(low[1]) - low > high - nz(high[1]) ? max(nz(low[1]) - low, 0) : 0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1]) /_len) + TrueRange SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1]) / _len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1]) / _len) + DirectionalMovementMinus DIP = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIM = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = abs(DIP-DIM) / (DIP+DIM)*100 adx = sma(DX, _len) [DIP,DIM,adx] [DIPlusC,DIMinusC,ADXC] = calcADX(ADX_len) [DIPlusM,DIMinusM,ADXM] = calcADX_Masanakamura(ADX_len) DIPlus = ADX_options == "CLASSIC" ? DIPlusC : DIPlusM DIMinus = ADX_options == "CLASSIC" ? DIMinusC : DIMinusM ADX = ADX_options == "CLASSIC" ? ADXC : ADXM ADX_color = DIPlus > DIMinus and ADX > th ? color.green : DIPlus < DIMinus and ADX > th ? color.red : color.orange barcolor(color = Act_ADX ? ADX_color : na, title = "ADX") //Range Filter--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- out = 0., cma = 0., cts = 0. Var = variance(src,length0)*mult sma = sma(src,length0) secma = pow(nz(sma - cma[1]),2) sects = pow(nz(src - cts[1]),2) ka = Var < secma ? 1 - Var/secma : 0 kb = Var < sects ? 1 - Var/sects : 0 cma := ka*sma+(1-ka)*nz(cma[1],src) cts := kb*src+(1-kb)*nz(cts[1],src) css = cts > cma ? color.green : color.red a = plot(cts,"CTS",color.red,2,transp=0) b = plot(cma,"CMA",color.green,2,transp=0) fill(a,b,color=css,transp=80) rangegood = cts > cma rangebad = cts < cma //SAR------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- psar = sar(start, increment, maximum) dir = psar < close ? 1 : -1 psarColor = dir == 1 ? color.green : color.red psarPlot = plot(psar, title="PSAR", style=plot.style_circles, linewidth=width, color=psarColor, transp=0) var color longColor = color.green var color shortColor = color.red sargood = dir ==1 sarbad = dir ==-1 //RSI--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- up_3 = rma(max(change(src_3), 0), len_3) down_3 = rma(-min(change(src_3), 0), len_3) rsi_3 = down_3 == 0 ? 100 : up_3 == 0 ? 0 : 100 - (100 / (1 + up_3 / down_3)) rsiob = (rsi_3 < 70) rsios = (rsi_3 > 30) //TWAP Trend -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- res = resolution != "0" ? resolution : timeframe.period weight = barssince(change(security(syminfo.tickerid, res, time, lookahead=barmerge.lookahead_on))) price = 0. price:= weight == 0 ? src : src + nz(price[1]) twap = price / (weight + 1) ma_ = smoothing < 2 ? twap : sma(twap, smoothing) bullish = iff(smoothing < 2, src >= ma_, src > ma_) disposition = bullish ? color.lime : color.red basis = plot(src, "OHLC4", disposition, linewidth=1, transp=100) work = plot(ma_, "TWAP", disposition, linewidth=2, transp=20) fill(basis, work, disposition, transp=65) //JMA------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ jsa = (src0 + src0[lengths]) / 2 sig = src0 > jsa ? 1 : src0 < jsa ? -1 : 0 jsaColor = sig > 0 ? color.lime : sig < 0 ? color.red : color.orange plot(jsa, color=jsaColor, linewidth=2) jmagood = sig > 0 jmabad = sig < 0 //MACD------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ fast_ma = ema(src, fast_length) slow_ma = ema(src, slow_length) macd = fast_ma - slow_ma signal = sma(macd, signal_length) macdgood = macd > signal macdbad = macd < signal //Volume Delta ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- bullPower = iff(close < open, iff(close[1] < open, max(high - close[1], close - low), max(high - open, close - low)), iff(close > open, iff(close[1] > open, high - low, max(open - close[1], high - low)), iff(high - close > close - low, iff(close[1] < open, max(high - close[1], close - low), high - open), iff(high - close < close - low, iff(close[1] > open, high - low, max(open - close[1], high - low)), iff(close[1] > open, max(high - open, close - low), iff(close[1] < open, max(open - close[1], high - low), high-low)))))) bearPower = iff(close < open, iff(close[1] > open, max(close[1] - open, high - low), high - low), iff(close > open, iff(close[1] > open, max(close[1] - low, high - close), max(open - low, high - close)), iff(high - close > close - low, iff(close[1] > open, max(close[1] - open, high - low), high - low), iff(high - close < close - low, iff(close[1] > open, max(close[1] - low, high - close), open - low), iff(close[1] > open, max(close[1] - open, high - low), iff(close[1] < open, max(open - low, high - close), high - low)))))) bullVolume = (bullPower / (bullPower + bearPower)) * volume bearVolume = (bearPower / (bullPower + bearPower)) * volume delta = bullVolume - bearVolume cvd = cum(delta) cvdMa = sma(cvd, periodMa) deltagood = cvd > cvdMa deltabad = cvd < cvdMa //Volume weight------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ getMA0(length) => maPrice = ema(volume, length) if maType == "SMA" maPrice := sma(volume, length) if maType == "HMA" maPrice := hma(volume, length) if maType == "WMA" maPrice := wma(volume, length) if maType == "DEMA" e1 = ema(volume, length) e2 = ema(e1, length) maPrice := 2 * e1 - e2 maPrice ma = getMA0(maLength) rvol = volume / ma volumegood = volume > rvolTrigger * ma //MA---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ma5 = sma(close, 5) ma10 = sma(close, 10) ma30 = sma(close, 30) magood = ma5 > ma30 mabad = ma5 < ma30 simplema = sma(src,length) exponentialma = ema(src,length) hullma = wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length))) weightedma = wma(src, length) volweightedma = vwma(src, length) avgval = matype==1 ? simplema : matype==2 ? exponentialma : matype==3 ? hullma : matype==4 ? weightedma : matype==5 ? volweightedma : na MA_speed = (avgval / avgval[1] -1 ) *100 masgood = MA_speed > 0 masbad = MA_speed < 0 //Momentum----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- data = 0 for i = 1 to tmolength-1 if close > open[i] data := data + 1 if close < open[i] data := data - 1 EMA5 = ema(data, calcLength) Main = ema(EMA5, smoothLength) Signal = ema(Main, smoothLength) momentumgood = Main > Signal momentumbad = Main < Signal //STRATEGY=============================================================================================================================================================================================================================================================== Long = (DIPlus > DIMinus and ADX > th) and volumegood and sargood and rsiob and macdgood and deltagood and magood and masgood and bullish and jmagood and rangegood and momentumgood Short = (DIPlus < DIMinus and ADX > th) and volumegood and sarbad and rsios and macdbad and deltabad and mabad and masbad and jmabad and rangebad and momentumbad //BACKTESTING========================================================================================================================================================================================================================== // ————— Backtest input Act_BT = input(true, title = "BACKTEST", type = input.bool) backtest_time = input(180, title ="BACKTEST DAYS", type = input.integer, minval = 1)*24*60*60*1000 entry_Type = input("% EQUITY", title = "ENTRY TYPE", options = ["CONTRACTS","CASH","% EQUITY"]) et_Factor = (entry_Type == "CONTRACTS") ? 1 : (entry_Type == "% EQUITY") ? (100/(strategy.equity/close)) : close //Signals---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // SL AND TP----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- stopPer = input(3.6, title='Stop Loss % [plotshape]', type=input.float) / 100 takePer = input(0.8, title='Take Profit % [plotshape]', type=input.float) / 100 long_short = 0 long_last = Long and (nz(long_short[1]) == 0 or nz(long_short[1]) == -1) short_last = Short and (nz(long_short[1]) == 0 or nz(long_short[1]) == 1) long_short := long_last ? 1 : short_last ? -1 : long_short[1] longPrice = valuewhen(long_last, close, 0) shortPrice = valuewhen(short_last, close, 0) longStop = longPrice * (1 - stopPer) shortStop = shortPrice * (1 + stopPer) longTake = longPrice * (1 + takePer) shortTake = shortPrice * (1 - takePer) //plot lines --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- plotshape(long_short==1 ? longTake : na, style=shape.cross, color=color.gray, location=location.absolute ) plotshape(long_short==-1 ? shortTake : na, style=shape.cross, color=color.gray, location=location.absolute ) longBar1 = barssince(long_last) longBar2 = longBar1 >= 1 ? true : false shortBar1 = barssince(short_last) shortBar2 = shortBar1 >= 1 ? true : false Long_SL = long_short==1 and longBar2 and low < longStop Short_SL = long_short==-1 and shortBar2 and high > shortStop Long_TP = long_short==1 and longBar2 and high > longTake Short_TP = long_short==-1 and shortBar2 and low < shortTake long_short := (long_short==1 or long_short==0) and longBar2 and (Long_SL or Long_TP) ? 0 : (long_short==-1 or long_short==0) and shortBar2 and (Short_SL or Short_TP) ? 0 : long_short last_long_cond = Long and long_last last_short_cond = Short and short_last //plotshapes--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- plotshape(last_long_cond, title="Long x1", color=color.blue, style=shape.triangleup, location=location.belowbar, size=size.small, textcolor=color.white, text="Long" , transp=1) plotshape(last_short_cond, title="Short x1", color=color.red, style=shape.triangledown, location=location.abovebar, size=size.tiny, textcolor=color.white, text="Short" ,transp=1) plotshape(Long_SL, location=location.belowbar, color=color.black, size=size.tiny , text="SL", textcolor=color.fuchsia) plotshape(Short_SL, location=location.abovebar, color=color.black, size=size.tiny , text="SL", textcolor=color.fuchsia) plotshape(Long_TP,style=shape.triangledown, location=location.abovebar, color=color.gray, size=size.tiny , text="TP", textcolor=color.red) plotshape(Short_TP,style=shape.triangleup, location=location.belowbar, color=color.gray, size=size.tiny , text="TP", textcolor=color.green) if last_long_cond and Act_BT strategy.entry("L", strategy.long) if last_short_cond and Act_BT strategy.entry("S", strategy.short) per(pcnt) => strategy.position_size != 0 ? round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na) stoploss=input(title=" stop loss [BT]", defval=3.6, minval=0.01) los = per(stoploss) q=input(title=" qty percent", defval=100, minval=1) tp=input(title=" Take profit [BT]", defval=0.8, minval=0.01) strategy.exit("tp", qty_percent = q, profit = per(tp), loss = los) //By wielkieef