Trong bài viết trước, một chiến lược Python rất đơn giản đã được thực hiện:
Mã nguồn chiến lược sau khi chuyển đổi:
'''backtest
start: 2019-02-20 00:00:00
end: 2020-01-10 00:00:00
period: 1m
exchanges: [{"eid":"OKEX","currency":"BTC_USDT"},{"eid":"OKEX","currency":"ETH_USDT","stocks":30},{"eid":"OKEX","currency":"LTC_USDT","stocks":100}]
'''
import time
import json
params = {
"arrBasePrice": [-1, -1, -1], # -1
"arrRatio": [0.05, 0.05, 0.05], # 0.05
"arrAcc": [], # _C(exchange.GetAccount)
"arrLastCancelAll": [0, 0, 0], # 0
"arrMinStocks": [0.01, 0.01, 0.01], # 0.01
"arrPricePrecision": [2, 2, 2], # 2
"arrAmountPrecision": [3, 2, 2], # 2
"arrTick":[]
}
def CancelAll(e):
while True :
orders = _C(e.GetOrders)
for i in range(len(orders)) :
e.CancelOrder(orders[i]["Id"], orders[i])
if len(orders) == 0 :
break
Sleep(1000)
def process(e, index):
global params
ticker = _C(e.GetTicker)
params["arrTick"][index] = ticker
if params["arrBasePrice"][index] == -1 :
params["arrBasePrice"][index] = ticker.Last
if ticker.Last - params["arrBasePrice"][index] > 0 and (ticker.Last - params["arrBasePrice"][index]) / params["arrBasePrice"][index] > params["arrRatio"][index]:
params["arrAcc"][index] = _C(e.GetAccount)
if params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last > params["arrMinStocks"][index]:
e.Buy(ticker.Last, params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last)
params["arrBasePrice"][index] = ticker.Last
if ticker.Last - params["arrBasePrice"][index] < 0 and (params["arrBasePrice"][index] - ticker.Last) / params["arrBasePrice"][index] > params["arrRatio"][index]:
params["arrAcc"][index] = _C(e.GetAccount)
if params["arrAcc"][index].Stocks * params["arrRatio"][index] > params["arrMinStocks"][index]:
e.Sell(ticker.Last, params["arrAcc"][index].Stocks * params["arrRatio"][index])
params["arrBasePrice"][index] = ticker.Last
ts = time.time()
if ts - params["arrLastCancelAll"][index] > 60 * 5 :
CancelAll(e)
params["arrLastCancelAll"][index] = ts
def main():
global params
for i in range(len(exchanges)) :
params["arrAcc"].append(_C(exchanges[i].GetAccount))
params["arrTick"].append(_C(exchanges[i].GetTicker))
exchanges[i].SetPrecision(params["arrPricePrecision"][i], params["arrAmountPrecision"][i])
for key in params :
if len(params[key]) < len(exchanges):
raise "params error!"
while True:
tblAcc = {
"type" : "table",
"title": "account",
"cols": ["Account information"],
"rows": []
}
tblTick = {
"type" : "table",
"title": "ticker",
"cols": ["Market information"],
"rows": []
}
for i in range(len(exchanges)):
process(exchanges[i], i)
for i in range(len(exchanges)):
tblAcc["rows"].append([json.dumps(params["arrAcc"][i])])
tblTick["rows"].append([json.dumps(params["arrTick"][i])])
LogStatus(_D(), "\n`" + json.dumps([tblAcc, tblTick]) + "`")
Sleep(500)
Khi so sánh mã này, bạn có thấy nó rất khác với mã trong bài trước không? Trong thực tế, logic giao dịch là chính xác như nhau, mà không có bất kỳ thay đổi nào. Chúng tôi chỉ sửa đổi chiến lược thành nhiều loài, chúng tôi không thể sử dụng hình thức trước đây của biến đơn như tham số chiến lược. Một giải pháp hợp lý hơn là làm cho tham số thành một mảng, và chỉ số của mỗi vị trí trong mảng tương ứng với cặp giao dịch được thêm vào.
Sau đó đóng gói mã của logic giao dịch vào một hàmprocess
. Trên vòng lặp chiến lược chính, gọi hàm này lặp đi lặp lại theo các cặp giao dịch được thêm vào, và để mỗi cặp giao dịch thực hiện mã logic giao dịch một lần.
for i in range(len(exchanges)):
process(exchanges[i], i)
params = {
"arrBasePrice": [-1, -1, -1], # -1
"arrRatio": [0.05, 0.05, 0.05], # 0.05
"arrAcc": [], # _C(exchange.GetAccount)
"arrLastCancelAll": [0, 0, 0], # 0
"arrMinStocks": [0.01, 0.01, 0.01], # 0.01
"arrPricePrecision": [2, 2, 2], # 2
"arrAmountPrecision": [3, 2, 2], # 2
"arrTick":[]
}
Thiết kế này cho phép mỗi cặp giao dịch có các thông số riêng của nó, bởi vì mỗi cặp giao dịch có thể có sự khác biệt giá lớn, và các thông số cũng có thể khác nhau, đôi khi yêu cầu cài đặt chênh lệch.
Hủy tất cả các chức năng Bạn có thể so sánh sự thay đổi của hàm này. hàm này chỉ sửa đổi một chút mã, và sau đó suy nghĩ về ý định của sự sửa đổi đó.
Dữ liệu biểu đồ thanh trạng thái Một biểu đồ được thêm vào để hiển thị dữ liệu thị trường và dữ liệu tài sản tài khoản trong thanh trạng thái, do đó tài sản và thị trường tương ứng của mỗi đối tượng trao đổi có thể được hiển thị trong thời gian thực. Có dễ dàng thay đổi một chiến lược Python thành một chiến lược đa loài sau khi nắm vững các ý tưởng thiết kế trên không?
Chiến lược chỉ dành cho mục đích học tập và kiểm tra lại, và bạn có thể tối ưu hóa và nâng cấp nó nếu bạn quan tâm.Địa chỉ chiến lược