Thực hiện nhanh chóng một công cụ giao dịch định lượng bán tự động
Trong giao dịch hợp đồng tương lai hàng hóa, sự điều chỉnh giữa thời gian là một phương pháp giao dịch phổ biến. Loại điều chỉnh này không phải là không có rủi ro. Khi hướng đơn phương của chênh lệch tiếp tục mở rộng, vị trí điều chỉnh sẽ ở trong trạng thái mất nổi. Tuy nhiên, miễn là vị trí điều chỉnh được kiểm soát đúng cách, nó vẫn rất hoạt động và khả thi.
Trong bài viết này, chúng tôi cố gắng chuyển sang một chiến lược giao dịch khác, thay vì xây dựng một chiến lược giao dịch hoàn toàn tự động, chúng tôi đã nhận ra một công cụ giao dịch định lượng tương tác bán tự động để làm cho nó dễ dàng hơn để điều chỉnh giữa thời gian trong giao dịch tương lai hàng hóa.
Nền tảng phát triển chúng tôi sẽ sử dụng nền tảng FMZ Quant.
Điều tra giữa thời gian là một khái niệm rất đơn giản.
In economics and finance, arbitrage is the practice of taking advantage of a price difference between two or more markets: striking a combination of matching deals that capitalize upon the imbalance, the profit being the difference between the market prices at which the unit is traded. When used by academics, an arbitrage is a transaction that involves no negative cash flow at any probabilistic or temporal state and a positive cash flow in at least one state; in simple terms, it is the possibility of a risk-free profit after transaction costs. For example, an arbitrage opportunity is present when there is the opportunity to instantaneously buy something for a low price and sell it for a higher price.
Khung chiến lược là như sau:
Function main(){
While(true){
If(exchange.IO("status")){ // Determine the connection status of the CTP protocol.
LogStatus(_D(), "Already connected to CTP !") // Market Opening time, login connection is normal.
} else {
LogStatus(_D(), "CTP not connected!") // Not logged in to the trading front end.
}
}
}
Nếu giao thức CTP được kết nối đúng, thì chúng ta cần thiết lập hợp đồng giao dịch và sau đó lấy báo giá thị trường. Sau khi có được báo giá, chúng ta có thể sử dụng thư viện
Function main(){
While(true){
If(exchange.IO("status")){ // Determine the connection status of the CTP protocol.
exchange.SetContractType("rb2001") // Set the far month contract
Var tickerA = exchange.GetTicker() // far-month contract quote data
exchange.SetContractType("rb1910") // Set the near month contract
Var tickerB = exchange.GetTicker() // near-month contract quote data
Var diff = tickerA.Last - tickerB.Last
$.PlotLine("diff", diff)
LogStatus(_D(), "Already connected to CTP !") // Market Opening time, login connection is normal.
} else {
LogStatus(_D(), "CTP not connected!") // Not logged in to the trading front end.
}
}
}
Nhận dữ liệu thị trường, tính toán sự khác biệt, và vẽ biểu đồ để ghi lại. để nó chỉ đơn giản là phản ánh sự biến động gần đây trong sự khác biệt giá.
Sử dụng chức năng của thư viện vẽ đường$.PlotLine
Trên trang chỉnh sửa chiến lược, bạn có thể thêm điều khiển tương tác trực tiếp vào chiến lược:
Sử dụng hàmGetCommand
trong mã chiến lược để nắm bắt lệnh được gửi đến robot sau khi điều khiển chiến lược trên được kích hoạt.
Sau khi lệnh được ghi lại, các lệnh khác nhau có thể được xử lý khác nhau.
Phần giao dịch của mã có thể được đóng gói bằng cách sử dụng var q = $.NewTaskQueue()
để tạo đối tượng kiểm soát giao dịchq
(được khai báo như một biến toàn cầu).
var cmd = GetCommand()
if (cmd) {
if (cmd == "plusHedge") {
q.pushTask(exchange, "rb2001", "sell", 1, function(task, ret) {
Log(task.desc, ret)
if (ret) {
q.pushTask(exchange, "rb1910", "buy", 1, 123, function(task, ret) {
Log("q", task.desc, ret, task.arg)
})
}
})
} else if (cmd == "minusHedge") {
q.pushTask(exchange, "rb2001", "buy", 1, function(task, ret) {
Log(task.desc, ret)
if (ret) {
q.pushTask(exchange, "rb1910", "sell", 1, 123, function(task, ret) {
Log("q", task.desc, ret, task.arg)
})
}
})
} else if (cmd == "coverPlus") {
q.pushTask(exchange, "rb2001", "closesell", 1, function(task, ret) {
Log(task.desc, ret)
if (ret) {
q.pushTask(exchange, "rb1910", "closebuy", 1, 123, function(task, ret) {
Log("q", task.desc, ret, task.arg)
})
}
})
} else if (cmd == "coverMinus") {
q.pushTask(exchange, "rb2001", "closebuy", 1, function(task, ret) {
Log(task.desc, ret)
if (ret) {
q.pushTask(exchange, "rb1910", "closesell", 1, 123, function(task, ret) {
Log("q", task.desc, ret, task.arg)
})
}
})
}
}
q.poll()