6 bejegyzés megtekintése - 1-6 / 6
  • Szerző
    Bejegyzés
  • Norbert
    Tag
    Bejegyzések száma: 35

    Szia!

    Szeretnék kapcsolatot létesíteni egy PHP fájl és egy EA között.
    Az lenne a legideálisabb megoldás, ha lenne arra mód, hogy MetaTraderből lehívjak egy URL-t, és a megjelenítendő „weblapot”, illetve annak forráskódját visszakapjam egy stringbe.

    Így a PHP $_GET-tel fogja megkapni az adatokat (pl http://valami.com/forex/upload.php?date=201309160228&newequity=32120), és a MetaTrader meg string-ben kap rá választ (pl success);

    Találtam erre egy megoldást; valaki készített erre libraryt, de nem akar működni:
    http://codebase.mql4.com/7353

    Használtad már, és csak én csinálok valamit rosszul, vagy ismersz esetleg valami jobb módszert erre? (A wininet boncolgatásába nem folytam még bele, valami egyszerűbb megoldást keresek, hátha.) Esetleg lehet, hogy mivel a kód 2011-es, valamiféle verzióprobléma áll fenn?

    Egy EA-n dolgozok, ami ha kész van, (ingyenesen) nyilvánossá akarom tenni. Kézzel remekül működik a stratégia, de az automatizáláshoz kellene ez az „apróság”.

    Köszönöm a segítséged!

    Norbert
    Tag
    Bejegyzések száma: 35

    Megtaláltam ezt is:
    http://forum.mql4.com/6778#98936

    Az init függvény előtt beillesztem ezt a kódot, majd:

    int init(){
       string hello = wget(URL HELYE);
       Alert(hello);
    }

    …futtatáskor Alertet nem kapok, hanem az történik, hogy a Napló kiírja: a robotot betöltötte, majd a következő üzenet azonnal: leszedte a chart-ról. Mindenféle hibaüzenet nélkül.

    Van valakinek ötlete?
    Gondolom csak valami apróságon bukik a dolog.

    Norbert
    Tag
    Bejegyzések száma: 35

    Leírom, hogy mire jutottam hajnalban.

    Ez a script működik:
    http://forum.mql4.com/6778#98936

    A robot betöltésekor engedélyezni kell a külső DLL importot (mert ugye használja wininet-et), és a parancsok végrehajtását kézi megerősítés nélkül. Emiatt nem működött nekem tegnap az EA.

    Két fontos észrevétel:
    01.: ANSI karakterkódolást kell használnia a PHP fájlnak.

    02.: Ez a script nem tud konkrét fájlt lekérni, hanem a mappában található index-et keresi, mindegy mit írsz URL-nek. Tehát http://valami.com/forex/update.php -t nem tudod behívni, mert igazából a http://valami.com/forex/index.php -t keresi. Ez nem is lenne nagy probléma.

    A baj az, hogy így nem tudsz adatot küldeni a PHP-nek.

    Fejben van már erre a megoldásom. Ha .htaccess-ben beállítod, hogy a valami.com/forex-ben belül bármilyen hivatkozást igazából a valami.com/forex/index.php-re dobja a szerver, akkor URL szétbontással el tudod érni a kommunikációt, a következőképpen:

    Például el akarod küldeni, hogy MIKOR történt tőkeemelkedés, és MENNYIRE.

    Így adnád be rendesen a PHP-nek:
    http://valami.com/forex/index.php?date=201309161313&equity=31200

    Igen ám, de a forex mappában csak simán az index.php-t akarja megnyitni.
    Viszont ha a .htaccess-ben beállítod, hogy a forex mappán belül bármilyen lekérést oda irányítson, akkor így nézhet ki a megnyitott url:

    http://valami.com/forex/201309161313/31200

    A forex mappában az index.php-val pedig a „/” jelek szerint szétszeded az URL-t egy tömbbe, és megvannak az adatok, amikkel tudsz dolgozni.

    Ezt még nem írtam meg (majd este lesz rá talán időm), csak ezt a megoldást találtam ki. Nem tudom, ennek van-e buktatója.

    Ha van jobb megoldás, azt örömmel várom. Esetleg egyszerűen csak ki kellene egészíteni a script-et, hogy konkrét fájlt le tudjon kérni… Ez lenne a legjobb.

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Én saját dll-t használok, amiben http post/get kezelés van.

    Az utóbbi kódot nem tudtam működésre bírni, igaz nem is foglalkoztam vele hosszabban. Az első általad linkelt megoldás nekem szépen működik, egy konkrét meghívott fájl tartalmát le tudtam kérdezni. Ha megmutatod, hogy hol akadtál el ezzel kapcsolatban, akkor igyekszem segíteni.

    Norbert
    Tag
    Bejegyzések száma: 35

    A 600-as build óta a fent linkelt megoldás nem működik, de találtam egy másikat, gondoltam megosztom.
    http://www.mql5.com/en/code/11119

    A használata csak ennyi:

    string result = httpGET("http://somethingsomethingsomething.com/hm.php");
    Comment(result);

    Hasznos információk:
    – érdemes megcsinálni a két apró módosítást, amit az mql fórum harmadik commentje ír
    – ha UTF-8-ban van a PHP-d, akkor BOM nélkül töltsd fel, különben az eredmény beolvasásakor találsz néhány karakternyi szemetet a string előtt
    – ha mindenképpen ékezetes karaktereket akarsz beolvasni, akkor használj ASCII kódolást
    – amikor futtatod a programod, ne felejtsd el engedélyezni a külső DLL-ek használatát

    Itt a javított kód annak, aki nem tudja hol kell módosítani.

    //+----------------------------------------------------------------------------+
    //|                                                              mql4-http.mqh |
    //+----------------------------------------------------------------------------+
    //|                                                      Built by Sergey Lukin |
    //|                                                    contact@sergeylukin.com |
    //|                                                                            |
    //| This libarry is highly based on following:                                 |
    //|                                                                            |
    //| - HTTP Wininet sample: http://codebase.mql4.com/8115                       |
    //| - EasyXML parser: http://www.mql5.com/code/1998                            |
    //|                                                                            |
    //+----------------------------------------------------------------------------+
    
    #import "wininet.dll"
    #define INTERNET_FLAG_PRAGMA_NOCACHE    0x00000100 // Forces the request to be resolved by the origin server, even if a cached copy exists on the proxy.
    #define INTERNET_FLAG_NO_CACHE_WRITE    0x04000000 // Does not add the returned entity to the cache. 
    #define INTERNET_FLAG_RELOAD            0x80000000 // Forces a download of the requested file, object, or directory listing from the origin server, not from the cache. 
    int InternetOpenW(
        string     sAgent,
        int        lAccessType,
        string     sProxyName="",
        string     sProxyBypass="",
        int     lFlags=0
    );
    int InternetOpenUrlW(
        int     hInternetSession,
        string     sUrl, 
        string     sHeaders="",
        int     lHeadersLength=0,
        int     lFlags=0,
        int     lContext=0 
    );
    int InternetReadFile(
        int     hFile,
        uchar  &   sBuffer[],
        int     lNumBytesToRead,
        int&     lNumberOfBytesRead
    );
    int InternetCloseHandle(
        int     hInet
    );       
    #import
    
    int hSession_IEType;
    int hSession_Direct;
    int Internet_Open_Type_Preconfig = 0;
    int Internet_Open_Type_Direct = 1;
    
    int hSession(bool Direct)
    {
        string InternetAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)";
        
        if (Direct) 
        { 
            if (hSession_Direct == 0)
            {
                hSession_Direct = InternetOpenW(InternetAgent, Internet_Open_Type_Direct, "0", "0", 0);
            }
            
            return(hSession_Direct); 
        }
        else 
        {
            if (hSession_IEType == 0)
            {
               hSession_IEType = InternetOpenW(InternetAgent, Internet_Open_Type_Preconfig, "0", "0", 0);
            }
            
            return(hSession_IEType); 
        }
    }
    
    string httpGET(string strUrl)
    {
       int handler = hSession(false);
       int response = InternetOpenUrlW(handler, strUrl,"",0, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD); 
       if (response == 0) 
            return(false);
            
       uchar ch[100]; string toStr=""; int dwBytes, h=-1;
       while(InternetReadFile(response, ch, 100, dwBytes)) 
      {
        if (dwBytes<=0) break; toStr=CharArrayToString(ch, 0, dwBytes);
      }
      
      InternetCloseHandle(response);
      return toStr;
    }
    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Köszi a kódmegosztást!

    A hamarosan bejelentésre kerülő új buildben pedig már natív megoldás is lesz.

6 bejegyzés megtekintése - 1-6 / 6
  • Be kell jelentkezni a hozzászóláshoz.