Ceci est mon BTCUSDTPERP 15 min bot Les meilleurs résultats sont sur BTCUSDTPERP sur binancefutures Les résultats dépendent des indicateurs de volume spécifiques qui fonctionnent le mieux sur binancefutures
Les robots de 15 minutes sont très rapides, c'est difficile de trouver une bonne configuration, à cause de 15 minutes de backtesting qui durent au moins 3-4 mois
Ce bot est spécifique, il a un très haut pourcentage de transactions rentables. Le bénéfice net est également très bon. Cependant, les robots de 15 minutes sont extrêmement difficiles à utiliser à long terme, alors j'ai fait les paramètres de déflouement que je peux.
Alors, Ce robot utilise 11 indicateurs différents:
ADX
Filtre à plage
SAR
Indice de résistance
Le TWAP
JMA
Le MACD
VOLUME DELTA
Poids du volume
- Je vous en prie. et le dernier pour les meilleurs résultats sur les graphiques qucik (15 min) j'ai décidé d' ajouter:
STOCH
ADX - - donne une vue solide de la tendance sans aucune trace d'escroquerie: Long seulement sur les barres vertes, Shorts seulement sur les barres rouges.
Filtre de gamme - cet indicateur permet de mieux voir les tendances, de définir les tendances, ce qui est important pour tous les pièges taureau/ours, ce qui est très utile en raison des tendances très variables.
SAR - Le SAR parabolique est un indicateur technique utilisé pour déterminer la direction du prix d'un actif, ainsi que pour attirer l'attention sur le moment où la direction du prix change.
Lorsque le RSI est suracheté, la stratégie n'ouvre pas de nouvelles positions longues, également lorsque le RSI est survendu, la stratégie n'ouvre pas de nouvelles positions courtes.
TWAP - a la même tâche que le filtre Range, est seulement pour une meilleure vue des tendances, définir les tendances.
JMA - L'indicateur Jurik Moving Average est l'un des moyens les plus sûrs d'assouplir les courbes de prix dans un délai minimum.
Le MACD (Moving Average Convergence Divergence) est un indicateur de dynamique qui montre la relation entre deux moyennes mobiles du prix d'un titre. Aujourd'hui, le MacD, tout comme la JMA, est nécessaire pour faire des robots rentables.
Volume Delta - Une approche cumulative du volume delta basée sur l'indicateur de balance taureau et ours de Vadim Gimelfarb publié dans le numéro d'octobre 2003 du magazine S&C. Ajustez la longueur de la moyenne mobile en fonction de vos besoins (symbole, échéancier, etc.)
Le poids du volume - est l'indicateur le plus important pour la stratégie, afin d'éviter les transactions ouvertes sur un graphique plat, de nouvelles transactions sont ouvertes après une forte barre de volume.
MA 5-10-30 - comme les précédents ceci est pour une meilleure vue des tendances, et de définir correctement les tendances, aussi Speed_MA sont utilisés pour prédire l'action future des prix.
Le stochastique est utile pour prédire les renversements de tendance. Il se concentre également sur la dynamique des prix et peut être utilisé pour identifier les niveaux de surachat et de survente
Vous allez bien.
test de retour
/*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