Estratégia de ziguezague quantitativo

Autora:ChaoZhang, Data: 2023-11-21 13:43:24
Tags:

img

Resumo

O objetivo desta estratégia é testar se diferentes variáveis de entrada, como cores de velas, volume e métodos aleatórios podem ser usados para prever mudanças de preço na forma de ondas senoidais.

Princípio da estratégia

A estratégia é dividida em três partes. A primeira parte detecta mudanças nas cores dos velares. Quando uma vela com uma cor diferente aparece após várias velas da mesma cor, a onda senoidal muda de direção. A segunda parte detecta se o volume é maior ou menor do que a média. Quando a média é quebrada, a onda muda de direção. A terceira parte usa um método aleatório para simular o lançamento de moedas. Quando o resultado aleatório é diferente, a onda muda de direção.

O código controla a corrida das ondas rastreando a direção atual, o número de picos e a posição do candelabro anterior para as três ondas.

Análise das vantagens

A teoria das ondas senoidais parece fazer sentido, e as formas de onda simuladas também têm alguma correlação com o mercado real. Mas através do teste desta estratégia, pode-se descobrir que eles são realmente resultados aleatórios.

Assim, uma vantagem desta estratégia é refutar o equívoco de que "o mercado pode ser previsto".As variáveis no mercado afetam os preços, mas são imprevisíveis, e decisões aleatórias também podem obter resultados semelhantes.

Análise de riscos

O maior risco desta estratégia é que é difícil determinar o lucro e a perda na negociação aleatória. Os resultados sob diferentes parâmetros também são difíceis de prever e é impossível determinar antecipadamente se pode ser lucrativo.

Além disso, a própria teoria da previsão de ondas senoidais é errada. As mudanças de mercado são muito complexas para serem simuladas com simples ciclicidade.

Para reduzir os riscos, é necessário analisar ainda mais os resultados aleatórios para determinar o intervalo de parâmetros; ou combinar outros métodos analíticos para verificar os sinais de negociação.

Orientações de otimização

Esta estratégia pode ser otimizada nas seguintes direcções:

  1. Aumentar mais variáveis convertidas em ondas para expandir o espaço da amostra
  2. Combine as três ondas de corrente para encontrar a melhor combinação de travessia
  3. Métodos de stop loss definidos, tais como percentual de stop loss
  4. Otimizar a lógica de entrada e saída e backtest para encontrar parâmetros ideais

Resumo

Ao testar diferentes ondas senoidais, esta estratégia ilustra a natureza imprevisível do mercado. Ao mesmo tempo, também refuta a teoria errônea de usar ciclos de onda para prever.

Em seguida, a praticidade da estratégia pode ser melhorada aumentando variáveis, combinando formas de onda, definindo paradas e otimizando parâmetros.


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


Mais.