Dạy bạn để đóng gói một chiến lược Python vào một tập tin địa phương

Tác giả:Tốt, Tạo: 2020-07-09 10:21:31, Cập nhật: 2023-10-28 15:28:00

img

Nhiều nhà phát triển viết các chiến lược trong Python muốn đặt các tập tin mã chiến lược tại địa phương, lo lắng về sự an toàn của chiến lược.

An ninh chiến lược

Chiến lược được phát triển trên nền tảng FMZ, và chiến lược chỉ hiển thị cho chủ tài khoản FMZ. Và trên nền tảng FMZ, mã chiến lược có thể được định vị hoàn toàn, ví dụ, chiến lược được đóng gói vào một gói Python và tải vào mã chiến lược, do đó việc định vị chiến lược được thực hiện.

Để biết thêm chi tiết, vui lòng truy cập:https://www.fmz.com/api

Thực tế, những lo lắng như vậy không cần thiết, nhưng vì có những nhu cầu như vậy, chúng tôi sẽ cung cấp một ví dụ thực hiện đầy đủ.

Tóm lại một chiến lược

Hãy tìm một chiến lược Python đơn giản để chứng minh, sử dụng cácDual Thrustchiế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 nào của mã chiến lược, đóng gói chiến lược vào một tập tin có thể được gọi bởi mã chiến lược trên nền tảng FMZ, và kết quả thực thi chính xác giống như chạy chiến lược trực tiếp. Vấn đề lớn nhất với đóng gói là các đối tượng toàn cầu, các hàm toàn cầu và các giá trị hằng số được gọi bởi mã chiến lược trên nền tảng FMZ không thể truy cập trong các tập tin chúng tôi đóng gó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 và hằng số này sang tập tin đóng gói. hãy làm từng bước.

img

Ghi vào tệptestAđược mở bởi biên tập viên địa phương.

img

Thêm một số mã, và giữ cho phần mã chiến lược sao chép và dán nguyên vẹn

# Function, object
exchanges = None
exchange = None
Log = None
Sleep = None
TA = None
Chart = None
LogProfitReset = None
LogStatus = None
_N = None
_C = None 
LogProfit = None  


# Strategy parameters
ContractTypeIdx = None
MarginLevelIdx = None
NPeriod = None
Ks = None
Kx = None
AmountOP = None
Interval = None
LoopInterval = None
PeriodShow = None  

# constant
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

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

Chiến lược khởi nghiệp trên nền tảng FMZ

Chiến lược khởi nghiệp 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.Phiên bản Python của mã chiến lược tương lai OKCoin Dual ThrustTrong thực tế, bạn có thể trực tiếp sao chépPhiên bản Python của mã chiến lược tương lai OKCoin Dual ThrustChiến lược, sau đó chỉ xóa mã chiến lược, dán nó.

import sys
# Here I wrote the path where I put the testA file myself. I replaced it with xxx. To put it simply, I set the path of my testA file.
sys.path.append("/Users/xxx/Desktop/pythonPlayground/")
import testA

def main():
    # Passing Exchange Object
    testA.SetExchanges(exchanges)
    # Pass global function SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit)
    testA.SetFunc(Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit)
    # Passing strategy parameters SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow)
    testA.SetParams(ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow)
    # Execute the main strategy function in the encapsulated testA file
    testA.main()

Bằng cách này, chúng tôi tóm tắt cơ thể chính của chiến lược logic trongtestAtrên nền tảng FMZ, chúng ta chỉ cần lưu một chiến lược khởi động. robot tạo ra chiến lược 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 nó tại địa phương.

So sánh kiểm tra ngược

  • Trọng lượngtestAtệp cục bộ cho backtest

img

  • Chiến lược ban đầu, backtesting trên máy chủ công cộng

img

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

tải tập tin trực tiếp để thực hiện. Lần này chúng tôi chuẩn bị mộttestBfile với mã choPhiên bản Python của mã chiến lược tương lai OKCoin Dual Thrust strategy.

import time
class Error_noSupport(BaseException):
    def __init__(self):
        Log("Only OKCoin futures are supported!#FF0000")

class Error_AtBeginHasPosition(BaseException):
    def __init__(self):
        Log("There is a futures position at startup!#FF0000")

ChartCfg = {
    '__isStock': True,
    'title': {
        'text': 'Dual Thrust Top and bottom rail map'
    },
    'yAxis': {

...

Nếu chiến lược quá dài, nó sẽ bị bỏ qua và mã chiến lược không cần phải được thay đổi.

Vậy chuẩn bị đi.Phiên bản Python của mã chiến lược tương lai OKCoin Dual Thrust(bắt đầu chiến lược, thực hiện trực tiếptestBfile), đó là chiến lược của chúng tôi trên nền tảng FMZ, tạo ra một robot, trực tiếp tảitestBcần lưu ý rằng chiến lược khởi động cũng phải có chính xác các thiết lập tham số chiến lược (các tham số giao diện chiến lược) như phiên bản gốc củaPhiên bản Python của mã chiến lược tương lai OKCoin Dual Thrust.

img

if __name__ == '__main__':
    Log("run...")
    try:
        # The file path is processed, you can write the actual path of your testB file
        f = open("/Users/xxx/Desktop/pythonPlayground/testB.py", "r")
        code = f.read()
        exec(code)
    except Exception as e:
        Log(e)

Thực hiện backtest:

img

Kết quả backtest phù hợp với thử nghiệm trên.

Rõ ràng phương pháp thứ hai ở trên là đơn giản hơn, nó được khuyến cáo sử dụng.


Thêm nữa