ポジティブバース百分比ブレイクアウト戦略は,価格アクション判断に基づいた定量的な取引戦略である.市場が現在上向き傾向状態にあるかどうかを決定するために,特定の期間中の上向きトレンドキャンドルの百分比を計算する.上向きトレンドキャンドルの百分比がユーザー定義上限を超えると,戦略は市場が現在上向き傾向にあり,ロングに行くと判断する.その百分比がユーザー定義下限を下回ると,戦略は市場が現在下向き傾向にあり,ショートに行くと判断する.
この戦略のコア指標は,上向きキャンドルの割合である.上向きキャンドルは,前回の低値以下に開き,開いている値以上に閉じて,その期間中に価格が上昇したことを示す.この戦略は,ユーザーによって定義されたバックバック期間の上向きキャンドルの数を数え,すべてのキャンドルの中で上向きキャンドルの割合を計算する.その割合が上限を超えると,戦略は市場が持続的な上向きの傾向にあり,ロングに行くことを判断する.その割合が下限を下回ると,戦略は市場が下向きの傾向にあり,ショートに行くことを判断する.ストップ・ロストとテイク・プロフィットオーダーは,ユーザーによって定義されたストップ・ロスト方法に従って設定される.
例えば,ユーザがバックピリオドを20に設定すると,上限を70に,下限を30にすると,戦略は最新の20のキャンドルを追溯する.そのうちの16がアップトレンドキャンドルであれば,割合は16/20=80になる.80%が70%上限より高いので,戦略はロングオーダーを実行する.最新の20のキャンドルの中で,5個しかアップトレンドキャンドルでない場合,割合は5/20=25%になる.これは30%下限よりも低い場合,戦略はショートオーダーを実行する.
この戦略の主な利点は以下の通りです.
この戦略の主なリスクは,
リスクは以下によって軽減できます.
この戦略を最適化するための主な方向は以下の通りである.
ポジティブバーの百分比ブレイクアウト戦略は,上下トレンドの持続性を統計的に判断することによって,傾向を把握するためのシンプルで直接的な論理を持っています. 分かりやすく,ユーザーフレンドリーで,初心者向けに適しています. しかし,単一の指標とパラメータ最適化に依存することで,さまざまな市場で安定した収益性のためにリスク管理のさらなる改善が必要です.
/*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)