
یہ مضمون دو حلوں پر بحث کرتا ہے مضمون کے آخر میں دوسرا حل آسان ہے (تجویز کردہ)۔
بہت سے ڈویلپر جو Python کو حکمت عملی لکھنے کے لیے استعمال کرتے ہیں وہ حکمت عملی کوڈ فائلوں کو مقامی طور پر ذخیرہ کرنا چاہتے ہیں، لیکن وہ حکمت عملی کی حفاظت کے بارے میں فکر مند ہیں۔ جیسا کہFMZ APIدستاویز میں تجویز کردہ ایک حل:
پالیسی سیکیورٹی موجد مقداری تجارتی پلیٹ فارم پر حکمت عملی تیار کریں صرف موجد مقداری اکاؤنٹ ہولڈرز کو دکھائی دیتی ہیں۔ اس کے علاوہ، حکمت عملی کوڈ کو مکمل طور پر انوینٹر کوانٹیٹیو ٹریڈنگ پلیٹ فارم پر مقامی کیا جا سکتا ہے، مثال کے طور پر، حکمت عملی کو ایک Python پیکج میں شامل کیا جا سکتا ہے اور اس طرح حکمت عملی لوکلائزیشن کو حاصل کیا جا سکتا ہے۔ 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 پلیٹ فارم پر حکمت عملی کوڈ کے ذریعے بلایا جا سکتا ہے۔ encapsulation کے ساتھ سب سے بڑا مسئلہ یہ ہے کہ FMZ پلیٹ فارم پر سٹریٹیجی کوڈ کے ذریعے کہلائے جانے والے عالمی آبجیکٹ، عالمی فنکشنز اور مستقل قدروں تک ہماری انکیپسولیشن فائلوں میں رسائی نہیں کی جا سکتی، اس لیے ہمیں ان اشیاء، فنکشنز، متغیرات کو منتقل کرنے کا راستہ تلاش کرنا چاہیے۔ , اور encapsulated دستاویز کے مستقل۔ پھر ہم اسے قدم بہ قدم سنبھالیں گے۔

مقامی ایڈیٹر میں کھولی گئی فائل 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 پلیٹ فارم پر حکمت عملی ان فنکشنز کو کال کرتی ہے اور کچھ استعمال شدہ فنکشنز، اشیاء وغیرہ کو منتقل کرتی ہے۔
شروع کرنے کی حکمت عملی بہت آسان ہے، جیسا کہ:

FMZ پلیٹ فارم پر کوڈ کی صرف چند سطریں لکھی گئی ہیں، واضح رہے کہ اس اسٹارٹ اپ اسٹریٹجی کے پیرامیٹرز ہماری انکیپسلیٹڈ اسٹریٹجی کے برابر ہیں۔ڈوئل تھرسٹ OKCoin فیوچرز کا پائتھون ورژنیہ بالکل ویسا ہی ہے، آپ براہ راست “Dual Thrust OKCoin Futures” کی حکمت عملی کو کاپی کر سکتے ہیں، پھر حکمت عملی کوڈ کو صاف کر کے پیسٹ کر سکتے ہیں۔
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 پلیٹ فارم پر رکھتے ہیں، ہمیں صرف ایک سٹارٹ اپ پالیسی کو محفوظ کرنے کی ضرورت ہوتی ہے جو کہ اس سٹارٹ اپ پالیسی کو براہ راست لوڈ کر سکتا ہے۔ اور اسے مقامی طور پر میزبان پر چلائیں۔


عملدرآمد کے لیے فائل کو براہ راست لوڈ کریں۔ اس بار ہم “Dual Thrust OKCoin Futures کے Python ورژن” حکمت عملی کا کوڈ رکھنے کے لیے ایک testB فائل تیار کرتے ہیں۔
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': {
...
حکمت عملی بہت لمبی ہے، اس لیے اسے چھوڑ دیا گیا ہے اور حکمت عملی کوڈ کو تبدیل کرنے کی بالکل ضرورت نہیں ہے۔ پھر “Dual Thrust OKCoin Futures کا Python ورژن تیار کریں (حکمت عملی شروع کریں اور testB فائل کو براہ راست عمل میں لائیں)“، جو FMZ پلیٹ فارم پر ہماری حکمت عملی ہے، ایک روبوٹ بنائیں، testB فائل کو براہ راست لوڈ کریں، اور براہ راست اس پر عمل درآمد کریں۔ واضح رہے کہ اسٹارٹ اپ حکمت عملی میں بھی وہی حکمت عملی پیرامیٹر سیٹنگز (سٹریٹیجی انٹرفیس پیرامیٹرز) ہونے چاہئیں جو “Python ورژن Dual Thrust OKCoin Futures” کے اصل ورژن کے طور پر ہیں۔

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)
بیک ٹیسٹ کرنے کے لیے:

بیک ٹیسٹ کے نتائج مندرجہ بالا ٹیسٹوں کے مطابق ہیں۔
ظاہر ہے، اوپر والا دوسرا طریقہ آسان اور تجویز کردہ ہے، اگر کوئی بہتر طریقہ ہے، تو آپ کو پیغام چھوڑنے کا خیرمقدم ہے۔