Kauf- und Verkaufssignalfilterstrategie basierend auf der Preisschwankungsbreite


Erstellungsdatum: 2024-03-08 17:06:50 zuletzt geändert: 2024-03-08 17:06:50
Kopie: 2 Klicks: 1110
1
konzentrieren Sie sich auf
1617
Anhänger

Kauf- und Verkaufssignalfilterstrategie basierend auf der Preisschwankungsbreite

Überblick

Die “Range Filter Buy Sell Signals Strategy” ist eine sehr praktische, quantitative Handelsstrategie. Sie nutzt Preisschwankungen, um Kauf- und Verkaufssignale zu filtern, um falsche Signale in niedrig schwankenden Märkten zu reduzieren und die Signalqualität in hoch schwankenden Märkten zu verbessern. Der Name der Strategie fasst die Hauptfunktionen der Strategie genau zusammen.

Strategieprinzip

Die Strategie berechnet zunächst die Bandbreite der Preisschwankungen eines Vermögenswerts in einem bestimmten Zeitraum. Insbesondere berechnet sie die Differenz zwischen den höchsten und niedrigsten Preisen in einem bestimmten Zeitraum, um die Größe der Preisschwankungen zu bestimmen.

Danach erzeugt es ein Kauf- und Verkaufssignal. Nicht alle Signale lösen jedoch den Einstieg aus, sondern müssen die Filterbedingungen des Preisschwankungsbereichs erfüllen. Zum Beispiel wird ein Kaufsignal nur ausgesendet, wenn der Preis den Schwankungsbereich überschreitet.

Auf diese Weise filtert die Strategie die meisten Falschsignale aus und verhindert unnötige Eintritte in einem niedrig schwankenden Marktumfeld. Während sie in einem hohen Schwanken die größeren Richtungsbewegungen erfasst und davon profitiert.

Strategische Vorteile

Der größte Vorteil dieser Strategie besteht darin, dass die Filterstärke der Signale dynamisch angepasst werden kann. Bei niedrigen Schwankungen wählt sie nur hochwertige Signale; bei hohen Schwankungen kann sie mehr Chancen nutzen, die der Markt bietet.

Diese Strategie ist intelligenter und anpassungsfähiger als die Filter mit festen Parametern. Sie bietet eine optimale Risiko-Rendite, unabhängig davon, in welchem Zustand der Markt ist.

Darüber hinaus bietet diese Strategie eine Kombination aus Trend- und Richtungsbeurteilung und bietet ein zuverlässigeres Handelssignal als einzelne Handelsbedingungen. Gleichzeitig verfügt sie über eine Stop-Loss-Stopp-Funktion, die das Risiko einzelner Geschäfte wirksam kontrolliert.

Strategisches Risiko

Das Hauptrisiko dieser Strategie besteht darin, dass die Parameter für den Schwankungsbereich festgelegt werden. Wenn der Bereich zu groß oder zu klein ist, kann dies die Signalqualität und die Gewinnchancen beeinträchtigen.

Darüber hinaus ist die Gewinnchance für diese Strategie in Märkten mit starken kurzfristigen Preisschwankungen relativ gering. Die Kombination verschiedener Periodensysteme hilft, dieses Problem zu mildern.

Richtung der Strategieoptimierung

Diese Strategie kann optimiert werden durch folgende Aspekte:

  1. Die automatische Optimierung der Parameter des Schwankungsbereichs mit Hilfe von Adaptive-Parameter-Algorithmen wird intelligenter und dynamischer gestaltet.

  2. Es wurden Filterregeln auf Basis von Big Cycle Trends eingefügt, um sich in schwankenden Märkten zu schützen.

  3. Diese Strategie, die in Kombination mit verschiedenen Zyklen entwickelt wurde, bildet ein System, das die Stabilität des Ganzen verbessert.

  4. Hinzufügen von Machine-Learning-Algorithmen, um die Parameter-Einstellungen und Filterregeln zu verbessern.

Zusammenfassen

Die Strategie der Filterung von Kauf- und Verkaufssignalen basierend auf Preisschwankungen ist eine sehr praktische und effektive quantitative Handelsstrategie. Sie kann die Filterintensität dynamisch anpassen und bietet in verschiedenen Marktumgebungen eine optimale Risiko-Rendite. Gleichzeitig besteht ein großer Optimierungsraum für die Strategie, insbesondere in Bezug auf die Optimierung von Parametern und Regeln.

Strategiequellcode
/*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')