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.
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.
La stratégie présente les avantages suivants:
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.
Le double traitement de ligne EMA peut filtrer un peu de bruit pour rendre le signal plus clair.
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.
L'opération de stratégie est simple et facile à mettre en œuvre.
La stratégie comporte également certains risques:
L'indicateur OBV peut émettre des signaux erronés à un moment donné, auquel la stratégie peut subir des pertes.
Dans les transactions violentes, les lignes EMA ont un effet de retard, qui peut manquer le point d'entrée optimal.
Le paramètre de stop loss fixe peut être trop rigide pour s'adapter aux changements du marché.
Les contre-mesures:
Confirmez avec d'autres indicateurs pour éviter de faux signaux.
Optimiser les paramètres pour rendre les lignes EMA plus sensibles.
Réglez le stop-loss dynamique.
La stratégie peut être optimisée dans les aspects suivants:
Optimiser la combinaison de paramètres EMA pour trouver des paramètres de moyenne mobile mieux adaptés.
Augmenter d'autres indicateurs de confirmation du signal, tels que le MACD, le RSI, etc., pour améliorer la précision du signal.
Mettre en place un stop loss dynamique, qui peut ajuster le point stop loss en temps réel en fonction des fluctuations du marché.
Optimisation des combinaisons de paramètres pour trouver la meilleure combinaison de paramètres.
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)