Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › Kommunikáció webszerverrel
Címkézve: dll, get, kommunikáció, php, webszerver
-
SzerzőBejegyzés
-
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 (plsuccess
);Találtam erre egy megoldást; valaki készített erre libraryt, de nem akar működni:
http://codebase.mql4.com/7353Haszná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!
Megtaláltam ezt is:
http://forum.mql4.com/6778#98936Az 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.Leírom, hogy mire jutottam hajnalban.
Ez a script működik:
http://forum.mql4.com/6778#98936A 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=31200Igen á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.
É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.
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/11119A 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átItt 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; }
Köszi a kódmegosztást!
A hamarosan bejelentésre kerülő új buildben pedig már natív megoldás is lesz.
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.