Phương pháp đột phá tỷ lệ % thanh dương

Tác giả:ChaoZhang, Ngày: 2024-01-08 10:32:25
Tags:

img

Tổng quan

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.

Chiến lược logic

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.

Phân tích lợi thế

Những lợi thế chính của chiến lược này là:

  1. Chiến lược logic là đơn giản và trực quan, dễ hiểu;
  2. Nó chỉ dựa trên một chỉ số, làm giảm nguy cơ quá tải;
  3. Người dùng có thể tùy chỉnh các tham số cho các sản phẩm khác nhau;
  4. Nó có các chức năng dừng lỗ / lấy lợi nhuận tích hợp để ngăn ngừa tổn thất lớn;
  5. Cho phép giao dịch ngược lại mà không cần rời khỏi vị trí trước, theo dõi xu hướng nhanh hơn.

Phân tích rủi ro

Những rủi ro chính của chiến lược này là:

  1. Chỉ dựa vào một chỉ số có thể tạo ra tín hiệu sai;
  2. Các thông số có xu hướng quá tải, hiệu suất trực tiếp có thể khác nhau rất nhiều;
  3. Stop loss có thể bị ảnh hưởng bởi biến động giá biến động, dẫn đến tổn thất;
  4. Giao dịch ngược có thể làm tăng lỗ;
  5. Hiệu suất phụ thuộc rất nhiều vào biểu tượng, đòi hỏi các thử nghiệm riêng biệt.

Các rủi ro có thể được giảm bằng cách:

  1. Thêm bộ lọc để tránh tín hiệu sai;
  2. Tối ưu hóa logic dừng lỗ để hạn chế lỗ;
  3. Đánh giá và kiểm soát kích thước tổn thất tối đa;
  4. Kiểm tra các biểu tượng khác nhau riêng biệt.

Hướng dẫn tối ưu hóa

Các hướng chính để tối ưu hóa chiến lược này bao gồm:

  1. Thêm các chỉ số phụ trợ như âm lượng để tránh tín hiệu sai;
  2. Tối ưu hóa các phương pháp dừng lỗ, chẳng hạn như dừng lỗ sau;
  3. Thêm các bộ lọc đầu vào như breakout của Bollinger Bands;
  4. Kiểm tra các thông số tối ưu của nến xu hướng tăng cho các biểu tượng khác nhau;
  5. Đánh giá mức thu hút tối đa và kiểm soát kích thước tổn thất.

Kết luận

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)

Thêm nữa