Quantitative Zigzag-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-21 13:43:24
Tags:

img

Übersicht

Der Zweck dieser Strategie ist es, zu testen, ob verschiedene Eingabevariablen wie Kerzenfarben, Volumen und zufällige Methoden verwendet werden können, um Preisänderungen in Form von Sinuswellen vorherzusagen.

Strategieprinzip

Die Strategie ist in drei Teile unterteilt. Der erste Teil erkennt Veränderungen der Kerzenfarben. Wenn eine Kerze mit einer anderen Farbe nach mehreren Kerzen der gleichen Farbe erscheint, dreht sich die Sinuswelle Richtung. Der zweite Teil erkennt, ob das Volumen höher oder niedriger als der Durchschnitt ist. Wenn der Durchschnitt gebrochen wird, dreht sich die Welle Richtung. Der dritte Teil verwendet eine zufällige Methode, um das Münzwerfen zu simulieren. Wenn das zufällige Ergebnis anders ist, dreht sich die Welle Richtung. Wenn diese drei Wellen sich bis zur festgelegten Anzahl von Zeiten ansammeln, werden Handelsentscheidungen getroffen.

Der Code steuert den Lauf der Wellen, indem er die aktuelle Richtung, die Anzahl der Spitzen und die Position des vorherigen Kerzenstäbes für die drei Wellen verfolgt.

Analyse der Vorteile

Diese Sinuswellen-Theorie scheint sinnvoll zu sein, und die simulierten Wellenformen haben auch eine gewisse Korrelation mit dem realen Markt. Aber durch den Test dieser Strategie kann festgestellt werden, dass sie tatsächlich zufällige Ergebnisse sind. Welche Kombination von Variablen die Wellenform ähnlicher macht, verbessert die Handelsergebnisse nicht.

Einer der Vorteile dieser Strategie besteht also darin, das falsche Konzept zu widerlegen, dass "der Markt vorhersehbar ist". Variablen auf dem Markt beeinflussen die Preise, aber sie sind unvorhersehbar, und zufällige Entscheidungen können auch ähnliche Ergebnisse erzielen.

Risikoanalyse

Das größte Risiko dieser Strategie besteht darin, dass es schwierig ist, Gewinn und Verlust beim Zufallshandel zu bestimmen. Die Ergebnisse unter verschiedenen Parametern sind auch schwierig vorherzusagen, und es ist unmöglich, im Voraus festzustellen, ob es profitabel sein kann.

Darüber hinaus ist die Sinuswellen-Vorhersage-Theorie selbst falsch. Marktveränderungen sind zu komplex, um sie mit einfacher Zyklosität zu simulieren.

Zur Verringerung der Risiken ist es notwendig, die zufälligen Ergebnisse weiter zu analysieren, um den Parameterbereich zu bestimmen; oder andere analytische Methoden zu kombinieren, um Handelssignale zu überprüfen.

Optimierungsrichtlinien

Diese Strategie kann in folgenden Richtungen optimiert werden:

  1. Erhöhen Sie mehr Variablen in Wellen umgewandelt, um den Probenraum zu erweitern
  2. Kombinieren Sie die drei Stromwellen, um die beste Kombination zu finden.
  3. Einrichtung von Stop-Loss-Methoden, wie zum Beispiel Prozentsatz-Loss-Stopps
  4. Optimierung der Eingangs- und Ausstiegslogik und des Backtests zur Suche nach optimalen Parametern

Zusammenfassung

Durch das Testen verschiedener Sinuswellen veranschaulicht diese Strategie die Unberechenbarkeit des Marktes und widerlegt gleichzeitig die falsche Theorie, dass Wellenzyklen zur Vorhersage verwendet werden.

Als nächstes kann die Praktikabilität der Strategie verbessert werden, indem Variablen erhöht, Wellenformen kombiniert, Stopps gesetzt und Parameter optimiert werden. Aber der Schlüssel ist immer noch zu verstehen, dass Marktveränderungen komplex und unvorhersehbar sind. Was wir tun müssen, ist, zufällige Risiken zu reduzieren, anstatt den Markt vorherzusagen.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 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/
// © Gentleman-Goat

//@version=5
strategy("Sine Wave Theory",overlay=false, precision = 2, initial_capital = 1000,shorttitle = "SINE_W_T")

