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

Tác giả:Lydia., Tạo: 2022-11-08 09:56:48, Cập nhật: 2023-09-15 20:52:26

img

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.

Thiết kế tham số

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:

  1. Offset: Khi một stop profit bị kích hoạt, khoảng cách offset cho offset là giá cao nhất và giá thấp nhất để phân định ranh giới stop profit.
  2. giới hạn: Các tham số được sử dụng để kiểm soát - A. Vị trí cơ sở ban đầu để mua trực tiếp, B. Giá xác định để chờ mua, C. Không làm gì.
  3. số tiền: Số tiền đặt hàng được đặt khi vị trí cơ sở được mở.
  4. lỗ: điểm dừng lỗ.
  5. TargetOffset: Sự khác biệt giá mà bù đắp giá mở cửa khi lệnh dừng lợi nhuận bị kích hoạt.
  6. minTick: Đơn vị biến động giá tối thiểu.
  7. Hướng: Hướng mở vị trí cơ sở.

Thiết kế chiến lược

/*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.

img

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ố.

img

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.

img

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

img

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í

img

Sự kết thúc

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ố.

img

Các thông số Pricing Currency Accuracy được thiết lập là 0, có nghĩa là giá trị dữ liệu giá là chính xác đến một chữ số (tức là 0 vị trí thập phân). Sau đó, đơn vị thay đổi giá tối thiểu là 1.

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.


Có liên quan

Thêm nữa