EMA des prix avec optimisation stochastique basée sur l'apprentissage automatique

Auteur:ChaoZhang est là., Date: 2024-01-26 14:57:08 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie combine la moyenne mobile lisse avec l'indicateur stochastique pour saisir plus d'opportunités dans les tendances. Elle utilise principalement deux moyennes mobiles exponentielles avec des périodes différentes pour générer des signaux de négociation, ainsi que le croisement de la ligne K et de la ligne D dans l'indicateur stochastique pour la sélection du moment d'entrée, afin d'obtenir une plus grande rentabilité dans les tendances.

Principe de stratégie

La stratégie utilise des moyennes mobiles lisses de 12 périodes et de 26 périodes. Lorsque la ligne rapide traverse au-dessus de la ligne lente du bas, allez long. Lorsque la ligne rapide traverse au-dessous de la ligne lente du haut, allez court. Pour filtrer les faux signaux, il faut que les lignes rapides et lentes soient dans le même sens, la ligne rapide au-dessus de la ligne lente pour le long, et la ligne rapide au-dessous de la ligne lente pour le court.

Le croisement de la ligne K et de la ligne D dans l'indicateur stochastique est utilisé pour la sélection du moment d'entrée. Lorsque la ligne K traverse au-dessus de la ligne D en dessous de la ligne de surachat, passez long. Lorsque la ligne K traverse au-dessous de la ligne D en haut de la ligne de survente, passez court.

La moyenne mobile fluide détermine la direction de la tendance, tandis que l'indicateur stochastique filtre le bruit et sélectionne le moment de l'entrée.

Les avantages de la stratégie

  • La moyenne mobile en soi a la caractéristique de suivre la tendance, facile à suivre les tendances
  • Utiliser Stochastique pour filtrer le bruit et améliorer la rentabilité
  • La combinaison d'AM rapides et lents permet d'entrer lorsque l'AM rapide se transforme en AM lent, ce qui permet d'obtenir un meilleur rapport risque-rendement
  • Le croisement de la ligne K et de la ligne D permet une optimisation supplémentaire du temps

Par conséquent, cette stratégie pourrait suivre la tendance de manière sélective pour saisir les opportunités et obtenir une plus grande rentabilité.

Analyse des risques

  • Risque élevé de sortie prématurée à court terme. Les signaux peuvent être refusés ou piégés lorsque l'AM rapide recule vers l'AM lent
  • Comme il suit la tendance, il ne peut pas s'adapter rapidement à un renversement drastique de tendance, ce qui entraîne des pertes importantes.

Pour réduire ces risques, nous pourrions définir un stop loss ou adopter des paramètres MA plus modérés.

Directions d'optimisation

La stratégie pourrait être encore optimisée par les aspects suivants:

  1. Testez différentes combinaisons de paramètres MA pour trouver le paramètre optimal
  2. Tester différentes combinaisons de paramètres stochastiques
  3. Ajouter une stratégie de stop loss
  4. Ajouter un stop loss dynamique basé sur la volatilité
  5. Optimisation des paramètres d'essai pour différents produits et périodes
  6. Utiliser des algorithmes d'apprentissage automatique pour optimiser les paramètres

En testant différentes combinaisons de paramètres, de meilleurs paramètres pourraient être trouvés.

Conclusion

La stratégie intègre les atouts de la moyenne mobile lisse et du stochastique pour le suivi des tendances, tout en sélectionnant un meilleur moment d'entrée. Elle est facile à utiliser, avec un risque contrôlable et une grande valeur pratique.


/*backtest
start: 2024-01-18 00:00:00
end: 2024-01-25 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author SoftKill

strategy(title="Price EMA with stock", shorttitle="EMA STOCH", overlay=true)
src = input(title="Source", type=input.source, defval=close)

src_0 = src[0]
src_1 = src[1]
src_2 = src[2]
src_3 = src[3]
src_4 = src[4]

len50 = input(50, minval=1, title="Length")
src50 = input(close, title="Source")
out50 = ema(src50, len50)
len100 = input(100)
src100 = input(close, title="Source")
out100 = ema(src100, len100)

len1 = input(1, minval=1, title="Length")
src1 = input(close, title="Source")
out1 = sma(src1, len1)

length = input(5, minval=1)
OverBought = input(80)
OverSold = input(20)
smoothK = 3
smoothD = 3

k = sma(stoch(close, high, low, length), smoothK)
d = sma(k, smoothD)
cu = crossover(k,OverSold)
co = crossunder(k,OverBought)

sma_down = crossunder(out1, out50)
sma_up = crossover(out1,out50)

//if (not na(k) and not na(d))
  //  if (co and k < OverSold)
    //    strategy.entry("StochLE", strategy.long, comment="StochLE")
    //if (cu and k > OverBought)
     //   strategy.entry("StochSE", strategy.short, comment="StochSE")

crossCandle_4 = crossover(src[4],out50)
crossCandleUnder_4= cross(src[4],out50)
crossCandle_3 = crossover(src[3],out50)
crossCandleUnder_3= crossunder(src[3],out50)
crossCandle_2 = crossover(src[2],out50)
crossCandleUnder_2= crossunder(src[2],out50)
crossCandle_1 = crossover(src[1],out50)
crossCandleUnder_1= crossunder(src[1],out50)
crossCandle_0 = crossover(src[0],out50)
crossCandleUnder_0= crossunder(src[0],out50)

conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0)
conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0)

touch4 = (cross(low[4],out50) or cross(high[4],out50))
touch3 = (cross(low[3],out50) or cross(high[3],out50))
touch2 = (cross(low[2],out50) or cross(high[2],out50))
touch1 = (cross(low[1],out50) or cross(high[1],out50))

touch = touch1 or touch2 or touch3 or touch4

//and sma_up
//and sma_down

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src_macd = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src_macd, fast_length) : ema(src_macd, fast_length)
slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)


// plot((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close >= out50 and  (cu) and out50 > out100 and hist>=0 , title="Buy", style=plot.style_columns, color=color.lime)
// plot((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close <= out50 and  (co) and out50< out100 and hist<=0 , title="sell", style=plot.style_columns, color=color.red)


long_cond = ((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close > out50 and  (cu) and out50 > out100 and hist>=0)
short_cond = ((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close < out50 and  (co) and out50< out100 and hist<=0)

tp=input(0.1)
sl=input(0.1)

strategy.entry("long",strategy.long, when=long_cond)
strategy.entry("short",strategy.short, when=short_cond)

strategy.exit("X_long", "long", profit=close * tp / syminfo.mintick,  loss=close * sl / syminfo.mintick, when=touch  )
strategy.exit("x_short", "short",profit=close * tp / syminfo.mintick,loss=close * sl / syminfo.mintick,when = touch )

// //tp = input(0.0003, title="tp")
// tp = 0.0003
// //sl = input(1.0 , title="sl")
// sl = 1.0
// strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong")
// strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort")

Plus de