
Khi bạn mới bắt đầu thiết kế chiến lược giao dịch định lượng tiền kỹ thuật số, bạn thường có nhiều yêu cầu về chiến lược khác nhau. Bất kể bạn sử dụng ngôn ngữ hay nền tảng nào, bạn sẽ gặp phải các yêu cầu thiết kế chiến lược cho nhiều tình huống khác nhau. Ví dụ, đôi khi cần luân chuyển nhiều loại, đôi khi cần phòng ngừa nhiều nền tảng và đôi khi cần giao dịch nhiều loại khác nhau cùng lúc, v.v. Hãy cùng chia sẻ một số kinh nghiệm thiết kế khi triển khai các yêu cầu chiến lược. Nền tảng học tập vẫn sử dụng Nền tảng giao dịch định lượng Inventor (https://www.fmz.com) và thị trường được chọn là thị trường tiền kỹ thuật số.
Loại nhu cầu này thường đòi hỏi phải viết chiến lược xu hướng đa dạng, chiến lược lưới đa dạng, v.v., đòi hỏi phải thực hiện lặp đi lặp lại logic chiến lược bằng cách sử dụng các cặp 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("已经切换交易对,按照策略逻辑处理交易对 :", symbol, "行情:", 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 tôi cấu hình robot:


Như bạn có thể thấy, điều này giúp cấu hình đối tượng trao đổi trên robot, chuyển đổi cặp giao dịch, nắm được điều kiện thị trường của các cặp giao dịch khác nhau, tiến hành nhiều điều kiện thị trường khác nhau và thực hiện theo logic chiến lược. 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, được lặp lại lần lượt trong vòng lặp để có được thông tin thị trường. Sau khi có được thông tin thị trường, chúng tôi có thể phát hiện cụ thể thông tin thị trường và kích hoạt logic giao dịch được thiết kế theo chiến lược.
Một số học viên có thể nói: “Tôi không thích việc chuyển đổi cặp giao dịch. Việc này có vẻ hơi rắc rối và chiến lược thiết kế không rõ ràng.” Trên thực tế còn có những phương pháp thiết kế khác mà chúng tôi sẽ giới thiệu bên dưới.
Thu thập dữ liệu thị trường cho các cặp giao dịch khác nhau thông qua nhiều đối tượng trao đổi và thực hiện theo logic chiến lược lặp lại.
Ví dụ, hãy cấu hình robot như thế này: cấu hình ba đối tượng trao đổi cho robot và đặt cặp giao dịch tương ứng là BTC_USDT, LTC_USDT và ETH_USDT.

Đối tượng trao đổi có tên “OKEX Spot V3 Test” nằm trong trung tâm điều khiển, trang cấu hình trao đổi:
Đã được cấu hình.
Sửa đổi mã vì lần này chúng tôi đã thêm nhiều đối tượng trao đổi vào robot, cụ thể là các đối tượng trao đổi với cặp giao dịch BTC_USDT, LTC_USDT và ETH_USDT.
function Process (e) {
var ticker = _C(e.GetTicker)
Log("交易所", e.GetName(), "按照策略逻辑处理交易对 :", e.GetCurrency(), "行情:", ticker)
// ...
// ..
// .
}
function main(){
while (true) {
for (var i = 0 ; i < exchanges.length; i++) {
Process(exchanges[i])
Sleep(500)
}
}
}
Chạy robot:

Các ví dụ được mô tả ở trên là về việc chuyển đổi cặp giao dịch hoặc thêm đối tượng trao đổi với nhiều cặp giao dịch khác nhau vào một tài khoản đã cấu hình. Tất cả đều được cấu hình chỉ bằng một tài khoản trao đổi (sử dụng một sàn giao dịch đã cấu hình). Vậy làm thế nào để sử dụng nhiều tài khoản giao dịch trong cùng một chiến lược?
Một số chiến lược bao gồm, ví dụ, phòng ngừa rủi ro chéo thị trường trên nhiều sàn giao dịch, chiến lược đa tài khoản trong một sàn giao dịch, v.v.
Nhiều sàn giao dịch được cấu hình, nhưng chúng là những sàn giao dịch khác nhau.
Ví dụ, tôi đã cấu hình 2 sàn giao dịch trong trang Trung tâm điều khiển->Sàn giao dịch->Thêm sàn giao dịch.
Tôi có thể truy cập thông tin tài sản của các tài khoản được cấu hình trên hai sàn giao dịch này trong chiến lược.

function main(){
Log(exchanges[0].GetAccount()) // 打印第一个 交易所对象的账户资产信息,即火币期货 这个交易所的资产信息。
Log(exchanges[1].GetAccount()) // ... 打印Bit-Z这个交易所的资产信息
}
Tất nhiên, tôi cũng có thể thêm cấu hình trao đổi của tài khoản thứ hai và thứ ba vào một trao đổi.
Nhiều cấu hình trao đổi đều là một trao đổi.
Ví dụ, hãy thêm một tài khoản Huobi Futures khác.

Như bạn có thể thấy, hai tài khoản của sàn giao dịch “Huobi Futures” đã được thiết lập.

Khi tạo chiến lược, đối tượng Huobi Futures Exchange sẽ xuất hiện trong tùy chọn “Sửa đổi cấu hình” của robot để lựa chọn.

Ví dụ, bạn có thể có hai tài khoản, một tài khoản sử dụng chiến lược lưới bán trước mua sau (hướng lên) và tài khoản còn lại sử dụng chiến lược lưới mua trước bán sau (hướng xuống).
Sau đây là sự khác biệt giữa việc cấu hình nhiều đối tượng trao đổi trên robot và việc cấu hình nhiều đối tượng trao đổi cho robot có cùng một tài khoản trao đổi:
Thoạt nhìn, điều này có phần giống với ví dụ về “Cấu hình nhiều đối tượng trao đổi cho robot có cùng tài khoản trao đổi” được giải thích ở trên, nhưng vẫn có sự khác biệt. Sự khác biệt là ví dụ trên là cấu hình trao đổi, nghĩa là:

Khi cấu hình đối tượng trao đổi trong robot, hãy luôn sử dụng:
Cấu hình này.
Chỉ có điều cài đặt cặp giao dịch sẽ khác nhau khi thêm đối tượng trao đổi. Nếu bạn gọi hàm GetAccount, bạn sẽ luôn truy cập được thông tin tài sản của cùng một tài khoản.
Tuy nhiên:
Hai đối tượng Huobi Futures Exchange được cấu hình theo cách này, mặc dù cả hai đều là Huobi Futures, nhưng lại đại diện cho các tài khoản sàn giao dịch khác nhau.
Đôi khi khi triển khai chiến lược phòng ngừa hợp đồng tiền kỹ thuật số, để nắm bắt các cơ hội giao dịch thoáng qua, nhiều tình huống đòi hỏi phải có các lệnh đồng thời. Tuy nhiên, vì các hợp đồng khác nhau nên bạn cần chuyển sang hợp đồng tương ứng khi lấy thông tin thị trường và đặt lệnh. Khi sử dụng hàm exchange.Go để thực hiện đồng thời các lệnh hoặc lấy thông tin thị trường, tốc độ không được nhanh do vấn đề đồng bộ hóa. Và thiết kế của các hợp đồng chuyển đổi khiến cho logic có vẻ không đơn giản như vậy. Vậy có cách nào tốt hơn không?
Tất nhiên là có cách! Chúng ta có thể thêm hai đối tượng trao đổi vào robot theo mô tả ở trên về “Cấu hình nhiều đối tượng trao đổi cho robot có cùng một tài khoản trao đổi”.
Sau đó, vẫn sử dụng cấu hình trao đổi này, hãy thêm một đối tượng trao đổi khác.
Một hộp thoại nhắc nhở sẽ bật lên vào lúc này!
Cấu hình tài khoản trao đổi không thể thêm các đối tượng trao đổi có cùng loại tiền tệ và cặp giao dịch.
Tôi nên làm gì trong trường hợp này? Có vẻ như không thể để robot chiến lược sử dụng hai đối tượng trao đổi và liên kết đối tượng trao đổi với một mã tài khoản trao đổi phải không? Vẫn còn cách!
Chúng ta vào “Trung tâm điều khiển” -> “Sàn giao dịch” và thêm cấu hình sàn giao dịch tương lai OKEX.

Sau khi cấu hình xong, nhấp vào Lưu.

### 「Điểm nổi bật」Bây giờ chúng ta có hai cấu hình trao đổi, nhưng thông tin cấu hình API KEY được sử dụng giống nhau.

Lợi ích của việc này là gì? Tất nhiên, khi viết chiến lược, thiết kế phải rất đơn giản!
function main(){
exchanges[0].SetContractType("quarter") // 设置第一个添加的交易所对象 当前的合约为季度合约
exchanges[1].SetContractType("this_week") // 设置第二个添加的交易所对象,当前的合约为当周合约
while (true) {
var beginTime = new Date().getTime() // 记录这次获取行情时起始的时间戳。
var rA = exchanges[0].Go("GetTicker") // 创建并发 线程去获取 第一个交易所对象,也就是季度合约的行情数据。
var rB = exchanges[1].Go("GetTicker") // 创建并发 线程去获取 第二个交易所对象,也就是当周合约的行情数据。
var tickerA = rA.wait() // 并发的两个线程各自执行自己的任务,这里等待获取数据,A 等待时,B任务也在执行。
var tickerB = rB.wait() // 所以这里看似是顺序执行,实际在底层是并发的。只不过获取的时候是顺序先获取A,在获取B。
var endTime = new Date().getTime() // 记录并发获取两个合约行情结束时的时间戳。
if (tickerA && tickerB) { // 如果获取的数据没有问题,执行以下逻辑。
var diff = tickerA.Last - tickerB.Last // 计算差价
$.PlotLine("diff", diff) // 使用画线类库把差价画在图表上。
if (diff > 500) { // 如果差价大于500, 对冲套利(当然设置500 的差价是比较大的,很少见。)
// 对冲
rA = exchanges[0].Go("Sell", tickerA.Buy, 1) // 并发线程创建 季度合约下卖单
rB = exchanges[1].Go("Buy", tickerB.Sell, 1) // 并发线程创建 当周合约下买单
var idA = rA.wait() // 等待 返回下单结果,返回的是订单ID
var idB = rB.wait() // ...
}
// ...
}
LogStatus(_D(), "并发获取两个合约行情耗时:", endTime - beginTime, "毫秒。") // 显示在状态栏上时间,以便知道程序在执行。
Sleep(500)
}
}
Liệu chiến lược thiết kế này có đơn giản hơn và ý tưởng có rõ ràng hơn không?
Hoạt động đĩa thực:

Có thể thấy rằng chỉ mất khoảng 50 mili giây để có được thông tin thị trường của hai hợp đồng cùng lúc mỗi lần.