finplot Grafik blockiert while Schleife

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
August1328
User
Beiträge: 65
Registriert: Samstag 27. Februar 2021, 12:18

Hallo zusammen,

ich bastele seit ein paar Wochen an einem neuen Trading Skript, welches auf nem vorhandenen Marktdaten Scanner des Brokers aufbaut.

Das funktioniert alles wunderbar, ich staune immer wieder, was mit Python so machbar ist. Das Skript ruft regelmäßig den Scanner auf, prüft ob die Aktien in meinem dataframe sind, checkt die Optionen, schaut nach aktuellen Nachrichten und SEC filings, ruft die letzten Kurse & Volumen ab und wenn ein paar Kriterien erfüllt sind, gibt es eine Übersicht aus, die inzwischen per colorama Modul auch farbig sein kann. Gewisse Nachrichten werden auf Schlüsselwörter untersucht und seit ein paar Tagen werden auch Finanzberichte, die im XML Format vorliegen, ausgewertet.

Das Ganze steckt in einer while True Schleife und nach ein paar Startschwierigkeiten läuft das Ding ohne hängen zu bleiben oder Fehlermeldung. Selbständig traden kann es nicht, das kommt später, veilleicht.

Viele Anregungen wie man etwas programmiert, nicht macht oder effizient macht, kommen auch aus diesem Forum - an dieser Stelle ein fettes Dankeschön, daß es das hier gibt!

Vor ein paar Tagen habe ich gedacht, es wäre doch super, wenn es mir bei jeder neuen Aktie, die im Scanner auftaucht, gleich ein Bild mit dem Kurs der letzten Tage anzeigen würde (die Funktion "Neue Aktie" ist vorhanden und gibt momentan einen Ton aus). Danach übernehme ich interessante Aktien per Hand in die Broker Software und schaue mir das an, ist halt manueller Aufwand.

Also habe ich mich nach Möglichkeiten umgesehen und bin nach matplotlib auf finplot gestossen. Deshalb die Beispiele angeschaut, ausprobiert und es funktionierte in wenigen Zeilen. Folgender Code gibt den Kurs der Microsoft Aktie (MSFT) der letzten 5 Tage aus:

Code: Alles auswählen

import finplot as fplt # https://pypi.org/project/finplot/
import yfinance # https://pypi.org/project/yfinance/

symbol = "MSFT"

df = yfinance.download(symbol, period = "5d", interval = "5m", prepost = True)
fplt.candlestick_ochl(df[['Open', 'Close', 'High', 'Low']])

fplt.show()
Also das Ganze in die while Schleife rein genommen - ich habe mich schon gefreut, wie einfach das ging - und das Skript wieder laufen lassen.

Als eine neue Aktie im Scanner auftauchte, erschien dazu eine Grafik mit dem Kurs der letzten Tage. Juhu! Auch diese Aufgabe kann ich von meiner ToDo-Liste streichen... bis ich bemerkt habe, daß das Skript nicht weiter läuft bzw. die while Schleife geblockt ist, solange das Fenster mit der Grafik offen ist.

Das muss ich doch lösen lassen, dachte ich, also ein wenig weiter recherchiert und das Thema wurde an verschiedenen Stellen auch diskutiert. Man kann die Grafik auch als Screenshot speichern, das sieht dann so aus:

Code: Alles auswählen

import finplot as fplt # https://pypi.org/project/finplot/
import yfinance # https://pypi.org/project/yfinance/

symbol = "MSFT"

df = yfinance.download(symbol, period = "5d", interval = "5m", prepost = True)
fplt.candlestick_ochl(df[['Open', 'Close', 'High', 'Low']])

def save():
    fplt.screenshot(open(f'{symbol}.png', 'wb'))

fplt.timer_callback(save, 0.5, single_shot=True)  # wait some until we're rendered

fplt.show()
Das funktionierte auf Anhieb und so dachte der Schlauberger hier, ich mache das super geschickt, speichere den Screenshot und rufe den danach über das Windows Standard Programm einfach auf und das Skript wird nicht mehr geblockt. Das sah dann so aus:

Code: Alles auswählen

import finplot as fplt # https://pypi.org/project/finplot/
import yfinance # https://pypi.org/project/yfinance/
from PIL import Image

symbol = "MSFT"

df = yfinance.download(symbol, period = "5d", interval = "5m", prepost = True)
fplt.candlestick_ochl(df[['Open', 'Close', 'High', 'Low']])

def save():
    fplt.screenshot(open(f'{symbol}.png', 'wb'))
    fplt.close()

fplt.timer_callback(save, 0.5, single_shot=True)  # wait some until we're rendered

fplt.show()

with Image.open(f'{symbol}.png') as bild:
    bild.show()
Aber die Ernüchterung folgte auf dem Fusse, war nix mit smart... auch dieser Aufruf blockiert die Schleife solange, bis die Grafik geschlossen wird. Hätte ich mir eigentlich denken können :roll:

Inzwischen habe ich diverse weitere Artikel und posts gelesen, aber die Lösungen für matplotlib wie block=False oder matplotlib.interactive() funktionieren in finplot nicht. Ein Vorschlag war, die Grafik per multiprocessing als neuen Prozess zu starten, naja ich weiß nicht...

Meine Lösung ist momentan, daß die Grafik nach 5 Sekunden automatisch geschlossen und als Screenshot gespeichert wird, dann läuft das Skript weiter und ich kann mit das Bild bei Bedarf nochmal aufrufen.

So richtig zufrieden bin ich aber nicht. Es ist nicht schlimm, daß es nicht so geht, wie ich wollte, aber vielleicht hat hier jemand einen Hinweis, wie man es lösen kann, daß das Fenster mit der Grafik offen bleiben kann UND die while Schleife weiter läuft. Oder soll ich auf matpotlib umsatteln?

Viele Grüße
Andy
Antworten