カスタム上向きブレイクアウト戦略


作成日: 2024-01-08 10:32:25 最終変更日: 2024-01-08 10:32:25
コピー: 0 クリック数: 629
1
フォロー
1617
フォロワー

カスタム上向きブレイクアウト戦略

概要

カスタムアップブレイク戦略は,価格動向判断に基づく量化取引戦略である.この戦略は,指定された周期内の正向K線占比を計算することによって,市場が現在継続的な上昇状態にあるかどうかを判断する.正向K線占比がユーザが設定した上限より高いとき,戦略判断は,現在上昇状態にあるとき,多額の取引を行う.正向K線占比がユーザが設定した下限より低いとき,戦略判断は,現在下行状態にあるとき,空き取引を行う.

戦略原則

この戦略の核心指標は正向K線占比である.正向K線は,低点から開盤,閉盤価格が開盤価格より高いK線を指し,その周期で価格が上昇したことを示している.この戦略は,統計ユーザが指定した往復周期で,正向K線の数がすべてのK線を占める割合を統計ユーザが指定する往復周期で占めている.その割合が上限より大きいときは,現在継続的に上昇傾向にあると判断され,その時点で多作;その割合が下限より小さいときは,現在継続的に下落傾向にあると判断され,その時点で空作.多作のストップ・ストップ・ストップは,ユーザが設定した方法で設定される.

例:ユーザの設定周期数は20で,上限は70で,下限は30である. 策略は,最近20根のK線を遡り,そのうち16根が正向K線である場合,占める割合は16/20=80%である. この時点でユーザの設定の上限70より高い場合,複数の操作を行う. 最近20根のK線のうち5根だけが正向K線である場合,占める割合は5/20=25%である. ユーザの設定下限30より低い場合,空き操作を行う.

優位分析

この戦略の利点は以下の通りです.

  1. 戦略はシンプルで直感的で理解しやすい.
  2. 単に1つの指標が必要で,過度に最適化のリスクを低減する.
  3. ユーザは,異なる品種に対応してパラメータをカスタマイズすることができます.
  4. 壊滅的な損失を防ぐために,内蔵の防犯機能.
  5. 直接逆行して,平仓を待たずに,動きを早く追跡できます.

リスク分析

この戦略にはいくつかのリスクがあります.

  1. 単一の指標を使うと 誤った信号が出ます
  2. 指標のパラメータは過度に最適化され,実態は大きく異なる可能性があります.
  3. 状況が激しく波動すると,ストップダストは破られ,損失を招く可能性があります.
  4. 逆開設機能により損失が増加する可能性があります.
  5. 効果と品種との関連性が高いため,別々にテストする必要があります.

リスクの低減のために,以下の方法で最適化できます.

  1. フィルタリング条件を追加し,誤信号を回避する.
  2. 損失を最小限に抑える戦略の最適化
  3. 単一の損失の額を評価し制御する.
  4. 種別試験の結果について

最適化の方向

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

  1. 価格合理性などの補助判断指標を増やし,誤った信号を回避する
  2. 移動停止,振動停止なども考慮できます.
  3. ブリンラインを突破して再入場するなど,開店条件の追加
  4. 異なる正向K線パラメータの異なる品種への適応性をテストする
  5. 最大の撤収を評価し,単一の損失の規模を制御する

要約する

カスタムアップブレイクストラテジーの全体的な構想は明快でシンプルで,統計的に正向K線を比して継続的な上昇または下降状態を判断し,簡単な指標を使用してトレンドを捕捉する.この戦略は,容易に理解でき,ユーザーフレンドリーで,量化取引の初心者向けに適しています.しかし,単一の指標とパラメータ設定のみに依存する一定の収益変動性があります.戦略のリスクに対する最適化は継続して行われ,より多くの市場で安定した利益を上げることができます.

ストラテジーソースコード
/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-04 00:00:00
period: 1m
basePeriod: 1m
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/
// © ZenAndTheArtOfTrading 
// © TweakerID

// Based on the calculations by ZenAndTheArtOfTrading, I added stop loss, take profit and reverse line codes.
// The Positive Bars % calculates the number of green (positive) bars, relative to a lookback period, defined 
// by the user. If the percentage is low, it means that there was a bigger number of red candles in the 
// lookback period. The strategy goes long when the percentage is high and short when it's low, although
// this logic can be reversed with positive results on different time frames.

//@version=4
strategy("Positive Bars % Strat", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

lookback = input(title="Lookback", type=input.integer, defval=13)
upperLimit = input(title="Upper Limit", type=input.integer, defval=70)
lowerLimit = input(title="Lower Limit", type=input.integer, defval=30)

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(10, step=.1, title="ATR Multiple")
i_TPRRR = input(1.6, step=.1, title="Take Profit Risk Reward Ratio")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR

// Strategy Stop
float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

//Calculations
positiveBars = 0
for i = (lookback - 1) to 0
    if close[i] > open[i]
        positiveBars := positiveBars + 1
positiveBarsPercent = (positiveBars / lookback) * 100

BUY=positiveBarsPercent >= upperLimit
SELL=positiveBarsPercent <= lowerLimit

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

strategy.exit("TP & SL", "long", limit=TP, stop=SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(i_SL and strategy.position_size > 0 ? SL : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 ? SSL : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)