Chiến lược tăng/giảm liên tiếp với Reverse và SL/TP Extension

Tác giả:ChaoZhang, Ngày: 2024-01-08 11:58:21
Tags:

img

Tổng quan

Chiến lược này là một phần mở rộng của chiến lược các thanh tăng/giảm liên tục được xây dựng trên TradingView. Nó có các thiết lập hướng linh hoạt cho phép giao dịch ngược. Ngoài ra, tích hợp với các phương pháp dừng lỗ khác nhau như điểm lắc / thấp, ATR dừng và chiến lược dừng, cũng như cài đặt lợi nhuận phù hợp. Điều này làm cho chiến lược tốt hơn trong quản lý rủi ro trong khi giữ các tín hiệu giao dịch ban đầu.

Chiến lược logic

Chiến lược này chủ yếu sử dụng các thanh tăng hoặc giảm liên tiếp để tạo ra tín hiệu mua và bán. Người dùng có thể cấu hình các thanh tăng liên tiếp cần thiết cho tín hiệu mua và các thanh giảm liên tiếp cho tín hiệu bán.

Ngoài ra, tùy chọn giao dịch ngược được thêm vào. Bằng cách kích hoạt nó, các tín hiệu mua ban đầu trở thành tín hiệu bán, và ngược lại, do đó hoàn thành việc đảo ngược giao dịch.

Đối với các lối vào và lối ra, hỗ trợ quay ngược vị trí trực tiếp để giảm thời gian không có vị trí.

Đối với dừng lỗ và lấy lợi nhuận, điểm swing / thấp, ATR dừng và chiến lược dừng được cung cấp để lựa chọn. Phương pháp dừng lỗ sẽ kết hợp với hướng vị trí để chọn swing thấp hoặc cao như dừng tích cực, hoặc sử dụng ATR để xác định giá dừng một cách năng động. Lấy lợi nhuận thiết lập một khoảng cách cố định dựa trên giá nhập cảnh.

Nếu trailing stop được bật, chiến lược có thể nới lỏng khoảng cách dừng khi thua, và thắt chặt khi kiếm lợi nhuận.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là tính linh hoạt để thích nghi với các điều kiện thị trường khác nhau:

  1. Các thông số lọc mua / bán có thể được thiết lập cho cả thị trường xu hướng và thị trường dao động
  2. Giao dịch ngược cho phép lựa chọn hướng khi cần thiết
  3. Vị trí ngược trực tiếp làm giảm thời gian không có vị trí
  4. Nhiều phương pháp dừng lỗ, chọn khi cần thiết
  5. Dừng kéo sẵn để có hiệu lực tự động

Phân tích rủi ro

Các rủi ro chính là quá nhiều thanh liên tiếp dẫn đến việc bỏ lỡ giao dịch và dừng lỗ mạnh gây ra tổn thất kéo dài.

  1. Điều chỉnh lên / xuống số lượng thanh vừa phải, không quá hung hăng
  2. Kiểm tra các phương pháp dừng lỗ khác nhau, tìm một phù hợp nhất
  3. Sử dụng trailing dừng lại cẩn thận, tránh mất mát quá lớn

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

Có chỗ cho việc tối ưu hóa thêm:

  1. Điều chỉnh động các thanh lên/dưới dựa trên ATR hoặc biến động
  2. Tỷ lệ lỗ/lợi nhuận dừng thử trong các giai đoạn nắm giữ khác nhau
  3. Thêm bộ lọc giá mở để tránh phá vỡ sai
  4. Tích hợp các chỉ số khác để cải thiện chất lượng tín hiệu

Kết luận

Chiến lược này tạo ra các mở rộng có lợi cho chiến lược cơ bản để kiểm soát rủi ro tốt hơn và giao dịch linh hoạt hơn.


/*backtest
start: 2023-01-07 00:00:00
end: 2023-08-30 05:20:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// Extension of the built-in strategy by Tradingview. The strategy buys after an X amount of
// consecutive bullish bars and viceversa for selling. This logic can be reversed and a Stop Loss
// with Take Profit can be added. There's also an option to adapt the SL into a Trailing Stop.

//@version=4
strategy("Consecutive Up/Down Strategy with Reverse", 
     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-------------------")  

consecutiveBarsUp = input(3)
consecutiveBarsDown = input(4)

/////////////////////// 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(5, step=.1, title="ATR Multiple")
i_TPRRR = input(5, step=.1, title="Take Profit Risk Reward Ratio")
TS=input(true, title="Trailing Stop")

// 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 /////////////////////////////////////////

price = close
ups = 0.0
ups := price > price[1] ? nz(ups[1]) + 1 : 0
dns = 0.0
dns := price < price[1] ? nz(dns[1]) + 1 : 0

BUY=ups >= consecutiveBarsUp and bar_index > 40
SELL=dns >= consecutiveBarsDown and bar_index > 40

//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

//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
 -strategy.position_avg_price
trailOffset     = strategy.position_avg_price - SL
var tstop = float(na)
if strategy.position_size > 0
    tstop := high- trailOffset - dif
    if tstop<tstop[1]
        tstop:=tstop[1]
else
    tstop := na
StrailOffset     = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
 and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
    Ststop := low+ StrailOffset + Sdif
    if Ststop>Ststop[1]
        Ststop:=Ststop[1]
else
    Ststop := na

strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL)

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


plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : 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