
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)
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.

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.
for i in range(len(exchanges)):
process(exchanges[i], i)
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.
Anda boleh membandingkan perubahan fungsi ini. Fungsi ini hanya mengubah suai sedikit kod, dan kemudian fikirkan tentang niat pengubahsuaian ini.
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?



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