Il s'agit d'une stratégie de rupture de dynamique relativement complexe qui intègre plusieurs indicateurs techniques pour le jugement et met en œuvre des ordres pyramidaux en plusieurs étapes dans différentes directions et phases pour atteindre l'objectif de l'échelle d'entrée et de sortie.
La stratégie combine principalement l'indicateur de dynamique MACD, l'indicateur de surachat et de survente RSI et les bandes de Bollinger pour un jugement directionnel. Lorsque la ligne MACD est supérieure à 0 et que le RSI est en dessous de la ligne de survente, c'est un signal long. Lorsque la ligne MACD est en dessous de 0 et que le RSI est au-dessus de la ligne de surachat, c'est un signal court. Elle intègre également la rupture des bandes de Bollinger sur le rail supérieur et inférieur pour une confirmation ultérieure des signaux de trading.
Dans la mise en œuvre spécifique, la stratégie juge d'abord la performance de la ligne MACD et du RSI pour confirmer les fondamentaux. Ensuite, en fonction de la rupture du rail supérieur et inférieur des bandes de Bollinger, elle prend des ordres pyramidaux de différentes tailles. En termes haussiers, elle sera progressivement longue avec une taille croissante près du rail inférieur des bandes de Bollinger. En termes baissiers, elle sera progressivement courte avec une taille croissante près du rail supérieur des bandes de Bollinger. En échelonnant dans et hors dans différentes directions et à différents prix, elle peut obtenir un plus grand profit cumulé.
Pendant ce temps, la stratégie suit également le prix le plus élevé et le plus bas pour définir un stop loss et un profit, en gérant les ordres en conséquence.
La combinaison de plusieurs indicateurs permet d'éviter une mauvaise appréciation d'un seul outil.
La mise à l'échelle avec plusieurs étapes peut amplifier la marge bénéficiaire.
La mise en place d'un stop loss et d'une prise de profit permet d'éviter les pertes liées à des pics élevés.
Un retrait contrôlable, pas beaucoup de pertes.
L'éclatement des bandes de Bollinger n'est pas fiable à 100%, il peut y avoir de faux signaux.
La pyramide par étapes nécessite une compréhension précise du rythme du marché, les retours rapides peuvent entraîner d'énormes pertes.
Il est nécessaire de surveiller la liquidité des instruments de négociation, une faible liquidité ne convient pas à la pyramide de grands lots.
Les coûts tels que le spread et la commission doivent être pris en compte dans le trading en direct.
Peut tester différentes combinaisons de paramètres comme la période de Bollinger, le multiplicateur de STD, les paramètres RSI pour trouver l'optimum.
Peut explorer d'autres techniques de mise à l'échelle comme la fraction fixe, le critère de Kelly, etc.
Peut mettre en œuvre une optimisation dynamique des paramètres avec l'apprentissage automatique, etc.
Peut incorporer plus de sources de données comme l'analyse des sentiments, les données sociales pour aider le jugement.
Peut explorer les spreads de calendrier à terme pour l'arbitrage, élargir encore l'espace de profit.
Cette stratégie utilise de manière complète plusieurs indicateurs techniques, prend la pyramide par étapes, gère les risques avec stop loss et take profit, ce qui en fait une tendance relativement complète suivant la stratégie. Mais les risques tels que les faux signaux et les retours rapides doivent être alertés, le bon ajustement des paramètres et de la taille de la position peut conduire à des rendements excédentaires plus stables.
/*backtest start: 2022-10-11 00:00:00 end: 2023-10-17 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy(title="Incremental Order size +", shorttitle="Strategy", overlay=true, default_qty_value=1, pyramiding=10) //Heiken Ashi isHA = input(false, "HA Candles", bool) //MACD fastLength = 12 slowlength = 26 MACDLength = 9 MACD = ema(close, fastLength) - ema(close, slowlength) aMACD = ema(MACD, MACDLength) delta = MACD - aMACD //Bollinger Bands Exponential src = open len = 18 e = ema(src,len) evar = (src - e)*(src - e) evar2 = (sum(evar,len))/len std = sqrt(evar2) Multiplier = input(3, minval = 0.01, title = "# of STDEV's") upband = e + (Multiplier * std) dnband = e - (Multiplier * std) //EMA ema3 = ema(close, 3) //RSIplot length = 45 overSold = 90 overBought = 10 price = close vrsi = rsi(price, length) notna = not na(vrsi) macdlong = crossover(delta, 0) macdshort = crossunder(delta, 0) rsilong = notna and crossover(vrsi, overSold) rsishort = notna and crossunder(vrsi, overBought) lentt = input(14, "Pivot Length") //The length defines how many periods a high or low must hold to be a "relevant pivot" h = highest(lentt) //The highest high over the length h1 = dev(h, lentt) ? na : h //h1 is a pivot of h if it holds for the full length hpivot = fixnan(h1) //creates a series which is equal to the last pivot l = lowest(lentt) l1 = dev(l, lentt) ? na : l lpivot = fixnan(l1) //repeated for lows last_hpivot = h1 ? time : nz(last_hpivot[1]) last_lpivot = l1 ? time : nz(last_lpivot[1]) long_time = last_hpivot > last_lpivot ? 0:1 //FIBS z = input(100, "Z-Index") p_offset= 2 transp = 60 a=(lowest(z)+highest(z))/2 b=lowest(z) c=highest(z) fibonacci = input(0, "Fibonacci") / 100 //Fib Calls fib0 = (((hpivot - lpivot)* fibonacci) + lpivot) fib1 = (((hpivot - lpivot)*.21) + lpivot) fib2 = (((hpivot - lpivot)*.3) + lpivot) fib3 = (((hpivot - lpivot)*.5) + lpivot) fib4 = (((hpivot - lpivot)*.62) + lpivot) fib5 = (((hpivot - lpivot)*.7) + lpivot) fib6 = (((hpivot - lpivot)* 1.00) + lpivot) fib7 = (((hpivot - lpivot)* 1.27) + lpivot) fib8 = (((hpivot - lpivot)* 2) + lpivot) fib9 = (((hpivot - lpivot)* -.27) + lpivot) fib10 = (((hpivot - lpivot)* -1) + lpivot) //Heiken Ashi Candles data2 = isHA ? heikenashi(syminfo.tickerid) : syminfo.tickerid res5 = input("5", "Resolution") //HT Fibs hfib0 = security(data2, res5, fib0[1]) hfib1 = security(data2, res5, fib1[1]) hfib2 = security(data2, res5, fib2[1]) hfib3 = security(data2, res5, fib3[1]) hfib4 = security(data2, res5, fib4[1]) hfib5 = security(data2, res5, fib5[1]) hfib6 = security(data2, res5, fib6[1]) hfib7 = security(data2, res5, fib7[1]) hfib8 = security(data2, res5, fib8[1]) hfib9 = security(data2, res5, fib9[1]) hfib10 = security(data2, res5, fib10[1]) vrsiup = vrsi > vrsi[1] and vrsi[1] > vrsi[2] vrsidown = vrsi < vrsi[1] and vrsi[1] < vrsi[2] long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long2 = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short2 = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown reverseOpens = input(false, "Reverse Orders", bool) if (reverseOpens) tmplong = long long := short short := tmplong //Strategy ts = input(99999, "TS") tp = input(30, "TP") sl = input(10, "SL") last_long = long ? time : nz(last_long[1]) last_short = short ? time : nz(last_short[1]) in_long = last_long > last_short in_short = last_short > last_long long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long = long ? open : nz(last_open_long[1]) last_open_short = short ? open : nz(last_open_short[1]) last_open_long_signal = long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal = short_signal ? open : nz(last_open_short_signal[1]) last_high = not in_long ? na : in_long and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low = not in_short ? na : in_short and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) long_ts = not na(last_high) and high <= (last_high - ts) and high >= last_open_long_signal short_ts = not na(last_low) and low >= (last_low + ts) and low <= last_open_short_signal long_tp = high >= (last_open_long + tp) and long[1] == 0 short_tp = low <= (last_open_short - tp) and short[1] == 0 long_sl = low <= (last_open_long - sl) and long[1] == 0 short_sl = high >= (last_open_short + sl) and short[1] == 0 last_hfib_long = long_signal ? fib1 : nz(last_hfib_long[1]) last_hfib_short = short_signal ? fib5 : nz(last_hfib_short[1]) last_fib7 = long ? fib7 : nz(last_fib7[1]) last_fib10 = long ? fib10 : nz(last_fib10[1]) last_fib8 = short ? fib8 : nz(last_fib8[1]) last_fib9 = short ? fib9 : nz(last_fib9[1]) last_long_signal = long_signal ? time : nz(last_long_signal[1]) last_short_signal = short_signal ? time : nz(last_short_signal[1]) last_long_tp = long_tp ? time : nz(last_long_tp[1]) last_short_tp = short_tp ? time : nz(last_short_tp[1]) last_long_ts = long_ts ? time : nz(last_long_ts[1]) last_short_ts = short_ts ? time : nz(last_short_ts[1]) long_ts_signal = crossover(last_long_ts, last_long_signal) short_ts_signal = crossover(last_short_ts, last_short_signal) last_long_sl = long_sl ? time : nz(last_long_sl[1]) last_short_sl = short_sl ? time : nz(last_short_sl[1]) long_tp_signal = crossover(last_long_tp, last_long) short_tp_signal = crossover(last_short_tp, last_short) long_sl_signal = crossover(last_long_sl, last_long) short_sl_signal = crossover(last_short_sl, last_short) last_long_tp_signal = long_tp_signal ? time : nz(last_long_tp_signal[1]) last_short_tp_signal = short_tp_signal ? time : nz(last_short_tp_signal[1]) last_long_sl_signal = long_sl_signal ? time : nz(last_long_sl_signal[1]) last_short_sl_signal = short_sl_signal ? time : nz(last_short_sl_signal[1]) last_long_ts_signal = long_ts_signal ? time : nz(last_long_ts_signal[1]) last_short_ts_signal = short_ts_signal ? time : nz(last_short_ts_signal[1]) true_long_signal = long_signal and last_long_sl_signal > last_long_signal[1] or long_signal and last_long_tp_signal > last_long_signal[1] or long_signal and last_long_ts_signal > last_long_signal[1] true_short_signal = short_signal and last_short_sl_signal > last_short_signal[1] or short_signal and last_short_tp_signal > last_short_signal[1] or short_signal and last_short_ts_signal > last_short_signal[1] // strategy.entry("BLUE", strategy.long, when=long) // strategy.entry("RED", strategy.short, when=short) g = delta > 0 and vrsi < overSold and vrsiup r = delta < 0 and vrsi > overBought and vrsidown long1 = cross(close, fib1) and g and last_long_signal[1] > last_short_signal// and last_long_signal > long short1 = cross(close, fib5) and r and last_short_signal[1] > last_long_signal// and last_short_signal > short last_long1 = long1 ? time : nz(last_long1[1]) last_short1 = short1 ? time : nz(last_short1[1]) last_open_long1 = long1 ? open : nz(last_open_long1[1]) last_open_short1 = short1 ? open : nz(last_open_short1[1]) long1_signal = crossover(last_long1, last_long_signal) short1_signal = crossover(last_short1, last_short_signal) last_long1_signal = long1_signal ? time : nz(last_long1_signal[1]) last_short1_signal = short1_signal ? time : nz(last_short1_signal[1]) long2 = cross(close, fib2) and g and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short2 = cross(close, fib4) and r and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long2 = long2 ? time : nz(last_long2[1]) last_short2 = short2 ? time : nz(last_short2[1]) last_open_short2 = short2 ? open : nz(last_open_short2[1]) long2_signal = crossover(last_long2, last_long1_signal) and long1_signal==0 short2_signal = crossover(last_short2, last_short1_signal) and short1_signal==0 last_long2_signal = long2_signal ? time : nz(last_long2_signal[1]) last_short2_signal = short2_signal ? time : nz(last_short2_signal[1]) //Trade 4 long3 = cross(close, fib3) and g and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short3 = cross(close, fib3) and r and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long3 = long3 ? time : nz(last_long3[1]) last_short3 = short3 ? time : nz(last_short3[1]) last_open_short3 = short3 ? open : nz(last_open_short3[1]) long3_signal = crossover(last_long3, last_long2_signal) and long2_signal==0 short3_signal = crossover(last_short3, last_short2_signal) and short2_signal==0 last_long3_signal = long3_signal ? time : nz(last_long3_signal[1]) last_short3_signal = short3_signal ? time : nz(last_short3_signal[1]) //Trade 5 long4 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short4 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long4 = long4 ? time : nz(last_long4[1]) last_short4 = short4 ? time : nz(last_short4[1]) long4_signal = crossover(last_long4, last_long3_signal) and long2_signal==0 and long3_signal==0 short4_signal = crossover(last_short4, last_short3_signal) and short2_signal==0 and short3_signal==0 last_long4_signal = long4_signal ? time : nz(last_long4_signal[1]) last_short4_signal = short4_signal ? time : nz(last_short4_signal[1]) //Trade 6 long5 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short5 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long5 = long5 ? time : nz(last_long5[1]) last_short5 = short5 ? time : nz(last_short5[1]) long5_signal = crossover(last_long5, last_long4_signal) and long3_signal==0 and long4_signal==0 short5_signal = crossover(last_short5, last_short4_signal) and short3_signal==0 and short4_signal==0 last_long5_signal = long5_signal ? time : nz(last_long5_signal[1]) last_short5_signal = short5_signal ? time : nz(last_short5_signal[1]) //Trade 7 long6 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short6 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long6 = long6 ? time : nz(last_long6[1]) last_short6 = short6 ? time : nz(last_short6[1]) long6_signal = crossover(last_long6, last_long5_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0 short6_signal = crossover(last_short6, last_short5_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0 last_long6_signal = long6_signal ? time : nz(last_long6_signal[1]) last_short6_signal = short6_signal ? time : nz(last_short6_signal[1]) //Trade 8 long7 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short7 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long7 = long7 ? time : nz(last_long7[1]) last_short7 = short7 ? time : nz(last_short7[1]) long7_signal = crossover(last_long7, last_long6_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0 and long6_signal==0 short7_signal = crossover(last_short7, last_short6_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0 and short6_signal==0 last_long7_signal = long7_signal ? time : nz(last_long7_signal[1]) last_short7_signal = short7_signal ? time : nz(last_short7_signal[1]) //Trade 9 long8 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short8 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long8 = long8 ? time : nz(last_long8[1]) last_short8 = short8 ? time : nz(last_short8[1]) long8_signal = crossover(last_long8, last_long7_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0 and long6_signal==0 and long7_signal==0 short8_signal = crossover(last_short8, last_short7_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0 and short6_signal==0 and short7_signal==0 last_long8_signal = long8_signal ? time : nz(last_long8_signal[1]) last_short8_signal = short8_signal ? time : nz(last_short8_signal[1]) //Trade 10 long9 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short9 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long9 = long9 ? time : nz(last_long9[1]) last_short9 = short9 ? time : nz(last_short9[1]) long9_signal = crossover(last_long9, last_long8_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0 and long6_signal==0 and long7_signal==0 and long8_signal==0 short9_signal = crossover(last_short9, last_short8_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0 and short6_signal==0 and short7_signal==0 and short8_signal==0 last_long9_signal = long9_signal ? time : nz(last_long9_signal[1]) last_short9_signal = short9_signal ? time : nz(last_short9_signal[1]) strategy.entry("Long", strategy.long, qty=1, when=long_signal) strategy.entry("Short", strategy.short, qty=1, when=short_signal) strategy.entry("Long", strategy.long, qty=2, when=long1_signal) strategy.entry("Short1", strategy.short, qty=2, when=short1_signal) strategy.entry("Long", strategy.long, qty=4, when=long2_signal) strategy.entry("Short2", strategy.short, qty=4, when=short2_signal) strategy.entry("Long", strategy.long, qty=8, when=long3_signal) strategy.entry("Short3", strategy.short, qty=8, when=short3_signal) strategy.entry("Long", strategy.long, qty=5, when=long4_signal) strategy.entry("Short", strategy.short, qty=5, when=short4_signal) strategy.entry("Long", strategy.long, qty=6, when=long5_signal) strategy.entry("Short", strategy.short, qty=6, when=short5_signal) strategy.entry("Long", strategy.long, qty=7, when=long6_signal) strategy.entry("Short", strategy.short, qty=7, when=short6_signal) strategy.entry("Long", strategy.long, qty=8, when=long7_signal) strategy.entry("Short", strategy.short, qty=8, when=short7_signal) strategy.entry("Long", strategy.long, qty=9, when=long8_signal) strategy.entry("Short", strategy.short, qty=9, when=short8_signal) strategy.entry("Long", strategy.long, qty=10, when=long9_signal) strategy.entry("Short", strategy.short, qty=10, when=short9_signal) short1_tp = low <= (last_open_short1 - tp) and short1[1] == 0 short2_tp = low <= (last_open_short2 - tp) and short2[1] == 0 short3_tp = low <= (last_open_short3 - tp) and short3[1] == 0 short1_sl = high >= (last_open_short1 + sl) and short1[1] == 0 short2_sl = high >= (last_open_short2 + sl) and short2[1] == 0 short3_sl = high >= (last_open_short3 + sl) and short3[1] == 0 close_long = cross(close, fib6) close_short = cross(close, fib0) // strategy.close("Long", when=close_long) // strategy.close("Long", when=long_tp) // strategy.close("Long", when=long_sl) // strategy.close("Short", when=long_signal) // strategy.close("Short1", when=long_signal) // strategy.close("Short2", when=long_signal) // strategy.close("Short3", when=long_signal) strategy.close("Short", when=short_tp) strategy.close("Short1", when=short1_tp) strategy.close("Short2", when=short2_tp) strategy.close("Short3", when=short3_tp) strategy.close("Short", when=short_sl) strategy.close("Short1", when=short1_sl) strategy.close("Short2", when=short2_sl) strategy.close("Short3", when=short3_sl)