
इस लेख में दो समाधानों पर चर्चा की गई है। लेख के अंत में दिया गया दूसरा समाधान सरल (अनुशंसित) है।
कई डेवलपर्स जो रणनीति लिखने के लिए पायथन का उपयोग करते हैं, वे रणनीति कोड फ़ाइलों को स्थानीय रूप से संग्रहीत करना चाहते हैं, लेकिन वे रणनीतियों की सुरक्षा के बारे में चिंतित हैं। जैसाFMZ APIदस्तावेज़ में एक समाधान प्रस्तावित किया गया:
नीति सुरक्षा इन्वेंटर क्वांटिटेटिव ट्रेडिंग प्लेटफ़ॉर्म पर रणनीतियाँ विकसित करें। रणनीतियाँ केवल इन्वेंटर क्वांटिटेटिव खाताधारकों को ही दिखाई देती हैं। इसके अलावा, रणनीति कोड को इन्वेंटर क्वांटिटेटिव ट्रेडिंग प्लेटफ़ॉर्म पर पूरी तरह से स्थानीयकृत किया जा सकता है। उदाहरण के लिए, रणनीति को पायथन पैकेज में समाहित किया जा सकता है और रणनीति कोड में लोड किया जा सकता है, इस प्रकार रणनीति स्थानीयकरण प्राप्त किया जा सकता है। https://www.fmz.com/api#%E7%AD%96%E7%95%A5%E5%AE%89%E5%85%A8%E6%80%A7
वास्तव में, इस बारे में चिंता करने की कोई आवश्यकता नहीं है, लेकिन चूंकि ऐसा समाधान मौजूद है, इसलिए एक पूर्ण कार्यान्वयन उदाहरण प्रदान किया गया है।
आइए क्लासिक पायथन का उपयोग करके प्रदर्शन करने के लिए एक सरल पायथन रणनीति खोजेंDual Thrustरणनीति, रणनीति पता: https://www.fmz.com/strategy/21856
हम रणनीति कोड के किसी भी हिस्से को बदलने का प्रयास नहीं करते हैं, और रणनीति को एक फ़ाइल में समाहित करते हैं जिसे FMZ प्लेटफ़ॉर्म पर रणनीति कोड द्वारा कॉल किया जा सकता है। निष्पादन परिणाम बिल्कुल वैसा ही है जैसा कि रणनीति को सीधे चलाने पर होता है। एनकैप्सुलेशन के साथ सबसे बड़ी समस्या यह है कि FMZ प्लेटफ़ॉर्म पर रणनीति कोड द्वारा बुलाए गए वैश्विक ऑब्जेक्ट्स, वैश्विक फ़ंक्शन और स्थिर मानों को हमारी एनकैप्सुलेटेड फ़ाइलों में एक्सेस नहीं किया जा सकता है, इसलिए हमें इन ऑब्जेक्ट्स, फ़ंक्शन, चर को पास करने का एक तरीका खोजना होगा , और स्थिरांक को समाहित दस्तावेज़ में जोड़ें। फिर हम इसे चरणबद्ध तरीके से निपटाएंगे।

स्थानीय संपादक में खोली गई फ़ाइल testA में पेस्ट करें.

# 函数、对象
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
उपरोक्त कोड का मुख्य कार्य वर्तमान फ़ाइल में प्रयुक्त वैश्विक फ़ंक्शन और वेरिएबल्स को घोषित करना है। फिर इन फ़ंक्शनों को आयात करने के लिए इंटरफ़ेस आरक्षित करेंSetExchanges,SetParams,SetFunc. एफएमजेड प्लेटफॉर्म पर मौजूद रणनीतियाँ इन फंक्शनों को कॉल करती हैं और कुछ प्रयुक्त फंक्शनों, ऑब्जेक्टों आदि को पास करती हैं।
स्टार्टअप रणनीति बहुत सरल है, इस प्रकार:

FMZ प्लेटफ़ॉर्म पर कोड की केवल कुछ पंक्तियाँ लिखी गई हैं। यह ध्यान दिया जाना चाहिए कि इस स्टार्टअप रणनीति के पैरामीटर हमारी एनकैप्सुलेटेड रणनीति के समान ही हैं।डुअल थ्रस्ट ओकेकॉइन फ्यूचर्स का पायथन संस्करणयह बिल्कुल वैसा ही है। वास्तव में, आप सीधे “डुअल थ्रस्ट ओकेकॉइन फ्यूचर्स के पायथन संस्करण” रणनीति की प्रतिलिपि बना सकते हैं, फिर रणनीति कोड को साफ़ करें और इसे पेस्ट करें
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 प्लेटफ़ॉर्म पर, हमें केवल एक स्टार्टअप पॉलिसी को सहेजने की आवश्यकता होती है। इस स्टार्टअप पॉलिसी को बनाने वाला रोबोट सीधे हमारी स्थानीय फ़ाइल को लोड कर सकता है और इसे स्थानीय रूप से होस्ट पर चलाएं.


निष्पादन के लिए फ़ाइल को सीधे लोड करें. इस बार हम “डुअल थ्रस्ट ओकेकॉइन फ्यूचर्स के पायथन संस्करण” रणनीति का कोड रखने के लिए एक टेस्टबी फ़ाइल तैयार करते हैं।
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': {
...
रणनीति बहुत लंबी है, इसलिए इसे छोड़ दिया गया है, और रणनीति कोड को बिल्कुल भी बदलने की आवश्यकता नहीं है। फिर “डुअल थ्रस्ट ओकेकॉइन फ्यूचर्स का पायथन संस्करण तैयार करें (रणनीति शुरू करें और सीधे टेस्टबी फ़ाइल निष्पादित करें)”, जो कि एफएमजेड प्लेटफॉर्म पर हमारी रणनीति है, एक रोबोट बनाएं, टेस्टबी फ़ाइल को सीधे लोड करें, और इसे सीधे निष्पादित करें। यह ध्यान दिया जाना चाहिए कि स्टार्टअप रणनीति में “पायथन संस्करण डुअल थ्रस्ट ओकेकॉइन फ्यूचर्स” के मूल संस्करण के समान रणनीति पैरामीटर सेटिंग्स (रणनीति इंटरफ़ेस पैरामीटर) भी होनी चाहिए।

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)
बैकटेस्ट करने के लिए:

बैकटेस्ट के परिणाम उपरोक्त परीक्षणों के अनुरूप हैं।
जाहिर है, ऊपर दी गई दूसरी विधि सरल और अनुशंसित है। यदि कोई बेहतर विधि है, तो आप एक संदेश छोड़ सकते हैं।