Научить вас шаг за шагом инкапсулировать стратегию Python в локальный файл

Создано: 2020-06-30 10:48:18, Обновлено: 2024-12-10 20:27:04
comments   3
hits   2788

Научить вас шаг за шагом инкапсулировать стратегию Python в локальный файл

Научить вас шаг за шагом инкапсулировать стратегию Python в локальный файл

В этой статье рассматриваются два решения. Другое решение в конце статьи проще (рекомендуется).

Многие разработчики, использующие Python для написания стратегий, хотят хранить файлы кода стратегии локально, но их беспокоит безопасность стратегий. КакFMZ APIОдно из решений, предложенных в документе:

Политика безопасности Разрабатывайте стратегии на платформе Inventor Quantitative Trading Platform. Стратегии видны только владельцам счетов Inventor Quantitative. Кроме того, код стратегии может быть полностью локализован на платформе количественной торговли Inventor. Например, стратегия может быть инкапсулирована в пакет Python и загружена в код стратегии, таким образом достигая локализации стратегии. https://www.fmz.com/api#%E7%AD%96%E7%95%A5%E5%AE%89%E5%85%A8%E6%80%A7

На самом деле, об этом не нужно беспокоиться, но поскольку такое решение существует, приведен полный пример реализации.

Инкапсуляция стратегии

Давайте найдем простую стратегию Python для демонстрации, используя классическуюDual ThrustСтратегия, адрес стратегии: https://www.fmz.com/strategy/21856 Мы стремимся не изменять никакую часть кода стратегии и инкапсулируем стратегию в файл, который может быть вызван кодом стратегии на платформе FMZ. Результат выполнения точно такой же, как и при прямом запуске стратегии. Самая большая проблема с инкапсуляцией заключается в том, что глобальные объекты, глобальные функции и константные значения, вызываемые кодом стратегии на платформе FMZ, не могут быть доступны в наших инкапсулированных файлах, поэтому мы должны найти способ передать эти объекты, функции, переменные и константы для инкапсулированного документа. Затем мы разберемся с этим шаг за шагом.

Научить вас шаг за шагом инкапсулировать стратегию Python в локальный файл

Вставьте в файл testA, открытый в локальном редакторе.

Научить вас шаг за шагом инкапсулировать стратегию Python в локальный файл

  • Добавьте немного кода и сохраните часть кода стратегии, которую вы скопировали и вставили, нетронутой.
  # 函数、对象
  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

Основная функция приведенного выше кода — объявление глобальных функций и переменных, используемых в текущем файле. Затем зарезервируйте интерфейс для импорта этих функций.SetExchangesSetParamsSetFunc. Стратегии на платформе FMZ вызывают эти функции и передают некоторые используемые функции, объекты и т. д.

Стратегия запуска на платформе FMZ

Стратегия запуска очень проста и выглядит следующим образом:

Научить вас шаг за шагом инкапсулировать стратегию Python в локальный файл

На платформе FMZ написано всего несколько строк кода. Следует отметить, что параметры этой стартовой стратегии такие же, как и у стратегии, которую мы инкапсулируем.Python-версия фьючерсов Dual Thrust OKCoinЭто то же самое. Фактически, вы можете напрямую скопировать стратегию “Python-версия Dual Thrust OKCoin Futures”, затем очистить код стратегии и вставить его

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()

Таким образом, мы инкапсулируем тело логики политики в файле testA и размещаем его локально на устройстве хоста. На платформе FMZ нам нужно сохранить только одну политику запуска. Робот, который создает эту политику запуска, может напрямую загрузить наш локальный файл и запустить его локально на хосте.

Сравнение результатов бэктестинга

  • Загрузите файл testA локально для бэктестинга

Научить вас шаг за шагом инкапсулировать стратегию Python в локальный файл

  • Оригинальная стратегия, протестированная на публичном сервере

Научить вас шаг за шагом инкапсулировать стратегию Python в локальный файл

Другой более простой способ

Непосредственно загрузите файл для выполнения. На этот раз мы подготавливаем файл testB для размещения кода стратегии «Python-версия 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': {

...

Стратегия слишком длинная, поэтому она опущена, а код стратегии вообще не нужно менять. Затем подготовьте «Python-версию Dual Thrust OKCoin Futures (запустите стратегию и выполните файл testB напрямую)», которая является нашей стратегией на платформе FMZ, создайте робота, напрямую загрузите файл testB и выполните его напрямую. Следует отметить, что стартовая стратегия также должна иметь те же настройки параметров стратегии (параметры интерфейса стратегии), что и исходная версия «Python version Dual Thrust OKCoin Futures».

Научить вас шаг за шагом инкапсулировать стратегию Python в локальный файл

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)

Чтобы провести бэктест: Научить вас шаг за шагом инкапсулировать стратегию Python в локальный файл

Результаты бэктестинга согласуются с приведенными выше тестами.

Очевидно, что второй метод выше проще и рекомендуется. Если есть лучший метод, вы можете оставить сообщение.