Type/to search
8
Follow
1364
Followers
آپ کو مرحلہ وار سکھائیں کہ Python سنگل پروڈکٹ حکمت عملی کو ملٹی پروڈکٹ حکمت عملی میں کیسے تبدیل کیا جائے۔
Discussions
Created 2020-01-20 17:33:36  Updated 2023-10-17 21:18:46
 14
 4783

img

1. آپ کو سکھائیں کہ Python سنگل پروڈکٹ حکمت عملی کو ملٹی پروڈکٹ حکمت عملی میں کیسے تبدیل کیا جائے۔

پچھلے مضمون میں، ایک بہت ہی آسان ازگر کی حکمت عملی کو لاگو کیا گیا تھا:"پیچھا کرنے اور بیچنے کی حکمت عملی کا ازگر کا ورژن"یہ حکمت عملی ایک مخصوص تجارتی جوڑی پر پروگرام شدہ ٹریڈنگ کرنے کے لیے اکاؤنٹ چلا سکتی ہے، اصول بہت آسان ہے، جو کہ عروج کا پیچھا کرنا اور زوال کو فروخت کرنا ہے۔ بعض اوقات ہم مختلف تجارتی جوڑوں کو چلانے کے لیے ایک ہی تجارتی منطق کا استعمال کرنا چاہتے ہیں۔ آپ متعدد روبوٹ بنا سکتے ہیں اور مختلف کرنسیوں کی تجارت کے لیے مختلف تجارتی جوڑے ترتیب دے سکتے ہیں۔ اگر موجد کے مقداری تجارتی پلیٹ فارم کی طاقتور لچک کو دیکھتے ہوئے حکمت عملی بہت پیچیدہ نہیں ہے۔ ایک حکمت عملی کو کثیر مصنوعات کی حکمت عملی میں تبدیل کرنا بہت آسان ہے، تاکہ آپ صرف ایک روبوٹ بنا کر متعدد تجارتی جوڑے چلا سکیں۔

تبدیل شدہ حکمت عملی سورس کوڈ:

