Hallo Blackjack.
Es ist so.(Schlussfolgerung aus meinen Beobachtungen) Das ein COM event einen Timeout hat. Es wird gefeuert und landet dann im Handler. Wenn es dort keine Verwendung nach Zeit x erfährt timeoutet es. Da ich aber nicht alle Fälle abdecke? habe ich bei mehreren 1000 Ereignissen pro Sekunde "Stau im Elbtunnel".
Um die Nachmittagszeit ist der meiste Traffic auf dem Handler. Da friert er mir ein und ich habe Zeitweise für 30-40 Minuten gar keine Events mehr.
Ich versuche es zu verstehen daher habe ich mit einer Funktion die mir die Methoden etc von com Objekten ausgibt. Es ist ein Paste aus dem Internetz, verbesserungsvorschläge - verry welcome. [Pastebin]
https://pastebin.com/2N8fidNu[/Pastebin]
Aus dieser konnte ich verstehen, das events(events = win32com.client.WithEvents( stream , EventHandler )) folgende Ereignisse feuert.
# {1: 'OnBezahlt', 2: 'OnBrief', 3: 'OnGeld', 4: 'OnBriefMT', 5: 'OnGeldMT', 6: 'OnStatus', 7: 'OnAktuellMeldung', 8: 'OnOpenInterest', 9: 'OnKorrekturOpen', 10: 'OnKorrekturHigh', 11: 'OnKorrekturLow', 12: 'OnKorrekturVolume', 13: 'OnIndiKurs', 14: 'OnNews', 15: 'OnReload', 16: 'OnExEvent'}
Wobei OnReload und OnExEvent nicht dokumentiert sind. Daraus habe ich halt jetzt folgenden Handler geknetet:
[codebox=pys60 file=Unbenannt.txt]
class EventHandler:
# {1: 'OnBezahlt', 2: 'OnBrief', 3: 'OnGeld', 4: 'OnBriefMT', 5: 'OnGeldMT', 6: 'OnStatus', 7: 'OnAktuellMeldung', 8: 'OnOpenInterest',
# 9: 'OnKorrekturOpen', 10: 'OnKorrekturHigh', 11: 'OnKorrekturLow', 12: 'OnKorrekturVolume', 13: 'OnIndiKurs', 14: 'OnNews', 15: 'OnReload', 16: 'OnExEvent'}
def OnBezahlt(self, SymbolNr, Kurs, Volume, Zeit):
# Dieses Ereignis tritt ein (wird gefeuert), wenn ein neuer Bezahltkurs für ein Symbol aus der Überwachungsliste eintrifft.
set_value(self, SymbolNr, Kurs, Volume, Zeit)
#logger("OnBezahlt")
return
def OnBrief(self, SymbolNr, Kurs, Volume, Zeit):
# Dieses Ereignis tritt ein (wird gefeuert), wenn ein neuer Briefkurs für ein Symbol aus der Überwachungsliste eintrifft.
return
def OnGeld(self, SymbolNr, Kurs, Volume, Zeit):
# Dieses Ereignis tritt ein (wird gefeuert), wenn ein neuer Gledkurs für ein Symbol aus der Überwachungsliste eintrifft.
return
def OnBriefMT(self, Position, SymbolNr, Kurs, Volume, Zeit):
# Dieses Ereignis tritt ein (wird gefeuert), wenn ein neuer Briefkurs (Markttiefe) für ein Symbol aus der Überwachungsliste eintrifft.
return
def OnGeldMT(self, Position, SymbolNr, Kurs, Volume, Zeit):
# Dieses Ereignis tritt ein (wird gefeuert), wenn ein neuer Gledkurs (Markttiefe) für ein Symbol aus der Überwachungsliste eintrifft.
return
def OnStatus(self, code):
# Dieses Ereignis tritt ein (wird gefeuert), wenn eine Statusveränderung bzgl. der Verbindung von Tai-Pan Realtime eintrifft.
print(code)
def OnAktuellMeldung(self, url):
# Dieses Ereignis wird gefeuert, wenn eine neue Aktuell-Meldung zu Tai-Pan Realtime verfügbar ist.
return
def OnOpenInterest(self, SymbolNr, OpenInterest, Zeit):
# Dieses Ereignis wird gefeuert, wenn ein neuer Wert für das Open Interest geliefert wird.
return
def OnKorrekturOpen(self, SymbolNr, Kurs, Volume, Zeit):
# Diese Ereignisse werden gefeuert, wenn eine Korrektur zu einem Symbol geliefert wird. Die Art der Korrektur wird durch das Event definiert.
return
def OnKorrekturHigh(self, SymbolNr, Kurs, Volume, Zeit):
# Diese Ereignisse werden gefeuert, wenn eine Korrektur zu einem Symbol geliefert wird. Die Art der Korrektur wird durch das Event definiert.
return
def OnKorrekturLow(self, SymbolNr, Kurs, Volume, Zeit):
# Diese Ereignisse werden gefeuert, wenn eine Korrektur zu einem Symbol geliefert wird. Die Art der Korrektur wird durch das Event definiert.
return
def OnKorrekturVolume(self, SymbolNr, Kurs, Volume, Zeit):
# Diese Ereignisse werden gefeuert, wenn eine Korrektur zu einem Symbol geliefert wird. Die Art der Korrektur wird durch das Event definiert.
return
def OnIndiKurs(self, SymbolNr, Kurs, Volume, Zeit):
# Dieses Ereignis wird gefeuert, wenn ein neuer Indikativer Kurs geliefert wird. Dies ist z.B. bei Open-, Intraday- oder Schluss-Auktionen der Fall.
return
def OnNews(self, Zeit, sWPKs):
# Dieses Ereignis wird gefeurt, wenn eine neue Newsmeldung geliefert wird. Geliefert wird die neuste News mit der Spalte "Wertpapiere" des Newsfensters und des Zeitstempels.
return
def OnReload(self):
# not in documentation
return
def OnExEvent(self, nEventID, SymbolNr, Kurs, Volume, Zeit, LongValue):
# not in documentation
logger( "exevent" + nEventID )
return
[/code]
Hier nochmal als Pastebin
[Pastebin]
https://pastebin.com/82C9afVd[/Pastebin]
Heute Abend hat er erstmal funktioniert™. Es ist aber auch nichts los. Ich arbeite mit sublimetext und python in der cmd. Da ich nicht so der "Windowstyp" bin, kenne ich keine andere Möglichkeit. Spyder habe ich unter Windows nicht ans laufen gekriegt. Daher wüsste ich nun nicht, wie ich es besser machen könnte zu sehen wo ein Event "Kleben bleibt". bzw. wie man eine solche COM vernünftig reverse engineered. Nach dem Source Code zum selber stöbern, brauche ich wohl nicht zu fragen bei Lenz und Partner.
Meine Frage hier zielt halt in die Richtung, wie die Finessen beim Aufruf von comobjekten mit pythoncom sind. Es muss ja möglich sein?
Danke und Grüße
derdigge