Chiến lược phá vỡ tỷ lệ Bars tích cực là một chiến lược giao dịch định lượng dựa trên các phán đoán hành động giá. Nó tính toán tỷ lệ phần trăm nến xu hướng tăng trong một khoảng thời gian cụ thể để xác định xem thị trường hiện đang ở trạng thái xu hướng tăng hay không. Khi tỷ lệ phần trăm nến xu hướng tăng cao hơn giới hạn trên được người dùng xác định, chiến lược đánh giá rằng thị trường hiện đang trong xu hướng tăng và đi dài. Khi tỷ lệ phần trăm thấp hơn giới hạn dưới được người dùng xác định, chiến lược đánh giá rằng thị trường hiện đang trong xu hướng giảm và đi ngắn.
Chỉ số cốt lõi của chiến lược này là tỷ lệ phần trăm nến xu hướng tăng. Nến xu hướng tăng mở dưới mức thấp trước đó và đóng trên mức mở, cho thấy giá tăng trong giai đoạn đó. Chiến lược đếm số lượng nến xu hướng tăng trong giai đoạn nhìn lại được xác định bởi người dùng và tính tỷ lệ phần trăm nến xu hướng tăng trong số tất cả nến. Khi tỷ lệ phần trăm cao hơn giới hạn trên, chiến lược đánh giá thị trường đang trong xu hướng tăng liên tục và đi dài. Khi tỷ lệ phần trăm thấp hơn giới hạn dưới, chiến lược đánh giá thị trường đang trong xu hướng giảm và đi ngắn.
Ví dụ, nếu người dùng đặt thời gian xem lại là 20, giới hạn trên là 70, giới hạn dưới là 30, chiến lược sẽ theo dõi lại 20 nến mới nhất. Nếu 16 trong số đó là nến xu hướng tăng, tỷ lệ phần trăm sẽ là 16/20 = 80%. Vì 80% cao hơn giới hạn trên là 70%, chiến lược sẽ thực hiện lệnh dài. Nếu trong số 20 nến mới nhất, chỉ có 5 nến xu hướng tăng, thì tỷ lệ phần trăm sẽ là 5/20 = 25%. Đây là thấp hơn giới hạn dưới 30%, chiến lược sẽ thực hiện lệnh ngắn.
Những lợi thế chính của chiến lược này là:
Những rủi ro chính của chiến lược này là:
Các rủi ro có thể được giảm bằng cách:
Các hướng chính để tối ưu hóa chiến lược này bao gồm:
Chiến lược Phân đoạn Tỷ lệ Bạch cầu tích cực có một logic đơn giản và thẳng thắn để nắm bắt xu hướng bằng cách đánh giá thống kê sự bền vững của xu hướng tăng/giảm. Nó dễ hiểu và thân thiện với người dùng, phù hợp với những người mới bắt đầu. Nhưng sự dựa vào một chỉ số duy nhất và tối ưu hóa tham số đòi hỏi phải cải thiện thêm việc kiểm soát rủi ro để có lợi nhuận ổn định trên các thị trường khác nhau.
/*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)