Mặc dù ngày càng có nhiều nhà giao dịch viết các chương trình giao dịch tự động đầy đủ, nhưng nhóm lớn hơn của các nhà giao dịch vẫn là các nhà giao dịch thủ công. Trên thực tế, các nhà giao dịch chủ quan thủ công cũng có thể viết các công cụ nhỏ để hỗ trợ họ trong giao dịch chủ quan của họ. Ví dụ, đôi khi bạn tìm thấy một vị trí đầu vào tốt và lên kế hoạch thiết lập một mức dừng lỗ cố định và lợi nhuận theo dõi trên vị trí ban đầu. Sau đó loại bỏ những thứ tốn năng lượng nhiều hơn như giám sát thị trường tiếp theo, làm theo chính xác kế hoạch dừng lỗ và lợi nhuận của riêng bạn và để chương trình thực hiện việc giám sát thị trường cho bạn.
Chiến lược để thiết kế các yêu cầu như vậy bằng cách sử dụng ngôn ngữ Pine rất đơn giản. Các thông số sau đây cần phải được thiết kế để đạt được chức năng theo yêu cầu:
/*backtest
start: 2022-09-24 00:00:00
end: 2022-09-27 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["v_input_1",20],["v_input_2",0],["v_input_4",50],["v_input_5",20],["RunMode",1,358374],["ZPrecision",0,358374],["XPrecision",3,358374]]
*/
strategy("Tracking loss and profit stopping entrustment", overlay = true)
varip targetPrice = na
varip high_lowPrice = na
varip isTrade = false
varip isAlert = false
varip isAlertMinTick = false
varip isAlertFinished = false
varip offset = input(30, "offset", "Tracking stop loss and stop profit offset")
varip limit = input(-1, "limit", "Initial opening price: - 1 means no opening, 0 means immediate opening, and other specific values are price limits")
varip amount = input(1, "amount", "amount of opening positions")
varip loss = input(30, "loss", "stop loss")
varip targetOffset = input(30, "targetOffset", "trigger tracking profit and loss stop offset")
varip minTick = input(1, "minTick", "the minimum unit of price fluctuation")
tradeType = input.string("long", "direction", tooltip="order direction, long: go long, short: go short", options=["long", "short"])
if not barstate.ishistory and not isAlertMinTick
runtime.log("check whether syminfo.mintick is correct! syminfo.mintick:", syminfo.mintick, "#FF0000")
if syminfo.mintick < minTick
runtime.error("system syminfo.mintick < minTick parameter", "#FF0000")
isAlertMinTick := true
if not barstate.ishistory and limit == -1 and not isAlert
runtime.log("No open price is set, current limit is -1 (to prevent false openings, initial default limit is -1), openings are prohibited", "#FF0000")
isAlert := true
if isTrade and strategy.position_size == 0 and not isAlertFinished
runtime.log("All order processes executed, position is 0", "#FF0000")
isAlertFinished := true
if not barstate.ishistory and not isTrade and limit != -1
if limit == 0
strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount)
else if limit > 0
strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount, limit=limit)
if tradeType == "long"
targetPrice := (limit == 0 ? close : limit) + targetOffset
else
targetPrice := (limit == 0 ? close : limit) - targetOffset
strategy.exit("exit", "open", amount, loss=loss, trail_price=targetPrice, trail_offset=offset)
runtime.log("The price per point is:", syminfo.mintick, ", current close:", close)
isTrade := true
if ((close > targetPrice and strategy.position_size > 0) or (close < targetPrice and strategy.position_size < 0)) and not barstate.ishistory
high_lowPrice := na(high_lowPrice) ? close : high_lowPrice
if strategy.position_size > 0
high_lowPrice := close > high_lowPrice ? close : high_lowPrice
else
high_lowPrice := close < high_lowPrice ? close : high_lowPrice
plot(targetPrice, "trail_price trigger line")
plot(strategy.position_size!=0 ? high_lowPrice : na, "current highest/lowest price")
plot(strategy.position_size!=0 ? (strategy.position_size > 0 ? high_lowPrice-syminfo.mintick*offset : high_lowPrice+syminfo.mintick*offset) : na, "moving stop loss trigger line")
Thiết kế chiến lược không phức tạp, nhưng nó cần phải được thiết lập như một mô hình giá thời gian thực vì giá nên được theo dõi mọi lúc.
Lưu ý rằng stop loss được thể hiện bằng điểm (minTick) và offset cũng được thể hiện bằng điểm (minTick).
Chiến lược hoa hồng này được thiết kế để cho phép không chỉ các vị trí cơ sở ban đầu để đi dài, mà còn các vị trí cơ sở ban đầu để đi ngắn. sau đó dừng lỗ và lợi nhuận theo dõi được xử lý theo hướng ngắn.
Hãy chứng minh việc thực hiện thiết kế như sau:
Khi chiến lược đang chạy, vị trí cơ sở sẽ được mở và nhập ngay lập tức, và sau đó dừng lỗ và theo dõi dừng lợi nhuận sẽ được thiết lập theo các thông số.
hướng được đặt là dài, tham số giới hạn được đặt là 0, tức là, hãy để chiến lược đi dài ngay lập tức khi nó chạy, số tiền được đặt là 1, tức là, chiến lược mở một vị trí của 1 hợp đồng.
2. Xác định các thông số giới hạn, xác định giá nhập cảnh
Các thiết lập tham số khác vẫn không thay đổi, ngoại trừ việc giá giới hạn tham số được chỉ định là: 1276
3. Các tham số giới hạn mặc định là -1, mà không vận hành bất cứ điều gì và ngăn chặn việc mở tình cờ các vị trí
Khi sử dụng chiến lược ngôn ngữ Pine, điều quan trọng là phải chú ý đặc biệt đến dữ liệu minTick. Số lượng chính xác của minTick giá trong hệ thống có liên quan đến độ chính xác tiền tệ giá trong tham số.
Các thông số
OK, trên đây là toàn bộ thiết kế của chiến lược hoa hồng bán tự động này, mặc dù tôi cũng sử dụng nó cho giao dịch robot thực. nhưng các công cụ như vậy cũng phải được sử dụng theo thói quen giao dịch của riêng bạn để hiểu, các sửa đổi cụ thể, tối ưu hóa có thể được thực hiện bởi chính bạn.
Như chúng ta có thể thấy, ngôn ngữ Pine rất dễ sử dụng, thuận tiện và dễ học. Chúng ta có thể sử dụng ngôn ngữ Pine để thiết kế các công cụ chúng ta muốn nhanh chóng, mà không phải lo lắng về lập trình phức tạp, và sử dụng ngôn ngữ Pine để làm cho giao dịch định lượng dễ dàng hơn trên nền tảng giao dịch định lượng FMZ.