avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Ajar anda langkah demi langkah cara mengubah strategi produk tunggal Python kepada strategi berbilang produk

Dicipta dalam: 2020-01-20 17:33:36, dikemas kini pada: 2023-10-17 21:18:46
comments   14
hits   4485

Ajar anda langkah demi langkah cara mengubah strategi produk tunggal Python kepada strategi berbilang produk

1. Ajar anda cara mengubah strategi produk tunggal Python kepada strategi berbilang produk

Dalam artikel sebelumnya, strategi Python yang sangat mudah telah dilaksanakan:「Versi Python strategi mengejar dan menjual ke bawah」Strategi ini boleh mengendalikan akaun untuk menjalankan dagangan berprogram pada pasangan dagangan tertentu Prinsipnya sangat mudah, iaitu mengejar kenaikan dan menjual kejatuhan. Kadangkala kita ingin menggunakan logik dagangan yang sama untuk mengendalikan pasangan dagangan yang berbeza. Anda boleh mencipta berbilang robot dan menetapkan pasangan dagangan yang berbeza untuk berdagang pelbagai mata wang. Jika strateginya tidak begitu rumit, memandangkan fleksibiliti kuat platform dagangan kuantitatif pencipta. Sangat mudah untuk mengubah strategi menjadi strategi berbilang produk, supaya anda boleh menjalankan berbilang pasangan dagangan dengan hanya mencipta satu robot.

Kod sumber strategi yang diubah:

'''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. Cari Perbezaan

Bandingkan kod dan mendapati ia sangat berbeza daripada kod dalam artikel sebelumnya? Sebenarnya, logik dagangan adalah sama, tanpa sebarang perubahan Cuma kami telah menukar strategi kepada pelbagai jenis, jadi kami tidak boleh menggunakan bentuk “pembolehubah tunggal sebagai parameter strategi” yang lebih munasabah untuk membuat Array parameter, indeks setiap kedudukan dalam tatasusunan sepadan dengan pasangan dagangan yang ditambah.

Ajar anda langkah demi langkah cara mengubah strategi produk tunggal Python kepada strategi berbilang produk

Kemudian masukkan kod logik transaksi ke dalam fungsiprocessDalam gelung utama strategi, fungsi ini dipanggil secara berulang mengikut pasangan dagangan yang ditambah, supaya kod logik dagangan dilaksanakan sekali untuk setiap pasangan dagangan.

  • #### Panggilan lelaran (lintas):
  for i in range(len(exchanges)): 
      process(exchanges[i], i)
  • #### Parameter strategi:
  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":[]
  }

Reka bentuk ini membolehkan setiap pasangan dagangan mempunyai parameternya sendiri, kerana harga setiap pasangan dagangan mungkin berbeza-beza dan parameter juga mungkin berbeza, jadi kadangkala tetapan yang berbeza diperlukan.

  • #### Fungsi CancelAll

Anda boleh membandingkan perubahan fungsi ini. Fungsi ini hanya mengubah suai sedikit kod, dan kemudian fikirkan tentang niat pengubahsuaian ini.

  • #### Data carta bar status

Menambahkan carta untuk memaparkan data pasaran dan data aset akaun dalam bar status, supaya aset dan data pasaran yang sepadan dengan setiap objek pertukaran boleh dipaparkan dalam masa nyata.

Selepas menguasai idea reka bentuk di atas, bukankah sangat mudah untuk mengubah suai strategi Python menjadi strategi pelbagai jenis?

3. Ujian belakang

Ajar anda langkah demi langkah cara mengubah strategi produk tunggal Python kepada strategi berbilang produk

Ajar anda langkah demi langkah cara mengubah strategi produk tunggal Python kepada strategi berbilang produk

Ajar anda langkah demi langkah cara mengubah strategi produk tunggal Python kepada strategi berbilang produk

Strategi ini adalah untuk rujukan sahaja, ujian belakang dan ujian Jika anda berminat, anda boleh mengoptimumkan dan menaik tarafnya. Alamat Polisi