Dạy bạn chuyển đổi một chiến lược Python một loài thành một chiến lược đa loài

Tác giả:Lydia., Tạo: 2022-12-20 17:26:27, Cập nhật: 2023-09-20 09:45:28

img

Dạy bạn chuyển đổi một chiến lược Python đồng tiền duy nhất thành một chiến lược đa tiền tệ

I. Dạy bạn chuyển đổi một chiến lược Python đồng tiền duy nhất thành một chiến lược đa đồng tiền

Trong bài viết trước, một chiến lược Python rất đơn giản đã được thực hiện:Chiến lược để mua những người chiến thắng của phiên bản Python, chiến lược này có thể vận hành một tài khoản để thực hiện chương trình giao dịch trên một cặp giao dịch nhất định. Nguyên tắc rất đơn giản, đó là đuổi theo sau khi tăng và giết sau khi giảm. Đô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 để thực hiện giao dịch trong các loại tiền tệ khác nhau. Nếu chiến lược không quá phức tạp, do sự linh hoạt mạnh mẽ của nền tảng giao dịch FMZ Quant, rất dễ biến một chiến lược thành một chiến lược đa loài, do đó bạn có thể chạy nhiều cặp giao dịch bằng cách tạo chỉ một robot.

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)

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

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.

img

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.

  • Gọi lặp đi lặp lại:
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 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?

III. Kiểm tra hậu quả

img img img

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


Có liên quan

Thêm nữa