Mengajar anda untuk merangkumi strategi Python ke dalam fail tempatan

Penulis:Kebaikan, Dicipta: 2020-07-09 10:21:31, Dikemas kini: 2023-10-28 15:28:00

img

Ramai pemaju yang menulis strategi dalam Python mahu meletakkan fail kod strategi secara tempatan, bimbang tentang keselamatan strategi.

Keselamatan Strategi

Strategi ini dibangunkan di platform FMZ, dan strategi hanya dapat dilihat oleh pemegang akaun FMZ. Dan di platform FMZ, kod strategi boleh ditolokalisasi sepenuhnya, sebagai contoh, strategi dikapsulkan ke dalam pakej Python dan dimuatkan dalam kod strategi, sehingga penyetempatan strategi direalisasikan.

Untuk maklumat lanjut, sila pergi ke:https://www.fmz.com/api

Sebenarnya, kebimbangan seperti ini tidak perlu, tetapi kerana terdapat keperluan seperti itu, kami akan memberikan contoh pelaksanaan yang lengkap.

Merangkumi strategi

Mari kita cari strategi Python yang mudah untuk demonstrasi, menggunakan klasikDual Thruststrategi, alamat strategi:https://www.fmz.com/strategy/21856Kami berusaha untuk tidak mengubah mana-mana bahagian kod strategi, merangkumi strategi ke dalam fail yang boleh dipanggil oleh kod strategi di platform FMZ, dan hasil pelaksanaan adalah sama seperti menjalankan strategi secara langsung. Masalah terbesar dengan encapsulation adalah bahawa objek global, fungsi global, dan nilai konstanta yang dipanggil oleh kod strategi di platform FMZ tidak dapat diakses dalam fail yang kita merangkumi, jadi kita mesti mencari cara untuk lulus objek, fungsi, pembolehubah, dan konstanta ini ke fail yang terenkap. mari lakukan langkah demi langkah.

img

Letakkan ke dalam failtestAdibuka oleh editor tempatan.

img

Tambah beberapa kod, dan menyimpan bahagian kod strategi disalin dan dilampirkan utuh

# 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

Fungsi utama kod di atas adalah untuk mengisytiharkan fungsi global dan pembolehubah yang digunakan dalam fail semasa.SetExchanges, SetParams, SetFuncuntuk mengimport fungsi ini. Strategi di platform FMZ memanggil fungsi ini dan lulus beberapa fungsi dan objek yang digunakan.

Strategi permulaan di platform FMZ

Strategi permulaan adalah sangat mudah, seperti berikut:

img

Terdapat hanya beberapa baris kod yang ditulis pada platform FMZ. perlu diperhatikan bahawa parameter strategi permulaan ini adalah sama persis dengan strategi kami dibungkusVersi Python kod strategi niaga hadapan OKCoin Dual ThrustMalah, anda boleh langsung menyalinVersi Python kod strategi niaga hadapan OKCoin Dual ThrustStrategi, kemudian hanya membersihkan kod strategi, paste ia.

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

Dengan cara ini, kita merangkumi badan utama logik strategi dalamtestAfile dan meletakkannya secara tempatan pada peranti di mana docker terletak. pada platform FMZ, kita hanya perlu menyimpan strategi permulaan. robot yang membuat strategi permulaan ini boleh memuat fail tempatan kita secara langsung dan menjalankannya secara tempatan.

Perbandingan Ujian Balik

  • BebantestAfail secara tempatan untuk backtest

img

  • Strategi asal, backtesting pada pelayan awam

img

Satu lagi cara yang lebih mudah

Muat fail terus untuk pelaksanaan. Kali ini kita menyediakantestBfail dengan kod untukVersi Python kod strategi niaga hadapan 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': {

...

Jika strategi itu terlalu panjang, ia akan dilepaskan dan kod strategi tidak perlu diubah sama sekali.

Kemudian bersiapVersi Python kod strategi niaga hadapan OKCoin Dual Thrust(memulakan strategi, melaksanakan secara langsungtestBfile), yang merupakan strategi kami pada platform FMZ, mencipta robot, langsung memuatkantestBIa harus diperhatikan bahawa strategi permulaan juga mesti mempunyai tetapan parameter strategi yang sama persis (parameter antara muka strategi) sebagai versi asalVersi Python kod strategi niaga hadapan 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)

Melakukan backtest:

img

Hasil backtest adalah konsisten dengan ujian di atas.

Jelas kaedah kedua di atas adalah lebih mudah, ia disyorkan untuk digunakan.


Lebih lanjut