avatar of 发明者量化-小小梦 发明者量化-小小梦
tập trung vào tin nhắn riêng tư
4
tập trung vào
1271
Người theo dõi

Dạy bạn từng bước cách chuyển đổi chiến lược sản phẩm đơn lẻ của Python thành chiến lược sản phẩm đa dạng

Được tạo ra trong: 2020-01-20 17:33:36, cập nhật trên: 2023-10-17 21:18:46
comments   14
hits   4485

Dạy bạn từng bước cách chuyển đổi chiến lược sản phẩm đơn lẻ của Python thành chiến lược sản phẩm đa dạng

1. Dạy bạn cách chuyển đổi chiến lược sản phẩm đơn lẻ của Python thành chiến lược đa sản phẩm

Trong bài viết trước, một chiến lược Python rất đơn giản đã được triển khai:「Phiên bản Python của chiến lược đuổi theo và bán xuống」Chiến lược này có thể vận hành một tài khoản để tiến hành giao dịch theo chương trình trên một cặp giao dịch nhất định. Nguyên tắc rất đơn giản, đó là theo đuổi sự tăng giá và bán sự giảm giá. Đôi khi chúng ta muốn sử dụng cùng một logic giao dịch để vận hành các cặp giao dịch khác nhau. Bạn có thể tạo nhiều robot và thiết lập các cặp giao dịch khác nhau để giao dịch nhiều loại tiền tệ khác nhau. Nếu chiến lược không quá phức tạp, xét đến tính linh hoạt mạnh mẽ của nền tảng giao dịch định lượng của nhà phát minh. Rất dễ dàng để chuyển đổi một chiến lược thành chiến lược đa sản phẩm, để bạn có thể chạy nhiều cặp giao dịch chỉ bằng cách tạo một robot.

Mã nguồn chiến lược đã 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": ["账户信息"], 
            "rows": []
        }        

        tblTick = {
            "type" : "table",
            "title": "ticker",
            "cols": ["行情信息"], 
            "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)

2. Tìm sự khác biệt

So sánh mã và thấy nó rất khác so với mã trong bài viết trước? Trên thực tế, logic giao dịch vẫn như vậy, không có bất kỳ thay đổi nào. Chỉ là chúng ta đã thay đổi chiến lược thành nhiều loại khác nhau, nên không thể sử dụng hình thức trước đây là “biến đơn làm tham số chiến lược”. Một giải pháp hợp lý hơn là để tạo tham số Mảng, 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.

Dạy bạn từng bước cách chuyển đổi chiến lược sản phẩm đơn lẻ của Python thành chiến lược sản phẩm đa dạng

Sau đó đóng gói mã logic giao dịch vào một hàmprocessTrong vòng lặp chính của chiến lược, hàm này được gọi lặp đi lặp lại theo các cặp giao dịch được thêm vào, do đó mã logic giao dịch được thực thi một lần cho mỗi cặp giao dịch.

  • #### Gọi lặp lại (duyệt):
  for i in range(len(exchanges)): 
      process(exchanges[i], i)
  • #### Các thông số chiến lược:
  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 vì giá của mỗi cặp giao dịch có thể thay đổi rất nhiều và các thông số cũng có thể khác nhau, do đó đôi khi cần có các thiết lập khác biệt.

  • #### Hàm CancelAll

Bạn có thể so sánh những thay đổi của chức năng này. Hàm này chỉ sửa đổi một chút mã, sau đó suy nghĩ về mục đích của sửa đổi này.

  • #### Dữ liệu biểu đồ thanh trạng thái

Đã thêm biểu đồ để hiển thị dữ liệu thị trường và dữ liệu tài sản tài khoản trên thanh trạng thái, để tài sản và dữ liệu thị trường tương ứng với từng đối tượng trao đổi có thể được hiển thị theo thời gian thực.

Sau khi nắm vững các ý tưởng thiết kế trên, việc sửa đổi chiến lược Python thành chiến lược đa dạng có phải rất dễ dàng không?

3. Kiểm tra ngược

Dạy bạn từng bước cách chuyển đổi chiến lược sản phẩm đơn lẻ của Python thành chiến lược sản phẩm đa dạng

Dạy bạn từng bước cách chuyển đổi chiến lược sản phẩm đơn lẻ của Python thành chiến lược sản phẩm đa dạng

Dạy bạn từng bước cách chuyển đổi chiến lược sản phẩm đơn lẻ của Python thành chiến lược sản phẩm đa dạng

Chiến lược này chỉ mang tính tham khảo, kiểm tra ngược và thử nghiệm. Nếu bạn quan tâm, bạn có thể tối ưu hóa và nâng cấp. Địa chỉ chính sách