Suche noch eine Loesung fuer Kommunikation zwischen Webserver und ein Programm



  • Hallo,

    ich baue mir seit einigen Monaten ein Programm und wollte euch gerne davon erzaehlen und euch nach Tipps fragen, weil mir fehlt noch eine gute Loesung fuer eine Aufgabe.

    Ich bin nur ein Hobby Programmierer und habe mir einige Sachen selbst beigebracht, daher fehlt mir oft mehr Fachwissen, die Sache die ich noch loesen muss ist bestimmt fuer erfahrene und ausgebildete Programmierer nicht so schwer.

    Das Programm das ich mir im Moment baue ist fuer Forexhandel gedacht, ich benutze eine Software die Metatrader heist und mit dem Metatrader kann man online Forex (Devisenmarkt) handeln. Auf dem Metatarder ist es auch moeglich mit einer Programmiersprache die MQL4 heist, Zusatzprogramme zu bauen und so ein Zusatzprogramm baue ich im Moment.

    Die Aufgabe von meinem Programm ist vom Metatrader aus, welcher auf meinen Heim PC laeuft, Handelssignale an eine online PHP Seite zu senden, die PHP Seite speichert die Signale, Kurse und andere aehnliche Daten die ich dort hin sende in einer online Mysql Datenbank. PHP Datei und Mysql Datenbank sind auf dem gleichen Webserver, so wie das bei einem Webhosting Packet gewoehnlich ist.

    Es werden nicht nur Daten an die PHP Seite zum abspeichern gesendet, sondern auch Daten wieder zurueck gesendet an den Metatrader, das macht auch die gleiche PHP Seite, nachem sie aufgerufen wird und Datenabspeichert gibt sie auch Daten wieder als Rueckgabe aus und diese Daten brauche ich dann wieder im Metatrader.

    Dieser Ablauf, die Kommunikation vom Metatrader mit der PHP Seite ist auch die Aufgabe die ich im Moment noch vernuenftig loesen muss und deswegen eure Tips gut gebrauchen kann.

    Im Moment habe ich eine nicht sogute Loesung die oft nur zu Programmabstuerzen fuehrt. Die Loesung die ich im Moment habe ist eine Funktion welche aus Windows Wininet DLL Datei import aufgebaut ist, diese Funktion bietet mir im Moment die Moeglichkeit ein Internetlink zusammen mit Get Parametern auf zu rufen und die Rueckgabe der aufgerufenen Seite wird wieder zurueck gegeben und steht dann zur Verfuegung, also vom Prinzip her genau das was ich brauche, Problem ist aber halt das diese Funktion sehr schlecht funktioniert und es eigentlich nur staendig Programmabsturz deswegen gibt, es laeuft nicht sauber und ich habe die Funktion auch nur in einem Online Tutorial gefunden und nicht selbst gebaut.

    Ich vermute das der Metatrader zu schwach ist fuer solche Funktionen die aus fremden nicht MQL4 Programmiersprache Elementen gebaut sind. Auf Windows Wininet DLL Dateien import reagiert der Metatarder sehr empfindlich.

    Was der Metatrader gut kann ist Infos in Textdateien schreiben. Weil fuer sowas reicht die eigene MQL4 Programmiersprache aus. Ich hatte deswegen ueberlegt das man die Internetlinks mit den Get Parameter in Textdateien schreiben koennte und ein anderes Programm das auf meinen PC laeuft koennte dann diese Internetlinks aus der Textdatei auslesen und aufrufen und die Rueckgabe wieder in eine Textdatei speichern, welche dann der Metatrader wieder auslesen kann, den mit Textdateien arbeiten funktioniert beim Metatrader gut genug.

    Hat jemand von euch gute Ideen fuer mich Tipps wie man das machen kann oder andere Loesungen? Ich weis selber noch nicht was fuer ein Programm sowas machen koennte was ich dort beschrieben habe, das auslesen von Internetlinks, dann aufrufen und wieder die Rueckgabe abspeichern in eine Textdatei.

    MFG



  • Ich habe mal kurz in der Dokumention zu MQL4 gestöbert und die Funktion httpGET gefunden, die das machen sollte, was Du willst. Ein GET-Argument wird mit '?' eingeleitet und mit '&' fortgeführt, z.B. http:||example.com/tuwas.php?KAUFEN=MARSCHMARSCH&BERICHTEN=SOFORT. Nach meinem Dafürhalten musst Du also nicht auf Externes zurückgreifen.

    Externe Programme, die Webseiten aufrufen und das Ergebnis ausspucken, gibt es wie Sand am Meer. Das Gebräuchlichste heißt WGET, kommt aus der Linux-Welt, gibt es aber auch für Windows.

    Obwohl kein .NET-Fan, würde ich beim Programmieren der genannten Aufgabe zu C# greifen, wenn ich so etwas nicht schon mit PHP-CLI realisiert hätte. Du musst Dir noch Gedanken über die Synchronisierung machen, denn Web-Aufruf und -rückgabe können dauern.

    viele grüße
    ralph

    EDIT: Seit wann werden denn URL's automatisch in Links umgewandelt? GRRR! 😡



  • Danke fuer deine Tipps.

    Die httpGet Funktion die du gefunden hast ist vielleicht die gleiche welche ich schon benutze und von welcher ich geschrieben habe, das die Probleme verursacht, weil die reine MQL4 Sprache hat nicht so eine httpGet funktion.

    Wenn du willst kannst du mir den Link geben von dieser httpGet funktion die du meinst, aber ich denke es ist die gleiche welche ich schon habe und beim Metatrader bin ich mir schon sehr sicher das das Problem durch die HTTPGet function entsteht, welche aus DLL Dateien von jemand gebaut wurde, der Erstelller dieser Funktion hat das auch nur hobbymaessig gemacht und arbeitet nicht fuer die Metatrader Firma und weis deswegen wahrscheinlich auch nicht genau worauf man achten muss damit das immer Fehlerfrei laeuft.

    Ich programmiere auch schon seit 2005 auf dem Metatrader und sehe diesen Fehler des Programmabsturzes, beziehungsweise Blockade muss man das eher nennen, weil dann so eine Meldung "Timeout" kommt und man das Programm neu starten muss, aber nicht der komplette Metatrader deswegen abstuertzt, nur bei benutzen von dll Dateien.

    Bei anderen Programmen, wo nur reines MQL4 zum bauen benutzt wird kommt sowas nie vor, aber beim benutzen von fremden DLL Dateien kommen staendig Probleme vor. Ob es daran liegt das die DLL Dateien und Funktionen nicht so gut gebaut sind, die Leute die den Metatrader gebaut haben kennen sich da wahrscheinlich am ehesten aus und koennten bestimmt fehlerfreie DLL Dateien erstellen, aber die meisten DLL Beispiele sind von Hobbyprogrammierern und erzeugen irgendwann Fehler, oder ob der Metatarder generell zu schwach ist um fremde Funktionen gut aus zu fuehren weis ich nicht, aber ich denke die beste Loesung ist dem Metatrader von diesen DLL Funktionen einfach zu befreien, damit er sauber arbeitet und den Rest, also die Kommunikation mit den Webserver muss ich anders loesen.

    Und da kann ich eure Hilfe gut gebrauchen, weil ich mich nicht sogut auskenne mit anderen Programmiersprachen.

    In PHP bin ich auch nicht so gut das ich sowas wie CLI selbst bauen koennte und andere Sprachen wie C# oder aehnliches kann ich sowieso nicht, nur die Syntax koennte ich ein wenig davon wahrschienlich lesen, aber wie man das richtig zusammen baut mueste ich erst Monate lang lernen.

    Wget hoert sich gut an, kann man den wget so benutzen das wget sich immer neue Internetlinks aus einer Textdatei holt und aufruft und die Rueckgabe der website wieder in ein bestimmten Ordner als Textdatei abspeichert? Wenn das moeglich ist mit wget waere das doch eine gute saubere Loesung oder gibt es Gruende kein wget fuer sowas zu benutzen?

    MFG

    P.S. Ich kenne den Unterschied zwischen Url und Links glaube gar nicht, wegen deiner Frage, ich meine die sind beies das gleiche und stellen ein Internetlink dar, aber ok das ist dann wieder wohl ein anderes langes Thema.



  • CplusplusUser schrieb:

    Wenn du willst kannst du mir den Link geben von dieser httpGet funktion die du meinst, aber ich denke es ist die gleiche welche ich schon habe und beim Metatrader bin ich mir schon sehr sicher das das Problem durch die HTTPGet function entsteht, welche aus DLL Dateien von jemand gebaut wurde, der Erstelller dieser Funktion hat das auch nur hobbymaessig gemacht und arbeitet nicht fuer die Metatrader Firma und weis deswegen wahrscheinlich auch nicht genau worauf man achten muss damit das immer Fehlerfrei laeuft.

    Ich hatte diese im Sinn:

    http://codebase.mql4.com/4428

    Diese Funktion benutzt nicht (auch nicht indirekt) WININET.DLL - wahrscheinlich werden die Sockets ohne Internet Explorer hergestellt.

    In PHP bin ich auch nicht so gut das ich sowas wie CLI selbst bauen koennte und andere Sprachen wie C# oder aehnliches kann ich sowieso nicht, nur die Syntax koennte ich ein wenig davon wahrschienlich lesen, aber wie man das richtig zusammen baut mueste ich erst Monate lang lernen.

    CLI heißt "Command Line Interface" und bedeutet, dass Du PHP lokal von der Kommandozeile aufrufst - wie ein normales Programm, also ohne Webserver. Du kannst PHP auch ohne Webserver installieren und nur als Skriptsprache benutzen. Vorteil: Wenn man eh schon für den Webserver PHP programmiert, muss man sich lokal nicht groß auf eine andere Programmiersprache umstellen.

    C# hat den Vorteil, dass es für den Webzugriff vorgefertigte Funktionen hat - vom Betriebssystemhersteller selbst. Bei C/C++ muss man sich das erst aus den Bibliotheken zusammenkramen - fehlerträchtig.

    Wget hoert sich gut an, kann man den wget so benutzen das wget sich immer neue Internetlinks aus einer Textdatei holt und aufruft und die Rueckgabe der website wieder in ein bestimmten Ordner als Textdatei abspeichert? Wenn das moeglich ist mit wget waere das doch eine gute saubere Loesung oder gibt es Gruende kein wget fuer sowas zu benutzen?

    Ja, man kann WGET in Deinem Sinne benutzen. Probier es aus (Stichwort: Taskplaner). Einziges richtiges Problem ist, dass man Vorkehrungen treffen muss, wenn Metatrader und WGET zufällig gleichzeitig auf dieselbe Datei zugreifen wollen.

    P.S. Ich kenne den Unterschied zwischen Url und Links glaube gar nicht, wegen deiner Frage, ich meine die sind beies das gleiche und stellen ein Internetlink dar, aber ok das ist dann wieder wohl ein anderes langes Thema.

    Ach, Entschuldigung, Du warst gar nicht gemeint. Ich hatte einen URL als Beispiel gepostet, wollte aber nicht, dass er klickbar wird (Link), weil er nur eine Blödsinnsadresse (example.com) hatte. Trotzdem hat die Forensoftware einen Link daraus gemacht und die Anzeige verstümmelt, so dass ich die Slashes im URL verändern musste.

    viele grüße
    ralph



  • Danke fuer deine Tipps.

    Das http Beispiel das du gefunden hast fuer Metatarder kannte ich auch, aber ich hatte ein anderes benutzt.

    Ich schaue mir am besten wget etwas mehr an, ich denke wget waere eine bessere Loesung, weil dann der Metatrader etwas ausgelastet wird und wget ein Stueck der Arbeit uebernimmt, ich kann aber mit dem Metatarder nicht pruefen ob gerade wget auf die Datei zugreift, ich hoffe da gibt es dann bei wget eine Loesung fuer sowas.



  • Hallo,

    versteht jemand von euch zufaellig den Code von folgender Funktion mit der ich per FTP Bilder auf mein Webserver lade, die Funktion benutze ich vom Metatrader aus und die ist mit Windows Wininet Funktion gebaut und was ich gerne wissen wuerde ist, ob es moeglich ist den Pfad an zu geben in welchen Order die Datei auf den Webserver gesendet wird, den im Moment wird es immer in das Hauptverzeichnis gesendet und ich wuerde gerne auch in ein anderes Verzeichnis die Datei damit senden koennen:

    bool SendWithFTP(string str)
    {
    //----
       int hIntObj, hIntObjConn;
       string Password, ServerName, UserName, LocalFile, HostFile;
       bool Success;
    
       //Uploading the file
       hIntObj=InternetOpenA("MyInternetObjectName",1,NULL,NULL,NULL);//We create an object of type "Internet"
       if (hIntObj>0)
          {
             ServerName=FTPServer;//Your ftp server
             UserName=FTPUsername;//Your username you use when manually establish a ftp session
             Password=FTPPassword;//Your password you use when manually establish a ftp session
             hIntObjConn=InternetConnectA(hIntObj, ServerName, 0, UserName, Password, INTERNET_SERVICE_FTP, NULL, NULL);//We hang a FTP session on our internet object created. The session could have been a HTTP session or even a HTTPS session. See http://msdn.microsoft.com/en-us/library/aa385473(VS.85).aspx
             if (hIntObjConn>0)
                {
                   string path=TerminalPath()+"\experts\files\\"+str;
                   LocalFile=path;//The physical address in your local machine where the file to be uploaded is.
                   path=str;
                   HostFile=path;//The name of the remote file uploaded
                   Success=FtpPutFileA(hIntObjConn, LocalFile, HostFile, FTP_TRANSFER_TYPE_BINARY, NULL);               
                   //if(Success)Print("SendFTP  "+str+" Update: ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES|TIME_SECONDS));
                   if(Success==false)Print("SendFTP  error "+str+" at: ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES|TIME_SECONDS));
                }
          }
       InternetCloseHandle(hIntObj);
    return(Success);
    //----
    }
    

    Uebrigens findet jemand von euch das es besser ist mit einem anderen Protokoll zum Beispiel HTTP statt mit FTP die Dateien zu senden, in meinen Fall sind die Dateien immer Bilder vom aktuellen Kurs, also der Chart mit allen Linien usw.



  • Wie wäre es, wenn Du mal die Quelle Deiner Schnippsel angeben würdest?
    Außerdem gibst Du zuwenig Informationen: Welches Betriebssystem läuft dem Server? Welcher FTP-Server? Welche Rechte hast Du dort? Welches Verzeichnis ist dort als FTP-Stammverzeichnis eingestellt? Wo genau soll die Datei hin?

    LocalFile ist der Pfad zu Deiner lokalen Datei.
    HostFile ist der Pfad der Zieldatei auf dem Server.
    Lass Dir mal den Inhalt der Variablen kurz vor dem Versenden ausgeben, dann ahnst Du schon das Problem. Mich wundert, dass der FTP-Server nicht mit einer Fehlermeldung abgebrochen hat.
    Ich bin gerade überfragt, ob FtpPutFileA mit einem vollen Pfad zurechtkommt, aber ein Versuch wäre es wert. Probier mal '/' statt '\' und '\'. Die überwiegende Mehrzahl heutiger Windows-Programme und alle Linux-Programme kommen damit zurecht.

    Bist Du der mit den zweihunderttausend FTP-Zugriffen in zwei Tagen? 😃

    viele grüße
    ralph



  • Ja ich bin der Experte mit den 200.000 Ftp Zugriffen und dabei habe ich auch dieses Ftp programm benutzt.
    😃



  • CplusplusUser schrieb:

    Ja ich bin der Experte mit den 200.000 Ftp Zugriffen und dabei habe ich auch dieses Ftp programm benutzt.
    😃

    *ggg*, aber im Ernst: Dein Vorhaben, eine Echtzeit-Trading-Seite zu entwickeln, ist ohne Hochleistungsserver und ohne Hochgeschwindigkeitsnetz nicht zu verwirklichen.
    Stell Dir eine leere Landstraße vor: auf dieser kommst Du recht zügig mit einem Auto voran. Stell aber 200.000 Autos drauf und Du hast einen respektablen Stau.
    Damit kann ich Deine andere Frage beantworten: Um Dateien zu übertragen, ist FTP das einfachste. Wenn Du aber viele Daten übertragen willst, musst Du darauf achten, jedes überflüssige Byte zu vermeiden. Hier wäre dann HTTP besser, bei dem zum Beispiel nur die Veränderungen seit dem letzten POST übertragen werden.

    Für das Zielverzeichnis ist Zeile 20 in der obigen Funktion maßgebend.
    Lege mal unter dem FTP-Hauptverzeichis auf dem Server ein Verzeichnis 'versuch' an.
    Gib dem Verzeichnis alle Rechte (777) und verändere Zeile 20 wie folgt:

    path="versuch/"+str;
    

    Nun müsste die nächste gesendete Datei im Verzeichnis 'versuch' landen. Prüfe das nach! FtpPutFileA spuckt keinen Fehler aus, wenn es nicht geklappt hat. Wenn es geklappt hat, musst Du Dir über die Rechte des Verzeichnisses Gedanken machen: so wenig wie möglich, so viel wie nötig. Außerdem solltest Du Dir Gedanken machen, was passiert, wenn ein böser Bube dem FTP-Server eine böse Datei sendet.

    viele grüße
    ralph

    EDIT: Ach ich vergaß:

    1. Zeile 27 muss verschoben werden und zwischen Zeile 25 und 26 kommen.

    2. Zwischen Zeile 24 und 25 muss noch folgendes eingefügt werden:

    InternetCloseHandle(hIntObjConn);
    


  • Danke fuer die viele Unterstuetzung, ich versuche demnaechst das aus zu probieren.

    Ich finde da hast du natuerlich recht, wenn man was richtig gutes bauen will muss man schon genauer hinschauen.

    Aber ich stehe mit meiner zu wenig Programmiererfahrung nicht sogut da, ich kann mir solche guten Loesungen nicht selber bauen.

    Es sind bei mir immer Bilder vom Trading Chart die gesendet werden. Ich wollte auch am Anfang eine HTTP POST function bauen um die Bilder auf den Webserver zu senden statt FTP mit Passwort zu benutzen.

    Aber ich habe nichts gefunden mit HTTP POST das vom Metatrader die Dateien senden kann, zumindest nichts kostenloses und wieviel das kosten wuerde wenn jemand das programmiert weis ich auch nicht genau, aber im Moment bin ich in der Aufbauphase und kann da eigentlich keine Ausgaben mehr machen und muss sehen das ich alles kostenlos alleine baue.

    Wenn jemand irgendwie Interesse hat an den Projekt mit mir zusammen zu arbeiten um das ganze zu optimieren und schneller und stabiler zu machen, bin ich auch offen fuer sowas.


Anmelden zum Antworten