Trong bài viết trước, chúng tôi đã thực hiện một đơn giản giao dịch lệnh giám sát bot, và ngày hôm nay chúng tôi sẽ thực hiện một phiên bản hợp đồng của một đơn giản lệnh giám sát bot.
Có một sự khác biệt lớn giữa bot giám sát lệnh của phiên bản hợp đồng và phiên bản giao ngay. Việc giám sát lệnh giao ngay chủ yếu có thể được thực hiện bằng cách theo dõi sự thay đổi tài sản tài khoản. Phiên bản tương lai cần theo dõi sự thay đổi vị trí trong tài khoản. Do đó, tình hình của phiên bản tương lai phức tạp hơn, bởi vì có các hợp đồng khác nhau cho các vị trí dài và ngắn của tương lai, cần phải giải quyết một loạt các chi tiết. Ý tưởng cốt lõi là theo dõi các thay đổi vị trí và kích hoạt hành động giám sát lệnh dựa trên các thay đổi vị trí. Ban đầu nó được thiết kế để xử lý các vị trí dài và ngắn cùng nhau, nhưng chúng tôi thấy sẽ phức tạp để giải quyết điều đó. Sau khi phân tích vấn đề, quyết định xử lý các vị trí dài và ngắn riêng biệt.
Parameter chiến lược:
Nó hỗ trợ backtest, và có thể trực tiếp sử dụng các cài đặt mặc định để backtest để quan sát.
Mã nguồn:
/*backtest
start: 2021-03-18 00:00:00
end: 2021-04-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*/
function test() {
// test function
var ts = new Date().getTime()
if (ts % (1000 * 60 * 60 * 6) > 1000 * 60 * 60 * 5.5) {
Sleep(1000 * 60 * 10)
var nowPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
var longPosAmount = nowPosAmount.long
var shortPosAmount = nowPosAmount.short
var x = Math.random()
if (x > 0.7) {
exchange.SetDirection("buy")
exchange.Buy(-1, _N(Math.max(1, x * 10), 0), "the reference account tests ordering#FF0000")
} else if(x < 0.2) {
exchange.SetDirection("sell")
exchange.Sell(-1, _N(Math.max(1, x * 10), 0), "the reference account tests ordering#FF0000")
} else if(x >= 0.2 && x <= 0.5 && longPosAmount > 4) {
exchange.SetDirection("closebuy")
exchange.Sell(-1, longPosAmount, "the reference account tests closing positions#FF0000")
} else if(shortPosAmount > 4) {
exchange.SetDirection("closesell")
exchange.Buy(-1, _N(shortPosAmount / 2, 0), "he reference account tests closing position#FF0000")
}
}
}
function getPosAmount(pos, ct) {
var longPosAmount = 0
var shortPosAmount = 0
_.each(pos, function(ele) {
if (ele.ContractType == ct && ele.Type == PD_LONG) {
longPosAmount = ele.Amount
} else if (ele.ContractType == ct && ele.Type == PD_SHORT) {
shortPosAmount = ele.Amount
}
})
return {long: longPosAmount, short: shortPosAmount}
}
function trade(e, ct, type, delta) {
var nowPosAmount = getPosAmount(_C(e.GetPosition), ct)
var nowAmount = type == PD_LONG ? nowPosAmount.long : nowPosAmount.short
if (delta > 0) {
// open position
var tradeFunc = type == PD_LONG ? e.Buy : e.Sell
e.SetDirection(type == PD_LONG ? "buy" : "sell")
tradeFunc(-1, delta)
} else if (delta < 0) {
// close position
var tradeFunc = type == PD_LONG ? e.Sell : e.Buy
e.SetDirection(type == PD_LONG ? "closebuy" : "closesell")
if (nowAmount <= 0) {
Log("no position detected")
return
}
tradeFunc(-1, Math.min(nowAmount, Math.abs(delta)))
} else {
throw "error"
}
}
function main() {
LogReset(1)
if (exchanges.length < 2) {
throw "no platform with order supervision"
}
var exName = exchange.GetName()
// detect the platform for reference
if (!exName.includes("Futures_")) {
throw "only support futures order supervising"
}
Log("start monitoring", exName, "platform", "#FF0000")
// detect the order supervising platform
for (var i = 1 ; i < exchanges.length ; i++) {
if (exchanges[i].GetName() != exName) {
throw "The order supervising platform is different from the reference platform!"
}
}
// set trading pair and contract
_.each(exchanges, function(e) {
if (!IsVirtual()) {
e.SetCurrency(refCurrency)
if (isSimulate) {
if (e.GetName() == "Futures_OKCoin") {
e.IO("simulate", true)
}
}
}
e.SetContractType(refCt)
})
var initRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
while(true) {
if (IsVirtual()) { // only simulate during backtest
test() // test function, which simulates a reference account to trade automatically, to trigger the order supervising of the account
}
Sleep(5000)
var nowRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
var tbl = {
type : "table",
title : "position",
cols : ["name", "label", "long", "short", "account asset (Stocks)", "account assest (Balance)"],
rows : []
}
_.each(exchanges, function(e) {
var pos = getPosAmount(_C(e.GetPosition), refCt)
var acc = _C(e.GetAccount)
tbl.rows.push([e.GetName(), e.GetLabel(), pos.long, pos.short, acc.Stocks, acc.Balance])
})
LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")
// calculate the position amount of change
var longPosDelta = nowRefPosAmount.long - initRefPosAmount.long
var shortPosDelta = nowRefPosAmount.short - initRefPosAmount.short
// detect the change
if (longPosDelta == 0 && shortPosDelta == 0) {
continue
} else {
// detect the position change
for (var i = 1 ; i < exchanges.length ; i++) {
// execute the action of long
if (longPosDelta != 0) {
Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "Execute long order supervising, amount of change:", longPosDelta)
trade(exchanges[i], refCt, PD_LONG, longPosDelta)
}
// execute the action of short
if (shortPosDelta != 0) {
Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "Execute short order supervising, amount of change:", shortPosDelta)
trade(exchanges[i], refCt, PD_SHORT, shortPosDelta)
}
}
}
// after the operation of order supervising, update
initRefPosAmount = nowRefPosAmount
}
}
Với thực tế rằng sau khi OKEX cập nhật giao diện V5, và OKEX mô phỏng bot có thể được sử dụng, tôi đã sử dụng API KAYs của hai OKEX mô phỏng bot để thử nghiệm, rất thuận tiện.
Đối tượng trao đổi đầu tiên được thêm vào là nền tảng tham chiếu và nền tảng giám sát lệnh theo tài khoản của nền tảng tham chiếu để hoạt động. Trên trang bot mô phỏng của OKEX, tài khoản nền tảng tham khảo đặt 3 hợp đồng ký quỹ mật mã hàng quý bằng ETH.
Nó có thể thấy rằng bot phát hiện ra sự thay đổi vị trí, và các hoạt động sau.
Chúng ta hãy thử đóng 2 vị trí hợp đồng mà chúng ta vừa mở.
Robot đã theo dõi và đóng 2 hợp đồng.
Chiến lược được thiết kế một cách đơn giản và dễ hiểu mà không cần tối ưu hóa. Phần được cải tiến cũng cần phải giải quyết các chi tiết như phát hiện tài sản khi giám sát lệnh. Để đơn giản hóa thiết kế, lệnh thị trường được sử dụng để giám sát lệnh. Chiến lược chỉ cung cấp các ý tưởng học tập và bot có thể được tối ưu hóa theo nhu cầu của bạn.
Địa chỉ chiến lược:https://www.fmz.com/strategy/270012
Chào mừng bạn để lại bình luận của bạn.