Tài nguyên đang được tải lên... tải...

Squeeze Backtest Transformer v2.0

Tác giả:ChaoZhang, Ngày: 2024-04-28 14:09:26
Tags:

img

Tổng quan

Squeeze Backtest Transformer v2.0 là một hệ thống giao dịch định lượng dựa trên chiến lược squeeze. Bằng cách thiết lập các tham số như nhập cảnh, dừng lỗ, tỷ lệ lợi nhuận, và thời gian giữ tối đa, nó kiểm tra lại chiến lược trong một khoảng thời gian cụ thể. Chiến lược hỗ trợ giao dịch đa hướng và có thể linh hoạt thiết lập hướng giao dịch dài hoặc ngắn. Đồng thời, chiến lược cũng cung cấp các tùy chọn phong phú để thiết lập thời gian kiểm tra lại, có thể dễ dàng chọn một khoảng thời gian cố định hoặc thời gian kiểm tra lại tối đa.

Nguyên tắc chiến lược

  1. Đầu tiên, xác định thời gian bắt đầu và kết thúc của backtest dựa trên các thông số thời gian backtest được thiết lập bởi người dùng.
  2. Trong thời gian backtest, nếu không có vị trí hiện tại và giá đạt mức giá đầu vào (được tính dựa trên tỷ lệ phần trăm mở), mở một vị trí và đặt giá dừng lỗ và lấy lợi nhuận (được tính dựa trên tỷ lệ phần trăm dừng lỗ và lấy lợi nhuận) cùng một lúc.
  3. Nếu một vị trí đã được nắm giữ, hủy lệnh lấy lợi nhuận và dừng lỗ trước đó và đặt lại giá lấy lợi nhuận và dừng lỗ mới (được tính dựa trên giá trung bình vị trí hiện tại).
  4. Nếu thời gian giữ tối đa được thiết lập, khi thời gian giữ đạt đến giá trị tối đa, buộc vị trí phải đóng.
  5. Chiến lược hỗ trợ giao dịch trong cả hai hướng dài và ngắn.

Ưu điểm chiến lược

  1. Các thiết lập tham số linh hoạt có thể được điều chỉnh theo các điều kiện thị trường và nhu cầu giao dịch khác nhau.
  2. Hỗ trợ giao dịch đa hướng để đạt được lợi nhuận trong các điều kiện thị trường khác nhau.
  3. Cung cấp các tùy chọn phong phú để thiết lập thời gian backtest, có thể dễ dàng thực hiện backtesting và phân tích dữ liệu lịch sử.
  4. Các thiết lập dừng lỗ và lấy lợi nhuận có thể kiểm soát rủi ro hiệu quả và cải thiện hiệu quả sử dụng vốn.
  5. Việc thiết lập thời gian giữ tối đa có thể tránh giữ các vị trí quá lâu và phải đối mặt với rủi ro thị trường.

Rủi ro chiến lược

  1. Việc thiết lập giá nhập cảnh, giá dừng lỗ và giá lấy lợi nhuận có tác động lớn đến lợi nhuận của chiến lược.
  2. Khi thị trường biến động mạnh mẽ, một lệnh dừng lỗ có thể được kích hoạt ngay sau khi mở một vị trí, dẫn đến tổn thất.
  3. Nếu thời gian giữ tối đa kích hoạt việc đóng một vị trí, nó có thể bỏ lỡ cơ hội kiếm lợi nhuận sau đó.
  4. Chiến lược có thể không hoạt động tốt trong một số điều kiện thị trường đặc biệt (chẳng hạn như thị trường bên cạnh).

Định hướng tối ưu hóa chiến lược

  1. Xem xét việc giới thiệu nhiều chỉ số kỹ thuật hơn hoặc chỉ số tâm lý thị trường để tối ưu hóa các điều kiện nhập cảnh, dừng lỗ và lấy lợi nhuận để cải thiện sự ổn định và lợi nhuận của chiến lược.
  2. Đối với việc thiết lập thời gian nắm giữ tối đa, nó có thể được điều chỉnh năng động theo biến động thị trường và lợi nhuận và lỗ vị trí để tránh chi phí cơ hội mà một thời gian đóng cửa cố định có thể mang lại.
  3. Đối với các đặc điểm của thị trường bên cạnh, logic như đột phá phạm vi bên cạnh hoặc xác nhận đảo ngược xu hướng có thể được thêm để giảm chi phí giao dịch thường xuyên.
  4. Xem xét thêm các chiến lược quản lý vị trí và quản lý vốn để kiểm soát rủi ro của một giao dịch duy nhất và cải thiện hiệu quả và ổn định của việc sử dụng vốn.

Tóm lại

Squeeze Backtest Transformer v2.0 là một hệ thống giao dịch định lượng dựa trên chiến lược squeeze có thể giao dịch trong các môi trường thị trường khác nhau thông qua các thiết lập tham số linh hoạt và hỗ trợ giao dịch đa hướng. Đồng thời, các tùy chọn thiết lập thời gian backtest phong phú và cài đặt lấy lợi nhuận và dừng lỗ có thể giúp người dùng thực hiện phân tích dữ liệu lịch sử và kiểm soát rủi ro. Tuy nhiên, hiệu suất của chiến lược bị ảnh hưởng rất nhiều bởi các thiết lập tham số và cần được tối ưu hóa và cải thiện dựa trên các đặc điểm thị trường và nhu cầu giao dịch để cải thiện sự ổn định và lợi nhuận của chiến lược. Trong tương lai, chúng ta có thể xem xét giới thiệu nhiều chỉ số kỹ thuật hơn, điều chỉnh thời gian nắm giữ tối đa, tối ưu hóa các chiến lược bên cạnh và tăng cường quản lý vị trí và vốn để tối ưu hóa thị trường.


