Python 戦略をローカル ファイルに収縮する方法を教えます

作者: リン・ハーン優しさ, 作成日:2020-07-09 10:21:31, 更新日:2023-10-28 15:28:00

img

Python で戦略を書く多くの開発者は,戦略の安全性を心配して,戦略コードファイルをローカルにしたいと考えています. FMZ API 文書で提案された解決策として:

戦略的セキュリティ

戦略はFMZプラットフォームで開発され,戦略はFMZアカウント所有者にのみ表示される.そしてFMZプラットフォームでは,戦略コードは完全にローカリズされ,例えば,戦略はPythonパッケージにカプセル化され,戦略コードにロードされ,戦略ローカリゼーションが実現される.

詳細については,以下を参照してください.https://www.fmz.com/api

実際,このような心配は必要ありませんが,そのような必要性があるので,完全な実施例を提示します.

戦略を概要する

簡単な Python 戦略を見つけましょう.Dual Thrust戦略 戦略の住所https://www.fmz.com/strategy/21856戦略コードのいかなる部分も変更しないように努力し,FMZプラットフォーム上の戦略コードで呼び出すことができるファイルに戦略をカプセル化し,実行結果は,戦略を直接実行することとまったく同じです. カプセル化の最大の問題は,FMZプラットフォーム上の戦略コードで呼び出されるグローバルオブジェクト,グローバル関数,およびコンスタント値は,カプセルするファイルでアクセスできないため,これらのオブジェクト,関数,変数,およびコンスタントをカプセル化されたファイルに転送する方法を見つけなければなりません. ステップごとに実行しましょう.

img

ファイルに貼るtestA地元の編集者が開きました

img

コードの一部をコピーしてペーストしたまま

# 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

上のコードの主な機能は,現在のファイルで使用されるグローバル関数と変数を宣言することです.SetExchanges, SetParams, SetFuncFMZ プラットフォームの戦略は,これらの関数を呼び出し,いくつかの使用された関数とオブジェクトを通過します.

FMZプラットフォームでのスタートアップ戦略

スタートアップ戦略は とてもシンプルです

img

このスタートアップ戦略のパラメータは,私たちのパッケージ戦略とまったく同じです.OKCoin フューチャーストラテジーコードの Python バージョン直接コピーすることができます.OKCoin フューチャーストラテジーコードの Python バージョン戦略コードを削除して貼り付けます

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

戦略の論理をtestAFMZ プラットフォームでは,起動戦略を保存するだけです. この起動戦略を作成するロボットは,ローカルファイルを直接読み込み,ローカルで実行できます.

バックテストの比較

  • 負荷testAバックテストのためにローカルファイル

img

  • オリジナル戦略,公共サーバーのバックテスト

img

もう一つの簡単な方法

実行のために直接ファイルをロードします. このとき,我々は準備するtestBファイルにOKCoin フューチャーストラテジーコードの Python バージョン 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': {

...

戦略が長すぎると 省略され 戦略コードは全く変更する必要はありません

準備してOKCoin フューチャーストラテジーコードの Python バージョン(戦略を始める,直接実行する)testBロボットを作成し,直接testBスタートアップ戦略は,スタートアップ戦略の初期バージョンと同じ戦略パラメータ設定 (戦略インターフェースパラメーター) を有しなければならない.OKCoin フューチャーストラテジーコードの Python バージョン.

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)

バックテストを実行します.

img

バックテストの結果は上記のテストと一致する.

明らかに上記の2番目の方法はよりシンプルで,使用することが推奨されます.


もっと