avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Ajari Anda langkah demi langkah cara mengubah strategi produk tunggal Python menjadi strategi multi-produk

Dibuat di: 2020-01-20 17:33:36, diperbarui pada: 2023-10-17 21:18:46
comments   14
hits   4485

Ajari Anda langkah demi langkah cara mengubah strategi produk tunggal Python menjadi strategi multi-produk

1. Mengajarkan Anda cara mengubah strategi produk tunggal Python menjadi strategi multiproduk

Pada artikel sebelumnya, strategi Python yang sangat sederhana telah diterapkan:「Versi Python dari strategi mengejar dan menjual」Strategi ini dapat mengoperasikan akun untuk melakukan perdagangan terprogram pada pasangan perdagangan tertentu. Prinsipnya sangat sederhana, yaitu mengejar kenaikan dan menjual saat penurunan. Terkadang kita ingin menggunakan logika perdagangan yang sama untuk mengoperasikan pasangan perdagangan yang berbeda. Anda dapat membuat beberapa robot dan mengatur pasangan perdagangan yang berbeda untuk memperdagangkan berbagai mata uang. Jika strateginya tidak terlalu rumit, mengingat fleksibilitas yang kuat dari platform perdagangan kuantitatif sang penemu. Sangat mudah untuk mengubah strategi menjadi strategi multiproduk, sehingga Anda dapat menjalankan beberapa pasangan perdagangan hanya dengan membuat satu robot.

Kode 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. Temukan Perbedaannya

Bandingkan kodenya dan temukan bahwa kode tersebut sangat berbeda dari kode di artikel sebelumnya? Sebenarnya, logika perdagangannya sama persis, tanpa ada perubahan apa pun. Hanya saja kita telah mengubah strategi menjadi beberapa variasi, jadi kita tidak dapat menggunakan bentuk sebelumnya yaitu “variabel tunggal sebagai parameter strategi”. Solusi yang lebih masuk akal adalah untuk membuat parameter Array, indeks setiap posisi dalam array sesuai dengan pasangan perdagangan yang ditambahkan.

Ajari Anda langkah demi langkah cara mengubah strategi produk tunggal Python menjadi strategi multi-produk

Kemudian enkapsulasi kode logika transaksi ke dalam suatu fungsiprocessDalam putaran utama strategi, fungsi ini dipanggil secara berulang berdasarkan pasangan perdagangan yang ditambahkan, sehingga kode logika perdagangan dieksekusi sekali untuk setiap pasangan perdagangan.

  • #### Panggilan iterasi (traversal):
  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":[]
  }

Desain ini memungkinkan setiap pasangan perdagangan memiliki parameternya sendiri, karena harga setiap pasangan perdagangan dapat sangat bervariasi dan parameternya juga dapat berbeda, sehingga terkadang diperlukan pengaturan yang berbeda.

  • #### Batalkan semua fungsi

Anda dapat membandingkan perubahan fungsi ini. Fungsi ini hanya memodifikasi sedikit kode, lalu memikirkan tujuan modifikasi ini.

  • #### Data grafik batang status

Menambahkan grafik untuk menampilkan data pasar dan data aset akun di bilah status, sehingga aset dan data pasar yang terkait dengan setiap objek bursa dapat ditampilkan secara real-time.

Setelah menguasai ide-ide desain di atas, bukankah sangat mudah untuk memodifikasi strategi Python menjadi strategi multi-variasi?

3. Pengujian ulang

Ajari Anda langkah demi langkah cara mengubah strategi produk tunggal Python menjadi strategi multi-produk

Ajari Anda langkah demi langkah cara mengubah strategi produk tunggal Python menjadi strategi multi-produk

Ajari Anda langkah demi langkah cara mengubah strategi produk tunggal Python menjadi strategi multi-produk

Strategi ini hanya untuk referensi, pengujian ulang dan pengujian. Jika Anda tertarik, Anda dapat mengoptimalkan dan meningkatkannya. Alamat Kebijakan