avatar of 发明者量化-小小梦 发明者量化-小小梦
Suivre Messages privés
4
Suivre
1271
Abonnés

Apprenez étape par étape comment transformer une stratégie mono-produit Python en stratégie multi-produits

Créé le: 2020-01-20 17:33:36, Mis à jour le: 2023-10-17 21:18:46
comments   14
hits   4485

Apprenez étape par étape comment transformer une stratégie mono-produit Python en stratégie multi-produits

1. Vous apprendre à transformer une stratégie mono-produit Python en une stratégie multi-produits

Dans l’article précédent, une stratégie Python très simple a été implémentée :« Version Python de la stratégie de poursuite à la hausse et de vente à la baisse »Cette stratégie permet d’exploiter un compte pour effectuer des transactions programmées sur une certaine paire de trading. Le principe est très simple, il consiste à chasser la hausse et à vendre la baisse. Parfois, nous souhaitons utiliser la même logique de trading pour exploiter différentes paires de trading. Vous pouvez créer plusieurs robots et définir différentes paires de trading pour trader différentes devises. Si la stratégie n’est pas très compliquée, compte tenu de la puissante flexibilité de la plateforme de trading quantitative de l’inventeur. Il est très facile de transformer une stratégie en une stratégie multi-produits, de sorte que vous pouvez exécuter plusieurs paires de trading en créant simplement un seul robot.

Le code source de la stratégie transformée :

'''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. Trouvez la différence

Comparez le code et constatez qu’il est très différent du code de l’article précédent ? En fait, la logique de trading est exactement la même, sans aucun changement. C’est juste que nous avons changé la stratégie en plusieurs variantes, nous ne pouvons donc pas utiliser la forme précédente de « variable unique comme paramètre de stratégie ». Une solution plus raisonnable est pour créer le paramètre Array, l’index de chaque position dans le tableau correspond à la paire de trading ajoutée.

Apprenez étape par étape comment transformer une stratégie mono-produit Python en stratégie multi-produits

Ensuite, encapsulez le code logique de transaction dans une fonctionprocessDans la boucle principale de la stratégie, cette fonction est appelée de manière itérative en fonction des paires de trading ajoutées, de sorte que le code logique de trading est exécuté une fois pour chaque paire de trading.

  • #### Appel d’itération (parcours) :
  for i in range(len(exchanges)): 
      process(exchanges[i], i)
  • #### Paramètres de la stratégie :
  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":[]
  }

Cette conception permet à chaque paire de trading d’avoir ses propres paramètres, car les prix de chaque paire de trading peuvent varier considérablement et les paramètres peuvent également différer, des paramètres parfois différenciés sont donc nécessaires.

  • #### Fonction AnnulerTout

Vous pouvez comparer les changements de cette fonction. Cette fonction modifie simplement un petit peu de code, puis réfléchissez à l’intention de cette modification.

  • #### Données du graphique à barres d’état

Des graphiques ont été ajoutés pour afficher les données de marché et les données d’actifs du compte dans la barre d’état, afin que les actifs et les données de marché correspondant à chaque objet d’échange puissent être affichés en temps réel.

Après avoir maîtrisé les idées de conception ci-dessus, n’est-il pas très facile de modifier une stratégie Python en une stratégie multi-variété ?

3. Backtesting

Apprenez étape par étape comment transformer une stratégie mono-produit Python en stratégie multi-produits

Apprenez étape par étape comment transformer une stratégie mono-produit Python en stratégie multi-produits

Apprenez étape par étape comment transformer une stratégie mono-produit Python en stratégie multi-produits

La stratégie est fournie à titre indicatif uniquement, pour les backtests et les tests. Si vous êtes intéressé, vous pouvez l’optimiser et la mettre à niveau. Adresse de la politique