Chiến lược dừng lỗ theo sau dựa trên khoảng cách giá


Ngày tạo: 2023-11-28 13:53:16 sửa đổi lần cuối: 2023-11-28 13:53:16
sao chép: 0 Số nhấp chuột: 659
1
tập trung vào
1621
Người theo dõi

Chiến lược dừng lỗ theo sau dựa trên khoảng cách giá

Tổng quan

Chiến lược này sử dụng nguyên tắc khoảng cách giá, mua khi phá vỡ điểm thấp, đặt lệnh dừng lỗ và lệnh dừng bán để theo dõi giá dừng lỗ thấp nhất và kiếm lợi nhuận.

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

Khi giá giảm xuống mức thấp nhất trong N giờ gần đây nhất, hãy đặt khoảng cách định vị, theo tỷ lệ phần trăm được thiết lập, đồng thời thiết lập lệnh dừng và dừng. Sau đó, đường dừng và đường dừng sẽ được di chuyển theo thị trường.

  1. Tính điểm thấp nhất trong N giờ làm giá ràng buộc
  2. Giá thực tế thấp hơn giá ràng buộc nhân tỷ lệ phần trăm đặt mua khi mua thêm
  3. Cài đặt giá dừng là giá nhập khẩu nhân tỷ lệ bán ra của thiết lập
  4. Thiết lập Stop Loss là giá khởi điểm trừ giá khởi điểm nhân Stop Loss %
  5. Tỷ lệ phần trăm của số đơn là quyền lợi chiến lược
  6. Theo dõi đường dừng động giá thấp nhất
  7. Ngăn chặn hoặc dừng lỗ.

Phân tích lợi thế chiến lược

Chiến lược này có những ưu điểm sau:

  1. Sử dụng suy nghĩ về khoảng cách giá để tăng tỷ lệ chiến thắng khi vượt qua điểm thấp
  2. Tự động theo dõi dừng lỗ, có thể khóa phần lớn lợi nhuận
  3. Tỷ lệ Stop Loss có thể điều chỉnh để phù hợp với các thị trường khác nhau
  4. Ứng dụng cho các giống có đặc điểm quay ngược rõ rệt
  5. Hoạt động đơn giản, dễ thực hiện

Phân tích rủi ro chiến lược

Chiến lược này cũng có một số rủi ro:

  1. Có thể sẽ không thành công, nhưng có thể sẽ tìm kiếm một lần nữa
  2. Cài đặt dừng hoặc dừng không đúng có thể gây ra dừng quá sớm hoặc dừng để mất một số tiền lớn hơn
  3. Cần tối ưu hóa các tham số thường xuyên để thích ứng với sự thay đổi của thị trường
  4. Có hạn chế, có thể không hiệu quả đối với một số giống
  5. Có một số nhu cầu can thiệp nhân tạo

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

Chiến lược này cũng có thể được tối ưu hóa bằng cách:

  1. Thêm các thuật toán học máy để tự động tối ưu hóa các tham số
  2. Thêm nhiều phương thức dừng lỗ, chẳng hạn như di chuyển dừng lỗ, treo dừng lỗ
  3. Tối ưu hóa logic dừng lỗ để thực hiện dừng lỗ thông minh hơn và trơn tru hơn
  4. Kết hợp với nhiều chỉ số đánh giá tín hiệu tin cậy, lọc tín hiệu sai
  5. Mở rộng phạm vi cho nhiều giống hơn, nâng cao tính phổ quát của chiến lược

Tóm tắt

Chiến lược này nói chung là một chiến lược dừng lỗ theo dõi đơn giản và hiệu quả dựa trên suy nghĩ về khoảng cách giá. Nó làm giảm khả năng nhập nhầm, có thể khóa lợi nhuận một cách hiệu quả, có rất nhiều không gian tối ưu hóa về tối ưu hóa tham số và lọc, đáng để nghiên cứu và cải thiện thêm.

Mã nguồn chiến lược
/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="Squeeze Backtest by Shaqi v1.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)
strategy.risk.allow_entry_in(strategy.direction.long)

R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"


buyPercent = input( title="Buy, %",         type=input.float,   defval=3,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
sellPercent = input(title="Sell, %",        type=input.float,   defval=1,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
stopPercent = input(title="Stop Loss, %",   type=input.float,   defval=1,       minval=0.01,        maxval=100,     step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
isMaxBars = input(  title="Max Bars To Sell",               type=input.bool,    defval=true ,                                   inline="MaxBars",   group="Squeeze Settings")
maxBars = input(    title="",       type=input.integer, defval=2,     minval=0,           maxval=1000, step=1,                  inline="MaxBars",   group="Squeeze Settings")
bind = input(       title="Bind",           type=input.source,  defval=close,                                                                       group="Squeeze Settings")
isRange = input(    title="Fixed Range",               type=input.bool,    defval=true,                                         inline="Range",     group="Backtesting Period")
rangeStart = input( title="",                       defval=R4,      options=[R0, R1, R2, R3, R4, R5, R6, R7],                   inline="Range",     group="Backtesting Period")
periodStart = input(title="Backtesting Start", type=input.time,    defval=timestamp("01 Aug 2021 00:00 +0000"),                                     group="Backtesting Period")
periodEnd = input(  title="Backtesting End",   type=input.time,    defval=timestamp("01 Aug 2022 00:00 +0000"),                                     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

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

barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
buyLimitPrice = bind - bind * buyPercent
buyLimitFilled = low <= buyLimitPrice
sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent)
sellLimitPrice = strategy.position_avg_price * (1 + sellPercent)

stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent
stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent

if afterStartDate and beforeEndDate and notInTrade
    strategy.entry("BUY", true, limit = buyLimitPrice)
    strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry)
strategy.cancel("INSTANT", when = inTrade)
if isMaxBars
    strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell")
strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice)

showStop = stopPercent <= 0.03

plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1)
plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1)
plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1)
plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)