В процессе загрузки ресурсов... загрузка...

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

Автор:Изобретатели количественного измерения - мечты, Создано: 2020-06-30 10:48:18, Обновлено: 2024-12-10 20:27:04

手把手教你把一个Python策略封装成本地文件

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

В этой статье мы расскажем о двух вариантах, а в конце статьи мы расскажем проще (рекомендуем).

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

Стратегия безопасности Разработка стратегии на квантовой торговой платформе изобретателя, которая доступна только для владельцев квантовой учетной записи изобретателя; и на квантовой торговой платформе изобретателя можно полностью локализовать код стратегии, например, обернуть его в пакет 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Мы стараемся не изменять ни одного кода части политики, обертывая политику в файл, который может быть вызван в ФМЗ, и результаты выполнения полностью совпадают с прямым выполнением этой политики. Самая большая проблема обертывания заключается в том, что глобальные объекты, глобальные функции, постоянные значения, которые вызываются в ФМЗ, не доступны в нашем обертанном файле, поэтому нужно найти способ передать эти объекты, функции, переменные, постоянные в обертанный файл.

手把手教你把一个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, и важно отметить, что параметры этой политики запуска должны быть с политикой, которую мы загружаем.Dual Thrust OKCoin в версии PythonТо же самое можно сделать, просто скопируя стратегию "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策略封装成本地文件

Есть еще один, более простой способ.

С помощью этого файла вы можете загрузить файл прямо в приложение. На этот раз мы подготовили тест-б файл, в котором мы поместили код для стратегии "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策略封装成本地文件

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策略封装成本地文件

Результаты повторных тестов совпадают с результатами вышеперечисленных тестов.

Очевидно, что второй способ проще, и я рекомендую его использовать.


Содержание

Больше информации

qq89520Это вдохновило меня на мысль, что есть много других возможностей, которые можно реализовать с помощью селена.

qq89520Учиться

Изобретатели количественного измерения - мечтыХа-ха, есть идеи, которые вы могли бы придумать, чтобы обсудить их вместе.