Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

21

06.05.2017, 13:43

Hier mal das Beispiel mittels Powershell auf Windows.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
$to = "D:\Test\test.txt"
$from = "C:\Users\Renegade\Desktop\test.log"

$timeout = new-timespan -Minutes 1

$starttime = [diagnostics.stopwatch]::StartNew()

while ($starttime.elapsed -lt $timeout){
    if(test-path $from) {
        Copy-Item $from -Destination $to
    }
    start-sleep -seconds 5
}


0. Eine neue Textdatei erstellen, Rechtsklick auf Desktop -> Neu -> Textdokument
1. Den Code oben in die Textdatei kopieren und unter Datei -> Speichern Unter als CopyLoop.ps1 speichern (z.B. unter C:\Users\Maik\Desktop\CopyLoop.ps1)
2. dannach Windowstaste drücken und powershell eingeben (nicht drauf klicken sondern...)
3. ...Strg+Shift+Enter drücken, dass bewirkt das Powershell als Admin gestartet wird (wird dich fragen ob du als Admin öffnen willst, natürlich ja)
4. In der blauen Konsole folgendes eingeben Set-ExecutionPolicy RemoteSigned (Damit sagst du Powershell das es Programme ausführen darf)
5. Mit J für Ja bestätigen
5. In der blauen Konsole den Pfad zur Datei eingeben, z.B. C:\Users\Maik\Desktop\CopyLoop.ps1 und mit Enter bestätigen

Das Skript läuft nun 1 Minute lang und prüft alle 5 Sekunden ob eine Datei unter $from zu finden ist und kopiert sie zu $to (mit Umbenennung der Endung). Möchtest du statt kopieren die Datei ausschneiden, verwende statt Copy-Item den Befehl Move-Item. Du kannst das Skript verändern in dem du es regulär mit klicken öffnest, dann sollte sich der Texteditor öffnen und du kannst die Datei verändern und speichern. ...und natürlich wieder mittels der blauen Powershell Konsole starten.

Viel Spaß!
Liebe Grüße,
René

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Renegade« (06.05.2017, 13:52)


22

06.05.2017, 17:52

Hier mal das Beispiel mittels Powershell auf Windows.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
$to = "D:\Test\test.txt"
$from = "C:\Users\Renegade\Desktop\test.log"

$timeout = new-timespan -Minutes 1

$starttime = [diagnostics.stopwatch]::StartNew()

while ($starttime.elapsed -lt $timeout){
    if(test-path $from) {
        Copy-Item $from -Destination $to
    }
    start-sleep -seconds 5
}


0. Eine neue Textdatei erstellen, Rechtsklick auf Desktop -> Neu -> Textdokument
1. Den Code oben in die Textdatei kopieren und unter Datei -> Speichern Unter als CopyLoop.ps1 speichern (z.B. unter C:\Users\Maik\Desktop\CopyLoop.ps1)
2. dannach Windowstaste drücken und powershell eingeben (nicht drauf klicken sondern...)
3. ...Strg+Shift+Enter drücken, dass bewirkt das Powershell als Admin gestartet wird (wird dich fragen ob du als Admin öffnen willst, natürlich ja)
4. In der blauen Konsole folgendes eingeben Set-ExecutionPolicy RemoteSigned (Damit sagst du Powershell das es Programme ausführen darf)
5. Mit J für Ja bestätigen
5. In der blauen Konsole den Pfad zur Datei eingeben, z.B. C:\Users\Maik\Desktop\CopyLoop.ps1 und mit Enter bestätigen

Das Skript läuft nun 1 Minute lang und prüft alle 5 Sekunden ob eine Datei unter $from zu finden ist und kopiert sie zu $to (mit Umbenennung der Endung). Möchtest du statt kopieren die Datei ausschneiden, verwende statt Copy-Item den Befehl Move-Item. Du kannst das Skript verändern in dem du es regulär mit klicken öffnest, dann sollte sich der Texteditor öffnen und du kannst die Datei verändern und speichern. ...und natürlich wieder mittels der blauen Powershell Konsole starten.

Viel Spaß!



Danke damit wird das bestimmt funktionieren.
Mir ist noch heute etwas aufgefallen, der Inhalt in der .log Datei wird immer erst aktualisiert nachdem das Metatrader Programm ausgeschaltet wurde, weis jemand wie man trotzdem auf den Aktuellen Inhalt der .log zugreifen kann, auch waehrend der Metatrader noch am laufen ist?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

23

07.05.2017, 15:08

Wenn der Inhalt sich erst beim schließen des Programms ändert, wie willst du dann vorher darauf zugreifen? Du kannst auch keine Nachricht lesen bevor man sie dir schickt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

24

07.05.2017, 16:50

Wenn der Inhalt sich erst beim schließen des Programms ändert, wie willst du dann vorher darauf zugreifen? Du kannst auch keine Nachricht lesen bevor man sie dir schickt.


