Pythonの手順をパッケージ化するコストを削減します

作者: リン・ハーン小さな夢, 作成日:2020-06-30 10:48:18, 更新日:2023-10-08 19:48:02

img

Pythonの手順をパッケージ化するコストを削減します

この記事では2つの方法について述べていますが,文末のもう1つの方法はよりシンプルです.

Python言語でポリシーを書く開発者は,そのセキュリティを懸念し,ポリシーコードファイルをローカルにしたいと願っています.FMZ API文書の提案の一つは,

戦略的セキュリティ 発明者量化取引プラットフォームでは,策略が発明者量化アカウント所有者にのみ表示される策略を開発する.また,発明者量化取引プラットフォームでは,策略コードを完全にローカライズすることが可能である.例えば,策略をPythonパッケージに包み込み,策略コードにロードすることで,策略のローカライゼーションを実現する.https://www.fmz.com/api#策略安全性

解決策があるからこそ,実現の完全な例が提示される.

策略を包み込む

簡単なPython戦略を例に挙げます.Dual Thrust戦略,戦略の住所:https://www.fmz.com/strategy/21856策略の一部コードを一切変更しないように努め,策略をFMZプラットフォーム上の策略コードで呼び出すことができるファイルにパッケージ化し,実行結果と直接実行するポリシーに完全に一致します. パッケージ化で最大の問題は,FMZプラットフォーム上の策略コードで呼び出すグローバルオブジェクト,グローバル関数,常量値は,私たちのパッケージ化ファイルではアクセスできないので,これらのオブジェクト,関数,変数,常数をパッケージ化ファイルに転送する方法を考えなければなりません. 次に,部署で処理します.

  • 複製Python版 Dual Thrust OKCoin フューチャー策略のコードを testA と呼ばれるローカル Python ファイルに貼り付けます.

    img

    testA を testA のファイルに貼る.

    img

  • コードの一部を追加して,コピー・ペーストするポリシーコードの一部を原始保存します.

    # 函数、对象
    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
    

    上記のコードの主な役割は,現在のファイル内で使用されている全域関数,変数を宣言すること.そして,これらの関数を輸入するインターフェースを予約すること.SetExchangesSetParamsSetFuncFMZのプラットフォーム上の戦略は,これらの関数を呼び出し,使用した関数,オブジェクトなどの一部を転送します.

FMZのスタート戦略

スタート戦略は簡単で,次の通りです.

img

FMZのプラットフォームでは,この数行だけのコードが書かれています. 注意しておきたいのは,この起動ポリシーのパラメータは,Python版 Dual Thrust OKCoin フューチャーPython版 Dual Thrust OKCoinのフューチャーをコピーして,そのコードを空にして,それを貼り付けます.

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 ファイルをローカルに読み返す

    img

  • オリジナルのポリシー,公共サーバーで復習

    img

簡単な方法があります.

ファイルを直接実行にアップロードします. テストBファイルを作成し",Python版 Dual Thrust OKCoinフューチャー"のコードを配置しました.

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フューチャー (起動ポリシー,直接testBファイルを実行する) "を準備します.これはFMZのプラットフォーム上で,ロボットを作成し,直接testBファイルをロードし,直接実行する方法です.注意すべきは",起動ポリシー"には,オリジナルのpython版 Dual Thrust OKCoinフューチャーと同じタッチのポリシーパラメータ設定 (戦略インターフェースパラメータ) が必要です.

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)

復習を実行する:img

テスト結果が上記のテストと一致した.

明らかに2番目の方法はもっと簡単で,使用することをお勧めします. より良い方法があるなら,Welcome to God's Message.


関連性

もっと

QQ89520セレニウムにはもっと多くの機能があると思います

QQ89520学習する

小さな夢ハハ,どんなアイデアが浮かび上がるのか,みんなで議論しましょう.