定量的なジグザック戦略

作者: リン・ハーンチャオチャン, 日付: 2023-11-21 13:43:24
タグ:

img

概要

この戦略の目的は,キャンドルスティック色,ボリューム,ランダム方法などの異なる入力変数がシナス波の形で価格変化を予測するために使用できるかどうかをテストすることです.この戦略はこれらの変数をシナス波の形に変換します.ピークまたは低谷が設定された回数に達すると,購入または販売の決定がされます.

戦略原則

この戦略は3つの部分に分かれています.最初の部分は,キャンドルスタイクの色の変化を検出します.同じ色の数本のキャンドルの後,異なる色を持つキャンドルが現れるとき,シナス波は方向を変えます.第二の部分は,ボリュームが平均より高く,または低く,かどうかを検出します.平均が壊されると,波は方向を変えます.第三の部分は,コインフリップをシミュレートするためにランダムな方法を使用します.ランダムな結果が異なる場合,波は方向を変えます.これらの3つの波が設定された数回に蓄積されると,取引決定がされます.

このコードは,3つの波の現在の方向,ピークの数,および前のろうそくの位置を追跡することによって波の走行を制御する.ピークの数がパラメータ設定に達すると,走行方向を変更する.このループはシナス波の走行をシミュレートする.

利点分析

このシナス波理論は意味があるように見え,シミュレーションされた波形も実際の市場と何らかの相関性を持っている.しかし,この戦略のテストを通じて,それらは実際にはランダムな結果であることが判明することができます.変数の組み合わせが波形をより類似させるのは,取引の結果を改善しません.

この戦略の利点は"市場が予測可能"という誤解を否定することにある.市場の変数は価格に影響するが,予測不可能であり,ランダムな決定も同様の結果を得ることができる.

リスク分析

この戦略の最大のリスクは,ランダムな取引で利益と損失を決定するのは困難である.異なるパラメータの下での結果も予測するのは困難で,利益を得られるかどうかを事前に決定することは不可能である.

さらに,シナス波予測理論自体は間違っている. 市場の変化は単純な周期性でシミュレートするには複雑すぎる. したがって,この戦略は実際に取引に使用することはできません.

リスクを減らすために,パラメータ範囲を決定するためにランダムな結果をさらに分析する必要がある.または,取引信号を検証するために他の分析方法を組み合わせなければならない.

オプティマイゼーションの方向性

この戦略は以下の方向で最適化できます.

  1. サンプル空間を拡大するために波に変換されるより多くの変数を増加
  2. 3つの電流波を組み合わせて 最高の横断組み合わせを見つけます
  3. ストップ・ロスの方法,例えば ストップ・ロスの割合
  4. 最適なパラメータを見つけるためにエントリーと出口論理とバックテストを最適化

概要

この戦略は,異なるシナプス波をテストすることで,市場の予測不可能な性質を示しています.同時に,予測するために波周期を使用するという誤った理論を否定しています.

次に,戦略の実用性は,変数を増やし,波形を組み合わせ,ストップを設定し,パラメータを最適化することで改善することができます. しかし,鍵は依然として市場の変化が複雑で予測不能であることを理解することです. 私たちがすべきことは,市場を予測するよりもランダムなリスクを減らすことです.


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


もっと