Joker di chuyển chiến lược chốt lời


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

Tổng quan

Chiến lược dừng di chuyển Joker là một chiến lược theo dõi xu hướng dựa trên đường trung bình di chuyển. Nó kết hợp các đặc điểm của dừng di chuyển và dừng di chuyển, nhằm mục đích khóa tối đa lợi nhuận khi thị trường đi theo hướng thuận lợi, đồng thời có thể dừng lỗ sớm nhất khi thị trường đi theo hướng bất lợi.

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

Chiến lược này sử dụng đường trung bình di chuyển nhanh và đường trung bình di chuyển chậm để xây dựng bộ lọc xu hướng. Khi đi qua đường trung bình di chuyển chậm trên đường trung bình di chuyển nhanh, hãy làm nhiều hơn; Khi đi qua đường trung bình di chuyển chậm dưới đường trung bình di chuyển nhanh, hãy làm trống.

Chiến lược đầu tiên tính toán giá dừng đầu tiên sau khi mở vị trí dựa trên tỷ lệ phần trăm dừng của cấu hình. Nếu tính năng dừng di động được bật, kích thước bước của dừng di động được tính toán dựa trên giá thay đổi tối thiểu của loại giao dịch và tỷ lệ phần trăm dừng di động của cấu hình.

Khi hướng giữ vị trí phù hợp với hướng tín hiệu, nếu không bật dừng di động, hãy dừng bằng cách đặt giá giới hạn; Nếu bật dừng di động, hãy sử dụng theo dõi dừng, liên tục điều chỉnh giá dừng theo kích thước bước.

Phân tích lợi thế

  • Sử dụng trung bình di chuyển để đánh giá xu hướng chính, tránh gây nhiễu quá nhiều cho chiến lược bởi tiếng ồn thị trường.

  • Khi kích hoạt dừng di động, bạn có thể điều chỉnh vị trí dừng theo xu hướng thị trường, đảm bảo rằng vị trí dừng luôn giữ chặt giá. Điều này linh hoạt và hiệu quả hơn so với việc thiết lập một giá dừng cố định.

  • Chữ dừng di động có thể khóa nhiều lợi nhuận hơn, giảm nguy cơ giảm giá của chiến lược. Nó cũng tránh được các vấn đề về vị trí dừng quá bảo thủ, khóa lợi nhuận quá sớm mà chỉ có thể xuất hiện khi đặt một lệnh dừng cố định.

  • Hạn chế di động vẫn giữ được lợi thế của thiết lập dừng lỗ, có thể dừng lỗ sớm nhất khi tình hình trở nên bất lợi.

Phân tích rủi ro

  • Đường trung bình di chuyển có thể tạo ra tín hiệu sai hoặc tín hiệu chậm trễ khi giá dao động mạnh. Điều này có thể dẫn đến mất mát trong chiến lược xây dựng vị trí đảo ngược. Bạn có thể điều chỉnh tham số trung bình di chuyển thích hợp hoặc thêm Filter để tối ưu hóa.

  • Thiết lập tỷ lệ chặn quá lớn cũng làm tăng thời gian giữ chiến lược và sự lệch giữa giá chặn thực tế và giá lý thuyết. Bạn có thể giảm tỷ lệ chặn thích hợp để giảm rủi ro này.

  • Thiết lập tỷ lệ bước của dừng di động quá nhỏ có thể dẫn đến tần số di chuyển quá cao, tăng phí giao dịch và rủi ro trượt. Bạn có thể điều chỉnh thích hợp để tối ưu hóa bước dừng di động.

  • Chữ dừng di chuyển chỉ tính đến di chuyển một chiều, không tính đến rút lui. Điều này có nghĩa là giá sẽ quay trở lại một lần nữa và chốt dừng di chuyển sẽ không giảm. Điều này sẽ dẫn đến việc chốt dừng cuối cùng thực hiện giá lệch khỏi giá lý thuyết.

Hướng tối ưu hóa

  • Bạn có thể xem xét điều chỉnh các tham số trung bình di chuyển tùy theo biến động của tỷ lệ biến động thị trường, tăng chu kỳ khi biến động tăng, giảm chu kỳ khi biến động giảm.

  • Có thể nghiên cứu các đặc điểm của các giống và thị trường khác nhau, thiết lập tỷ lệ trục trục mặc định khác nhau, giảm nguy cơ lệch trục trục trục.

  • Có thể nghiên cứu cơ chế dừng di chuyển hai chiều, di chuyển dừng lên khi giá đạt đến điểm cao mới và di chuyển dừng xuống khi có sự rút lui, để dừng lại gần giá hơn.

  • Có thể xem xét kết hợp với chỉ số cường độ xu hướng để giảm tỷ lệ dừng khi xu hướng yếu và tăng tỷ lệ dừng khi xu hướng mạnh.

  • Có thể xem xét kết hợp với mô hình học máy để thiết lập tỷ lệ dừng động bằng cách sử dụng các phạm vi giá dự đoán của mô hình.

Tóm tắt

Chiến lược dừng di động Joker có cấu trúc tổng thể rõ ràng, sử dụng đường trung bình di động để đánh giá xu hướng, sau đó động điều chỉnh vị trí dừng để khóa lợi nhuận. Nó có lợi thế của dừng di động và dừng di động, có thể theo dõi xu hướng một cách hiệu quả và kiểm soát rủi ro.

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