Range Filter Kauf-Verkauf-Signalstrategie

Schriftsteller:ChaoZhang, Datum: 2024-03-08 17:06:50
Tags:

img

Übersicht

Die Range Filter Buy Sell Signals Strategie ist eine sehr praktische quantitative Handelsstrategie. Sie verwendet den Preisschwankungsbereich, um Kauf- und Verkaufssignale zu filtern, falsche Signale in Märkten mit geringer Volatilität zu reduzieren und die Signalqualität in Märkten mit hoher Volatilität zu verbessern.

Strategie Logik

Die Strategie berechnet zunächst den Schwankungsbereich des Vermögenswertpreises über einen bestimmten Zeitraum, insbesondere die Differenz zwischen dem höchsten und dem niedrigsten Preis innerhalb des angegebenen Zeitraums, um die Amplitude der Preisschwankung zu bestimmen.

Danach erzeugt es Kauf- und Verkaufssignale. Allerdings werden nicht alle Signale den Einstieg auslösen, sondern müssen die Filterbedingungen für den Kursschwankungsbereich erfüllen. Zum Beispiel wird ein Kaufsignal nur ausgegeben, wenn der Preis den Schwankungsbereich durchbricht.

Auf diese Weise filtert die Strategie die meisten falschen Signale in Marktumgebungen mit geringer Volatilität aus und vermeidet unnötigen Eintritt.

Vorteile

Der größte Vorteil dieser Strategie besteht darin, dass sie die Filterstärke der Signale dynamisch anpassen kann. Bei geringer Volatilität wählt sie nur hochwertige Signale; bei hoher Volatilität kann sie mehr Möglichkeiten des Marktes nutzen.

Diese Strategie ist im Vergleich zu festen Parameterfiltern intelligenter und anpassungsfähiger und bietet unabhängig vom Marktzustand eine überlegene Risikovergütung.

Darüber hinaus beinhaltet diese Strategie im Vergleich zu einer einzigen Betriebsbedingung ein trendorientiertes Urteilsvermögen, um zuverlässigere Handelssignale zu liefern. Gleichzeitig verfügt sie auch über Stop-Loss- und Take-Profit-Funktionen, um das Risiko einzelner Trades effektiv zu kontrollieren.

Risiken

Das Hauptrisiko der Strategie liegt in der Festlegung von Volatilitätsbereichsparametern, die bei zu großer oder zu geringer Satzbandbreite negative Auswirkungen auf die Signalqualität und die Gewinnchancen haben.

Darüber hinaus bietet die Strategie relativ weniger Gewinnchancen in Märkten mit starken kurzfristigen schwankenden Trends.

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Verwenden Sie adaptive Parameter-Algorithmen, um die Parameter des Volatilitätsbereichs automatisch zu optimieren, um sie intelligenter und dynamischer zu machen.

  2. Erhöhung der Filterungsregeln auf der Grundlage großer Zyklustrends, um Konsolidierungstränge zu vermeiden.

  3. Kombination verschiedener Zyklen der Strategie zu einem System und Verbesserung der allgemeinen Stabilität.

  4. Hinzufügen von Algorithmen für maschinelles Lernen zur Verbesserung der Wirkung von Parameter-Einstellungen und Filterregeln.

Schlussfolgerung

Die Range Filter Buy Sell Signals Strategie ist eine sehr praktische und effektive quantitative Handelsstrategie. Sie kann die Filterintensität dynamisch anpassen und in verschiedenen Marktumgebungen eine überlegene Risikovergütung bieten. Gleichzeitig gibt es immer noch ein großes Potenzial bei der Optimierung dieser Strategie, insbesondere bei Parameteroptimierung und Regeloptimierung. Insgesamt bietet diese Strategie eine hervorragende Basislösung für quantitative Trader, die nach stetigen Überzinsrenditen streben.


/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=5
strategy(title='Range Filter - B&S Signals', shorttitle='[Doan]_RF-B&S Signals', overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01
shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01

longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01
shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01

emaLength = input.int(200, title="EMA Length")

// Determine stop loss price

//Range Size Function
rng_size(x, qty, n) =>
    wper = n * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), n)
    AC = ta.ema(avrng, wper) * qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n) =>
    r = rng_
    var rfilt = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)

    hi_band = rng_filt1 + r
    lo_band = rng_filt1 - r
    rng_filt = rng_filt1
    [hi_band, lo_band, rng_filt]

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, title='Swing Source')

//Range Period
rng_per = input.int(defval=20, minval=1, title='Swing Period')

//Range Size Inputs
rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier')

//Bar Colors
use_barcolor = input(defval=false, title='Bar Colors On/Off')

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward = fdir == 1 ? 1 : 0
downward = fdir == -1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color = upward and rng_src > filt ? rng_src > rng_src[1] ? #05ff9b : #00b36b : downward and rng_src < filt ? rng_src < rng_src[1] ? #ff0583 : #b8005d : #cccccc


ema = ta.ema(close, emaLength)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)

longTakePrice = strategy.position_avg_price * (1 + longTakePerc)
shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc)

//Filter Plot
filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67)

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title='High Band')
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title='Low Band')

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title='High Band Fill')
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title='Low Band Fill')

//Bar Color
barcolor(use_barcolor ? bar_color : na)
// Entry
strategy.entry("Long", strategy.long, when=longCondition)
strategy.entry("Short", strategy.short, when=shortCondition)

plot(ema)

//Plot Buy and Sell Labels
plotshape(longCondition, title='Buy Signal', text='BUY', textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0))
plotshape(shortCondition, title='Sell Signal', text='SELL', textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title='Buy Alert', message='BUY')
alertcondition(shortCondition, title='Sell Alert', message='SELL')





Mehr