定量的破線戦略


作成日: 2023-11-21 13:43:24 最終変更日: 2023-12-01 15:01:07
コピー: 1 クリック数: 622
1
フォロー
1617
フォロワー

定量的破線戦略

概要

この戦略の目的は,K線色,交差量,ランダムな方法などの異なる入力変数をテストして,正弦波の方法で価格変化を予測できるかどうかをテストすることです.この戦略は,これらの変数を正弦波の形式に変換し,波のピークまたは波の谷が設定された回数に達すると,購入または販売の決定を行います.

戦略原則

戦略は3つの部分に分かれ,第”部はK線の色変化を検知する.同じ色のK線の数根の後,異なる色が現れた場合,正弦波が回転する.第2部は,成交量が平均値より高いか低いかを検知し,平均値を破るとき,波が回転する.第3部は,ランダムな方法を使用してコインを投げ,ランダムな結果が異なる場合は波が回転する.この3つの波は,設定された回数に累積され,取引の決定を行う.

コードは,三つの波の現在の方向,波峰数,上のK線の状況を追跡することで,波の動作を制御する.波峰数がパラメータ設定に達すると,動作方向を変更する.このループによって正弦波の動作を模倣する.

優位分析

この正弦波の理論は理にかなっているように見えるが,模擬された波形も現実市場と何らかの関連がある.しかし,この戦略のテストによって,実際にはランダムな結果であることが判明する.どの変数の組み合わせの波形がより似ていて,取引結果を向上させない.

だから,この戦略の利点は,市場がを予測できるという誤った考え方を否定することです. 市場の変数は価格に影響を与えますが,予測不能で,ランダムな決定は,同様の結果を得ることができます.

リスク分析

この戦略の最大のリスクは,ランダムな取引で利益と損失を確定することが難しいことです.異なるパラメータの下での結果を予測することも困難であり,利益があるかどうかを事前に決定することができません.

さらに,正弦波予測理論自体は誤りである。市場の変化は単純周期的模擬では不可能である。したがって,この戦略は実物取引に真に適用できない。

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

最適化の方向

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

  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)