Một tay dạy bạn cách gói một chính sách Python trong một tài liệu chi phí thấp

Tác giả:Giấc mơ nhỏ, Tạo: 2020-06-30 10:48:18, Cập nhật: 2023-10-08 19:48:02

img

Một tay dạy bạn cách gói một chính sách Python trong một tài liệu chi phí thấp

Bài viết này đề cập đến hai giải pháp, và giải pháp khác ở cuối bài viết đơn giản hơn (được đề xuất).

Một số nhà phát triển sử dụng ngôn ngữ Python để viết chính sách muốn giữ các tập tin mã chính sách tại địa phương vì lo ngại về an ninh chính sách.FMZ APIMột trong những đề xuất trong tài liệu là:

An ninh chiến lược Phát triển các chính sách trên nền tảng giao dịch định lượng của nhà phát minh, chỉ có thể hiển thị cho chủ tài khoản định lượng của nhà phát minh. Và có thể thực hiện bản địa hóa mã chính sách hoàn toàn trên nền tảng giao dịch định lượng của nhà phát minh, ví dụ như gói các chính sách thành một gói Python và tải trong mã chính sách để thực hiện bản địa hóa chính sách.https://www.fmz.com/api#策略安全性

Trong khi đó, các nhà nghiên cứu cho rằng, một giải pháp như vậy là hoàn toàn không cần thiết, nhưng nó cung cấp một ví dụ hoàn hảo về việc thực hiện.

Bao gồm một chiến lược

Chúng tôi đã tìm ra một chiến lược Python đơn giản để thực hiện bằng cách sử dụng các công cụ Python cổ điển.Dual ThrustCác chiến lược, địa chỉ chiến lược:https://www.fmz.com/strategy/21856Chúng tôi cố gắng không thay đổi bất kỳ phần mã chính sách nào, gói chính sách thành một tập tin có thể được gọi bằng mã chính sách trên nền tảng FMZ, và kết quả thực hiện hoàn toàn phù hợp với việc chạy chính sách trực tiếp. Vấn đề lớn nhất của gói là các đối tượng toàn cầu, các hàm toàn cầu, các giá trị biến thể được gọi bằng mã chính sách trên nền tảng FMZ không thể truy cập được trong tập tin được gói của chúng tôi, vì vậy chúng tôi phải tìm cách truyền các đối tượng, hàm, biến thể, biến thể vào tập tin được gói. Sau đó chúng tôi sẽ xử lý theo nhóm.

  • Sao chépPython phiên bản Dual Thrust OKCoin tương laiMã của chính sách, dán vào tập tin Python địa phương, tập tin Python địa phương được đặt tên là testA.

    img

    Ghi vào file testA mở trong trình soạn thảo cục bộ.

    img

  • Thêm một số mã để giữ nguyên phần mã chính sách sao chép dán vào

    # 函数、对象
    exchanges = None
    exchange = None
    Log = None
    Sleep = None
    TA = None
    Chart = None
    LogProfitReset = None
    LogStatus = None
    _N = None
    _C = None 
    LogProfit = None  
    
    
    # 策略参数
    ContractTypeIdx = None
    MarginLevelIdx = None
    NPeriod = None
    Ks = None
    Kx = None
    AmountOP = None
    Interval = None
    LoopInterval = None
    PeriodShow = None  
    
    # 常量
    ORDER_STATE_PENDING = 0
    ORDER_STATE_CLOSED = 1
    ORDER_STATE_CANCELED = 2
    ORDER_STATE_UNKNOWN = 3
    ORDER_TYPE_BUY = 0 
    ORDER_TYPE_SELL = 1
    PD_LONG = 0
    PD_SHORT = 1  
    
    
    def SetExchanges(es):
        global exchanges, exchange
        exchanges = es
        exchange = es[0]  
    
    def SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit):
        global Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit
        Log = pLog
        Sleep = pSleep
        TA = pTA
        Chart = pChart
        LogStatus = pLogStatus
        LogProfitReset = pLogProfitReset
        _N = p_N
        _C = p_C
        LogProfit = pLogProfit  
    
    def SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow):
        global ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow
        ContractTypeIdx = pContractTypeIdx
        MarginLevelIdx = pMarginLevelIdx
        NPeriod = pNPeriod
        Ks = pKs
        Kx = pKx
        AmountOP = pAmountOP
        Interval = pInterval
        LoopInterval = pLoopInterval
        PeriodShow = pPeriodShow
    

    Nhiệm vụ chính của mã trên là tuyên bố các hàm, biến thể toàn cầu được sử dụng trong tệp hiện tại.SetExchangesSetParamsSetFuncCác chiến lược trên nền tảng FMZ gọi các chức năng này và chuyển một số chức năng, đối tượng, v.v.

