
Mặc dù ngày càng có nhiều nhà giao dịch viết chương trình để thực hiện giao dịch hoàn toàn tự động nhưng nhóm lớn vẫn là 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 một số công cụ nhỏ để hỗ trợ cho giao dịch chủ quan của mình. Ví dụ, đôi khi bạn tìm thấy một vị thế vào lệnh tốt và lên kế hoạch đặt mức dừng lỗ cố định và mức chốt lời theo sau cho vị thế ban đầu. Sau đó, bạn có thể tránh các nhiệm vụ tốn năng lượng như theo dõi thị trường tiếp theo. Chỉ cần tuân theo các kế hoạch dừng lỗ và chốt lời đã thiết lập và để chương trình theo dõi thị trường thay bạn. Nếu bạn thua cược, hãy dừng lỗ; nếu bạn thắng, hãy theo dõi mục tiêu lợi nhuận để hỗ trợ giao dịch thủ công.
Chiến lược thiết kế các yêu cầu như vậy bằng ngôn ngữ Pine rất đơn giản. Các tham số sau đây cần được thiết kế để triển khai cá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("跟踪止损止盈委托", 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", "跟踪止损止盈偏移")
varip limit = input(-1, "limit", "初始开仓价格,-1为不开仓,0为立即开仓,其它具体数值为限价价格")
varip amount = input(1, "amount", "开仓量")
varip loss = input(30, "loss", "止损")
varip targetOffset = input(30, "targetOffset", "触发跟踪止盈止损偏移量")
varip minTick = input(1, "minTick", "价格一跳")
tradeType = input.string("long", "direction", tooltip="下单方向,long做多,short做空", options=["long", "short"])
if not barstate.ishistory and not isAlertMinTick
runtime.log("检查syminfo.mintick是否正确!syminfo.mintick:", syminfo.mintick, "#FF0000")
if syminfo.mintick < minTick
runtime.error("系统syminfo.mintick < minTick参数", "#FF0000")
isAlertMinTick := true
if not barstate.ishistory and limit == -1 and not isAlert
runtime.log("没有设置开仓价格,当前limit为-1(防止误开仓,初始默认limit为-1),禁止开仓", "#FF0000")
isAlert := true
if isTrade and strategy.position_size == 0 and not isAlertFinished
runtime.log("所有委托流程执行完毕,仓位为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("每点价格为:", syminfo.mintick, ",当前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 触发线")
plot(strategy.position_size!=0 ? high_lowPrice : na, "当前最高价/最低价")
plot(strategy.position_size!=0 ? (strategy.position_size > 0 ? high_lowPrice-syminfo.mintick*offset : high_lowPrice+syminfo.mintick*offset) : na, "移动止损触发线")
Thiết kế chiến lược không phức tạp. Khi sử dụng, thường cần phải thiết lập thành “mô hình giá thời gian thực” vì giá cần được kiểm tra mọi lúc.

Lưu ý rằng mức dừng lỗ trong các tham số được thể hiện bằng điểm (một lần tăng giá) và mức bù trừ theo dõi chốt lời cũng được thể hiện bằng điểm (một lần tăng giá). targetOffset theo dõi độ lệch của đường kích hoạt chốt lời và được thể hiện theo khoảng cách giá (ví dụ: nếu bạn đặt thành 30, nghĩa là khoảng cách là 30 nhân dân tệ). Khi giá nhảy 1, 30 lần nhảy tương đương với khoảng cách 30 nhân dân tệ.
Chiến lược ủy thác này được thiết kế không chỉ cho phép các vị thế mua ban đầu mà còn cho phép các vị thế bán ban đầu. Sau đó, lệnh dừng lỗ và lệnh chốt lời sẽ được xử lý theo hướng bán khống.
Chúng ta hãy chứng minh các chức năng được thiết kế thực hiện:
1. Khi chiến lược này đang chạy, hãy mở một vị thế cơ sở ngay lập tức và sau đó đặt mức dừng lỗ và chốt lời theo các thông số.

Hướng được đặt thành dài, tham số giới hạn được đặt thành 0, nghĩa là chiến lược sẽ tham gia thị trường và đi vào dài ngay lập tức khi chạy, và số tiền được đặt thành 1, và chiến lược sẽ mở vị thế là 1 hợp đồng.

2. Chỉ định tham số giới hạn và giá nhập
Các thiết lập tham số khác không thay đổi, chỉ cần chỉ định giá tham số giới hạn là: 1276

3. Tham số giới hạn mặc định là -1, nghĩa là không có thao tác nào được thực hiện để ngăn chặn việc mở vị trí một cách ngẫu nhiên.

Khi sử dụng chiến lược ngôn ngữ Pine, hãy đặc biệt chú ý đến dữ liệu giá tăng đột biến. Mức tăng giá cụ thể của hệ thống có liên quan đến “độ chính xác của giá tiền tệ” trong các tham số.

Tham số “Độ chính xác của đơn vị tiền tệ định giá” được đặt thành 0, nghĩa là giá trị dữ liệu giá chính xác đến từng chữ số đơn vị (tức là số chữ số thập phân là 0). Khi đó, đơn vị thay đổi giá nhỏ nhất là 1. Vì một số thông số có liên quan đến mức tăng giá cụ thể nên cần đặc biệt chú ý đến điểm này.
Được rồi, trên đây là nội dung thiết kế đầy đủ của chiến lược ủy thác bán tự động này, mặc dù tôi cũng sử dụng nó trong giao dịch thực tế. Tuy nhiên, các công cụ như vậy phải được hiểu và sử dụng theo thói quen giao dịch của riêng bạn và bạn có thể tự mình sửa đổi và tối ưu hóa chúng. Mã chiến lược ở đây chỉ dành cho mục đích chia sẻ công khai, giao lưu và học hỏi phương pháp thiết kế và logic.
Có thể thấy rằng ngôn ngữ Pine rất dễ sử dụng, tiện lợi và dễ học. Chúng ta có thể sử dụng ngôn ngữ Pine để nhanh chóng thiết kế các công cụ mà chúng ta muốn mà không cần phải lo lắng về thiết kế chương trình phức tạp. Sử dụng ngôn ngữ Pine trong FMZ Quantitative giúp giao dịch định lượng dễ dàng và đơn giản hơn.