var bar_change_wave_direction = input.int(defval=1,title="Starting Wave Direction",group="Bar Change")
bar_change_sine_wave_number = input.int(defval=28,title="Sine Wave #",group="Bar Change")
bar_change_sine_wave_res = input.timeframe(defval="D",title="Resolution",group="Bar Change")
bar_change_trade = input.bool(defval=true,title="Trade",group="Bar Change")

var volume_wave_direction = input.int(defval=1,title="Starting Wave Direction",group="Volume")
avg_volume_length = input.int(7,title="Lookback Length",group="Volume")
volume_sine_wave_number = input.int(defval=28,title="Sine Wave #",group="Volume")
volume_sine_wave_res = input.timeframe(defval="D",title="Resolution",group="Volume")
volume_trade = input.bool(defval=false,title="Trade",group="Volume")

var coin_flip_wave_direction = input.int(defval=1,title="Starting Wave Direction",group="Coin Flip")
coin_flip_sine_wave_number = input.int(defval=28,title="Sine Wave #",group="Coin Flip")
coin_flip_seed = input.int(defval=1,title="Seed #",group="Coin Flip")
coin_flip_trade = input.bool(defval=false,title="Trade",group="Coin Flip")

avg_volume = ta.sma(volume,avg_volume_length)

//Green or Red Candle
bar_color = close>open ? color.green : color.red
bar_color_time_adj = request.security(syminfo.tickerid, bar_change_sine_wave_res, bar_color)

//Above or Below Average
volume_state = (volume>avg_volume) ? color.blue : color.purple
volume_state_time_adj = request.security(syminfo.tickerid, volume_sine_wave_res, volume_state)
 
//Coinflip
coin_flip = math.random(0,100,coin_flip_seed)>=50 ? color.teal : color.yellow

var bar_change_wave_count = 0
var volume_wave_count = 0
var coin_flip_wave_count = 0

//Wave Counters
if(volume_state_time_adj[1] != volume_state_time_adj)
    volume_wave_count := volume_wave_count + volume_wave_direction

if(bar_color_time_adj[1] != bar_color_time_adj)
    bar_change_wave_count := bar_change_wave_count + bar_change_wave_direction

if(coin_flip[1] != coin_flip)
    coin_flip_wave_count := coin_flip_wave_count + coin_flip_wave_direction

//Direction changers
if(math.abs(bar_change_wave_count) == bar_change_sine_wave_number and bar_color_time_adj[1] != bar_color_time_adj)
    bar_change_wave_direction := bar_change_wave_direction * -1

if(math.abs(volume_wave_count) == volume_sine_wave_number and volume_state_time_adj[1] != volume_state_time_adj)
    volume_wave_direction := volume_wave_direction * -1

if(math.abs(coin_flip_wave_count) == coin_flip_sine_wave_number and coin_flip[1] != coin_flip)
    coin_flip_wave_direction := coin_flip_wave_direction * -1

//Entry positions
if(bar_change_wave_count==bar_change_sine_wave_number and bar_change_trade==true)
    strategy.entry(id="short",direction=strategy.short)
if(bar_change_wave_count==bar_change_sine_wave_number*-1 and bar_change_trade==true)
    strategy.entry(id="long",direction=strategy.long)

if(volume_wave_count==volume_sine_wave_number and volume_trade==true)
    strategy.entry(id="short-volume",direction=strategy.short)
if(volume_wave_count==volume_sine_wave_number*-1 and volume_trade==true)
    strategy.entry(id="long-volume",direction=strategy.long)

if(coin_flip_wave_count==coin_flip_sine_wave_number and coin_flip_trade==true)
    strategy.entry(id="short-coinflip",direction=strategy.short)
if(coin_flip_wave_count==coin_flip_sine_wave_number*-1 and coin_flip_trade==true)
    strategy.entry(id="long-coinflip",direction=strategy.long)

hline(0, title='Center', color=color.white, linestyle=hline.style_dashed, linewidth=1)
plot(bar_change_wave_count,title="Bar Change", color=bar_color, linewidth=2)
plot(volume_wave_count,title="Volume Average Change", color=volume_state, linewidth=2)
plot(coin_flip_wave_count,title="Coin Flip Change", color=coin_flip, linewidth=2)


Mehr