Chiến lược kiếm lợi nhuận theo dõi Joker

Tác giả:ChaoZhang, Ngày: 2023-09-23 15:04:20
Tags:

Tổng quan

Chiến lược Joker Trailing Take Profit là một chiến lược theo xu hướng dựa trên trung bình động. Nó kết hợp các tính năng của việc dừng lỗ và thu lợi nhuận để tối đa hóa lợi nhuận khi thị trường di chuyển theo hướng thuận lợi, trong khi cắt giảm lỗ khi xu hướng đảo ngược.

Chiến lược logic

Chiến lược này sử dụng trung bình di chuyển nhanh và chậm để xác định xu hướng tổng thể. Nó đi dài khi MA nhanh vượt qua trên MA chậm, và đi ngắn khi MA nhanh vượt qua dưới MA chậm.

Chiến lược này đầu tiên tính toán giá lợi nhuận bắt đầu dựa trên tỷ lệ phần trăm được cấu hình sau khi mở một vị trí. Nếu lợi nhuận theo dõi được bật, nó tính toán một bước theo dõi dựa trên kích thước dấu chấm tối thiểu của biểu tượng và tỷ lệ phần trăm theo dõi được cấu hình.

Khi hướng vị trí phù hợp với tín hiệu, lệnh giới hạn được sử dụng để lấy lợi nhuận nếu trailing bị vô hiệu hóa. Nếu trailing được bật, giá lấy lợi nhuận được theo dõi dựa trên kích thước bước.

Phân tích lợi thế

  • Các đường trung bình động lọc tiếng ồn thị trường và tránh các tín hiệu sai.

  • Trailing take profit điều chỉnh mức lợi nhuận theo động dựa trên hành động giá.

  • Theo dõi lấy lợi nhuận khóa trong nhiều lợi nhuận hơn và làm giảm cơ hội để trả lại lợi nhuận. Nó cũng tránh ra khỏi quá sớm với một mức lợi nhuận cố định.

  • Chức năng dừng lỗ cho phép chiến lược thoát sớm khi xu hướng đảo ngược.

Phân tích rủi ro

  • Đường trung bình động có thể tạo ra tín hiệu sai hoặc chậm trễ trong các biến động giá lớn. Điều này có thể gây ra tổn thất từ các giao dịch sai hướng. Tối ưu hóa các tham số MA và thêm bộ lọc có thể giúp.

  • Một tỷ lệ lợi nhuận được đặt quá cao làm tăng thời gian giữ và độ lệch giữa giá lợi nhuận thực tế và dự kiến.

  • Một bước sau đặt quá nhỏ gây ra các bản cập nhật đơn đặt hàng quá mức và làm tăng phí và trượt.

  • TP theo dõi chỉ di chuyển lên và không xem xét rút tiền. Điều này có thể gây ra sự lệch giữa giá lợi nhuận thực tế và dự kiến. Một cơ chế theo dõi hai chiều có thể giúp.

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

  • Xem xét điều chỉnh năng động các tham số MA dựa trên biến động: Thời gian lớn hơn khi biến động tăng và thời gian nhỏ hơn khi biến động giảm.

  • Nghiên cứu tỷ lệ lợi nhuận tối ưu cho các sản phẩm và thị trường khác nhau để giảm thiểu rủi ro lệch.

  • Khám phá cơ chế theo dõi hai chiều để theo dõi cả tăng và giảm. Điều này sẽ giữ lợi nhuận gần với giá.

  • Kết hợp các chỉ số sức mạnh xu hướng để giảm tỷ lệ lợi nhuận trong xu hướng yếu và tăng tỷ lệ trong xu hướng mạnh.

  • Kết hợp với các mô hình học máy để thiết lập động tỷ lệ lợi nhuận dựa trên phạm vi giá dự đoán.

Kết luận

Chiến lược Joker Trailing Take Profit có cấu trúc rõ ràng và sử dụng trung bình động để xác định hướng xu hướng và theo dõi để khóa lợi nhuận. Nó kết hợp các lợi thế của việc dừng lại và thu lợi nhuận để theo xu hướng trơn tru trong khi kiểm soát rủi ro.


