In einem letzten Artikel wurde eine sehr einfache Python-Strategie implementiert:"Python-Version für die Jagd nach dem Sturz und Fall"Die Strategie, mit der man ein Konto an einem Handelspärchen steuern kann, ist sehr einfach: man will mit der gleichen Handelslogik verschiedene Handelspare steuern. Man kann mehrere Roboter erstellen, verschiedene Handelspare einrichten, um in verschiedenen Währungen zu handeln. Wenn die Strategie nicht sehr kompliziert ist, ist es angesichts der großen Flexibilität der Quantifizierungsplattformen der Erfinder sehr einfach, eine Strategie in verschiedene Strategien umzuwandeln, so dass man mehrere Trades mit nur einem Roboter erstellen kann.
Die Strategie wurde überarbeitet:
'''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)
Wenn man sich den Code anschaut, sieht man, dass er sich stark von dem Code im vorherigen Artikel unterscheidet. Tatsächlich ist die Transaktionslogik genau die gleiche, ohne dass sich etwas ändert, nur dass wir die Strategie in mehrere Varianten modifizieren, so dass wir nicht mehr die vorhergehenden einzelnen Variablen als Strategieparameter verwenden können. Eine vernünftigere Lösung ist, die Parameter in Arrays zu machen, wobei der Index jeder Position der Array dem hinzugefügten Transaktionspaar entspricht.
Dann wickeln wir diesen Teil der Transaktionslogik in eine Funktion ein.process
In der Strategie-Hauptläufe wird die Funktion auf Basis der hinzugefügten Transaktionspaare wiederholt aufgerufen, sodass jedes Transaktionspaar einmal Transaktionslogikcode ausführt.
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":[]
}
So entworfen, kann jeder Handelspare seine eigenen Parameter haben, da jeder Handel einen großen Unterschied in den möglichen Preisen hat, die auch in den Parametern unterschiedlich sein können, und manchmal eine Differentiations-Einstellung erforderlich ist.
Man kann die Veränderung dieser Funktion als eine Änderung der Funktion vergleichen. Die Funktion ändert lediglich ein Stück Code und denkt dann darüber nach, welche Absicht sie hat.
Es wurde ein Diagramm hinzugefügt, in dem die Marktdaten und die Aktiendaten der Konten in der Status-Tabelle angezeigt werden, um die entsprechenden Vermögenswerte und Märkte für jedes Austauschobjekt in Echtzeit darzustellen.
Ist es nicht einfach, eine Python-Strategie in mehrere Varianten zu verwandeln, wenn man diese Designideen kennt?
Die Strategien sind nur für das Lernen, das Nachprüfen und das Optimieren von Upgrades geeignet.Strategische Adresse
Bbbwwed 2009Meng, warum hast du diese Strategie nicht einfach so eingestellt, dass exchange.SetDirection (("buy") -richtung, und es gibt ein e. nicht exchange.
Das große schwarze PferdWie hoch ist das Mindestkapital für diese Strategie?
Das große schwarze PferdIch habe eine Frage, die ich mir nicht stellen kann: "Warum nicht handeln?"
Das große schwarze PferdGut, gut, gut, gut, ich habe es in die Münze gebracht, kein Wunder.
Das große schwarze Pferd/upload/asset/164f3fe6e84331d800583.png Jetzt ist es gut, aber ich habe Geld in meinem Konto, wie viel Mindestkapital soll ich in diese Strategie investieren, ist es nicht genug Geld in meinem Konto?
Das große schwarze Pferd/upload/asset/16495fcb1185338f8af27.png ist die zusätzliche Administrator-IP
Das große schwarze PferdGetAccount: 400: {"error_message":"Invalid IP","code":30011,"error_code":"30011","message":"Invalid IP"} Ich habe es in der API hinzugefügt, aber irgendwie ist es falsch.
Das große schwarze Pferd/upload/asset/164330beccf32fc55e7b6.png Wie löst man das?
Das große schwarze PferdWie viele K-Reihe-Zyklen setzt der Roboter ein?
Die Erfinder quantifizieren - Kleine TräumeDie Strategie ist eine Lehr- und Lernstrategie, die ohne Realität durchgeführt werden kann und die selbst modifiziert, erweitert und optimiert werden kann.
Die Erfinder quantifizieren - Kleine TräumeDie Strategie ist offen, die Strategielogik ist sehr einfach: Jagen nach dem Sturz und Sturz.
Die Erfinder quantifizieren - Kleine TräumeBei der Beantragung des API KEY ist die IP-Adresse als zugängliche Whitelist-Adresse festgelegt. Nach der Einstellung kann nur diese IP-Adresse mit Ihrem API KEY auf die API-Schnittstelle zugreifen.
Die Erfinder quantifizieren - Kleine TräumeInstallieren Sie Python auf dem Server, auf dem sich der Administrator befindet.
Die Erfinder quantifizieren - Kleine TräumeDiese Strategie ist unabhängig von den K-Linien und kann beliebig eingestellt werden. Die Wiederholung wird auf 1 Minute eingestellt, da sie die Tickgröße beeinflusst.