Mengajar anda untuk mengubah strategi Python spesies tunggal ke dalam strategi pelbagai spesies

Penulis:Lydia, Dicipta: 2022-12-20 17:26:27, Dikemas kini: 2023-09-20 09:45:28

img

Mengajar anda untuk mengubah Python strategi mata wang tunggal ke dalam strategi multi mata wang

I. Mengajar anda untuk mengubah strategi Python mata wang tunggal ke dalam strategi multi mata wang

Dalam artikel terakhir, strategi Python yang sangat mudah dilaksanakan:Strategi untuk membeli pemenang versi Python, strategi ini boleh mengendalikan akaun untuk menjalankan perdagangan program pada pasangan dagangan tertentu. Prinsipnya sangat mudah, iaitu mengejar selepas meningkatkan dan membunuh selepas menurun. Kadang-kadang kita ingin menggunakan logik perdagangan yang sama untuk mengendalikan pasangan dagangan yang berbeza. Anda boleh membuat beberapa robot dan menetapkan pasangan dagangan yang berbeza untuk menjalankan transaksi dalam pelbagai mata wang. Jika strategi tidak sangat kompleks, memandangkan fleksibiliti kuat Platform Dagangan Kuantum FMZ, mudah untuk mengubah strategi menjadi strategi pelbagai spesies, sehingga anda boleh menjalankan beberapa pasangan dagangan dengan hanya membuat satu robot.

Kod sumber strategi selepas 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. Cari perbezaan

Dengan membandingkan kod itu, adakah anda mendapati bahawa ia sangat berbeza dengan kod dalam artikel sebelumnya? Pada hakikatnya, logik perdagangan adalah sama, tanpa sebarang perubahan. kita hanya memodifikasi strategi kepada pelbagai spesies, kita tidak boleh menggunakan bentuk sebelumnya variabel tunggal sebagai parameter strategi. Penyelesaian yang lebih munasabah adalah untuk membuat parameter ke dalam array, dan indeks setiap kedudukan dalam array sepadan dengan pasangan dagangan yang ditambah.

img

Kemudian merangkum kod logik perdagangan ke dalam fungsiprocess. Pada gelung strategi utama, panggil fungsi ini secara berulang mengikut pasangan dagangan yang ditambah, dan biarkan setiap pasangan dagangan menjalankan kod logik dagangan sekali.

  • Panggilan berulang:
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 setiap pasangan dagangan mungkin mempunyai perbezaan harga yang besar, dan parameter juga mungkin berbeza, kadang-kadang memerlukan tetapan perbezaan.

  • Batalkan semua fungsi Anda boleh membandingkan perubahan fungsi ini. fungsi ini hanya mengubah suai kod kecil, dan kemudian berfikir tentang niat perubahan tersebut.

  • Data carta bar status Carta ditambahkan untuk memaparkan data pasaran dan data aset akaun di bar status, supaya aset dan pasaran yang sepadan untuk setiap objek pertukaran dapat dipaparkan dalam masa nyata. Adakah mudah untuk mengubah strategi Python menjadi strategi pelbagai spesies selepas menguasai idea reka bentuk di atas?

III. Ujian belakang

img img img

Strategi ini adalah untuk tujuan pembelajaran dan backtesting sahaja, dan anda boleh mengoptimumkan dan menaik tarafnya jika anda berminat.Alamat Strategi


Berkaitan

Lebih lanjut