Chúng ta hãy tiếp tục với cuộc thảo luận từ bài viết trước: Thiết kế Hệ thống Quản lý Đồng bộ hóa Lệnh dựa trên định lượng FMZ (1) (https://www.fmz.com/digest-topic/9729) và bắt đầu thiết kế một chiến lược theo dõi lệnh đồng bộ.
Hãy nghĩ về một số vấn đề thiết kế như vậy:
var isStopFollow = false // Used to mark whether the current order is being followed
var reStartPwd = null // Used to record the restart password
Sau đó, chúng tôi thêm các điều khiển tương tác trên trang chỉnh sửa chiến lược để tạm dừng chiến lược / khởi động lại (không dừng bot thực sự, chỉ tạm dừng logic, không theo lệnh nữa). Chúng tôi có thể đặt mật khẩu tạm dừng khi tạm dừng, để ngay cả với bot thực của bạn mở rộng API KEY củaOrder Synchronization Management System Class Library (Single Server)
Khi khởi động lại lệnh theo, nhập mật khẩu đặt trước để đánh thức chức năng theo lệnh.
Mã để thực hiện các chức năng liên quan:
...
// Judge the interaction command
if (arr.length == 2) {
// Buttons with controls
if (arr[0] == "stop/restart") {
// Pause/restart order-following
if (!isStopFollow) {
isStopFollow = true
reStartPwd = arr[1]
Log("it has stopped the order-following,", "Set the restart password as:", reStartPwd, "#FF0000")
} else if (isStopFollow && arr[1] == reStartPwd) {
isStopFollow = false
reStartPwd = null
Log("it has restarted the order-following, ", "Clear the restart password.", "#FF0000")
} else if (isStopFollow && arr[1] != reStartPwd) {
Log("Restart password error!")
}
}
continue
}
specifiedAmount: Chỉ định số lệnh theo sau, mặc định là -1, tức là không được chỉ định. zoomAmountRatio: Tỉ lệ theo số lượng lệnh được gửi, ví dụ, nếu tín hiệu được gửi là: ETH_USDT,swap,buy,1, nhân giá trị số lượng lệnh bằng zoomAmountRatio. mặc định là -1, tức là không có tỉ lệ.
var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
Ở đây nó được thực hiện để mở rộng quy mô hoặc xác định một giá trị cụ thể cho số lượng lệnh được theo dõi trong tín hiệu nhận được.
Thư viện lớp được sử dụng bởi các đơn đặt hàng tại chỗ đặt:https://www.fmz.com/strategy/10989Thư viện lớp được sử dụng bởi các đơn đặt hàng trong tương lai đặt:https://www.fmz.com/strategy/203258
function trade(action) {
// Switch trading pairs and set up contracts
exchange.SetCurrency(action.symbol)
if (action.ct != "spot") {
exchange.SetContractType(action.ct)
}
var retTrade = null
var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
if (action.direction == "buy") {
retTrade = action.ct == "spot" ? $.Buy(amount) : $.OpenLong(exchange, action.ct, amount)
} else if (action.direction == "sell") {
retTrade = action.ct == "spot" ? $.Sell(amount) : $.OpenShort(exchange, action.ct, amount)
} else if (action.direction == "closebuy") {
retTrade = action.ct == "spot" ? $.Sell(amount) : $.CoverLong(exchange, action.ct, amount)
} else if (action.direction == "closesell") {
retTrade = action.ct == "spot" ? $.Buy(amount) : $.CoverShort(exchange, action.ct, amount)
}
return retTrade
}
Vì vậy, chúng ta có thể thấy rằng đặt một lệnh chỉ cần một câu:$.Sell(amount)
, $.Buy(amount)
, $.OpenLong(exchange, action.ct, amount)
. v.v
Mã tạm thời củaOrder Synchronous Management System (Synchronous Server)
là như sau:
Bây giờ chúng ta bắt đầu thiết kế lại hệ thống quản lý đồng bộ hóa đơn hàng (Synchronous Server):
// Global variables
var isStopFollow = false
var reStartPwd = null
function trade(action) {
// Switch trading pairs and set up contracts
exchange.SetCurrency(action.symbol)
if (action.ct != "spot") {
exchange.SetContractType(action.ct)
}
var retTrade = null
var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
if (action.direction == "buy") {
retTrade = action.ct == "spot" ? $.Buy(amount) : $.OpenLong(exchange, action.ct, amount)
} else if (action.direction == "sell") {
retTrade = action.ct == "spot" ? $.Sell(amount) : $.OpenShort(exchange, action.ct, amount)
} else if (action.direction == "closebuy") {
retTrade = action.ct == "spot" ? $.Sell(amount) : $.CoverLong(exchange, action.ct, amount)
} else if (action.direction == "closesell") {
retTrade = action.ct == "spot" ? $.Buy(amount) : $.CoverShort(exchange, action.ct, amount)
}
return retTrade
}
function parseCmd(cmd) {
var objAction = {}
// Parse cmd, such as: ETH_USDT,swap,buy,1
var arr = cmd.split(",")
if (arr.length != 4) {
return null
}
objAction.symbol = arr[0]
objAction.ct = arr[1]
objAction.direction = arr[2]
objAction.amount = arr[3]
return objAction
}
function main() {
// Clear all logs
LogReset(1)
if (isSimulateOKEX) {
exchange.IO("simulate", true)
Log("Switch to OKEX demo!")
}
// Set accuracy
exchange.SetPrecision(pricePrecision, amountPrecision)
// Check zoom and specify it cannot be set at the same time
if (specifiedAmount != -1 && zoomAmountRatio != -1) {
throw "it cannot specify simultaneous volume and scaling volume at the same time"
}
while (true) {
var cmd = GetCommand()
if (cmd) {
Log("cmd: ", cmd)
var arr = cmd.split(":")
// Judge interaction commands
if (arr.length == 2) {
// Buttons with controls
if (arr[0] == "stop/restart") {
// Pause/restart order-following
if (!isStopFollow) {
isStopFollow = true
reStartPwd = arr[1]
Log("it has stopped the order-following.", "Set the restart password as.", reStartPwd, "#FF0000")
} else if (isStopFollow && arr[1] == reStartPwd) {
isStopFollow = false
reStartPwd = null
Log("it has restarted the order-following", "Clear the restart password.", "#FF0000")
} else if (isStopFollow && arr[1] != reStartPwd) {
Log("Restart password error!")
}
}
continue
}
// Permission to follow orders
if (!isStopFollow) {
// Resolve the interaction instructions of order-following signal
var objAction = parseCmd(cmd)
if (objAction) {
// The analysis is correct
var ret = trade(objAction)
} else {
Log("Wrong signal command cmd:", cmd)
}
}
}
// Display order-following status
LogStatus(_D(), isStopFollow ? "Stop Synchronization" : "Keep Synchronization", "\n")
Sleep(1000)
}
}
Chúng tôi kiểm tra tài khoản dẫn đầu lệnh bằng cách sử dụng Binance bot thực cho thời gian này, và chúng tôi sử dụng tài khoản OKEX cho lệnh theo dõi bot thực.main
Chức năng trong chức năng thử nghiệm(Order Synchronization Management System Class Library (Single Server)
trong mẫu) được sử dụng trong bài trước.
Ở đây chúng ta thay đổi hướng giao dịch thành
Tiếp theo, hãy thử đóng vị trí bằng cách thay đổi hướng thứ tự trong chức năng chính thử nghiệm để đóng vị trí ngắn bằng 0,003.
Sau đó chúng ta chạy nó một lần nữa, chịu trách nhiệm cho lệnh dẫn đầu (Order Synchronization Management System Class Library (Single Server)).
Hoạt động tương tự đã được kích hoạt bởi một robot thực sự.
Địa chỉ chiến lược: Bộ thư viện lớp Order Synchronization Management System (Single Server) (https://www.fmz.com/strategy/345171) Hệ thống quản lý đồng bộ hóa đơn hàng (Synchronous Server) (https://www.fmz.com/strategy/345172)
Chiến lược được thiết kế chỉ để giao tiếp và học tập, xin vui lòng điều chỉnh và tối ưu hóa theo nhu cầu thực tế.