Type/to search
8
Follow
1364
Followers
Bringen Sie Ihnen Schritt für Schritt bei, wie Sie die Python-Einzelproduktstrategie in eine Mehrproduktstrategie umwandeln
Discussions
Created 2020-01-20 17:33:36  Updated 2023-10-17 21:18:46
 14
 4782

img

1. Lernen Sie, wie Sie eine Python-Einzelproduktstrategie in eine Mehrproduktstrategie umwandeln

Im vorherigen Artikel wurde eine sehr einfache Python-Strategie implementiert:„Python-Version der Aufhol- und Abverkaufsstrategie“Mit dieser Strategie kann ein Konto so betrieben werden, dass programmierter Handel mit einem bestimmten Handelspaar durchgeführt wird. Das Prinzip ist sehr einfach: den Anstieg verfolgen und den Rückgang verkaufen. Manchmal möchten wir die gleiche Handelslogik für den Betrieb unterschiedlicher Handelspaare verwenden. Sie können mehrere Roboter erstellen und verschiedene Handelspaare festlegen, um mit verschiedenen Währungen zu handeln. Sofern die Strategie nicht allzu kompliziert ist, bietet sie die leistungsstarke Flexibilität der quantitativen Handelsplattform des Erfinders. Es ist sehr einfach, eine Strategie in eine Multiproduktstrategie umzuwandeln, sodass Sie durch die Erstellung nur eines Roboters mehrere Handelspaare ausführen können.

Der transformierte Strategie-Quellcode:

'''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. Finde den Unterschied

Vergleichen Sie den Code und stellen Sie fest, dass er sich stark vom Code im vorherigen Artikel unterscheidet?
Tatsächlich ist die Handelslogik genau dieselbe, ohne Änderungen. Wir haben die Strategie nur auf mehrere Varianten umgestellt, sodass wir die bisherige Form „einzelne Variable als Strategieparameter“ nicht mehr verwenden können. Eine vernünftigere Lösung ist Um das Parameter-Array zu erstellen, entspricht der Index jeder Position im Array dem hinzugefügten Handelspaar.

img

Kapseln Sie dann den Transaktionslogikcode in eine FunktionprocessIn der Hauptschleife der Strategie wird diese Funktion iterativ entsprechend der hinzugefügten Handelspaare aufgerufen, sodass der Code der Handelslogik einmal für jedes Handelspaar ausgeführt wird.

  • Iterationsaufruf (Durchlaufaufruf):

    for i in range(len(exchanges)): process(exchanges[i], i)
  • Strategieparameter:

    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":[] }

    Durch dieses Design kann jedes Handelspaar seine eigenen Parameter haben, da die Preise der einzelnen Handelspaare stark variieren können und sich auch die Parameter unterscheiden können, sodass manchmal differenzierte Einstellungen erforderlich sind.

  • CancelAll-Funktion

    Sie können die Änderungen dieser Funktion vergleichen. Diese Funktion ändert nur ein wenig Code. Denken Sie dann über die Absicht dieser Änderung nach.

  • Statusbalkendiagrammdaten

    Diagramme zur Anzeige von Marktdaten und Kontovermögensdaten in der Statusleiste hinzugefügt, sodass die Vermögenswerte und Marktdaten zu jedem Börsenobjekt in Echtzeit angezeigt werden können.

Ist es nicht sehr einfach, eine Python-Strategie in eine Strategie mit mehreren Varianten umzuwandeln, nachdem man die oben genannten Designideen gemeistert hat?

3. Backtesting

img

img

img

Die Strategie dient nur zu Referenzzwecken, zum Backtesting und zum Testen. Bei Interesse können Sie sie optimieren und aktualisieren.
Richtlinienadresse

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)