Ajari Anda langkah demi langkah untuk merangkum strategi Python ke dalam file lokal

Dibuat di: 2020-06-30 10:48:18, diperbarui pada: 2024-12-10 20:27:04
comments   3
hits   2788

Ajari Anda langkah demi langkah untuk merangkum strategi Python ke dalam file lokal

Ajari Anda langkah demi langkah untuk merangkum strategi Python ke dalam file lokal

Artikel ini membahas dua solusi. Solusi lain di akhir artikel lebih sederhana (disarankan).

Banyak pengembang yang menggunakan Python untuk menulis strategi ingin menyimpan file kode strategi secara lokal, tetapi mereka khawatir tentang keamanan strategi tersebut. SebagaiFMZ APISalah satu solusi yang diusulkan dalam dokumen tersebut:

Kebijakan Keamanan Kembangkan strategi di Inventor Quantitative Trading Platform. Strategi hanya dapat dilihat oleh pemegang akun Inventor Quantitative. Selain itu, kode strategi dapat dilokalkan sepenuhnya pada Inventor Quantitative Trading Platform. Misalnya, strategi dapat dienkapsulasi ke dalam paket Python dan dimuat ke dalam kode strategi, sehingga mencapai lokalisasi strategi. https://www.fmz.com/api#%E7%AD%96%E7%95%A5%E5%AE%89%E5%85%A8%E6%80%A7

Sebenarnya hal ini tidak perlu dikhawatirkan, tetapi karena sudah ada solusinya, maka diberikan contoh implementasi yang lengkap.

Merangkum sebuah strategi

Mari kita temukan strategi Python sederhana untuk didemonstrasikan, menggunakan klasikDual ThrustStrategi, alamat strategi: https://www.fmz.com/strategy/21856 Kami berusaha untuk tidak mengubah bagian mana pun dari kode strategi, dan merangkum strategi tersebut ke dalam sebuah berkas yang dapat dipanggil oleh kode strategi pada platform FMZ. Hasil eksekusinya sama persis dengan menjalankan strategi secara langsung. Masalah terbesar dengan enkapsulasi adalah bahwa objek global, fungsi global, dan nilai konstan yang dipanggil oleh kode strategi pada platform FMZ tidak dapat diakses dalam file yang dienkapsulasi, jadi kita harus menemukan cara untuk meneruskan objek, fungsi, variabel ini. , dan konstanta ke dokumen yang dienkapsulasi. Kemudian kami akan menanganinya langkah demi langkah.

Ajari Anda langkah demi langkah untuk merangkum strategi Python ke dalam file lokal

Tempel ke file testA yang dibuka di editor lokal.

Ajari Anda langkah demi langkah untuk merangkum strategi Python ke dalam file lokal

  • Tambahkan beberapa kode, dan biarkan bagian kode strategi yang Anda salin dan tempel tetap utuh
  # 函数、对象
  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

Fungsi utama kode di atas adalah untuk mendeklarasikan fungsi dan variabel global yang digunakan dalam file saat ini. Kemudian pesan antarmuka untuk mengimpor fungsi-fungsi iniSetExchangesSetParamsSetFunc. Strategi pada platform FMZ memanggil fungsi-fungsi ini dan meneruskan beberapa fungsi, objek, dll. yang digunakan.

Strategi peluncuran di platform FMZ

Strategi startupnya sangat sederhana, yaitu sebagai berikut:

Ajari Anda langkah demi langkah untuk merangkum strategi Python ke dalam file lokal

Hanya ada beberapa baris kode yang ditulis pada platform FMZ. Perlu dicatat bahwa parameter strategi startup ini sama dengan strategi yang kami rangkum.Versi Python dari Dual Thrust OKCoin FuturesIni persis sama. Faktanya, Anda dapat langsung menyalin strategi “versi Python dari Dual Thrust OKCoin Futures”, lalu menghapus kode strategi dan menempelkannya

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

Dengan cara ini, kami merangkum badan logika kebijakan dalam file testA dan meletakkannya secara lokal di perangkat host. Pada platform FMZ, kami hanya perlu menyimpan satu kebijakan startup. Robot yang membuat kebijakan startup ini dapat langsung memuat file lokal kami dan menjalankannya secara lokal pada host.

Perbandingan pengujian ulang

  • Muat file testA secara lokal untuk pengujian ulang

Ajari Anda langkah demi langkah untuk merangkum strategi Python ke dalam file lokal

  • Strategi asli, diuji kembali di server publik

Ajari Anda langkah demi langkah untuk merangkum strategi Python ke dalam file lokal

Cara lain yang lebih sederhana

Langsung memuat berkas untuk dieksekusi. Kali ini kami menyiapkan file testB untuk menempatkan kode strategi “versi Python dari 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': {

...

Strateginya terlalu panjang, jadi dihilangkan dan kode strategi tidak perlu diubah sama sekali. Kemudian persiapkan “Dual Thrust OKCoin Futures versi Python (jalankan strategi dan jalankan file testB secara langsung)”, yang merupakan strategi kita pada platform FMZ, buat robot, muat file testB secara langsung, dan jalankan secara langsung. Perlu dicatat bahwa strategi startup juga harus memiliki pengaturan parameter strategi yang sama (parameter antarmuka strategi) seperti versi asli “Python versi Dual Thrust OKCoin Futures”.

Ajari Anda langkah demi langkah untuk merangkum strategi Python ke dalam file lokal

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)

Untuk melakukan backtest: Ajari Anda langkah demi langkah untuk merangkum strategi Python ke dalam file lokal

Hasil uji ulang konsisten dengan pengujian di atas.

Tentu saja, cara kedua di atas lebih mudah dan direkomendasikan. Jika ada cara yang lebih baik, silakan tinggalkan pesan.