Hozzászólások

15 bejegyzés megtekintése - 1-15 / 24
  • Szerző
    Bejegyzés
  • Norbert
    Tag
    Bejegyzések száma: 35
    Hozzászólás: Saját DLL #5162

    Visual Studio-val nekem is rendesen működik, a fenti linken pontos leírás van hozzá. Kell hozzá a def file, igen. A kérdés az lett volna, hogy G++ al konzolból hogyan fordítok; gondolom egy parancs lenne hozzácsapni a def-et, de valahogy sehogy nem akart működni.

    Bár kicsit zavar, de el tudom fogadni: amikor DLL-re van szükségem (azóta nem is kellett) én is Visual Studio-t használok.

    Norbert
    Tag
    Bejegyzések száma: 35
    Hozzászólás: Saját DLL #5061

    Visual Studio-val (Visual C++) egyébként működik, de nem tudom mit varázsol a háttérben, így nem tudom kiadni a megfelelő parancsot a compilernek. Mindenesetre Visual Studioval így csinálsz MetaTrader által is ehető DLL-t:

    (nem működő link)

    Norbert
    Tag
    Bejegyzések száma: 35

    Tényleg szar, dobtam.
    Köszönöm!

    Norbert
    Tag
    Bejegyzések száma: 35

    Arra is gondoltam, hogy ugyanaz a problémám mint a hosszabb távú backtestnél: olyan chartokról akarok adatot szedni amiket valójában soha nem nyitottam meg a MetaTraderben, vagyis gyakorlatilag semmi gyertyaadatom nincs. Tehát elvileg csak rá kell venni a termált, hogy szerezze be azokat a gyertyaadatokat, amiknek megfelel a szimbólum-idősík tömb kettős.

    Lehet, hogy ez még tovább gyorsítana rajta, de ettől függetlenül is érthetetlen, hogy második-harmadik nekifutásnál miért megy döcögve, ha elsőre gond nélkül megcsinálja egy másodperc alatt.

    Azt tartom valószínűnek, hogy minden iCustomnál újra „felcsatolja” magának az EA, de közben otthagyja a régit is, így minden vizsgálatkor ArraySize(data)*ArraySize(tf) darab indikátorral többet kell a memóriában eltárolni és nem mellesleg újraszámolni.

    Tehát tényleg csak azt kellene elérni, hogy miután használtam az indikátort, azonnal kilőjem a memóriából.

    Norbert
    Tag
    Bejegyzések száma: 35

    Minimálisat gyorsított a folyamaton, hogy az iCustom függvényhívásnál a változókat előre konvertálva úgy adom át, ahogy azt az indikátor várja.

    double(var1), int(var2), bool(var3), ...

    Egyéb ötlet?

    Norbert
    Tag
    Bejegyzések száma: 35

    Találtam egy ilyet:
    http://forum.mql4.com/48398#643743

    Oké, backtestre jogos, erre nem figyeltem: nincs meg minden timeframe-em.
    Viszont a chartra helyezésnél attól még nem kellene lelassulnia és második lekérésnél megenni a processzort.

    Ha nincs más megoldás, az is megfelelne, ha sikerülne valahogy teljesen kiirtani a memóriából az indikátort a vizsgálatom végén. Lényegében reprodukálnám azt az állapotot, amikor először indítom el az EA-t.

    Norbert
    Tag
    Bejegyzések száma: 35

    Sikerült működésre bírni, köszönöm!

    Viszont utána rájöttem, hogy mégsem kell az egész EA-t átírni, mert nagy nehezen feltűnt, hogy ilyen számlákon nem csak „EURUSD”, hanem „EURUSD.” chart nyitását is felajánlja a MetaTrader. Azon pedig működik az eredeti kódom is, amit eddig használtam.

    Norbert
    Tag
    Bejegyzések száma: 35

    Köszönöm, tényleg ez volt a baj első körben, egy if-fel validáltam ezt a „.” dolgot.

    Elkezdtem viszont más hibaüzenetet kapni.

    Az alábbi teszt script eredménye:
    ticket: -1
    lasterror: 129

    void start(){
       string symbol=Symbol();
       if(StringLen(symbol)==6) symbol+=".";
       string minlot=MarketInfo(symbol,MODE_MINLOT);
       int magic=0;
       
       RefreshRates();
       int ticket=OrderSend(symbol,OP_BUY,StrToDouble(minlot),Ask,3,NULL,NULL,NULL,magic,NULL,"LimeGreen");
       Alert(ticket+" || " + GetLastError());
    }

    Hogy lehet invalid price (129), amikor a MarketInfo-t használja az Ask? Próbáltam így is:

    int ticket=OrderSend(symbol,OP_BUY,0.1,NormalizeDouble(Ask,Digits),3,NULL,NULL,"",magic,0,"LimeGreen");
    

    Érdekes, hogy az eddigi éles és demo számlákon az elmúlt 2 évben soha nem volt ezekkel probléma.

    Norbert
    Tag
    Bejegyzések száma: 35

    GetLastError() = 133

    Norbert
    Tag
    Bejegyzések száma: 35

    Elképesztő, hogy MQL4-ben is van „delete”, de „add” már nincs :D
    http://docs.mql4.com/chart_operations/chartindicatordelete

    Mondjuk ez is sántít egy kicsit: megvárja a következő tick-et, mire végre is hajtja a delete parancsot.

    Norbert
    Tag
    Bejegyzések száma: 35
    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;
    }
    Norbert
    Tag
    Bejegyzések száma: 35

    Pesten vagyok, elsősorban egyetemi hallgató, közel 0 óra szabadidővel. (Pont emiatt fordulok meg a fórumon leginkább nyáron és télen.) De egy szegedi barátomnak megígértem, hogy hamarosan elugrom hozzá, akkor összefuthatunk. Vagy ha véletlen vasárnap járnál Pesten, szólj :)

    Norbert
    Tag
    Bejegyzések száma: 35

    Köszönöm a választ!
    Néhány millió volt a terv, de pár száz ezer forinttal mindenképpen indítottam volna. Szóval köszönöm. Most már tényleg kezd esedékessé válni valamiféle sörkérdés.

    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.

15 bejegyzés megtekintése - 1-15 / 24