Estrategia de zigzag cuantitativo

El autor:¿ Qué pasa?, Fecha: 2023-11-21 13:43:24
Las etiquetas:

img

Resumen general

El propósito de esta estrategia es probar si diferentes variables de entrada como colores de velas, volumen y métodos aleatorios pueden usarse para predecir los cambios de precios en forma de ondas senoidales.

Principio de la estrategia

La estrategia se divide en tres partes. La primera parte detecta cambios en los colores de las velas. Cuando una vela con un color diferente aparece después de varias velas del mismo color, la onda senoidal gira de dirección. La segunda parte detecta si el volumen es mayor o menor que el promedio. Cuando se rompe el promedio, la onda gira de dirección. La tercera parte utiliza un método aleatorio para simular el lanzamiento de monedas. Cuando el resultado aleatorio es diferente, la onda gira de dirección. Cuando estas tres ondas se acumulan al número establecido de veces, se toman decisiones comerciales.

El código controla el funcionamiento de las ondas rastreando la dirección actual, el número de picos y la situación del candelabro anterior para las tres ondas.

Análisis de ventajas

Esta teoría de ondas senoidales parece tener sentido, y las formas de onda simuladas también tienen cierta correlación con el mercado real. Pero a través de la prueba de esta estrategia, se puede encontrar que en realidad son resultados aleatorios.

Por lo tanto, una ventaja de esta estrategia es refutar el concepto erróneo de que "el mercado se puede predecir". Las variables en el mercado afectan los precios, pero son impredecibles, y las decisiones al azar también pueden obtener resultados similares.

Análisis de riesgos

El mayor riesgo de esta estrategia es que es difícil determinar la ganancia y pérdida en el comercio aleatorio. Los resultados bajo diferentes parámetros también son difíciles de predecir, y es imposible determinar de antemano si puede ser rentable.

Además, la teoría de la predicción de ondas senoidales en sí misma es errónea. Los cambios del mercado son demasiado complejos para simularlos con una simple ciclicidad. Por lo tanto, esta estrategia no puede usarse para el comercio real.

Para reducir los riesgos, es necesario analizar aún más los resultados aleatorios para determinar el rango de parámetros; o combinar otros métodos analíticos para verificar las señales comerciales.

Direcciones de optimización

Esta estrategia se puede optimizar en las siguientes direcciones:

  1. Aumentar más variables convertidas en ondas para expandir el espacio de muestra
  2. Combina las tres olas de corriente para encontrar la mejor combinación de travesía
  3. Métodos de detención de pérdidas establecidos, como los porcentajes de detención de pérdidas
  4. Optimizar la lógica de entrada y salida y backtest para encontrar parámetros óptimos

Resumen de las actividades

Al probar diferentes ondas senoidales, esta estrategia ilustra la naturaleza impredecible del mercado. Al mismo tiempo, también refuta la teoría errónea de usar ciclos de ondas para predecir.

A continuación, la practicidad de la estrategia puede mejorarse aumentando las variables, combinando las formas de onda, estableciendo paradas y optimizando parámetros. Pero la clave sigue siendo entender que los cambios del mercado son complejos e impredecibles. Lo que necesitamos hacer es reducir los riesgos aleatorios en lugar de predecir el mercado.


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


Más.