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.
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
Strategi ini hanya untuk referensi, pengujian ulang dan pengujian. Jika Anda tertarik, Anda dapat mengoptimalkan dan meningkatkannya.
Alamat Kebijakan
孟总,请问为什么,你这个策略下单不用设置exchange.SetDirection("buy")方向,还有个e. 不是exchange.吗,我最近在学习策略
- 1








