4
tập trung vào
1076
Người theo dõi

Dạy bạn từng bước để đóng gói một chiến lược Python vào một tệp cục bộ

Được tạo ra trong: 2020-06-30 10:48:18, cập nhật trên: 2024-12-10 20:27:04
comments   3
hits   2788

Dạy bạn từng bước để đóng gói một chiến lược Python vào một tệp cục bộ

Dạy bạn từng bước để đóng gói một chiến lược Python vào một tệp cục bộ

Bài viết này thảo luận về hai giải pháp. Giải pháp còn lại ở cuối bài viết đơn giản hơn (được khuyến nghị).

Nhiều nhà phát triển sử dụng Python để viết chiến lược muốn lưu trữ các tệp mã chiến lược cục bộ, nhưng họ lo ngại về tính bảo mật của các chiến lược. BẰNGFMZ APIMột giải pháp được đề xuất trong tài liệu:

Chính sách bảo mật Phát triển các chiến lược trên Nền tảng giao dịch định lượng Inventor. Các chiến lược chỉ hiển thị với chủ tài khoản Inventor Quantitative. Ngoài ra, mã chiến lược có thể được bản địa hóa hoàn toàn trên Nền tảng giao dịch định lượng Inventor. Ví dụ, chiến lược có thể được đóng gói vào một gói Python và được tải vào mã chiến lược, do đó đạt được bản địa hóa chiến lược. https://www.fmz.com/api#%E7%AD%96%E7%95%A5%E5%AE%89%E5%85%A8%E6%80%A7

Trên thực tế, không cần phải lo lắng về điều này, nhưng vì đã có giải pháp như vậy nên một ví dụ triển khai đầy đủ đã được cung cấp.

Đóng gói một chiến lược

Chúng ta hãy tìm một chiến lược Python đơn giản để chứng minh, sử dụng công cụ cổ điểnDual ThrustChiến lược, địa chỉ chiến lược: https://www.fmz.com/strategy/21856 Chúng tôi cố gắng không thay đổi bất kỳ phần nào của mã chiến lược và đóng gói chiến lược vào một tệp có thể được gọi bằng mã chiến lược trên nền tảng FMZ. Kết quả thực hiện hoàn toàn giống với việc chạy trực tiếp chiến lược. Vấn đề lớn nhất với việc đóng gói là các đối tượng toàn cục, hàm toàn cục và 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ể được truy cập trong các tệp được đóng 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 này và các hằng số trong tài liệu được đóng gói. Sau đó chúng ta sẽ xử lý từng bước một.

Dạy bạn từng bước để đóng gói một chiến lược Python vào một tệp cục bộ

Dán vào tệp testA đã mở trong trình soạn thảo cục bộ.

Dạy bạn từng bước để đóng gói một chiến lược Python vào một tệp cục bộ

  • Thêm một số mã và giữ nguyên phần mã chiến lược mà bạn đã sao chép và dán
  # 函数、对象
  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

Chức năng chính của đoạn mã trên là khai báo các hàm và biến toàn cục được sử dụng trong tệp hiện tại. Sau đó dành riêng giao diện để nhập các chức năng nàySetExchangesSetParamsSetFunc. Các chiến lược trên nền tảng FMZ gọi các hàm này và truyền lại một số hàm, đối tượng, v.v. đã sử dụng.

Chiến lược ra mắt trên nền tảng FMZ

Chiến lược khởi nghiệp rất đơn giản như sau:

Dạy bạn từng bước để đóng gói một chiến lược Python vào một tệp cục bộ

Chỉ có một vài dòng mã được viết trên nền tảng FMZ. Cần lưu ý rằng các tham số của chiến lược khởi nghiệp này giống với chiến lược mà chúng tôi đóng gói.Phiên bản Python của Dual Thrust OKCoin FuturesNó hoàn toàn giống nhau. Trên thực tế, bạn có thể sao chép trực tiếp chiến lược “Python version of Dual Thrust OKCoin Futures”, sau đó xóa mã chiến lược và dán 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()

Theo cách này, chúng tôi đóng gói phần thân logic chính sách trong tệp testA và đặt nó cục bộ trên thiết bị của máy chủ. Trên nền tảng FMZ, chúng tôi 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 cục bộ của chúng tôi và chạy cục bộ trên máy chủ.

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

  • Tải tệp testA cục bộ để kiểm tra ngược

Dạy bạn từng bước để đóng gói một chiến lược Python vào một tệp cục bộ

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

Dạy bạn từng bước để đóng gói một chiến lược Python vào một tệp cục bộ

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

Tải trực tiếp file để thực thi. Lần này chúng tôi chuẩn bị một tệp testB để đặt mã của chiến lược “Phiên bản Python của 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': {

...

Chiến lược quá dài nên bỏ qua và không cần phải thay đổi mã chiến lược. Sau đó, hãy chuẩn bị “Phiên bản Python của Dual Thrust OKCoin Futures (khởi động chiến lược và thực thi trực tiếp tệp testB)”, đây là chiến lược của chúng tôi trên nền tảng FMZ, tạo một robot, tải trực tiếp tệp testB và thực thi trực tiếp. Cần lưu ý rằng chiến lược khởi nghiệp cũng phải có cùng cài đặt tham số chiến lược (tham số giao diện chiến lược) như phiên bản gốc của “Python version Dual Thrust OKCoin Futures”.

Dạy bạn từng bước để đóng gói một chiến lược Python vào một tệp cục bộ

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 ngược: Dạy bạn từng bước để đóng gói một chiến lược Python vào một tệp cục bộ

Kết quả kiểm tra ngược phù hợp với các thử nghiệm trên.

Rõ ràng, phương pháp thứ hai ở trên đơn giản hơn và được khuyến khích. Nếu có phương pháp nào tốt hơn, bạn có thể để lại tin nhắn.