'''backtest start: 2019-02-20 00:00:00 end: 2020-01-10 00:00:00 period: 1m exchanges: [{"eid":"OKEX","currency":"BTC_USDT"},{"eid":"OKEX","currency":"ETH_USDT","stocks":30},{"eid":"OKEX","currency":"LTC_USDT","stocks":100}] ''' import time import json params = { "arrBasePrice": [-1, -1, -1], # -1 "arrRatio": [0.05, 0.05, 0.05], # 0.05 "arrAcc": [], # _C(exchange.GetAccount) "arrLastCancelAll": [0, 0, 0], # 0 "arrMinStocks": [0.01, 0.01, 0.01], # 0.01 "arrPricePrecision": [2, 2, 2], # 2 "arrAmountPrecision": [3, 2, 2], # 2 "arrTick":[] } def CancelAll(e): while True : orders = _C(e.GetOrders) for i in range(len(orders)) : e.CancelOrder(orders[i]["Id"], orders[i]) if len(orders) == 0 : break Sleep(1000) def process(e, index): global params ticker = _C(e.GetTicker) params["arrTick"][index] = ticker if params["arrBasePrice"][index] == -1 : params["arrBasePrice"][index] = ticker.Last if ticker.Last - params["arrBasePrice"][index] > 0 and (ticker.Last - params["arrBasePrice"][index]) / params["arrBasePrice"][index] > params["arrRatio"][index]: params["arrAcc"][index] = _C(e.GetAccount) if params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last > params["arrMinStocks"][index]: e.Buy(ticker.Last, params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last) params["arrBasePrice"][index] = ticker.Last if ticker.Last - params["arrBasePrice"][index] < 0 and (params["arrBasePrice"][index] - ticker.Last) / params["arrBasePrice"][index] > params["arrRatio"][index]: params["arrAcc"][index] = _C(e.GetAccount) if params["arrAcc"][index].Stocks * params["arrRatio"][index] > params["arrMinStocks"][index]: e.Sell(ticker.Last, params["arrAcc"][index].Stocks * params["arrRatio"][index]) params["arrBasePrice"][index] = ticker.Last ts = time.time() if ts - params["arrLastCancelAll"][index] > 60 * 5 : CancelAll(e) params["arrLastCancelAll"][index] = ts def main(): global params for i in range(len(exchanges)) : params["arrAcc"].append(_C(exchanges[i].GetAccount)) params["arrTick"].append(_C(exchanges[i].GetTicker)) exchanges[i].SetPrecision(params["arrPricePrecision"][i], params["arrAmountPrecision"][i]) for key in params : if len(params[key]) < len(exchanges): raise "params error!" while True: tblAcc = { "type" : "table", "title": "account", "cols": ["账户信息"], "rows": [] } tblTick = { "type" : "table", "title": "ticker", "cols": ["行情信息"], "rows": [] } for i in range(len(exchanges)): process(exchanges[i], i) for i in range(len(exchanges)): tblAcc["rows"].append([json.dumps(params["arrAcc"][i])]) tblTick["rows"].append([json.dumps(params["arrTick"][i])]) LogStatus(_D(), "\n`" + json.dumps([tblAcc, tblTick]) + "`") Sleep(500)

2. فرق تلاش کریں۔

کوڈ کا موازنہ کریں اور معلوم کریں کہ یہ پچھلے مضمون کے کوڈ سے بہت مختلف ہے؟
درحقیقت، تجارتی منطق بالکل وہی ہے، بغیر کسی تبدیلی کے، یہ صرف اتنا ہے کہ ہم نے حکمت عملی کو متعدد اقسام میں تبدیل کر دیا ہے، اس لیے ہم "ایک متغیر کو حکمت عملی کے پیرامیٹر کے طور پر" استعمال نہیں کر سکتے پیرامیٹر Array بنانے کے لیے، ارے میں ہر پوزیشن کا اشاریہ شامل کیے گئے تجارتی جوڑے سے مطابقت رکھتا ہے۔

img

پھر ٹرانزیکشن لاجک کوڈ کو فنکشن میں سمیٹیں۔processحکمت عملی کے مرکزی لوپ میں، اس فنکشن کو شامل کردہ تجارتی جوڑوں کے مطابق تکراری طور پر کہا جاتا ہے، تاکہ ٹریڈنگ لاجک کوڈ کو ہر تجارتی جوڑے کے لیے ایک بار عمل میں لایا جائے۔

  • تکرار (ٹراوورسل) کال:

    for i in range(len(exchanges)): process(exchanges[i], i)
  • حکمت عملی کے پیرامیٹرز:

    params = { "arrBasePrice": [-1, -1, -1], # -1 "arrRatio": [0.05, 0.05, 0.05], # 0.05 "arrAcc": [], # _C(exchange.GetAccount) "arrLastCancelAll": [0, 0, 0], # 0 "arrMinStocks": [0.01, 0.01, 0.01], # 0.01 "arrPricePrecision": [2, 2, 2], # 2 "arrAmountPrecision": [3, 2, 2], # 2 "arrTick":[] }

    یہ ڈیزائن ہر تجارتی جوڑے کو اپنے پیرامیٹرز رکھنے کی اجازت دیتا ہے، کیونکہ ہر تجارتی جوڑے کی قیمتیں بہت مختلف ہو سکتی ہیں اور پیرامیٹرز بھی مختلف ہو سکتے ہیں، اس لیے بعض اوقات مختلف ترتیبات کی ضرورت ہوتی ہے۔

  • تمام فنکشن منسوخ کریں۔

    آپ اس فنکشن کی تبدیلیوں کا موازنہ کر سکتے ہیں۔ یہ فنکشن صرف تھوڑا سا کوڈ میں ترمیم کرتا ہے، اور پھر اس ترمیم کے ارادے کے بارے میں سوچیں۔

  • اسٹیٹس بار چارٹ ڈیٹا

    اسٹیٹس بار میں مارکیٹ ڈیٹا اور اکاؤنٹ کے اثاثہ جات کے ڈیٹا کو ظاہر کرنے کے لیے چارٹس شامل کیے گئے، تاکہ ہر ایکسچینج آبجیکٹ سے متعلقہ اثاثے اور مارکیٹ ڈیٹا کو حقیقی وقت میں دکھایا جا سکے۔

مندرجہ بالا ڈیزائن آئیڈیاز پر عبور حاصل کرنے کے بعد، کیا ازگر کی حکمت عملی کو کثیر النوع حکمت عملی میں تبدیل کرنا بہت آسان نہیں ہے؟

3. بیک ٹیسٹنگ

img

img

img

حکمت عملی صرف حوالہ، بیک ٹیسٹنگ اور جانچ کے لیے ہے، اگر آپ دلچسپی رکھتے ہیں، تو آپ اسے بہتر اور اپ گریڈ کر سکتے ہیں۔
پالیسی کا پتہ

Related Recommendations
Comment
All comments (14)

    孟总,请问为什么,你这个策略下单不用设置exchange.SetDirection("buy")方向,还有个e. 不是exchange.吗,我最近在学习策略

    4 years ago

    这个策略最低本金是多少啊

    6 years ago

    没有实盘过,该策略为教学策略,学习为主,可以自行修改、扩展、优化跑实盘。

    6 years ago

    怎么不交易啊,半天没有反应。。。。。

    6 years ago

    好了,好了,弄好了,我弄成币本位了,怪不得呢

    6 years ago

    img 现在好了,但是我账户里是有钱的,你这个策略最少本金要投入多少啊,是不是我账户里的钱不够

    6 years ago

    可以具体看下这个策略源码, 策略公开的,策略逻辑很简单就是追涨杀跌。注意,这个是个数字货币现货策略,不能跑期货,可以自己修改成期货的。

    6 years ago

    img 是添加的托管者IP啊,没错啊

    6 years ago

    GetAccount: 400: {"error_message":"Invalid IP","code":30011,"error_code":"30011","message":"Invalid IP"}
    IP我也添加到API里面了,怎么还是出错

    6 years ago

    申请API KEY 的时候,设置的IP地址是允许访问的白名单地址,你设置了以后,就只有这个IP地址可以使用你的API KEY访问API接口。你设置的是你的托管者的IP地址么?

    6 years ago

    img 这个怎么解决

    6 years ago

    托管者所在服务器安装一下python。

    6 years ago

    机器人K线周期设置多少

    6 years ago

    这个策略不看K线的, 随便设置都行,回测的话因为影响tick粒度,设置为1分钟。

    6 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)