Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › String globális változó?
Címkézve: globális változó
-
SzerzőBejegyzés
-
Szia Radu,
Szeretnék Terminálon belül a robotok között string alapú adatcserét biztosítani, de nagy sebességgel(fájlt ezért nem erőltetem). A global változó csak double lehet. Hogyan tudok hasonló módon string adatot tárolni? A globális változó azért jó itt, mert azt tárolja a rendszer és ha netán újraindul a MT4 akkor is visszatölti. Van valami ötleted? A Windows SDK ESENT könyvtára jó lehetne, de ahhoz, meg nem találtam példát, hogyan tudom bepakolni MT4 alá.
köszi!!
Dani
A végső cél az, hogy ne kösse be a robot ugyanazt a jelet kétszer. A robot fut ugyanazon a devizapáron több idősíkon is és meg kell oldanom, hogy tudjanak róla, ha az egyik már megtalálta a jelet, amit a másik is éppen bekötne.
A több idősíkra történő elkülönített GV adatmentést én úgy szoktam megoldani, hogy külön hozok létre a magic számokon belül idősík-adatokat: pl. ha a robot neve ‘robot’, akkor a következő gv neveket adom:
- _robot_EURUSD_90_M1_
- _robot_EURUSD_90_M5_
- _robot_EURUSD_90_M15_
- _robot_EURUSD_90_M30_
- stb.
A robot a robotneve, az EURUSD az instrumentum, a 90 a magic szám.
Ezen felül még odafigyelek arra is, hogy egy plusz _t szövegrészt adok hozzá a GV névhez akkor, ha IsTesting módban vagyunk. A neveket az OnInit() eljárásban gyártom le, szuperglobális stringekben tárolom és természetesen – amennyiben backtesztről van szó – OnDeInit() -ben törlöm az érintett GV-ket.
String adatok tárolását ezen túlmenően régen szintén GV-vel, mostanában ezzel oldom meg. MQL5-re készült, de minimális (tényleg!) munkával MQL4 alatt is csodálatosan működik.
A ‘régen gv-ben tároltam a stringeket’ alatt arra gondolok, hogy a globális változó nevében gyakorlatilag kis túlzással bármilyen karakter előfordulhat. Definiáltam egy alap sablont, amire lehet matchelni a ciklusos ellenőrzéssel, utána pedig had’ szóljon. Például: a feladat az volt, hogy egy fő instrumentumon futtatott robot további instrumentumokon kössön pozíciót. A bevont alinstrumentumok nevei folyamatosan változtak, azokat muszáj volt GV-ben tárolni. Így az alap változónév – a fenti példa alapján – _robot_EURUSD_90_pozicio_ volt, az adatokat így tároltam:
_robot_EURUSD_90_pozicio_EURUSD_
_robot_EURUSD_90_pozicio_GBPUSD_
_robot_EURUSD_90_pozicio_EURJPY_A GV-k értékeiben további hasznos double adatot lehetett tárolni. Volt, hogy oda raktam pl. az érintett robot magic számát, hogy még egyszerűsítsek a keresésen.
Ez utóbbi helyett ma már az INI megoldást választanám.
köszi!! Named Pipe-ot használtál már MT4 alatt?
#import "kernel32.dll" //http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx int CreateNamedPipeW(string PipeName,int dwOpenMode,int dwPipeMode,int nMaxInstances,int nOutBufferSize,int nInBufferSize,int nDefaultTimeOut,int lpSecurityAttributes); int CreateNamedPipeA(string PipeName,int dwOpenMode,int dwPipeMode,int nMaxInstances,int nOutBufferSize,int nInBufferSize,int nDefaultTimeOut,int lpSecurityAttributes); int ConnectNamedPipe(int hPipe, int lpOverlapped); int CallNamedPipeW(string PipeName, string outBuffer, int outBufferSz, uint& inBuffer[], int inBufferSz, int& bytesRead[], int timeOut); int CallNamedPipeA(string PipeName, string outBuffer, int outBufferSz, uint& inBuffer[], int inBufferSz, int& bytesRead[], int timeOut); int ReadFile(int hPipe, int& inBuffer[],int NumberOfBytesToRead, int& bytesRead[], int lpOverlapped); int WriteFile(int hPipe, string sBuffer, int NumberOfBytesToWrite, int& bytesWritten[], int lpOverlapped); int FlushFileBuffers(int hPipe); int DisconnectNamedPipe(int hPipe); int CloseHandle(int hPipe); #import
Egyszer asszem nézegettem, de nem alkalmaztam – nem emlékszem már, miért. Van MQL4/MQL5 lib is belőle a Codebase-n, nézz körbe arrafelé!
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.