Doch das geht (Naja, ok, indirekt, also nicht wirklich), jedoch wird dann nicht mehr auf das .log zugegriffen sondern via MQL direkt auf den Metatrader mittels seiner eingebauten Events (siehe Working with Events). Ich bin kein Experte in Bezug auf MQL (und ich wette, dass sind die Wenigsten in einem SpieleProgrammierer Forum), aber ein kurzer Blick in die Dokumentation lässt erahnen, dass die Skriptsprache von Metatrader eine Vielzahl von Möglichkeiten offen lässt. Ich empfehle dir (@»SpieleProgrammerUser«), dich mal genauer mit der MQL4 Reference zu beschäftigen. Dort findest du alles was du brauchst und musst keine unnötigen Umwege mittels batch oder Powershell gehen (damit machst du dir das Leben nur unnötig schwer), da MQL schon einiges in Bezug auf Dateioperationen bietet.
Liebe Grüße,
René

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Renegade« (07.05.2017, 16:58)


25

07.05.2017, 18:49

Wenn der Inhalt sich erst beim schließen des Programms ändert, wie willst du dann vorher darauf zugreifen? Du kannst auch keine Nachricht lesen bevor man sie dir schickt.


Doch das geht (Naja, ok, indirekt, also nicht wirklich), jedoch wird dann nicht mehr auf das .log zugegriffen sondern via MQL direkt auf den Metatrader mittels seiner eingebauten Events (siehe Working with Events). Ich bin kein Experte in Bezug auf MQL (und ich wette, dass sind die Wenigsten in einem SpieleProgrammierer Forum), aber ein kurzer Blick in die Dokumentation lässt erahnen, dass die Skriptsprache von Metatrader eine Vielzahl von Möglichkeiten offen lässt. Ich empfehle dir (@»SpieleProgrammerUser«), dich mal genauer mit der MQL4 Reference zu beschäftigen. Dort findest du alles was du brauchst und musst keine unnötigen Umwege mittels batch oder Powershell gehen (damit machst du dir das Leben nur unnötig schwer), da MQL schon einiges in Bezug auf Dateioperationen bietet.


Die Metatrader Programmiersprache benutze ich eigentlich schon seit einigen Jahren und kenne mich somit auch weitgehend gut damit aus. Leider ist beim Metatrader alles ein wenig wie in einer Sandbox aufgebaut, man kann nicht auf Dateien zugreifen von ausserhalb, das hat sicher auch Sicherheitsgruende, aber das macht es auch oft schwer dort etwas zu programmieren.

Ich habe ein Beitrag von jemanden gefunden der eine Loesung gesucht hat fuer die gleiche Aufgabe wie ich: https://www.mql5.com/en/forum/71130

Ich weis nicht ob der das hinbekommen hat, aber es hoert sich dort etwas so an als ob es moeglich sein koennte.

Wenn jemand hier sich damit beschaeftigen will kann ich auch gerne 20 - 30 Euro fuer eine Loesung anbieten, eine Loesung bei der ich in real time die Eintrage der .log Datei im Ordner MQL5/logs lesen kann.

Mit Geld spielt man ja nicht lautet das Motto fuer den Finanzmarkthandel, aber irgendwo ist Finanzmakthandel das Spiel der Spiele.

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

26

08.05.2017, 21:07

Die Lösung kannst du auch gerne umsonst haben:
Nutze in MQL einfach die ShellExecuteA Methode um eine Batch-Datei aufzurufen. So könntest du auch selbst unter bestimmten Ereignissen deines MetaTraders etwas in eine kleine Textdatei schreiben und dann an einen beliebigen Ort schieben. Das könnte ungefähr so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
int fileHandle = FileOpen(filePath, FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI);
[...]
FileWriteString(fileHandle, data);
[...]
FileClose(fileHandle);
[...]
string batPath = "C:\Users\Maik\Desktop\move.bat";
ShellExecuteA(0, "Open", batPath, 0, "", 3);


#import "shell32.dll"
int ShellExecuteA(int hwnd,string Operation,string File,string Parameters,string Directory,int ShowCmd);


https://www.mql5.com/en/forum/117418
Liebe Grüße,
René

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Renegade« (08.05.2017, 21:19)


27

08.05.2017, 21:44

Die Lösung kannst du auch gerne umsonst haben:
Nutze in MQL einfach die ShellExecuteA Methode um eine Batch-Datei aufzurufen. So könntest du auch selbst unter bestimmten Ereignissen deines MetaTraders etwas in eine kleine Textdatei schreiben und dann an einen beliebigen Ort schieben. Das könnte ungefähr so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
int fileHandle = FileOpen(filePath, FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI);
[...]
FileWriteString(fileHandle, data);
[...]
FileClose(fileHandle);
[...]
string batPath = "C:\Users\Maik\Desktop\move.bat";
ShellExecuteA(0, "Open", batPath, 0, "", 3);


#import "shell32.dll"
int ShellExecuteA(int hwnd,string Operation,string File,string Parameters,string Directory,int ShowCmd);


https://www.mql5.com/en/forum/117418



