आपको एक स्थानीय फ़ाइल में पायथन रणनीति को समाहित करने के लिए चरण दर चरण सिखाना
इस लेख में दो समाधानों पर चर्चा की गई है। लेख के अंत में दिया गया दूसरा समाधान सरल (अनुशंसित) है।
कई डेवलपर्स जो रणनीति लिखने के लिए पायथन का उपयोग करते हैं, वे रणनीति कोड फ़ाइलों को स्थानीय रूप से संग्रहीत करना चाहते हैं, लेकिन वे रणनीतियों की सुरक्षा के बारे में चिंतित हैं। जैसाFMZ APIदस्तावेज़ में एक समाधान प्रस्तावित किया गया:
नीति सुरक्षा
इन्वेंटर क्वांटिटेटिव ट्रेडिंग प्लेटफ़ॉर्म पर रणनीतियाँ विकसित करें। रणनीतियाँ केवल इन्वेंटर क्वांटिटेटिव खाताधारकों को ही दिखाई देती हैं। इसके अलावा, रणनीति कोड को इन्वेंटर क्वांटिटेटिव ट्रेडिंग प्लेटफ़ॉर्म पर पूरी तरह से स्थानीयकृत किया जा सकता है। उदाहरण के लिए, रणनीति को पायथन पैकेज में समाहित किया जा सकता है और रणनीति कोड में लोड किया जा सकता है, इस प्रकार रणनीति स्थानीयकरण प्राप्त किया जा सकता है।
https://www.fmz.com/api#策略安全性
वास्तव में, इस बारे में चिंता करने की कोई आवश्यकता नहीं है, लेकिन चूंकि ऐसा समाधान मौजूद है, इसलिए एक पूर्ण कार्यान्वयन उदाहरण प्रदान किया गया है।
एक रणनीति को संक्षेप में प्रस्तुत करें
आइए क्लासिक पायथन का उपयोग करके प्रदर्शन करने के लिए एक सरल पायथन रणनीति खोजेंDual Thrustरणनीति, रणनीति पता: https://www.fmz.com/strategy/21856
हम रणनीति कोड के किसी भी हिस्से को बदलने का प्रयास नहीं करते हैं, और रणनीति को एक फ़ाइल में समाहित करते हैं जिसे FMZ प्लेटफ़ॉर्म पर रणनीति कोड द्वारा कॉल किया जा सकता है। निष्पादन परिणाम बिल्कुल वैसा ही है जैसा कि रणनीति को सीधे चलाने पर होता है। एनकैप्सुलेशन के साथ सबसे बड़ी समस्या यह है कि FMZ प्लेटफ़ॉर्म पर रणनीति कोड द्वारा बुलाए गए वैश्विक ऑब्जेक्ट्स, वैश्विक फ़ंक्शन और स्थिर मानों को हमारी एनकैप्सुलेटेड फ़ाइलों में एक्सेस नहीं किया जा सकता है, इसलिए हमें इन ऑब्जेक्ट्स, फ़ंक्शन, चर को पास करने का एक तरीका खोजना होगा , और स्थिरांक को समाहित दस्तावेज़ में जोड़ें। फिर हम इसे चरणबद्ध तरीके से निपटाएंगे।
-
कॉपीडुअल थ्रस्ट ओकेकॉइन फ्यूचर्स का पायथन संस्करणरणनीति कोड को testA नामक स्थानीय पायथन फ़ाइल में चिपकाया जाता है।
स्थानीय संपादक में खोली गई फ़ाइल testA में पेस्ट करें.
-
कुछ कोड जोड़ें, और रणनीति कोड का वह भाग जिसे आपने कॉपी करके पेस्ट किया था, उसे बरकरार रखें
python# 函数、对象 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 प्लेटफॉर्म पर लॉन्च रणनीति
स्टार्टअप रणनीति बहुत सरल है, इस प्रकार:
FMZ प्लेटफ़ॉर्म पर कोड की केवल कुछ पंक्तियाँ लिखी गई हैं। यह ध्यान दिया जाना चाहिए कि इस स्टार्टअप रणनीति के पैरामीटर हमारी एनकैप्सुलेटेड रणनीति के समान ही हैं।डुअल थ्रस्ट ओकेकॉइन फ्यूचर्स का पायथन संस्करणयह बिल्कुल वैसा ही है। वास्तव में, आप सीधे "डुअल थ्रस्ट ओकेकॉइन फ्यूचर्स के पायथन संस्करण" रणनीति की प्रतिलिपि बना सकते हैं, फिर रणनीति कोड को साफ़ करें और इसे पेस्ट करें
python
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 फ़ाइल को स्थानीय रूप से लोड करें
-
मूल रणनीति, सार्वजनिक सर्वर पर बैकटेस्ट की गई
एक और सरल तरीका
निष्पादन के लिए फ़ाइल को सीधे लोड करें.
इस बार हम "डुअल थ्रस्ट ओकेकॉइन फ्यूचर्स के पायथन संस्करण" रणनीति का कोड रखने के लिए एक टेस्टबी फ़ाइल तैयार करते हैं।
python
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
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)
बैकटेस्ट के परिणाम उपरोक्त परीक्षणों के अनुरूप हैं।
जाहिर है, ऊपर दी गई दूसरी विधि सरल और अनुशंसित है। यदि कोई बेहतर विधि है, तो आप एक संदेश छोड़ सकते हैं।








