Sie lernen, eine Python-Strategie für eine einzige Art in eine Multi-Species-Strategie umzuwandeln.

Schriftsteller:Lydia., Erstellt: 2022-12-20 17:26:27, Aktualisiert: 2023-09-20 09:45:28

img

Sie lernen, eine Python-Single-Währung-Strategie in eine Multi-Währung-Strategie umzuwandeln

I. Ihnen beibringen, eine Python-Einwährungsstrategie in eine Multiwährungsstrategie umzuwandeln

Im letzten Artikel wurde eine sehr einfache Python-Strategie implementiert:Strategie für den Kauf der Gewinner der Python-Version, kann diese Strategie ein Konto betreiben, um den Programmhandel auf einem bestimmten Handelspaar durchzuführen. Das Prinzip ist sehr einfach, d.h. nach Steigerung jagen und nach Abnahme töten. Manchmal möchten wir dieselbe Handelslogik verwenden, um verschiedene Handelspaare zu betreiben. Sie können mehrere Roboter erstellen und verschiedene Handelspaare einstellen, um Transaktionen in verschiedenen Währungen durchzuführen. Wenn die Strategie nicht sehr komplex ist, ist es angesichts der starken Flexibilität der FMZ Quant Trading Platform leicht, eine Strategie in eine Multi-Species-Strategie zu verwandeln, so dass Sie mehrere Handelspaare ausführen können, indem Sie nur einen Roboter erstellen.

Strategie-Quellcode nach der Transformation:

'''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": ["Account information"], 
            "rows": []
        }        

        tblTick = {
            "type" : "table",
            "title": "ticker",
            "cols": ["Market information"], 
            "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)

II. Unterschied finden

Haben Sie bei einem Vergleich festgestellt, daß sich dieser Code stark von dem im vorigen Artikel beschriebenen unterscheidet? In der Tat ist die Handelslogik genau die gleiche, ohne jegliche Veränderung. Wir ändern nur die Strategie zu einer Mehrfachart, wir können nicht die vorherige Form von eine Variable als Strategieparameter verwenden. Eine vernünftigere Lösung besteht darin, den Parameter in ein Array zu machen, und der Index jeder Position im Array entspricht dem hinzugefügten Handelspaar.

img

Dann verkapseln Sie den Code der Handelslogik in eine Funktionprocess. Auf der Hauptstrategie Schleife, rufen Sie diese Funktion iterativ nach den hinzugefügten Handel Paare, und lassen Sie jedes Handel Paar den Handel Logikcode einmal ausführen.

  • Iterativer (durchläufiger) Aufruf:
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":[]
}

Dieses Design ermöglicht es jedem Handelspaar, seine eigenen Parameter zu haben, da jedes Handelspaar eine große Preisdifferenz haben kann und die Parameter auch unterschiedlich sein können, was manchmal eine unterschiedliche Einstellung erfordert.

  • Alle Funktionen absagen Diese Funktion modifiziert nur einen kleinen Code und dann denken Sie über die Absicht einer solchen Modifikation nach.

  • Daten des Statusbalkendiagramms Ein Diagramm wird hinzugefügt, um die Marktdaten und Kontovermögensdaten in der Statusleiste anzuzeigen, so dass die entsprechenden Vermögenswerte und der Markt jedes Börsenobjekts in Echtzeit angezeigt werden können. Ist es leicht, eine Python-Strategie in eine Multi-Species-Strategie zu ändern, nachdem man die oben genannten Designideen beherrscht hat?

III. Rückprüfung

img img img

Die Strategie dient ausschließlich Lern- und Backtestingzwecken, und Sie können sie optimieren und aktualisieren, wenn Sie interessiert sind.Strategieadresse


Verwandt

Mehr