/*backtest
start: 2023-04-22 00:00:00
end: 2024-04-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5

strategy(title="Squeeze Backtest by Shaqi v2.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0)
R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"

BL = "low"
BH = "high"
BO = "open"
BC = "close"
BHL= "mid (hl)"
BOC = "mid (oc)"

LONG = "LONG"
SHORT = "SHORT"

direction = input.string(title="Direction", defval=LONG, options=[LONG, SHORT], group="Squeeze Settings")
strategy.risk.allow_entry_in(direction == LONG ? strategy.direction.long : strategy.direction.short)
openPercent = input.float(1.4, "Open, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
closePercent = input.float(0.6, "Close, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
stopPercent = input.float(0.8, "Stop Loss, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
isMaxBars = input.bool(true, "Max Bars To Sell", inline="MaxBars", group="Squeeze Settings")
maxBars = input.int(10, title="", minval=0, maxval=1000, step=1, inline="MaxBars", group="Squeeze Settings")
bind = input.string(BC, "Bind", options=[BL, BH, BO, BC, BHL, BOC], group="Squeeze Settings")
isRange = input.bool(true, "Fixed Range", inline="Range", group="Backtesting Period")
rangeStart = input.string(R2, "", options=[R0, R1, R2, R3, R4, R5, R6, R7], inline="Range", group="Backtesting Period")
periodStart = input(timestamp("12 Apr 2024 00:00 +0000"), "Backtesting Start", group="Backtesting Period")
periodEnd = input(timestamp("20 Apr 2024 00:00 +0000"), "Backtesting End", group="Backtesting Period")

int startDate = na
int endDate = na
if isRange
    if rangeStart == R0
        startDate := timenow - 21600000
        endDate := timenow
    else if rangeStart == R1
        startDate := timenow - 43200000
        endDate := timenow
    else if rangeStart == R2
        startDate := timenow - 86400000
        endDate := timenow
    else if rangeStart == R3
        startDate := timenow - 172800000
        endDate := timenow
    else if rangeStart == R4
        startDate := timenow - 604800000
        endDate := timenow
    else if rangeStart == R5
        startDate := timenow - 1209600000
        endDate := timenow
    else if rangeStart == R6
        startDate := timenow - 2592000000
        endDate := timenow
    else if rangeStart == R7
        startDate := time
        endDate := timenow
else 
    startDate := periodStart
    endDate := periodEnd
    
float bindOption = na
if bind == BL
    bindOption := low
else if bind == BH
    bindOption := high
else if bind == BO
    bindOption := open
else if bind == BC
    bindOption := close
else if bind == BHL
    bindOption := hl2
else
    bindOption := ohlc4

afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
periodCondition = true
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size != 0

barsFromEntry = ta.barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
openLimitPrice = direction == LONG ? (bindOption - bindOption * openPercent) : (bindOption + bindOption * openPercent)

closeLimitPriceEntry = openLimitPrice * (direction == LONG ? 1 + closePercent : 1 - closePercent)
closeLimitPrice = strategy.position_avg_price * (direction == LONG ? 1 + closePercent : 1 - closePercent)

stopLimitPriceEntry = direction == LONG ? openLimitPrice - openLimitPrice * stopPercent : openLimitPrice + openLimitPrice * stopPercent
stopLimitPrice = direction == LONG ? strategy.position_avg_price - strategy.position_avg_price * stopPercent : strategy.position_avg_price + strategy.position_avg_price * stopPercent

if periodCondition and notInTrade
    strategy.entry(direction == LONG ? "BUY" : "SELL", direction == LONG ? strategy.long : strategy.short, limit = openLimitPrice, stop = stopLimitPriceEntry)
    strategy.exit("INSTANT", limit = closeLimitPriceEntry, stop = stopLimitPriceEntry, comment_profit = direction == LONG ? 'INSTANT SELL' : 'INSTANT BUY', comment_loss = 'INSTANT STOP')
if inTrade 
    strategy.cancel("INSTANT")
    strategy.exit(direction == LONG ? "SELL" : "BUY", limit = closeLimitPrice, stop = stopLimitPrice, comment_profit = direction == LONG ? "SELL" : "BUY", comment_loss = "STOP")
if isMaxBars and barsFromEntry == maxBars
    strategy.close_all(comment = "TIMEOUT STOP", immediately = true)



showStop = stopPercent <= 0.20

// plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=1)
// plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=1)
// plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=1)
plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=0)
plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=0)
plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=0)

plot(openLimitPrice, title="Trailing Open Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.blue : color.red, 30), offset=1)
plot(closeLimitPriceEntry, title="Trailing Close Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.red : color.blue, 80), offset=1)
plot(stopLimitPriceEntry, title="Trailing Stop Position Limit Order", style=plot.style_stepline, color=color.new(#c50202, 80), offset=1)



Thêm nữa