Dieser Artikel erklärt detailliert eine quantitative Trendstrategie, die auf der Analyse des Volumenverhältnisses basiert und Kauf- und Verkaufssignale erzeugt, indem die gleitenden Durchschnitte des bullischen und der bärischen Volumens berechnet werden.
I. Strategische Logik
Der Kernindikator dieser Strategie ist das bullische und das bärische Volumen.
Berechnen Sie das tägliche Gesamtvolumen.
Bezeichnen Sie das Volumen als Bullenvolumen, wenn der Tagesbalken schließt, und Bärenvolumen, wenn er nach unten schließt.
Berechnen Sie gleitende Durchschnitte für die Bullen- und die Bärenmengen separat.
Ein Kaufsignal wird erzeugt, wenn der Bullenvolumen-MA über den Bärenvolumen-MA und umgekehrt geht.
Der Preisänderungsindikator wird auch als Filter verwendet und nimmt nur Geschäfte ein, wenn ein klarer Trend besteht.
Setzen Sie Stop-Loss und Gewinn auf Basis von Signalen, um Gewinne zu erzielen.
Durch die Beurteilung der Trendrichtung durch Volumenverhältnis und Filterung mit Preisänderungsrate kann die Signalqualität verbessert werden.
II. Vorteile der Strategie
Der größte Vorteil dieser Strategie ist die Verwendung von Volumen, um die Trendrichtung zu bestimmen, was eine der grundlegendsten Trendfolgemethoden ist.
Auch können Volumenindikatoren, da sie relativ empfindlich sind, Breakout-Signale frühzeitig widerspiegeln.
Schließlich verbessert das Filtern mit Preisänderungsrate auch die Signalqualität.
III. Potenzielle Risiken
Während die Strategie Vorteile hat, sollten für den Live-Handel folgende Risiken berücksichtigt werden:
Erstens müssen die Parameter für die Volumenindikatoren umsichtig festgelegt werden, um falsche Signale zu vermeiden.
Zweitens ist die Anwendung nur eines Indikators für Preiseverfälschungen anfällig, da andere Indikatoren zur Überprüfung kombiniert werden sollten.
Schließlich besteht die Gefahr, dass ein zu nah eingestellter Stop-Loss vorzeitig gestoppt wird.
IV. Zusammenfassung
Zusammenfassend wurde in diesem Artikel eine quantitative Strategie erklärt, bei der das Volumenverhältnis zur Bestimmung von Trends verwendet wird. Sie erzeugt Handelssignale, indem sie gleitende Durchschnitte von bullischem und bärischem Volumen berechnet. Die Strategie hat einen gewissen Grad an Führung und Sensibilität, muss aber mit anderen Indikatoren zur Überprüfung kombiniert werden. Darüber hinaus sind eine ordnungsgemäße Einstellung der Parameter und ein umsichtiges Geldmanagement auch der Schlüssel zu ihrer Lebensfähigkeit. Insgesamt bietet sie einen einzigartigen Ansatz, Volumen für die Trendanalyse zu verwenden, erfordert jedoch weitere Verbesserungen.
/*backtest start: 2023-08-14 00:00:00 end: 2023-09-13 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // Based on Volume Flow v3 indicator by oh92 strategy("Volume Flow 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 maType = input(title="Moving Average Type", options=["Simple", "Exponential", "Double Exponential"], defval="Simple") length = input(6, title="MA Length") x = input(3.1, title="Factor For Breakout Candle") // Basic Volume Calcs // vol = volume bull = close>open?vol:0 bear = open>close?vol:0 // Double EMA Function // dema(src, len) => (2 * ema(src, len) - ema(ema(src, len), len)) // BULL Moving Average Calculation bullma = maType == "Exponential" ? ema(bull, length) : maType == "Double Exponential" ? dema(bull, length) : sma(bull, length) // BEAR Moving Average Calculation // bearma = maType == "Exponential" ? ema(bear, length) : maType == "Double Exponential" ? dema(bear, length) : sma(bear, length) ///////////// Rate Of Change ///////////// source = close roclength = input(12, minval=1) pcntChange = input(2, 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 = bullma > bearma and isMoving() short = bullma < bearma and isMoving() 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(2.0, title='Stop Loss %') / 100 tp_inp = input(900.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) 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("Long", strategy.long, when=long) strategy.entry("Short", strategy.short, when=short) strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0) strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0) ///////////// Plotting ///////////// bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80) bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30) plot(bullma, color=color.lime, linewidth=1, transp=0, title="Bull MA", transp=10) plot(bearma, color=color.red, linewidth=1, transp=0, title="Bear MA", transp=10)