
Die Strategie verwendet eine doppelte EMA-Gewinnlinie-Spanne, um die hohen und niedrigen OBV-Indikatoren in Abhängigkeit von der Richtung der Trends zu beurteilen. Die OBV-Indikatoren können die Beziehung zwischen Preis und Transaktionsvolumen besser widerspiegeln und die Absichten der Marktteilnehmer bestimmen, so dass sie für die Erfassung von Markttrends verwendet werden können. Die Strategie kombiniert mit der Indicator-Gleichbehandlung von Moving Averages, um Marktlärm effektiv zu filtern und die wichtigsten Trends zu erfassen.
Die Strategie basiert hauptsächlich darauf, ob der OBV-Indikator im Aufwärtstrend ist, um die Zeit für einen Mehrkopf-Eintritt zu beurteilen. Insbesondere wird der 6-Tage-EMA und der 24-Tage-EMA des OBV berechnet, die ein Mehrkopfsignal erzeugen, wenn der 6-Tage-EMA über den 24-Tage-EMA geht. Ebenso wird ein Leerkopfsignal erzeugt, wenn der 6-Tage-EMA unter dem 24-Tage-EMA geht.
Der Schlüssel zur Trendbeurteilung der Strategie liegt in der OBV-Anzeige. Die OBV-Anzeige spiegelt die kollektive Bereitschaft der Großkapitalisten wider und kann die Einstellung der Marktteilnehmer effektiv widerspiegeln. In Kombination mit der Bearbeitung von Moving Averages kann ein Teil des Rauschens ausgelöscht werden, wodurch das Signal klarer und zuverlässiger wird. Die Strategie verwendet schnelle EMA-Linien und langsame EMA-Linien, um Handelssignale zu erstellen, die Preisdaten ausgleichen können, während sie auch tendenzielle Veränderungen empfindlicher erfassen können.
Die Strategie hat folgende Vorteile:
Der OBV-Kennzeichen basiert auf der Anzahl der Transaktionen, was die Absichten der Marktteilnehmer deutlich erkennen lässt.
Die Doppel-EMA-Einheitlichkeitsbehandlung kann teilweise Geräusche ausfiltern und die Signale klarer machen.
Die Kombination aus schnellen und langsamen EMA-Linien ermöglicht die Gleichung der Preise und die Erfassung von Trendänderungen.
Die Strategie ist einfach zu handhaben und umzusetzen.
Die Strategie birgt auch einige Risiken:
Der OBV-Indikator gibt zu bestimmten Zeiten ein falsches Signal ab, bei dem die Strategie verlieren könnte.
In extremen Situationen kann es sein, dass die EMA-Linien mit Verzögerungen beschäftigt sind und die optimalen Eintrittspunkte verpasst werden.
Die festgelegte Stop-Loss-Einstellung ist möglicherweise zu starr und kann sich nicht an Veränderungen am Markt anpassen.
Gegenmaßnahmen:
In Kombination mit anderen Indikatoren wird die Bestätigung durchgeführt, um falsche Signale zu vermeiden.
Optimierung der Parameter-Einstellungen, um EMA-Linien empfindlicher zu machen.
Dynamische Verlustlösung eingestellt.
Die Strategie kann in folgenden Richtungen optimiert werden:
Optimieren Sie die EMA-Parameterkombination, um die passendsten Mittellinienparameter zu finden.
Hinzufügen anderer Indikatoren zur Signalbestätigung, wie MACD, RSI usw., um die Signalgenauigkeit zu verbessern.
Ein dynamischer Stop-Loss, der den Stop-Loss-Punkt in Echtzeit an die Marktbewegungen anpasst.
Optimierung der Parameterkombinationen, um die optimale Parameterkombination zu finden
Die Strategie ist insgesamt eine einfache und zuverlässige Trendverfolgungsstrategie. Sie kombiniert OBV-Indikatoren und eine doppelte EMA-Gleichlinie, um eine Trendbeurteilung zu realisieren. Der Vorteil ist die einfache Bedienung, die Signalklarheit und die Möglichkeit, die Trends effektiv zu verfolgen. Der Nachteil ist, dass falsche Signale auftreten können, und die EMA-Linie wird verzögert.
/*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)