Trend nach der auf der Volumenquote basierenden Strategie

Schriftsteller:ChaoZhang, Datum: 14.9.2023
Tags:

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.

  1. Berechnen Sie das tägliche Gesamtvolumen.

  2. Bezeichnen Sie das Volumen als Bullenvolumen, wenn der Tagesbalken schließt, und Bärenvolumen, wenn er nach unten schließt.

  3. Berechnen Sie gleitende Durchschnitte für die Bullen- und die Bärenmengen separat.

  4. Ein Kaufsignal wird erzeugt, wenn der Bullenvolumen-MA über den Bärenvolumen-MA und umgekehrt geht.

  5. Der Preisänderungsindikator wird auch als Filter verwendet und nimmt nur Geschäfte ein, wenn ein klarer Trend besteht.

  6. 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)

Mehr