Mengajarkan Anda untuk mengkapsulkan strategi Python ke dalam file lokal

Penulis:Kebaikan, Dibuat: 2020-07-09 10:21:31, Diperbarui: 2023-10-28 15:28:00

img

Banyak pengembang yang menulis strategi di Python ingin menempatkan file kode strategi secara lokal, khawatir tentang keamanan strategi.

Keamanan Strategi

Strategi dikembangkan di platform FMZ, dan strategi hanya terlihat oleh pemegang akun FMZ. Dan di platform FMZ, kode strategi dapat sepenuhnya dilokalisasi, misalnya, strategi dikemas dalam paket Python dan dimuat dalam kode strategi, sehingga lokalisasi strategi direalisasikan.

Untuk informasi lebih lanjut, silakan kunjungi:https://www.fmz.com/api

Sebenarnya, kekhawatiran semacam ini tidak perlu, tetapi karena ada kebutuhan seperti itu, kami akan memberikan contoh implementasi yang lengkap.

Menyimpulkan strategi

Mari kita cari strategi Python sederhana untuk demonstrasi, menggunakan klasikDual Thruststrategi, alamat strategi:https://www.fmz.com/strategy/21856Kami berusaha untuk tidak mengubah bagian mana pun dari kode strategi, mengkapsulkan strategi ke dalam file yang dapat dipanggil oleh kode strategi di platform FMZ, dan hasil eksekusi persis sama dengan menjalankan strategi secara langsung. Masalah terbesar dengan enkapsulasi adalah bahwa objek global, fungsi global, dan nilai konstan yang dipanggil oleh kode strategi di platform FMZ tidak dapat diakses di file yang kita bungkus, jadi kita harus menemukan cara untuk melewati objek, fungsi, variabel, dan konstanta ini ke file yang dikapsulkan. mari lakukan langkah demi langkah.

img

Tempelkan ke dalam filetestAdibuka oleh editor lokal.

img

Tambahkan beberapa kode, dan menjaga bagian kode strategi disalin dan ditempel 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 kode di atas adalah untuk menyatakan fungsi global dan variabel yang digunakan dalam file saat ini.SetExchanges, SetParams, SetFuncStrategi di platform FMZ memanggil fungsi ini dan melewati beberapa fungsi dan objek yang digunakan.

Strategi startup di platform FMZ

Strategi startup sangat sederhana, sebagai berikut:

img

Ada hanya beberapa baris kode yang ditulis pada platform FMZ. Harus dicatat bahwa parameter strategi startup ini persis sama dengan strategi kami dikemasVersi Python dari kode strategi berjangka OKCoin Dual ThrustBahkan, Anda dapat langsung menyalinVersi Python dari kode strategi berjangka OKCoin Dual ThrustStrategi, maka hanya menghapus kode strategi, tempelkan.

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 merangkum tubuh utama logika strategi dalamtestAfile dan letakkan secara lokal pada perangkat di mana docker berada. pada platform FMZ, kita hanya perlu menyimpan strategi startup. robot yang membuat strategi startup ini dapat langsung memuat file lokal kita dan menjalankannya secara lokal.

Perbandingan backtesting

  • BebantestAfile secara lokal untuk backtest

img

  • Strategi asli, backtesting di server publik

img

Cara lain yang lebih sederhana

Muat file langsung untuk eksekusi. Kali ini kita mempersiapkantestBfile dengan kode untukVersi Python dari kode strategi berjangka 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 terlalu panjang, maka strategi tersebut akan dihilangkan dan kode strategi tidak perlu diubah sama sekali.

Lalu persiapkanVersi Python dari kode strategi berjangka OKCoin Dual Thrust(memulai strategi, langsung melaksanakantestBfile), yang merupakan strategi kami pada platform FMZ, membuat robot, langsung memuattestBPerlu dicatat bahwa strategi startup juga harus memiliki pengaturan parameter strategi yang sama persis (parameter antarmuka strategi) sebagai versi asli dariVersi Python dari kode strategi berjangka 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)

Lakukan backtest:

img

Hasil backtest konsisten dengan tes di atas.

Jelas metode kedua di atas lebih sederhana, disarankan untuk digunakan.


Lebih banyak