ich habe ein Skript gebastelt, welches streaming Daten empfängt, asynchron mit ein paar if / elif Abfragen verarbeitet und dann über eine Broker API Aktien kaufen kann.
Grundsätzlich funktioniert das Skript, es macht Trades mit Gewinn, aber natürlich macht es auch "Fehler" d.h. trades mit Verlust... nein, eigentlich macht es keine Fehler, sondern es macht nur was ich ihm gesagt habe bzw. nicht ausgeschlossen habe - diese Fehler schmälern den Gewinn wieder, zum Teil erheblich... (wie erwartet habe ich keine Gelddruck Maschine erfunden


Deshalb habe ich vor ein paar Wochen angefangen zusätzliche Variablen und Abfragen einzubauen, um wiederholte Fehler / falsche Trades zu vermeiden. Das hat es nur begrenzt besser gemacht: Einerseits hat das Skript schlechte trades vermieden, andererseits ist es, da es einen Haufen if /elif abfragen durcharbeitet, immer langsamer geworden, so daß andere trades schlechter wurden (das Skript macht kurze day trades).
Inzwischen habe ich die ganzen "Verbesserungen" bzw. zusätzlichen Abfragen rückgängig gemacht und suche nach einem anderen Weg, weitere Abfragen einzubauen, aber auch die Geschwindigkeit zu erhöhen.
Die letzten Wochen habe ich viel über threading, GIL, coroutines und multiprocessing gelesen und ich denke, das ich parallele Bearbeitung bzw. multiprocessing benötige, aber andererseits waren das so viele Informationen, daß ich seit ein paar Tagen etwas auf dem Schlauch stehe und irgendwie nicht weiß, wo und wie ich ansetzen soll oder was ich probieren soll.
In meinem Kopf sieht es so aus: Es gibt multiprocessing, für rechenintensive Funktionen. Dann gibt es multiprocessing für async. Das ist ein wenig spezieller. Es gibt ein paar Beispiele im Netz, die sich aber alle mit 1 rechenintensiven Aufgabe beschäftigen. In diesen Beispielen geht es um tasks, futures, coroutines, pipein / pipeout, queues, ... Es gibt spezielle Module wie aioprocessing oder aiomultiprocess, die async multiprocessing vereinfachen sollen, aber ich finde meine Aufgabenstellung da nicht wieder, weil die if Abfragen eigentlich nicht sehr rechenintensiv sind und auch nichts miteinander zu tun haben, d.h. die könnten eigentlich unabhängig voneinander parallel ablaufen. Seit ein paar Tagen gibt es das Modul MPIRE, das funktioniert aber noch nicht unter Windows, ganz zu schweigen von async...
Also, ich habe folgendes Skript und ich würde gerne die if / elif für verschiedene "Informationstypen" parallel bearbeiten lassen, statt nacheinander (sorry für die Kürzungen, aber ich poste nicht meine selbstentwickelten Abfragen / knowhow):
Vorab zur Info: symbols ist eine Liste mit 0 bis x Aktien, ich prüfe ob nur 1 Aktie im Stream drin ist, alles andere ist irrelevant / zu kompliziert. Dann prüfe ich, ob das diese 1 Aktie = symbol in meiner vordefinierten Tabelle mit Aktien ist, die mich interessieren. symbols und symbol sind Json arrays.
Code: Alles auswählen
import asyncio
import ib_insync as ibi
import socketio
...
ib = ibi.IB()
sio = socketio.AsyncClient()
@sio.on('connect')
def on_connect():
print("\nConnected to streaming API")
@sio.on('data')
async def on_data(data):
if len(symbols) == 1:
try:
zeile = dfvolgainer.loc[symbol]
except KeyError:
pass
else:
if informationstyp1:
if ...:
await trade(symbol, aktion)
elif ...:
await trade(symbol, aktion)
elif informationstyp2:
if ...:
await trade(symbol, aktion)
elif ...:
await trade(symbol, aktion)
elif informationstyp3:
...
async def trade(tickersymbol, regel):
...
async def main_loop():
await ib.connectAsync()
await sio.connect('http://...')
await sio.wait()
try:
asyncio.run(main_loop())
...
Für jedes Beispiel, Tipp oder Link, wie man mehrere unabhängige Aufgaben / Prozesse, in diesem Fall if / elif informationstypx parallel in async abarbeiten kann, wäre ich wirklich dankbar - oder einfach nur ne Info, auf welches "Gleis" ich setzen soll.
Danke & Gruß
Andy