Tendance croisée de l' OBV EMA à la suite de la stratégie

Auteur:ChaoZhang est là., Date: 2024-02-20 à 15h35
Les étiquettes:

img

Résumé

Cette stratégie utilise le croisement des lignes EMA doubles de l'indicateur OBV pour déterminer la tendance de l'OBV, et prend des positions longues / courtes en fonction de la direction de la tendance.

Principe de stratégie

Cette stratégie utilise principalement si OBV est dans une tendance haussière pour déterminer le calendrier d'entrée longue. Plus précisément, elle calcule l'EMA de 6 jours et l'EMA de 24 jours d'OBV. Lorsque l'EMA de 6 jours franchit le niveau supérieur de l'EMA de 24 jours, un signal long est généré. De même, lorsque l'EMA de 6 jours franchit le niveau inférieur de l'EMA de 24 jours, un signal court est généré. En outre, la stratégie définit également un stop loss de 3%.

L'indicateur OBV reflète l'intention collective des gros fonds et peut refléter efficacement l'attitude des participants au marché. Combiné avec le traitement de la ligne moyenne mobile, un certain bruit peut être filtré pour rendre le signal plus clair et plus fiable.

Analyse des avantages

La stratégie présente les avantages suivants:

  1. L'indicateur OBV basé sur le volume des transactions permet de juger clairement de l'intention des participants au marché et le signal est plus fiable.

  2. Le double traitement de ligne EMA peut filtrer un peu de bruit pour rendre le signal plus clair.

  3. La combinaison de lignes EMA rapides et lentes peut prendre en compte à la fois l'assouplissement des prix et la capture des changements de tendance.

  4. L'opération de stratégie est simple et facile à mettre en œuvre.

Analyse des risques

La stratégie comporte également certains risques:

  1. L'indicateur OBV peut émettre des signaux erronés à un moment donné, auquel la stratégie peut subir des pertes.

  2. Dans les transactions violentes, les lignes EMA ont un effet de retard, qui peut manquer le point d'entrée optimal.

  3. Le paramètre de stop loss fixe peut être trop rigide pour s'adapter aux changements du marché.

Les contre-mesures:

  1. Confirmez avec d'autres indicateurs pour éviter de faux signaux.

  2. Optimiser les paramètres pour rendre les lignes EMA plus sensibles.

  3. Réglez le stop-loss dynamique.

Direction de l'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Optimiser la combinaison de paramètres EMA pour trouver des paramètres de moyenne mobile mieux adaptés.

  2. Augmenter d'autres indicateurs de confirmation du signal, tels que le MACD, le RSI, etc., pour améliorer la précision du signal.

  3. Mettre en place un stop loss dynamique, qui peut ajuster le point stop loss en temps réel en fonction des fluctuations du marché.

  4. Optimisation des combinaisons de paramètres pour trouver la meilleure combinaison de paramètres.

Conclusion

En général, cette stratégie est une stratégie de suivi de tendance relativement simple et fiable. Elle combine l'indicateur OBV et les lignes EMA doubles pour juger de la tendance. Les avantages sont un fonctionnement simple, des signaux clairs et la capacité de suivre efficacement les tendances. Les inconvénients sont les signaux erronés possibles et le retard du traitement de la ligne EMA.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("OBV EMA X 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.0)

/////////////// 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

/////////////// OBV /////////////// 
src = close
atr = atr(input(title="ATR Period", defval=3, minval=1))
atrmult = input(title="ATR Mult", defval=1, minval=0)
obv = cum(change(src) > 0 ? volume * (volume / atr) : change(src) < 0 ? -volume * (volume / atr) : 0 * volume / atr)
e1 = ema(obv, input(24))
e2 = ema(obv, input(6))

///////////////  Strategy  /////////////// 
long = crossover(e2, e1)
short = crossunder(e2, e1)

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])

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

//////////////// Stop loss /////////////// 
sl_inp = input(3.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

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)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
plot(e1, color = e1 > e1[1] ? color.lime : e1 < e1[1] ? color.red : color.white, linewidth = 2, offset = 0)
plot(e2, color = e2 > e2[1] ? color.lime : e2 < e2[1] ? color.red : color.white, linewidth = 1)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)

Plus de