/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='Joker Trailing TP Bot', shorttitle='Joker TTP Bot', overlay=true, pyramiding=0, process_orders_on_close=false, close_entries_rule='ANY', calc_on_every_tick=false, calc_on_order_fills=false, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, currency=currency.USD) //, max_labels_count=500)

fromDate = input(timestamp('01 Jan 2021 00:00 UTC'), 'From Date')
toDate = input(timestamp('31 Dec 2121 23:59 UTC'), 'To Date')
fastMALen = input.int(23, 'Fast SMA Length')
slowMALen = input.int(50, 'Slow SMA Length')
longTakeProfitPerc = input.float(0.5, 'Long Take Profit %', minval=0.05, step=0.05) * 0.01
shortTakeProfitPerc = input.float(0.5, 'Short Take Profit %', minval=0.05, step=0.05) * 0.01
enableTrailing = input.bool(true, 'Enable Trailing')
trailingTakeProfitPerc = input.float(0.01, 'Trailing Take Profit %', minval=0.01, maxval=100, step=0.01) * 0.01

float fastMA = ta.sma(close, fastMALen)
float slowMA = ta.sma(close, slowMALen)
bool isWithinPeriod = true
bool openLongPosition = isWithinPeriod and ta.crossover(fastMA, slowMA)
bool openShortPosition = isWithinPeriod and ta.crossunder(fastMA, slowMA)
bool longIsActive = openLongPosition or strategy.position_size > 0
bool shortIsActive = openShortPosition or strategy.position_size < 0

float longTakeProfitPrice = na
longTakeProfitPrice := if longIsActive
    if openLongPosition and not (strategy.position_size > 0)
        close * (1 + longTakeProfitPerc)
    else
        nz(longTakeProfitPrice[1], close * (1 + longTakeProfitPerc))
else
    na

float shortTakeProfitPrice = na
shortTakeProfitPrice := if shortIsActive
    if openShortPosition and not (strategy.position_size < 0)
        close * (1 - shortTakeProfitPerc)
    else
        nz(shortTakeProfitPrice[1], close * (1 - shortTakeProfitPrice))
else
    na

float longTrailingTakeProfitStepTicks = longTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
float shortTrailingTakeProfitStepTicks = shortTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick

strategy.entry(id = 'Long Entry', direction = strategy.long, when = openLongPosition, alert_message = 'Long(' + syminfo.ticker + '): Started')
strategy.entry(id = 'Short Entry', direction = strategy.short, when = openShortPosition, alert_message = 'Short(' + syminfo.ticker + '): Started')
strategy.exit(id = 'Long Take Profit', from_entry = 'Long Entry', limit = enableTrailing ? na : longTakeProfitPrice, trail_price = enableTrailing ? longTakeProfitPrice : na, trail_offset = enableTrailing ? longTrailingTakeProfitStepTicks : na, when = longIsActive, alert_message = 'Long(' + syminfo.ticker + '): Take Profit activated')
strategy.exit(id = 'Short Take Profit', from_entry = 'Short Entry', limit = enableTrailing ? na : shortTakeProfitPrice, trail_price = enableTrailing ? shortTakeProfitPrice : na, trail_offset = enableTrailing ? shortTrailingTakeProfitStepTicks : na, when = shortIsActive, alert_message = 'Short(' + syminfo.ticker + '): Take Profit activated')

plot(series = fastMA, title='Fast SMA', color = color.blue, linewidth = 1, style = plot.style_line)
plot(series = slowMA, title='Slow SMA', color = color.orange, linewidth = 1, style = plot.style_line)
plot(series = longTakeProfitPrice, title='Long Take Profit', color = color.green, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = shortTakeProfitPrice, title='Short Take Profit', color = color.red, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = strategy.position_avg_price, title='Position', color = color.white, linewidth = 1, style = plot.style_linebr)


Thêm nữa