Tendance à la suite d'une stratégie basée sur le stochastique et l'ICC

Auteur:ChaoZhang est là., Date: 2023-11-22 16:23:31 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie combine l'indicateur stochastique et l'indicateur CCI pour identifier la direction de la tendance, et utilise l'indicateur de taux de changement pour filtrer les tendances liées à la plage, afin de suivre la tendance.

La logique de la stratégie

  1. L'indicateur stochastique évalue les tendances haussières et baissières
    La croix d'or du stochastique est le signal d'achat, tandis que la croix de la mort est le signal de vente
  2. L'indicateur CCI détermine la direction de la tendance L'indice CCI supérieur à 0 indique un marché haussier, tandis qu'un marché baissier inférieur à 0
  3. Indicateur de filtrage de tendance liée à la fourchette
    Définir les paramètres du taux de variation pour juger si le prix est dans une tendance active
  4. Règles d'entrée et de sortie Entrée longue: Croix dorée stochastique et CCI > 0 et tendance active Entrée courte: Croix de mort stochastique & CCI < 0 & tendance active Exit de stop-loss: 3% pour le côté long et le côté court

Analyse des avantages

  1. La combinaison de Stochastique et CCI améliore l'exactitude du jugement de tendance
  2. Le taux de change filtre les tendances de la fourchette, évitant les transactions invalides
  3. Traitement à la fois long et court, capable de détecter différents types de tendances
  4. L'entrée de la rupture est opportune pour la tendance
  5. Un stop loss strict empêche les pertes énormes et contrôle le risque

Analyse des risques

  1. Un mauvais réglage des paramètres peut conduire à une stratégie trop conservatrice ou agressive
  2. L'effet des indicateurs est limité, il peut échouer dans des conditions de marché extrêmes
  3. L'entrée de la rupture passe à côté de la phase initiale des tendances, renonçant à une partie des bénéfices
  4. L'échec du contrôle des risques en cas d'arrêt trop serré ou trop large

Directions d'optimisation

  1. Optimisation des paramètres pour trouver la combinaison optimale
  2. Ajouter plus d'indicateurs de tendance pour améliorer l'efficacité
  3. Utiliser le stop loss de suivi ou le stop loss basé sur le temps pour réduire les risques de violation du stop loss
  4. Ajouter des indicateurs de risque tels que le tirage maximal pour contrôler complètement le risque

Résumé

Cette stratégie évalue la direction de la tendance en intégrant les indicateurs stochastiques, CCI et de taux de changement, et capte les opportunités de tendance avec le suivi de la rupture.


/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Stochastic CCI BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// CCI ///////////// 
src = close
ccilength = input(13, minval=1, title="CCI Length")
c=cci(src, ccilength)

///////////// Stochastic ///////////// 
len = input(19, minval=1, title="RSI Length")
lenema = input(12, minval=1, title="RSI-EMA Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
out = ema(rsi, lenema)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = out > out[1] and isMoving() and c > 0
short = out < out[1] and isMoving() and c < 0

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
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_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(3.0, title='Stop Loss %') / 100 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long_signal)
    strategy.entry("S", strategy.short, when=short_signal)
    strategy.exit("L Ex", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S Ex", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=80)
plot(out, color = out > out[1] ? color.lime:color.red, linewidth = 2, title="Stoch")
plot(c, color = c > 0 ? color.lime:color.red, linewidth = 2, title="CCI")

Plus de