Python で戦略を書く多くの開発者は,戦略の安全性を心配して,戦略コードファイルをローカルにしたいと考えています. FMZ API 文書で提案された解決策として:
戦略的セキュリティ
戦略はFMZプラットフォームで開発され,戦略はFMZアカウント所有者にのみ表示される.そしてFMZプラットフォームでは,戦略コードは完全にローカリズされ,例えば,戦略はPythonパッケージにカプセル化され,戦略コードにロードされ,戦略ローカリゼーションが実現される.
詳細については,以下を参照してください.https://www.fmz.com/api
実際,このような心配は必要ありませんが,そのような必要性があるので,完全な実施例を提示します.
簡単な Python 戦略を見つけましょう.Dual Thrust
戦略 戦略の住所https://www.fmz.com/strategy/21856戦略コードのいかなる部分も変更しないように努力し,FMZプラットフォーム上の戦略コードで呼び出すことができるファイルに戦略をカプセル化し,実行結果は,戦略を直接実行することとまったく同じです. カプセル化の最大の問題は,FMZプラットフォーム上の戦略コードで呼び出されるグローバルオブジェクト,グローバル関数,およびコンスタント値は,カプセルするファイルでアクセスできないため,これらのオブジェクト,関数,変数,およびコンスタントをカプセル化されたファイルに転送する方法を見つけなければなりません. ステップごとに実行しましょう.
testA
.ファイルに貼るtestA
地元の編集者が開きました
コードの一部をコピーしてペーストしたまま
# 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
, SetFunc
FMZ プラットフォームの戦略は,これらの関数を呼び出し,いくつかの使用された関数とオブジェクトを通過します.
スタートアップ戦略は とてもシンプルです
このスタートアップ戦略のパラメータは,私たちのパッケージ戦略とまったく同じです.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()
戦略の論理をtestA
FMZ プラットフォームでは,起動戦略を保存するだけです. この起動戦略を作成するロボットは,ローカルファイルを直接読み込み,ローカルで実行できます.
testA
バックテストのためにローカルファイル実行のために直接ファイルをロードします.
このとき,我々は準備する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 バージョン.
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)
バックテストを実行します.
バックテストの結果は上記のテストと一致する.
明らかに上記の2番目の方法はよりシンプルで,使用することが推奨されます.