Chiến lược này thực hiện chức năng thiết lập nhiều phần trăm dừng xuất cảnh. Chiến lược này đầu tiên đánh giá các điều kiện dài và ngắn, nhập cảnh nhiều thời gian trống. Sau đó, chuyển phần trăm thành điểm giá thông qua hàm percentAsPoints tùy chỉnh. Chương trình đã thiết lập 4 exit theo phần trăm dừng 1% , 2%, 3% và 4% được thiết lập, đồng thời cũng thiết lập một điểm dừng 2% chung.
Chiến lược này chủ yếu được đánh giá bằng cách giao điểm đa không của đường trung bình sma. Cụ thể hơn, khi đường nhanh sma ((14) đi qua đường chậm sma ((28) sẽ được nhập nhiều hơn; khi đường nhanh sma ((14) đi qua đường chậm sma ((28) sẽ được nhập trống.
Câu hỏi đặt ra là, làm thế nào để thiết lập nhiều điểm dừng phần trăm?
percentAsPoints(pcnt) =>
strategy.position_size != 0 ? round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
Chức năng này sẽ sử dụng phần trăm nhân giá trung bình của vị trí giữ và chia cho giá tối thiểu, để có được số điểm giá nếu số lượng giữ không bằng 0. Nếu vị trí giữ là 0, trả về na.
Với hàm này, chúng ta có thể dễ dàng chuyển đổi số phần trăm thành số phần trăm. Sau đó, chương trình sẽ theo cài đặt 1%, 2%, 3% và 4%, thiết lập 4 exits:
lossPnt = percentAsPoints(2)
strategy.exit("x1", qty_percent = 25, profit = percentAsPoints(1), loss = lossPnt)
strategy.exit("x2", qty_percent = 25, profit = percentAsPoints(2), loss = lossPnt)
strategy.exit("x3", qty_percent = 25, profit = percentAsPoints(3), loss = lossPnt)
strategy.exit("x4", profit = percentAsPoints(4), loss = lossPnt)
Trong khi đó, tất cả các exit đều sử dụng một stop loss 2% phổ biến. Điều này mang lại hiệu quả ngăn chặn nhiều phần trăm.
Chiến lược này có nhiều ưu điểm:
Bạn có thể làm việc theo bộ phận của mình để tránh bỏ lỡ cơ hội kiếm tiền nhiều hơn. Nói chung, càng đứng sau, càng lớn, rủi ro càng lớn, chiến lược này có thể cân bằng rủi ro và lợi nhuận.
Phân chia lô hạn có thể trả lại vốn, giảm rủi ro. Ví dụ: thiết lập 25% lô, khi lợi nhuận đạt 1%, bạn có thể lấy lại 1⁄4 vốn. Sau đó, các vị trí được vận hành dựa trên lợi nhuận.
Bảo vệ chống mất mát khi xảy ra tình huống bất thường, giảm 2% có thể tránh được những tổn thất lớn khi xảy ra tình huống cực đoan.
Mã được thực hiện đơn giản, rõ ràng, dễ hiểu, dễ sửa đổi và tối ưu hóa. Chức năng tùy chỉnh chuyển phần trăm thành số điểm, sau đó một vài dòng mã có thể được thiết lập nhiều dấu chấm.
Chiến lược này cũng có một số rủi ro:
Thị trường dừng phần trăm dễ bị dao động ngang, giá dao động xung quanh giá dừng. Điều này thường xuyên gây ra lỗ dừng, tăng tần suất giao dịch và gánh nặng phí xử lý.
Việc phân chia các đợt dừng giao dịch làm tăng số lượng giao dịch và gánh nặng phí xử lý. Nếu phí xử lý quá cao, phần lợi nhuận của đợt dừng sẽ được bù đắp.
Thiết lập điểm dừng không đúng cũng ảnh hưởng đến tỷ lệ lợi nhuận. Nếu thiết lập quá bảo thủ, sẽ khó đạt được lợi nhuận thỏa đáng; và thiết lập quá cực đoan, rủi ro quá lớn.
Lạm dừng phần trăm cố định, không tính đến biến động và xu hướng của thị trường. Trong trường hợp xung đột, nên giảm mức dừng và trong trường hợp xu hướng, nên tăng mức dừng.
Với những rủi ro trên, có thể tiếp tục tối ưu hóa các khía cạnh sau:
Tối ưu hóa chiến lược dừng để nó có thể tự động điều chỉnh theo biến động thị trường và xu hướng. Ví dụ: thêm ATR Stop, thắt chặt Stop trong thời gian chấn động và nới lỏng Stop trong xu hướng.
Tối ưu hóa tỷ lệ và độ lớn của ngắt hàng loạt để đạt được sự kết hợp tối ưu của lợi nhuận rủi ro. Thêm chức năng tối ưu hóa tham số để tìm tham số tối ưu.
Giảm số lần dừng và tránh giao dịch quá thường xuyên. Ví dụ: thiết lập vùng đệm giá, chỉ dừng sau khi vượt quá một phạm vi nhất định.
Xem xét các yếu tố phí tổn, khi dự kiến lợi nhuận ngừng giảm thấp hơn phí tổn. Hoặc tối ưu hóa mức giảm theo phí tổn.
Sử dụng đơn vị dừng sổ sách. Theo ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên ưu tiên
Chiến lược này đạt được hiệu quả của nhiều điểm dừng phần trăm, thiết lập bốn điểm dừng 1%, 2%, 3% và 4%, có thể dừng lại theo giờ, đồng thời dừng lại 2% để ngăn chặn tổn thất lớn trong trường hợp bất thường. Chiến lược này có thể cân bằng lợi nhuận rủi ro và ngăn chặn cơ hội kiếm tiền hơn.
/*backtest
start: 2023-10-31 00:00:00
end: 2023-11-30 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © adolgov
//@version=4
strategy("Multiple %% profit exits example", overlay=false, default_qty_value = 10)
longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = crossunder(sma(close, 14), sma(close, 28))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
percentAsPoints(pcnt) =>
strategy.position_size != 0 ? round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
lossPnt = percentAsPoints(2)
strategy.exit("x1", qty_percent = 25, profit = percentAsPoints(1), loss = lossPnt)
strategy.exit("x2", qty_percent = 25, profit = percentAsPoints(2), loss = lossPnt)
strategy.exit("x3", qty_percent = 25, profit = percentAsPoints(3), loss = lossPnt)
strategy.exit("x4", profit = percentAsPoints(4), loss = lossPnt)
profitPercent(price) =>
posSign = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
(price - strategy.position_avg_price) / strategy.position_avg_price * posSign * 100
p1 = plot(profitPercent(high), style=plot.style_linebr, title = "open profit % upper bound")
p2 = plot(profitPercent(low), style=plot.style_linebr, title = "open profit % lower bound")
fill(p1, p2, color = color.red)