Tangan-tangan mengajarkan Anda untuk membungkus kebijakan Python dalam dokumen yang murah.

Penulis:Mimpi kecil, Dibuat: 2020-06-30 10:48:18, Diperbarui: 2023-10-08 19:48:02

img

Tangan-tangan mengajarkan Anda untuk membungkus kebijakan Python dalam dokumen yang murah.

Artikel ini membahas dua solusi, yang lain di akhir artikel lebih sederhana (rekomendasi).

Ada banyak pengembang yang menulis kebijakan menggunakan bahasa Python yang ingin menyimpan dokumen kode kebijakan secara lokal karena khawatir keamanan kebijakan; seperti:FMZ APISalah satu solusi yang diajukan dalam dokumen tersebut adalah:

Keamanan Strategis Strategi yang dikembangkan di Inventor Quantum Trading Platform hanya dapat dilihat oleh pemegang akun Inventor Quantum Trading Platform. Dan di Inventor Quantum Trading Platform, kode kebijakan dapat dilokalisasi sepenuhnya, misalnya dengan membungkus kebijakan ke dalam paket Python dan memuatnya dalam kode kebijakan.https://www.fmz.com/api#策略安全性

Meskipun kekhawatiran ini tidak perlu, namun dengan solusi seperti itu, ini memberikan contoh implementasi yang lengkap.

Membungkus sebuah strategi

Kami menemukan strategi Python yang sederhana untuk demonstrasi, menggunakan strategi Python klasik.Dual ThrustStrategi, alamat strategi:https://www.fmz.com/strategy/21856Kami berusaha untuk tidak mengubah kode bagian kebijakan, dan membungkus kebijakan ke dalam sebuah file yang dapat dipanggil oleh kode kebijakan di platform FMZ, dan hasil pelaksanaannya sepenuhnya konsisten dengan menjalankan kebijakan tersebut secara langsung. Masalah terbesar dengan pembungkus adalah bahwa objek global, fungsi global, nilai konstanta yang dipanggil oleh kode kebijakan di platform FMZ tidak dapat diakses di dalam file yang kami bungkus, jadi kami harus mencari cara untuk menyampaikan objek, fungsi, variabel, konstanta ke dalam file yang dikemas.

  • MeniruPython versi Dual Thrust OKCoin berjangkaKode untuk kebijakan, yang ditempelkan ke dalam file Python lokal, yang disebut testA.

    img

    Tempelkan testA ke dalam file yang dibuka di editor lokal.

    img

  • Tambahkan beberapa kode untuk menjaga bagian kode kebijakan yang disalin dan ditempel 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 dari kode di atas adalah untuk menyatakan fungsi global, variabel, dan lain-lain yang digunakan dalam dokumen saat ini.SetExchangesSetParamsSetFuncFungsi-fungsi ini dapat digunakan untuk memindahkan beberapa fungsi, objek, dan lain-lain.

Strategi peluncuran di platform FMZ

Cara memulai sangat sederhana, seperti berikut:

img

Hanya beberapa baris kode yang ditulis di platform FMZ, dan perlu dicatat bahwa parameter untuk memulai kebijakan ini adalah untuk membungkus kebijakan dengan kami.Python versi Dual Thrust OKCoin berjangkaDengan cara yang sama, Anda dapat langsung menyalin strategi "Python versi Dual Thrust OKCoin futures" dan mengosongkan kode dari strategi tersebut dan menempelkannya pada akun Anda.

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 demikian, kita akan mengunggah subjek logika kebijakan ke dalam testA file dan menempatkan pada perangkat lokal di mana host berada, dan pada platform FMZ, hanya dengan menyimpan satu kebijakan startup, robot yang membuat kebijakan startup ini dapat langsung memuat file lokal kita dan berjalan di host lokal.

Perbandingan

  • TestA file yang dimuat secara lokal

    img

  • Kebijakan asli, di-retest di server publik

    img

Cara lain yang lebih sederhana.

Anda dapat mengunggah file langsung ke aplikasi. Kali ini kami menyiapkan sebuah testB file yang menempatkan kode untuk strategi "python version 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': {

...

Jika strategi terlalu panjang, maka akan dihilangkan, dan kode tidak perlu diubah sama sekali. Kemudian siapkan "Python Dual Thrust OKCoin Futures", yaitu strategi kami di platform FMZ, membuat bot, langsung memuat testB, dan langsung mengeksekusi. Perlu dicatat bahwa "Python Dual Thrust OKCoin Futures" harus memiliki pengaturan parameter strategi yang sama dengan versi asli.

img

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)

Periksa ulang:img

Hasil retestnya sama dengan tes di atas.

Cara kedua jelas lebih sederhana dan saya sarankan untuk digunakan, jika ada cara yang lebih baik, selamat datang di blog saya.


Berkaitan

Lebih banyak

QQ89520Saya merasa selenium dapat digunakan untuk melakukan banyak hal.

QQ89520Belajar

Mimpi kecilHa ha, ada ide yang bisa kita sampaikan dan bahas bersama-sama.