Hi, danke fuer die vielen nuetzlichen Tipps.
Mit dem Metatrader hat man oft Probleme, da funktioniert nicht immer alles so logisch.
Ich habe jetzt festgestellt das der Inhalt in der .log Datei nicht gleichzeittig aktualisiert wird.
Wenn man beim Metatrader im Experts Tab schaut stehen die ganze Infos, die werden dort Reihe fuer Reihe rein geschrieben, aber wenn man gleichzeittig in den Ordner MQL5\Logs schaut und die .log Datei vom aktuellen Tag oeffnet sieht man die neuen Infos dort nicht, erst wenn man den Metatrader neu startet, werden die Infos aktualisiert.
Oder wenn man im Tab Expert bei den Nachrichten die dort Reihe fuer Reihe reingeschrieben werden, einmal ein Rechtsklick auf die Maus macht erscheint ein kleines Menue wo man auswaehlen kann den Ordner zu oeffnen, wenn man das macht wird auch aufeinmal der Inhalt in der .log Datei aktualisiert, aber es wird keine Funktion angeboten in MQL5 um diesen Vorgang zu programmieren.

Deswegen komme ich da nicht weiter.
Ich habe heute schon mit Hilfe einer Batch Datei das kopieren der .log Datei in den gewuenschten Ort hinbekommen, aber jetzt ist das problem das der Inhalt dort in der datei nicht aktuell ist.

Deswegen bin ich jetzt am ueberlegen ob ich nicht auf eine andere Weise die Signale auslesen kann welche in diese .log datei geschrieben werden, ueber ein Umweg mit Emails koennte man das auch machen, dann laest man sich die Signale per Email zusenden und muss dann mit einem Programm auf sein Email Account zugreifen. So kommt man dann auch auf die Signale. Aber am besten waere es gewesen wenn ich direkt aus der .log Datei alles auslesen kann, da ist aber wie gesagt das Problem das diese datei nicht in real time aktualisiert wird.

Falls jemand ein trick kennt wie man an die aktuellen Daten der .log Datei dran kommt waere super fuer mich, wuerde mir dann den Umweg sparen koennen ueber Emails das zu machen.

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

28

08.05.2017, 21:58

Mit dem Metatrader hat man oft Probleme, da funktioniert nicht immer alles so logisch.

Na scheinbar schon - die Leute aus dem MQL Forum machen es genau so ;)
Und warum kannst du jetzt nicht ein Skript in MQL schreiben und auf etwaige Ereignisse reagieren? Du kannst dich doch sogar in die void OnTick(); vom MetaTrader hängen und damit mehrmals beliebige Werte pro Sekunde prüfen. Genau dafür ist doch MQL da. Deine Umwege mache imo deshalb nicht so richtig Sinn :hmm: Ich denke du bist hier (https://www.mql5.com/de/forum) mit deinen Fragen doch deutlich besser aufgehoben als in einem Spieleprogrammierer Forum!
Liebe Grüße,
René

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Renegade« (08.05.2017, 22:04)


29

08.05.2017, 22:10

Mit dem Metatrader hat man oft Probleme, da funktioniert nicht immer alles so logisch.

Na scheinbar schon - die Leute aus dem MQL Forum machen es genau so ;)
Und warum kannst du jetzt nicht ein Skript in MQL schreiben und auf etwaige Ereignisse reagieren? Du kannst dich doch sogar in die void OnTick(); vom MetaTrader hängen und damit mehrmals beliebige Werte pro Sekunde prüfen. Genau dafür ist doch MQL da. Deine Umwege mache imo deshalb nicht so richtig Sinn :hmm: Ich denke du bist hier (https://www.mql5.com/de/forum) mit deinen Fragen doch deutlich besser aufgehoben als in einem Spieleprogrammierer Forum!


Weist du ich baue schon auf dem Metatrader seit einigen Jahren Programme, habe dort auch ein Freelancer Profil auf mql5.com wo ich schon ueber 100 Jobs fuer andere fertig gestellt habe und nur gute Bewertungen bekommen habe, ich wueste mir also schon zu helfen wenn das wirklich so einfach waere. Aber beim Metatrader funktionieren manchmal einige sachen nicht so wie man es erwartet.

Ich habe heute schon 2 Jobs dort geoeffnet um mir selber Hilfe bei anderen zu holen, aber bisher hat noch niemand eine Loesung anbieten koennen. https://www.mql5.com/en/job/62433

Es ist hatl aus irgendeinen Grund so aufgebaut beim Metatrader das der Text in diese .log datei erst rein geschrieben wird wenn der Metatrader ausgeschaltet wird. Ich wuerde mich nicht wundern wenn das von den Entwicklern mit Absicht so erschwert wurde, damit andere Leute nicht so einfach Signale aus lesen koennen aus beispielweise kommerziellen Indikatoren.

Keine Ahnung warum das so ist, aber es ist halt so, der Text in dieser log datei wird erst aktualisiert wenn man den Metatrader ausschaltet, daher kommt man nicht in real time an die Daten.

30

08.05.2017, 22:35

Ein Programm schreibt also Daten in eine Datei. Lässt sich dieser Dateipfad ändern? Du könntest eine Pipe erstellen, den Pfad auf ebendiese Pipe setzen und dadurch die Daten abgreifen. Ich teste es mal.

Werbeanzeige