Hier häufen sich langsam die Unstimmigkeiten und ich versuche mal einige davon zu bereinigen.
Im Excel lassen sich per VBA einige Funktionen von Klassen wie dem Workbook
überladen, das sind nicht wirklich Ereignisse, aber vom Prinzip sind die Resultate
in diesem Fall identisch.
Zum Beispiel lässt sich relativ einfach die Methode Open der Workbook Klasse
überladen oder auch Change vom Worksheet durch Worksheet_Change.
Die Change Methode wird bei Änderungen von Feldwerten durch den Benutzer
aufgerufen, nun werden aber die Feldwerte durch die DDE Verbindung
aktualisiert oder eher gesagt, die Brokersoftware pushed die Werte via
DDE Hotlink ans Excel weiter. Somit werden die Änderungen nicht vom Benutzer
selbst durchgeführt, sondern direkt von Excel und es erfolgt kein expliziter
Aufruf der Change Methode.
Also lässt sich mit dem ereignisgesteuerten Ansatz nicht sonderlich viel
anfangen und wenn es funktionieren würde, wären die paar DDE Hotlinks
kein Problem für den Rechner. Als Anbindung an die Bis.net Software
verwende
ich 1200 DDE Hotlinks für die Dax Aktien mit einer Markttiefe von 10 und leite
diese dann mit Com an Excel weiter. Das Bindeglied dient nur der
Stabilieserung des Datentransfer und mit kleinen Tricks lande ich bei einer
Auslastung von ~10%.
Wenn du dir nicht die Mühe machen willst und noch ein externes Bindeglied
zwischen dem Metatrader und Excel erstellen willst (der Metatrader lässt sich
eigentlich besser direkt über die API ansteuern, ich kann dir die
Funktions-Importe zukommen lassen) ist wohl (wie schon erwähnt) der Timer
die passendere Lösung.
Mit VBA ist es möglich die Windows Timer Funktionen zu importieren, was
aber zu sehr instabilen Ergebnissen führen kann. Eine wohl elegantere
Möglichkeit besteht in dem 'Anhängen' deiner Funktion an das Application.OnTime Event:
Public RunWhen As Double
Public Sec As Long
Public Row As Long
Sub StartTimer()
Row = 1
RunWhen = Now + TimeSerial(0, 0, 1)
Sec = Sec + 1
Application.OnTime EarliestTime:=RunWhen, Procedure:="StartIt", Schedule:=True
End Sub
Sub StopTimer()
On Error Resume Next
Application.OnTime EarliestTime:=RunWhen, Procedure:="StartIt", Schedule:=False
Sec = 0
End Sub
Private Sub StartIt()
MsgBox "Timer"
Row = Row + 1
Tabelle1.Cells(Row, 1).Value = "Kurs" + Row
StartTimer
End Sub
Hoffe dir einigermaßen weitergeholfen zu haben und noch viel Erfolg
mit deinen Analysen.
- Erik