Khi người mới bắt đầu thiết kế một chiến lược giao dịch định lượng tiền điện tử, thường có nhiều yêu cầu về các chức năng khác nhau. Bất kể ngôn ngữ và nền tảng lập trình, tất cả chúng đều sẽ gặp phải các yêu cầu thiết kế khác nhau. Ví dụ, đôi khi nhiều loại giao dịch luân chuyển được yêu cầu, đôi khi cần phải có nhiều nền tảng bảo hiểm, và đôi khi các loại giao dịch khác nhau được yêu cầu đồng thời.
Nền tảng học tập vẫn sử dụng nền tảng giao dịch FMZ Quanthttps://www.fmz.com), và thị trường được chọn là thị trường tiền điện tử.
Hầu hết các tình huống nhu cầu này được chuẩn bị cho các chiến lược xu hướng và lưới đa tiền điện tử, cần được thực hiện trên thị trường với các phương pháp lặp lại giao dịch khác nhau.
Thường được thiết kế như thế này:
function Process (symbol) {
exchange.IO("currency", symbol)
var ticker = _C(exchange.GetTicker)
Log("has switched trading pairs, processing trading pairs according to strategy logic:", symbol, "quotes: ", ticker)
// ...
// ..
// .
}
function main(){
var symbols = ["BTC_USDT", "LTC_USDT", "ETH_USDT"]
while (true) {
for (var i = 0 ; i < symbols.length; i++) {
Process(symbols[i])
Sleep(500)
}
}
}
Chúng ta cấu hình robot:
Có thể thấy rằng điều này nhận ra rằng một đối tượng trao đổi được cấu hình trên robot, và cặp giao dịch được chuyển đổi; thị trường của các cặp giao dịch khác nhau được thu được, và thị trường đa thương mại được thực hiện; và nó được thực hiện theo một chiến lược logic.
Có thể thấy rằng ba cặp giao dịch mà chúng tôi xác định: BTC_USDT, LTC_USDT, ETH_USDT, trong vòng lặp, lặp đi lặp lại lấy báo giá thị trường, và sau khi có được thông tin, nó có thể phát hiện cụ thể thị trường và kích hoạt logic giao dịch được thiết kế bởi chiến lược.
Một số độc giả có thể hỏi:
Có thực sự các lựa chọn thiết kế khác, mà chúng tôi sẽ giới thiệu nó ở dưới đây.
Dữ liệu thị trường của các cặp giao dịch khác nhau được thu thập thông qua nhiều đối tượng trao đổi và được thực hiện trong logic chiến lược lặp lại.
Ví dụ, cấu hình robot bằng cách cấu hình ba đối tượng trao đổi cho robot. Các cặp giao dịch được đặt thành BTC_USDT, LTC_USDT và ETH_USDT tương ứng.
Tên là đối tượng trao đổi
Mọi chuyện đã xong rồi.
Chúng tôi đã thay đổi một chút mã này, bởi vì lần này chúng tôi đã thêm nhiều đối tượng trao đổi vào robot, đó là các đối tượng trao đổi của cặp giao dịch BTC_USDT, LTC_USDT, ETH_USDT.
function Process (e) {
var ticker = _C(e.GetTicker)
Log("exchange", e.GetName(), "Process trading pairs according to strategy logic:", e.GetCurrency(), "Quotes:", ticker)
// ...
// ..
// .
}
function main(){
while (true) {
for (var i = 0 ; i < exchanges.length; i++) {
Process(exchanges[i])
Sleep(500)
}
}
}
Chạy robot:
Ví dụ chúng tôi đã mô tả ở trên, cho dù chuyển đổi các cặp giao dịch hoặc thêm một đối tượng giao dịch cho nhiều cặp giao dịch khác nhau của một tài khoản cấu hình.
Vậy làm thế nào để sử dụng nhiều tài khoản giao dịch trong một chiến lược?
Một số chiến lược như phòng ngừa rủi ro qua thị trường đa sàn giao dịch, chiến lược nhiều tài khoản trong một sàn giao dịch duy nhất.
Ví dụ, chúng tôi đã cấu hình 2 trao đổi trên bảng điều khiển -> trao đổi -> Thêm trang trao đổi.
chúng ta có thể truy cập vào thông tin tài sản của các tài khoản được cấu hình bởi hai sàn giao dịch này trong chiến lược.
function main(){
Log(exchanges[0].GetAccount()) // Print the account asset information of the first exchange object.
Log(exchanges[1].GetAccount()) // ... Print the asset information of the Bit-Z exchange
}
Tất nhiên, tôi cũng có thể thêm một cấu hình trao đổi tài khoản thứ hai và thứ ba vào một trao đổi.
Ví dụ, chúng ta thêm một tài khoản khác cho Huobi Futures.
Như bạn có thể thấy, điều này cấu hình các tài khoản của hai sàn giao dịch
Khi chiến lược được tạo, một đối tượng Huobi Futures Exchange xuất hiện trong tùy chọn Modify Configuration của Robot
Ví dụ, điều này cho phép hai tài khoản bán trước và sau đó mua với chiến lược lưới điển hình (lên) hoặc mua trước và sau đó bán (dưới).
Thông qua hai ví dụ trên
Dưới đây là sự khác biệt giữa cấu hình nhiều đối tượng trao đổi trên robot và
Ví dụ này slamming và trên đã đề cập đến của
Sự khác biệt là ví dụ trên là một cấu hình trao đổi, tức là:
Khi robot cấu hình đối tượng trao đổi, nó luôn sử dụng:
Cấu hình này.
Nó chỉ là khi bạn thêm một đối tượng trao đổi, các thiết lập cặp giao dịch là khác nhau.
Nếu hàm GetAccount được gọi, thông tin tài sản của cùng một tài khoản luôn được truy cập.
tuy nhiên:
Hai đối tượng trao đổi tương lai huobi được cấu hình như vậy, mặc dù tất cả đều là tương lai huobi, đại diện cho các tài khoản trao đổi khác nhau.
Đôi khi trong chiến lược bảo hiểm hợp đồng tiền điện tử, để nắm bắt các cơ hội giao dịch thoáng qua, nhiều kịch bản cần phải được đặt đồng thời. Tuy nhiên, vì hợp đồng khác nhau, bạn cần chuyển sang hợp đồng tương ứng khi bạn nhận được báo giá thị trường và đặt lệnh. Khi sử dụngexchange.Go
và thiết kế của hợp đồng chuyển đổi cũng làm cho logic không quá đơn giản. có cách nào tốt hơn không?
Tất nhiên là có, Chúng ta có thể thêm hai đối tượng trao đổi cho robot bằng cách làm theo các
Sau đó sử dụng cấu hình trao đổi này để thêm một đối tượng trao đổi khác.
Một hộp thông báo sẽ xuất hiện!
Một cấu hình tài khoản trao đổi, bạn không thể thêm các đối tượng trao đổi của cùng một loại tiền tệ hoặc cặp giao dịch.
Tôi nên làm gì? Có vẻ như robot chiến lược không thể sử dụng hai đối tượng trao đổi, và đối tượng trao đổi bị ràng buộc với số tài khoản trao đổi?
Vẫn còn một con đường!
Hãy đi đến bảng điều khiển -> trao đổi, và sau đó thêm một cấu hình trao đổi tương lai OKEX.
Nhấp vào Save khi được cấu hình.
Bằng cách này chúng ta có hai cấu hình trao đổi, nhưng cùng một thông tin cấu hình API KEY được sử dụng.
Điều này mang lại lợi ích gì?
khi viết một chiến lược, thiết kế sẽ rất đơn giản!
function main(){
exchanges[0].SetContractType("quarter") // Set the first added exchange object. The current contract is a quarterly contract.
exchanges[1].SetContractType("this_week") // Set the second added exchange object, the current contract is the current week contract
while (true) {
var beginTime = new Date().getTime() // Record the timestamp from which this time the market quote was taken.
var rA = exchanges[0].Go("GetTicker") // Create a concurrent thread to get the first exchange object, which is the market data for the quarterly contract.
var rB = exchanges[1].Go("GetTicker") // Create a concurrent thread to get the second exchange object, which is the market data for the weekly contract.
var tickerA = rA.wait() // The two threads executing each other perform their own tasks, waiting to get the data. When A waits, the B task is also executing.
var tickerB = rB.wait() // So it seems to be sequential execution, actually at the bottom of the concurrency. Only when you get the order is to get A first, and get B.
var endTime = new Date().getTime() // Record the timestamp at the end of the two contract quotes.
if (tickerA && tickerB) { // If there is no problem with the data obtained, execute the following logic.
var diff = tickerA.Last - tickerB.Last // calculate the difference
$.PlotLine("diff", diff) // Use the line drawing library to plot the difference on the chart.
if (diff > 500) { // If the spread is greater than 500, hedge arbitrage (of course, the difference of 500 is relatively large, rarely seen.)
// Hedging
rA = exchanges[0].Go("Sell", tickerA.Buy, 1) // Concurrent threads create a selling order under the quarterly contract
rB = exchanges[1].Go("Buy", tickerB.Sell, 1) // Concurrent thread create a buying order under the weekly contract
var idA = rA.wait() // Waiting for the return of placing order results, returning the order ID
var idB = rB.wait() // ...
}
// ...
}
LogStatus(_D(), "Concurrently get two contract quotes taking time:", endTime - beginTime, "millisecond.") // Shows the time on the status bar to know that the program is executing.
Sleep(500)
}
Chiến lược thiết kế này có đơn giản và rõ ràng hơn nhiều không?
Hoạt động thị trường thực tế:
Như bạn có thể thấy, chỉ mất khoảng 50 mili giây để nhận được giá của hai hợp đồng mỗi lần.