Tài nguyên đang được tải lên... tải...

Viết một công cụ giao dịch bán tự động bằng ngôn ngữ Pine

Tác giả:Những nhà phát minh định lượng - những giấc mơ nhỏ, Tạo: 2022-09-29 14:36:32, Cập nhật: 2023-09-15 20:53:45

img

Viết một công cụ giao dịch bán tự động bằng ngôn ngữ Pine

Mặc dù ngày càng có nhiều nhà giao dịch viết chương trình để giao dịch hoàn toàn tự động, nhưng một nhóm lớn hơn vẫn là các nhà giao dịch thủ công. Trong thực tế, các nhà giao dịch chủ thể thủ công cũng có thể hỗ trợ giao dịch chủ thể của mình bằng cách viết một số công cụ nhỏ. Ví dụ, đôi khi tìm thấy một vị trí đầu vào tốt, lập kế hoạch đặt lỗ cố định, theo dõi lỗ dừng.

Thiết kế tham số

Chiến lược thiết kế các nhu cầu như vậy bằng ngôn ngữ Pine rất đơn giản, tùy thuộc vào nhu cầu thực hiện chức năng cần thiết kế một vài tham số sau:

1, Offset: Khi kích hoạt theo dõi dừng giá, di chuyển giá cao nhất, giá thấp nhất để xác định khoảng cách di chuyển của đường dừng giá. 2, giới hạn: Các tham số được sử dụng để kiểm soát A. Mua trực tiếp; B. Đặt giá chờ mua; C. Không làm gì cả. 3, số lượng: số lượng đơn đặt hàng khi bắt đầu giao dịch. 4, Loss: Số điểm dừng lỗ. 5, TargetOffset: Sự chênh lệch giá của giá mở vị trí khi kích hoạt theo dõi dừng giá. 6 minTick: Giá tăng. 7, direction: hướng đặt chân và mở chân.

Chiến lược thiết kế

/*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 cũng không phức tạp, và khi sử dụng, thường cần thiết lập "mô hình giá thực tế" vì bạn phải phát hiện giá mọi lúc.

img

Lưu ý rằng trong tham số stop loss được biểu thị bằng dấu chấm (trước khi giá nhảy), offset theo dõi trục trục trục trục trục cũng được biểu thị bằng dấu chấm (trước khi giá nhảy). targetOffset theo dõi trục trục trục trục trục trục trục trục trục trục trần được biểu thị bằng khoảng cách giá (ví dụ: đặt 30, đó là khoảng cách 30 đô la).

Chính sách ủy thác này được thiết kế để không chỉ làm nhiều hơn thế nhưng cũng làm trống các tầng đáy ban đầu. Sau đó, dừng lỗ và theo dõi ngăn chặn đà được xử lý theo hướng làm trống.

Dưới đây là một ví dụ về các tính năng thực hiện thiết kế:

1, để cho chiến lược này chạy ngay lập tức, sau đó theo các tham số thiết lập dừng lỗ, theo dõi dừng tăng.

img

direction được đặt là long, limit được đặt là 0, cho phép chiến lược chạy ngay lập tức nhập nhiều, amount được đặt là 1, chiến lược mở 1 hợp đồng.

img

2, Đặt tham số giới hạn, Đặt giá vào

Các tham số khác không thay đổi, chỉ cần chỉ định giá của tham số limit là: 1276

img

3, tùy chọn giới hạn mặc định là -1, không điều hành bất cứ điều gì để ngăn chặn việc bắt đầu sai

img

Sự kết thúc

Khi sử dụng chiến lược ngôn ngữ Pine, hãy đặc biệt chú ý đến dữ liệu giá một lần. Giá một lần của hệ thống liên quan đến "chính xác tiền định giá" trong tham số.

img

Các tham số "định giá tiền tệ chính xác" được thiết lập là 0, nghĩa là số liệu giá chính xác đến một vị trí (tức là số nhỏ là 0). Vì vậy, đơn vị biến động nhỏ nhất của giá là 1.

OK, trên đây là tất cả các thiết kế của chính sách giao dịch bán tự động này, mặc dù tôi cũng sử dụng trên máy tính thực. Nhưng các công cụ như vậy cũng cần phải hiểu được cách sử dụng theo thói quen giao dịch của mình và có thể tự sửa đổi, tối ưu hóa. Mã chính sách này chỉ là chia sẻ công khai, trao đổi, học thiết kế, logic.

Có thể thấy rằng ngôn ngữ Pine rất dễ sử dụng, dễ sử dụng 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 bận tâm đến việc thiết kế chương trình phức tạp.


Có liên quan

Thêm nữa