Sajnálatosan a 416-os és 418-as build verziójában súlyos, DLL fájlokkal kapcsolatos hiba van.
Mi az a DLL hívás?
A DLL hívások használata gyakorlatilag azt teszi lehetővé a robotprogramozók számára, hogy olyan funkciókat tegyenek elérhetővé a robotokban, amelyek egyébként a Metatrader programnyelve által önmagában nem lennének használhatóak vagy elérhetőek.
Ilyesfajta megoldást alkalmaznak legtöbbször a kereskedelmi forgalomban eladott robotok értékesítése során – így ha ilyen robotokat vagy indikátorokat használsz, semmiféleképpen ne frissítsd a terminálodat 416-os vagy 418-as verzióra. A 409-es verzió az utolsó, amellyel nincs ilyen jellegű probléma.
Az érintett terminálok
Jelen pillanatban leginkább a legújabb kiadást, vagyis a 418-as verziót.
Néhányan említést tettek arról is, hogy a 416-os build verziót is érinti a probléma.
A MetaQuotes fórumán már – többek közt – én is szóvá tettem a hibát, a poszt írásának idején azonban még mindig nem érkezett válasz.
Közben internetszerte (például itt, itt, és itt) bukkannak fel a problémát szóvá tevő blogbejegyzések, mivel egy-egy ismertebb robot használatát is megakadályozza a hiba.
Konkrétan milyen funkciót érint a hiba?
A hiba a 418-as build verzióban a double, azaz tört típusú változókat érinti. Amennyiben ilyen számot kér le a robot a DLL-ből, teljesen helytelen érték jön vissza.
Példa: 1.4322 helyett „-1.#IND” és„-92242943740584613000000″ a visszatérési érték.
A 416-os build verzióban állítólagosan – ezt nem tudom megerősíteni – a DLL eljárásoknak átadott változók sorrendjét érinti a hiba.
Amennyiben a robotod nem használ DLL hívásokat, akkor nincs miért aggódnod.
Mikor javítják ki a hibát?
A Metatrader gyártóján, a MetaQuotes nevű cégen múlik. Mostanában egyre többször előfordul, hogy hibás (vagyis nem eléggé tesztelt) változatot adnak ki, így nem túl sok reményt fűzök hozzá, hogy túlságosan gyorsan törnék magukat.
Mi a megoldás?
A hivatalos megoldás jelen esetben a gyártón múlik – amennyiben hallgatnak a „népre”, új kiadás formájában javítani fogják a problémát. Ideiglenes fixet jelenthet, ha:
- visszaállunk korábbi (409 -es vagy annál régebbi) Metatrader verzióra
- ha saját robotról van szó, kivesszük és helyettesítjük a DLL eljárásait natív MQL eljárásokkal, ahol double értéket érint a program (amennyiben ez lehetséges)
Üdv!
Még megoldás lehet, ha a dll-ben lévő függvényeknek egyetlen string típusú paramétere lesz.
Ahol eddig pl. három paraméterünk volt, ott összefűzzük valamilyen elválasztó karakterrel, átadjuk, és majd a dll-ben lévő függvény szétszedi és felhasználja, mint régen.
ji
Hali!
Ez nem értem, mire lenne megoldás.
Nem a paraméterek darabszámával van gond, hanem a double típussal. És ezzel is csak a 418-as változatban.
Üdv!
Te írtad: ” A 416-os build verzióban állítólagosan – ezt nem tudom megerősíteni – a DLL eljárásoknak átadott változók sorrendjét érinti a hiba.”
Ebből az következik, hogy ne legyen a sorrenddel hiba, legyen egy paraméter.
Ráadásul legyen ez string típusú, hogy a double problémát is megoldjuk.
Pld:
régi: double fv(double a, string b, double c)
meghívva: fv(1.12345,”alma”,23.5)
új: string fv(string d)
meghívva: fv(„1.12345@alma@23.5”)
Az elválasztó jel lehet pl. a „@”. Az fv elejét kell átírni, a dll-ben, hogy szétszedje különböző paraméterekre.
Nyilván egy dll-ben lévő fv, ami eddig double-el tért vissza, most string-gel fog. Mql4 oldalon konvertáljuk.
Persze, ha a dll-t nem mi írtuk, akkor ez nem megoldás.
ji
Ja, így már értem mire írtad. A megoldásod jó ötlet, de mivel az ilyen jellegű problémák jellemzően utólag derülnek ki, ezért hiába küzd az ember ilyen megoldásokkal. Hiszen lehet, hogy a 430-as változatban épp a string bemenetek/kimenetek kapcsán adnak ki valami hibát:)