In diesem Artikel wird eine quantitative Strategie beschrieben, die auf der Grundlage der Transaktionsrate die Richtung der Tendenz bestimmen soll. Diese Strategie erzeugt ein Kauf- und Verkaufssignal durch die Berechnung einer überflüssigen Transaktionsmittellinie.
Der Kern der Strategie ist die Überflüssigkeit. Die Berechnungsmethoden sind wie folgt:
Berechnen Sie das Tagesvolumen.
Wenn die K-Linie als mehrspätig beurteilt wird, wird die Transaktionsmenge als mehrspätige Transaktionsmenge (“Bull Volume”) aufgezeichnet.
Wenn die K-Linie als leerer Kopf beurteilt wird, wird die Transaktionsmenge als leeres Transaktionsvolumen (“Bear Volume”) notiert.
Der bewegliche Durchschnitt der Transaktionen mit mehrfachen und leeren Quadern wird berechnet.
Wenn ein Mehrseitiger Moving Average über einen leeren Moving Average fährt, erzeugt dies ein Kaufsignal; umgekehrt erzeugt es ein Verkaufsignal.
Der Markt ist in der Lage, die Preise zu filtern und nur dann zu handeln, wenn eine eindeutige Tendenz zu beobachten ist.
Ein Stop-Loss-Stopp-Punkt, um den Gewinn zu verriegeln.
Auf diese Weise kann die Trendrichtung anhand des freien Anteils an der Transaktionsmenge beurteilt und die Signalqualität verbessert werden. Die Stop-Loss-Stopp-Einstellung ermöglicht auch einen kontrollierbaren Verlust pro Transaktion.
Der größte Vorteil dieser Strategie besteht darin, dass der Umsatz eine der grundlegendsten Methoden zur Bestimmung des Trends ist. Der Umsatz spiegelt das Verhalten der Marktteilnehmer wider.
Darüber hinaus ist der Volumenindikator auch ein viel sensiblerer Weg, um einen Durchbruch zu erkennen. Im Vergleich zu einem Preisindikator kann ein Trendwechsel früher erfasst werden.
Schließlich verbesserte sich die Signalqualität durch die Filterung in Verbindung mit den Preisänderungsindikatoren.
Obwohl diese Strategie einige Vorteile hat, ist auf die folgenden Risiken auf der Plattform zu achten:
Zunächst ist es notwendig, die Parameter für die Transaktionsdatenbank sorgfältig einzustellen, um falsche Signale zu vermeiden.
Zweitens, der Preis, der nur auf einen Indikator angewiesen ist, wird leicht durchbrochen. Es sollte eine Kombination aus mehreren Indikatoren überprüft werden.
Schließlich besteht die Gefahr, dass die Stop-Loss-Einstellung zu nahe kommt, was dazu führen kann, dass die Stop-Loss-Einstellung durchbrochen wird.
Vier Inhalte, Zusammenfassung
Dieser Artikel beschreibt eine quantitative Strategie, bei der Trends anhand von Transaktionsquoten beurteilt werden können. Sie erzeugt Handelssignale durch die Berechnung von Multivariate-Transaktionsmittellinien. Die Strategie hat einen gewissen Vorrang, muss aber auch mit anderen Indikatoren verifiziert werden.
/*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)