Excel

      Original von Erik Nijkamp
      Das OnData Event ist zwar elegant, aber bist du dir auch bewusst, das nun
      bei jedem DDE Hotlink Event die Funktion aufgerufen wird? Wenn du die
      Daten chronologisch ablegen willst, wird dieses jetzt bei jedem Tick durchgeführt
      und ich vermute, dass Excel gerade bei Forex nicht sonderlich viel Chancen
      bei der Abarbeitung hat.

      OnData ist dokumentiert in der Msdn:
      msdn2.microsoft.com/en-us/libr…cel.worksheet.ondata.aspx

      Zudem werden bei OnData keine Zellenbezüge übergeben?
      Also ist es wohl eher sinnvoll für für jeden Kurs ein Sheet zu verwenden,
      wenn dur wirklich Tickdaten benötigst, ansonsten würde ich aus Performance
      Gründen die sekündliche Timerlösung vorziehen.


      Hi Erik Nijkamp,
      so undokumentiert wie in dem anderen Forum geschrieben steht scheint das OnData-Ereignis doch nicht zu sein, danke für den Hinweis!
      Ich hab schon zu Anfang gemutmasst, dass Excel Probleme haben wird der Datenflut Herr zu werden und denke es noch immer. Nur war ich optimistisch, weil Du unten geschrieben hat dass auch ein ereignisgesteuertes Datensammeln kein Problem sei ?(
      eric schrieb ja zu Beginn des Threads, dass er Tickdaten sammeln möchte. Wenn Sekunden reichen, hast Du ja schon eine gute Lösung gepostet.
      API-Lösung ist bei dieser Zielsetzung ein weiterer Unsicherheitsfaktor und für dieses Ziel nicht gut, da hast Du völlig recht!
      Ciao
      ktrade
      API Funktionen im VBA benutzen ist nie sonderlich stabil und auch nur bei
      einfachen Queries oder ähnliche Aufgaben ratsam.

      Application.Wait(...) sollte ausreichend sein.

      Das OnData Event ist zwar elegant, aber bist du dir auch bewusst, das nun
      bei jedem DDE Hotlink Event die Funktion aufgerufen wird? Wenn du die
      Daten chronologisch ablegen willst, wird dieses jetzt bei jedem Tick durchgeführt
      und ich vermute, dass Excel gerade bei Forex nicht sonderlich viel Chancen
      bei der Abarbeitung hat.

      OnData ist dokumentiert in der Msdn:
      msdn2.microsoft.com/en-us/libr…cel.worksheet.ondata.aspx

      Zudem werden bei OnData keine Zellenbezüge übergeben?
      Also ist es wohl eher sinnvoll für für jeden Kurs ein Sheet zu verwenden,
      wenn dur wirklich Tickdaten benötigst, ansonsten würde ich aus Performance
      Gründen die sekündliche Timerlösung vorziehen.
      Danke. Damit könnte ich mir sonst mit einer Schleife und Sleep einen einfachen Timer basteln, falls OnData nicht funktioniert.
      Lol, ich habe immer das Gefühl meine Lösungen sind ziemlich primitiv. Aber Hauptsache es funktioniert, doch das muss es erst noch.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „eric“ ()

      Das Makro Sammeln ist sicher eleganter, nur habe ich es nicht verstanden.
      Sobald wieder Kurse kommen, werde ich es probieren.

      Noch eine Frage: Weisst du oder jemand anderes ob es möglich ist in den Code eine Pause einzufügen, also einen Befehl der das Programm während der Ausführung z.B. für 1 Sek. pausieren lässt?
      Wenn Dein Makro "WertKopieren" funktioniert und das ominöse OnData-Ereignis noch unterstützt wird, dann denke ich auf den ersten Blick, dass es klappen müsste. Probier es doch einfach aus!
      Die Art und Weise des Makros "Sammeln" im ursprünglichen Code ist sicherlich eleganter und wahrscheinlich auch schneller, als der Umweg über die Zwischenablage?
      So, jetzt habe ich mal ein Makro gemacht, das die Aktion die ich brauche ausführt und es scheint zu funktionieren.
      Die Zelle, deren Werte ich auflisten möchte ist Tabelle1, F7 und kopieren möchte ich die Werte nach Tabelle2 B5, B6, B7 usw. Jedes mal wenn Tabelle1, F7 einen neuen Wert annimmt.

      Sub WertKopieren()
      '
      ' WertKopieren Makro

      Dim Shift As Long
      Shift = 0
      Sheets("Tabelle1").Select
      Range("F7").Select
      Selection.Copy
      Sheets("Tabelle2").Select
      Range("B5").Offset(Shift, 0).Select
      ActiveSheet.Paste
      Shift = Shift + 1

      End Sub



      Könnte ich das nun mit dem OnData Ereignis so kombinieren:

      Sub SammelnStarten()
      Worksheets("Tabelle1").OnData = "WertKopieren"
      End Sub

      Sub WertKopieren()
      '
      ' WertKopieren Makro

      Dim Shift As Long
      Shift = 0
      Sheets("Tabelle1").Select
      Range("F7").Select
      Selection.Copy
      Sheets("Tabelle2").Select
      Range("B5").Offset(Shift, 0).Select
      ActiveSheet.Paste
      Shift = Shift + 1

      End Sub


      ??
      Das ist das erste mal dass ich mich mit Makros und VBA beschäftige, darum habe ich noch nicht viel Ahnung davon.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „eric“ ()

      RE: Excel+Trading


      Sub SammelnStarten()
      Worksheets("Tabelle1").OnData = "Sammeln"
      End Sub


      Sub Sammeln()
      Dim intRow As Integer
      With Worksheets("Tabelle2")
      intRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
      .Cells(intRow, 1) = Now
      .Cells(intRow, 2) = Worksheets("Tabelle1").Range("A1").Value
      End With
      End Sub


      Sieht ja wirklich fast schon zu einfach aus, KISS halt ;)
      Bin gespannt, ob das nicht mehr dokumentierte OnData-Ereignis noch mit neueren Excel-Versionen funktioniert, lass es mich bitte wissen. Bei Office2000 sollte es noch gegangen sein

      Ciao
      ktrade
      Vielen Dank für die ausführliche Antwort Erik. Also ist es so, dass es sich mit Excel und VBA und dann am besten mit dem Application.OnTime Event machen lässt, oder über die MetaTrader API. Ich denke für mich ist erst einmal der Weg über Excel der bessere. Programmieren kann ich nicht. VBA habe ich aber vor zu lernen. Dann müsste ich nur noch meine Funktion programmieren und an den von dir geposteten Code anhängen.
      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
      Grad hab ich noch die Idee...VBA ist ja Ereignisgesteuert, man kann also bei Veränderung eines Feldes, die Felder speichern. Dann spart man sich den Timer. Man kann die Felder mit den Zeitdaten ja mitspeichern, dann dürfte es auch kein Problem mit den Daten geben wie ich zuerst dachte.
      Pseudocode:
      Wenn Feldinhalt geändert, dann speichere Felder "Kurs, Zeit..." in Liste.

      Ob man auf dem Rechner dann noch was anderes machen kann ausser Kurse sammeln, muss man halt testen.Ich denk das wirkt ziemlich lähmend auf den PC und in schnellen Marktphasen kann es sein dass man einzelne Kurse wegen der Verzögerung nicht mitkriegt. Aber musst halt testen.
      Danke. Mit VBA kenne ich mich noch überhaupt nicht aus, aber ich will es sowieso lernen. Wenn das so machbar ist, reicht mir das schon. Ein fixer Timer wäre zwar nicht ideal, lieber nur ein Eintrag für jeden neuen Tick, aber es würde auch so gehen.
      Kannst du vielleicht noch genauer sagen, wo du das Problem mit den Daten siehst, wegen Open und Close?
      Eric
      Ich hab zwar schon lange nichts mehr mit Excel gemacht, aber über VBA gibt es sicher die Möglichkeit über einen Timer regelmäßig ein Feld in eine Liste zu kopieren. Ich vermute allerdings, dass man die Daten, die man auf diese Art erzeugt nicht sehr gut gebrauchen kann, da man irgendwelche Open/Close-damit speichert. Zumindest bei kurzfristigen Timeframes...
      Leider soll ja der VisualChart Test nur noch 3 Tage gehen, sonst könnte ich mal rumprobieren.
      Ciao
      ktrade