Tài nguyên đang được tải lên... tải...

Một tay dạy bạn cách chuyển một chính sách Python thành nhiều chính sách.

Tác giả:Những nhà phát minh định lượng - những giấc mơ nhỏ, Tạo: 2020-01-20 17:33:36, Cập nhật: 2023-10-17 21:18:46

img

Một, tay tay dạy bạn cách chuyển từ một chính sách Python thành nhiều chính sách.

Trong bài viết trước, tôi đã thực hiện một chiến lược Python rất đơn giản:"Python theo đuổi chiến lược giết chết"Các chiến lược này có thể điều khiển một tài khoản để giao dịch theo quy trình trên một cặp giao dịch, nguyên tắc rất đơn giản, đó là theo đuổi đòn đánh. Đôi khi chúng ta muốn sử dụng cùng một logic giao dịch để điều hành các cặp giao dịch khác nhau. Có thể tạo nhiều robot, thiết lập các cặp giao dịch khác nhau, để giao dịch với 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 định lượng của người phát minh.

Các nguồn mã chính sách đã được sửa đổ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)

Thứ hai, tìm sự khác biệt

Nếu so sánh với mã hóa, liệu nó có khác gì mã hóa trong bài viết trước? Trong thực tế, logic giao dịch là hoàn toàn giống nhau, không có bất kỳ thay đổi, chỉ cần chúng tôi sửa đổi các chiến lược thành nhiều loại, không thể sử dụng các biến đơn lẻ trước đây để làm cho các tham số chiến lược, một giải pháp hợp lý hơn là làm cho các tham số thành một mảng, chỉ mục của mỗi vị trí mảng tương ứng với các giao dịch được thêm vào.

img

Và sau đó gói phần mã logic giao dịch này thành một hàm.processTrong đó, trong vòng lặp chính của chiến lược, hãy gọi hàm này theo các giao dịch được thêm vào để cho mỗi cặp giao dịch thực hiện một mã logic giao dịch.

  • Một người đàn ông người Việt Nam bị bắt giữ tại Việt Nam.

    for i in range(len(exchanges)): 
        process(exchanges[i], i)
    
  • Các tham 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 tham số riêng của nó, vì mỗi giao dịch có sự khác biệt lớn về giá có thể, các tham số cũng có thể khác nhau, đôi khi cần thiết lập khác biệt.

  • Chức năng CancelAll

    Bạn có thể so sánh, thay đổi hàm này. Chức năng này chỉ thay đổi một chút mã, và sau đó suy nghĩ, ý định thay đổi như vậ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 trong thanh trạng thái, cho phép hiển thị tài sản và thị trường tương ứng cho mỗi đối tượng giao dịch trong thời gian thực.

Với những ý tưởng về thiết kế trên, có phải việc thay đổi một chiến lược Python thành nhiều chiến lược khác nhau là dễ dàng không?

Ba, kiểm tra lại

img

img

img

Các chiến lược chỉ dành cho tham khảo học tập, thử nghiệm kiểm tra lại, có thể tối ưu hóa nâng cấp.Địa chỉ chiến lược


Có liên quan

Thêm nữa

bbbwwed2009Mong muốn biết tại sao, bạn chỉ cần cài đặt hướng exchange.SetDirection (("buy") và một e. không phải là exchange.

Con ngựa đen của vòng đồng xuKhoản vốn tối thiểu cho chiến lược này là bao nhiêu?

Con ngựa đen của vòng đồng xuTại sao không giao dịch, nửa ngày không có phản ứng nào cả.

Con ngựa đen của vòng đồng xuĐược rồi, được rồi, tôi đã làm được, tôi đã làm được, không có gì ngạc nhiên.

Con ngựa đen của vòng đồng xu/upload/asset/164f3fe6e84331d800583.png Bây giờ là tốt, nhưng tôi có tiền trong tài khoản, chiến lược của bạn ít nhất là bao nhiêu tiền đầu tư, không phải tài khoản của tôi là không đủ

Con ngựa đen của vòng đồng xu/upload/asset/16495fcb1185338f8af27.png là IP quản trị được thêm vào

Con ngựa đen của vòng đồng xuGetAccount: 400: {"error_message":"Invalid IP","code":30011,"error_code":"30011","message:"Invalid IP"} Tôi đã thêm vào API, nhưng tôi đã sai.

Con ngựa đen của vòng đồng xu/upload/asset/164330beccf32fc55e7b6.png

Con ngựa đen của vòng đồng xuRobot K-Line được thiết lập bao nhiêu chu kỳ

Những nhà phát minh định lượng - những giấc mơ nhỏKhông có máy tính thực, chiến lược này là chiến lược giảng dạy, học tập chủ yếu, bạn có thể tự sửa đổi, mở rộng, tối ưu hóa máy tính thực.

Những nhà phát minh định lượng - những giấc mơ nhỏBạn có thể nhìn cụ thể vào mã nguồn của chiến lược này, chiến lược là công khai, chiến lược logic rất đơn giản là theo đuổi đòn đánh.

Những nhà phát minh định lượng - những giấc mơ nhỏKhi yêu cầu API KEY, địa chỉ IP được thiết lập là địa chỉ danh sách trắng cho phép truy cập, và sau khi bạn thiết lập, chỉ có địa chỉ IP này có thể sử dụng API KEY của bạn để truy cập API. Bạn đã thiết lập địa chỉ IP của người quản lý của bạn?

Những nhà phát minh định lượng - những giấc mơ nhỏBạn có thể cài đặt python trên máy chủ mà người quản trị đang sử dụng.

Những nhà phát minh định lượng - những giấc mơ nhỏLưu ý rằng, nếu bạn không sử dụng các đường K, bạn có thể sử dụng các thiết lập khác nhau, nhưng nếu bạn sử dụng các đường tick, bạn có thể sử dụng các đường tick.