Mengajarkan Anda untuk mengubah strategi Python satu spesies menjadi strategi multi spesies

Penulis:Lydia, Dibuat: 2022-12-20 17:26:27, Diperbarui: 2023-09-20 09:45:28

img

Mengajarkan Anda untuk mengubah strategi Python satu mata uang ke dalam strategi multi mata uang

I. Mengajarkan Anda untuk mengubah strategi Python satu mata uang ke strategi multi-mata uang

Dalam artikel sebelumnya, strategi Python yang sangat sederhana diterapkan:Strategi untuk membeli pemenang versi Python, strategi ini dapat mengoperasikan akun untuk melakukan perdagangan program pada pasangan perdagangan tertentu. Prinsipnya sangat sederhana, yaitu mengejar setelah meningkat dan membunuh setelah menurun. Kadang-kadang 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 melakukan transaksi dalam berbagai mata uang. Jika strategi tidak terlalu kompleks, mengingat fleksibilitas yang kuat dari FMZ Quant Trading Platform, mudah untuk mengubah strategi menjadi strategi multi-spesies, sehingga Anda dapat menjalankan beberapa pasangan perdagangan dengan hanya membuat satu robot.

Kode sumber strategi setelah transformasi:

'''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. Menemukan perbedaan

Dengan membandingkan kode itu, apakah Anda mendapati bahwa kode itu sangat berbeda dengan kode dalam artikel sebelumnya? Pada kenyataannya, logika trading sama persis, tanpa perubahan apapun. kita hanya memodifikasi strategi menjadi multi-spesies one, kita tidak bisa menggunakan bentuk sebelumnya dari single variable sebagai parameter strategi. solusi yang lebih masuk akal adalah membuat parameter menjadi array, dan indeks setiap posisi dalam array sesuai dengan pasangan trading yang ditambahkan.

img

Kemudian merangkum kode logika perdagangan ke dalam fungsiprocessPada loop strategi utama, panggil fungsi ini secara iteratif sesuai dengan pasangan perdagangan yang ditambahkan, dan biarkan setiap pasangan perdagangan mengeksekusi kode logika perdagangan sekali.

  • Panggilan berulang (transversal):
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 untuk memiliki parameter sendiri, karena setiap pasangan perdagangan mungkin memiliki perbedaan harga yang besar, dan parameter juga mungkin berbeda, kadang-kadang memerlukan pengaturan diferensial.

  • Batalkan semua fungsi Anda dapat membandingkan perubahan fungsi ini. fungsi ini hanya memodifikasi kode kecil, dan kemudian berpikir tentang niat modifikasi tersebut.

  • Data grafik bilah status Sebuah grafik ditambahkan untuk menampilkan data pasar dan data aset akun di bilah status, sehingga aset dan pasar yang sesuai dari setiap objek pertukaran dapat ditampilkan secara real time. Apakah mudah untuk mengubah strategi Python menjadi strategi multi-spesies setelah menguasai ide-ide desain di atas?

III. Uji Kembali

img img img

Strategi ini hanya untuk tujuan pembelajaran dan backtesting, dan Anda dapat mengoptimalkan dan meningkatkannya jika Anda tertarik.Alamat Strategi


Berkaitan

Lebih banyak