Chiến lược khởi động trên nền tảng FMZ

Các chiến lược khởi động rất đơn giản, như sau:

img

Chỉ có một vài dòng mã được viết trên nền tảng FMZ, và cần lưu ý là tham số của chính sách khởi động này là chính sách mà chúng ta sẽ gói.Python phiên bản Dual Thrust OKCoin tương laiBạn có thể tự động sao chép chiến lược "Python version Dual Thrust OKCoin futures" và xóa mã của chiến lược và dán nó lên.

import sys
# 这里我写的是自己放置testA文件的路径,具体我替换为xxx了,简单说就是设置自己的testA文件路径就可以了
sys.path.append("/Users/xxx/Desktop/pythonPlayground/")
import testA

def main():
    # 传递交易所对象
    testA.SetExchanges(exchanges)
    # 传递全局函数 SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit)
    testA.SetFunc(Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit)
    # 传递策略参数 SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow)
    testA.SetParams(ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow)
    # 执行封装的testA文件中的策略主函数
    testA.main()

Như vậy, chúng ta sẽ gói các chủ thể logic chính sách trong tệp testA, đặt tại thiết bị của người quản lý, trên nền tảng FMZ, chỉ cần lưu một chính sách khởi động, robot tạo chính sách khởi động này có thể tải trực tiếp tệp địa phương của chúng tôi và chạy tại địa phương của người quản lý.

Kiểm tra lại sự tương phản

  • Tải testA bản địa

    img

  • Chính sách gốc, được kiểm tra lại trên máy chủ công cộng

    img

Một cách đơn giản hơn.

Bạn có thể tải file trực tiếp vào trình thực hiện. Trong trường hợp này, chúng tôi đã chuẩn bị một testB file để đặt mã cho chính sách "python version Dual Thrust OKCoin futures".

import time
class Error_noSupport(BaseException):
    def __init__(self):
        Log("只支持OKCoin期货!#FF0000")

class Error_AtBeginHasPosition(BaseException):
    def __init__(self):
        Log("启动时有期货持仓! #FF0000")

ChartCfg = {
    '__isStock': True,
    'title': {
        'text': 'Dual Thrust 上下轨图'
    },
    'yAxis': {

...

Các chiến lược quá dài sẽ bị bỏ qua, và mã chiến lược sẽ không cần thay đổi. Sau đó, chuẩn bị cho "Python Dual Thrust OKCoin Futures (chế độ khởi động, thực hiện testB trực tiếp) ", đó là chiến lược của chúng tôi trên nền tảng FMZ, tạo robot, tải testB trực tiếp, và thực hiện trực tiếp.

img

if __name__ == '__main__':
    Log("run...")
    try:
        # 文件路径做了处理,可以写入自己testB文件放置的实际路径
        f = open("/Users/xxx/Desktop/pythonPlayground/testB.py", "r")
        code = f.read()
        exec(code)
    except Exception as e:
        Log(e)

Thực hiện kiểm tra lại:img

Kết quả xét nghiệm lại phù hợp với các xét nghiệm trên.

Rõ ràng, phương pháp thứ hai đơn giản hơn, nên sử dụng, nếu có cách tốt hơn, hãy chào mừng.


Có liên quan

Thêm nữa

qq89520Và tôi cảm thấy rằng tôi có thể thực hiện nhiều chức năng hơn với selenium.

qq89520Học tập

Giấc mơ nhỏHa-ha, có ý tưởng nào có thể được đưa ra để chúng ta cùng thảo luận.