Bóp Backtest Transformers v2.0


Ngày tạo: 2024-04-28 14:09:26 sửa đổi lần cuối: 2024-04-28 14:09:26
sao chép: 0 Số nhấp chuột: 536
1
tập trung vào
1617
Người theo dõi

Bóp Backtest Transformers v2.0

Tổng quan

Đánh giá đòn bẩy Binomo v2.0 là một hệ thống giao dịch định lượng dựa trên chiến lược kiểu đòn bẩy. Nó thực hiện đòn bẩy đối với chiến lược trong một khoảng thời gian nhất định bằng cách đặt các tham số như tỷ lệ nhập, lỗ và dừng, và thời gian giữ vị trí 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à thời gian kết thúc của phản hồi dựa trên các tham số thời gian phản hồi được thiết lập bởi người dùng.
  2. Trong thời gian đánh giá lại, nếu không có vị trí hiện tại và giá chạm vào giá vào ((theo tỷ lệ phần trăm mở vị trí), hãy mở vị trí và đồng thời đặt giá dừng và dừng ((theo tỷ lệ phần trăm dừng và dừng)).
  3. Nếu đã nắm giữ vị trí, hãy hủy lệnh dừng lỗ trước đó và đặt lại giá dừng lỗ mới ((dựa trên giá trung bình nắm giữ vị trí hiện tại)).
  4. Nếu thiết lập thời gian giữ vị thế tối đa, hãy bắt buộc thanh toán khi thời gian giữ vị thế đạt đến giá trị tối đa.
  5. Chiến lược này hỗ trợ giao dịch cả hai chiều, giao dịch tròn và giao dịch trắng.

Lợi thế chiến lược

  1. 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 chiều, có thể thu được lợi nhuận trong các tình huống thị trường khác nhau.
  3. Cung cấp nhiều tùy chọn thiết lập thời gian tra cứu để dễ dàng tra cứu và phân tích dữ liệu lịch sử.
  4. Cài đặt dừng lỗ và dừng lại 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. Cài đặt thời gian nắm giữ tối đa giúp tránh rủi ro thị trường khi nắm giữ quá lâu.

Rủi ro chiến lược

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

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

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

Tóm tắt

Extreme Retracement Transform Gold v2.0 là một hệ thống giao dịch định lượng dựa trên chiến lược loại squeeze, có thể giao dịch trong các môi trường thị trường khác nhau thông qua cài đặt tham số linh hoạt và hỗ trợ giao dịch đa hướng. Ngoài ra, các tùy chọn cài đặt giai đoạn retracement phong phú và cài đặt dừng lỗ có thể giúp người dùng 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 nhiều bởi cài đặt tham số, cần phải được tối ưu hóa và cải tiến để tăng cường sự ổn định và lợi nhuận của chiến lược theo đặc điểm thị trường và nhu cầu giao dịch.

Mã nguồn chiến lược
/*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)