Radu MetaTrader a blogja | További ingyenes és hasznos eszközök MetaTraderhez | Kérdésed merült fel? Kérdezz!
MQL4 Könyv tartalomjegyzék | Stratégiák programozása MetaTrader platformra | Fogalomtár | Gyakran Ismételt Kérdések

MQL4 könyv   Beépített függvények    Általános függvények


Általános függvények

 

A leggyakrabban használt függvény a Comment().

A Comment() függvény

void Comment(...)

Ez a függvény egy, a felhasználó által meghatározott üzenetet jelenít meg az ablak bal felső sarkában. A paraméterek bármilyen típusúak lehetnek. A paraméterek száma nem haladhatja meg a 64-et. Tömbök nem lehetnek a Comment() függvény paraméterei. A tömböket elemenként kell megadni paraméterként. A double típus adatait 4 tizedes számjeggyel írja ki a függvény. Nagyobb pontosságú megjelenítésre a DoubleToStr() függvényt használjuk. A bool, datetime és színtípusokat számértékükkel fogja kiírni. A datetime típus stringként történő megjelenítésére használjuk a TimeToStr() függvényt.

Paraméterek:

 - bármilyen érték vesszőkkel elválasztva.

Példa a függvény használatára ez az egyszerű  comment.mq4 EA lehet, amellyel megjelenítjük a megbízások számával kapcsolatos információt.
//--------------------------------------------------------------------
// comment.mq4
// The code should be used for educational purpose only.
//--------------------------------------------------------------------
int start() // Special function start
{
int Orders=OrdersTotal(); // Number of orders
if (Orders==0) // If numb. of ord. = 0
Comment("No orders"); // Comment to the window corner
else // If there are orders
Comment("Available ",Orders," orders." );// Comment
return; // Exit
}
//--------------------------------------------------------------------

A programban az OrdersTotal() függvénnyel meghatározzuk a megbízások számát. Ha az Orders változó (a megbízások száma) egyenlő 0-val a Comment() függvényt a ” No orders” paraméterrel hajtjuk végre. Ha legalább egy megbízás van, Comment() függvényt vesszővel elválasztott  paraméterlistával fogjuk végre hajtani. Ebben az esetben  3 paramétert használunk: az első az ”Available” string állandó, a második az Orders változó értéke és a harmadik as ”orders” string állandó. A start() függvény mindegyik végrehajtásánál az üzenet meg fog jelenni a chart ablak felső bal sarkában. A 132. ábrán azt a variációt láthatjuk, amikor egy megbízásunk van.


132. ábra. Egy szöveges üzenet az ablak bal felső sarkban a comment script végrehajtása után.


A hangállományok lejátszására PlaySound() függvényt használjuk.

A PlaySound() függvény

void PlaySound(string filename)

A függvény egy hangállományt játszik le. A fájlnak a  terminal_directory\sounds  alkönyvtárában kell elhelyezkednie.

Paraméterek:
filename - a hangállomány elérési útja.

Néhány ajánlott hangállományt mellékeltek a programhoz  - Sound Files.

Néha a programkód írása során felmerül a felhasználóval fojtatott párbeszéd szükségessége. Az MessageBox() függvényt használjuk erre a célra.

A MessageBox() függvény

int MessageBox(string text=NULL, string caption=NULL, int flags=EMPTY)
Paraméterek:
text
a bemutatott üzenet szövege;
caption
az üzenetdoboz fejlécének szabadon megválasztható szövege. Ha ez a paraméter hiányzik, az EA neve fog megjelenni a dobozfejlécben;
flags -
szabadon megválasztható flagek, amik meghatározzák a dialógusdoboz fajtáját és viselkedését. A különböző flagek kombinálni is (lásd:MessageBox Return Codes).

Nézzünk egy példát a MessageBox() használatára!

31. feladat: Írd meg annak az EA-nak a kódját, amelyik mutat egy üzenetdobozt azzal a kérdéssel, hogy a fontos sajtóközleményt megelőzően 5 percben bezárjon-e minden megbízást. Ha a felhasználó a Yes-re kattint, minden megbízást zárni fog, ha a No-ra akkor semmilyen kereskedelmi műveletet nem hajt végre.

A felhasználóval párbeszédet fojtató EA kódja a következő (dialogue.mq4):

//--------------------------------------------------------------------
// dialogue.mq4
// The code should be used for educational purpose only.
//--------------------------------------------------------------- 1 --
#include <WinUser32.mqh>               // Needed to MessageBox
extern double Time_News=15.30;         // Time of important news
bool Question=false;                   // Flag (question is not put yet)
//--------------------------------------------------------------- 2 --
int start()                            // Special function start
  {
   PlaySound("tick.wav");              // At each tick
   double Time_cur=Hour()+ Minute()/100.0;// Current time (double)
   if (OrdersTotal()>0 && Question==false && Time_cur<=Time_News-0.05)
     {                                 // Providing some conditions
      PlaySound("news.wav");           // At each tick
      Question=true;                   // Flag (question is already put)
      int ret=MessageBox("Time of important news release. Close all orders?",
      
"Question", MB_YESNO|MB_ICONQUESTION|MB_TOPMOST); // Message box
      //--------------------------------------------------------- 3 --
      if(ret==IDYES)                   // If the answer is Yes
         Close_Orders();               // Close all orders
     }
   return;                             // Exit
  }
//--------------------------------------------------------------- 4 --
void Close_Orders()                    // Cust. funct. for closing orders
  {
   Alert("Function of closing all orders is being executed.");// For illustration
   return;                             // Exit
  }
//--------------------------------------------------------------- 5 --

A 1-2 blokkban a WinUser32.mqh fájlt illesztjük be a programba; ebben a fájlban a MessageBox() visszatérési kódokat határoztuk meg. Valamint ebben a blokkban a külső Time_news változóban beállítjuk - a fontos sajtóközlemény idejét.  Az EA végrehajtásának egész időszaka alatt a megbízások zárásával kapcsolatos kérdést csak egyszer kell feltenni. Annak  számontartására, hogy a kérdést feltettük-e már, az EA Question változót használjuk.

A start() különleges függvény mindegyik kezdésénél (a 2-3 blokkban) a PlaySound() függvényt végrehajtjuk. A lejátszott a tick.wav hang egy gyenge kattanásra hasonlít, ami egy új tick megjelenését jelzi. A programban lejátszott hangot a programozó választja meg. Néhány esetben nagyon hasznos a hangokat használni. Például egy hangjelzés jelentheti egy EA végrehajtását. Más hangok egyéb eseményeket jelezhetnek, például: kereskedési ismertetőjel megjelenése, megbízás zárása, stb.

A Time_cur változó értéke az aktuális szerveridő értékét veszi fel. Az EA-ban a párbeszéd ablak megnyitási feltételeinek elemzése történik. Ha van egy vagy több megbízásunk, és az üzenetdobozt eddig még nem jelenítette meg a program és a szerveridő valamint a fontos sajtóközlemény időpontja közötti idő kevesebb mint 5 perc, akkor bizonyos műveleteket fog végrehajtani a program. Először is a PlaySound() végrehajtása a hangjelzéssel felkelti a felhasználó figyelmét. A Question változó ”true” értéket kap (ezért nem kell többször mutatni a szövegdobozt). A következő sorban végrehajtjuk a MessageBox() függvényt:

 int ret=MessageBox("Time of important news release. Close all orders?",
"Question", MB_YESNO|MB_ICONQUESTION|MB_TOPMOST); // Message box

Ebben az esetben a beállított string állandó értéke ("Time of important news release. Close all orders?") fog megjelenni a szövegdobozban, valamint a szövegdoboz fejlécében a ”Question” érték. Az  MB_YESNO flag jelenti a Yes és No gombok  jelenlétét (lásd: MessageBox Return Values). Az MB_ICONQUESTION flag meghatározza azt az ikont, amit az üzenetdoboz bal oldali részében láthatunk, (minden működési variációnak van saját ikonja a Windows XP ikonkészletből). Az MB_TOPMOST flag meghatározza, hogy a szövegdoboz mindig látható legyen, ”mindig felül” függetlenül attól milyen programokat hajtunk végre pillanatnyilag a számítógépen. MessageBox() végrehajtása következtében a megadott paraméterekkel egy üzenetdobozt láthatunk:


Fig. 133. Dialog box displayed as a result of MessageBox() execution.

Amikor az üzenetdoboz megjelenik, a program végrehajtása megáll addig, amíg a felhasználó egy gombra nem kattint az üzenetdobozban. Amint ez megtörténik, a vezérlés át fog kerülni a MessageBox() hívását követő programsorba, ebben az esetben a 3-4 blokkba. Egy üzenetdoboznak az a tulajdonsága, hogy magánál tartja a vezérlést nagyon fontos, és ezt számításba kell venni a programfejlesztésnél. Például ha a felhasználó elhagyta a számítógépét és az üzenetdoboz ez alatt az idő alatt jelenik meg, a program válaszra fog várni és kódot nem fogja végrehajtani az alatt az időszak alatt (amíg valamelyik gombot meg nem nyomjuk).

Megjegyzés: mielőtt az üzenetdoboz megjelenik a programvégrehajtást a tickeket jelző hang kíséri. Amikor az üzenetdoboz megjelenik, azt egy másféle hang jelzi. Abban az időszakban, amikor az üzenetdoboz a válaszra várva nyitva van, nincs hangjelzés, amely jelezné, hogy a vezérlés a nyitott dialógusablak válaszára vár. Miután egy gombot megnyomtunk, a program végrehajtása folytatódni fog és a tickek hangját megint hallani fogjuk.

Ha a felhasználó a Yes-re kattint, a Close_Orders() függvényt fogja hívni a program és ez a függvény a megbízásokat be fogja zárni. A Close_Orders() függvény leírása itt nem szerepel, a végrehajtás tényét az Alert() függvény jelzi: ("Function of closing all orders is being executed."). Ha a felhasználó a No-ra kattint, a megbízásokat lezáró függvényt nem hívjuk. Az EA aktuális munkamenete alatt az üzenetdoboz nem fog megint megjelenni.

Általános függvények


Függvény
Összefoglaló információ
Alert Bemutat egy üzenetet, ami a felhasználói által meghatározott adatokat tartalmaz. Paraméterei lehetnek bármilyen típusúak. A paraméterek szám nem lehet több 64-nél.
Comment Megjeleníti a felhasználó által meghatározott üzenetet a szimbólumablak bal felső sarkában. A paraméterek bármilyen típusúak lehetnek. A paraméterek szám nem múlhatja felül a 64-et.
GetTickCount A GetTickCount() milliszekundumokban visszaadja a rendszer elindítása óta eltelt időt. A számlálót a rendszeridőzítő kapacitása korlátozza. Mivel az időt előjel nélküli egészként tároljuk, a számláló 49.7 naponként túlcsordul (lenullázódik).
MarketInfo Visszaadja a ”Piacfigyelő” ablakban lévő szimbólumokkal kapcsolatos különféle információkat. Az információ aktuális szimbólumra vonatkozó részét   előre definiált változókban tárolja  (lásd: MarketInfo() Identifiers).
MessageBox A MessageBox függvény létrehoz és megjelenít egy dialógusablakot, valamint kezeli azt. Egy dialógusablak egy fejlécet és egy program által meghatározott üzenetet tartalmaz, valamint az előre definiált ikonok és nyomógombok meghatározott kombinációját. Ha a függvényt sikeresen végrehajtjuk, a  visszatérési érték a MessageBox() függvény visszatérési kód-értékei közül az egyik lesz. A függvényt nem hívhatjuk egy egyéni indikátorból, mert az indikátorokat az interfész felületen hajtjuk végre és nem lassíthatjuk azt a válasz várásával.
PlaySound Egy hangállományt játszik le. A fájlnak a terminal_dir\sounds könyvtárban vagy annak az alkönyvtárában kell elhelyezkednie.
Print Egy bejegyzést ír az expert logba. A paraméterek bármilyen típusúak lehetnek. A paraméterek száma nem lehet több 64-nél.
SendFTP Egy fájlt küld arra a címre, amit megadtunk az Eszközök-> Beállítások -> Kiadó fülön. Ha a kísérlet nem sikerül a visszaküldött érték FALSE. A függvény nem működik tesztelő módban. Ezt a függvényt nem hívhatjuk egyéni indikátorokból. A küldendő fájlnak a terminal_directory\experts\files  mappában vagy annak almappájában kell lennie. A fájl nem kerül elküldésre, ha nincs FTP cím és/vagy hozzáférési jelszó a beállításokban megadva.
SendMail Egy e-mailt küld arra a címre, amit a Beállítások Email fülén megadtunk. Az üzenetek küldését a beállításokban kikapcsolhatjuk, vagy az e-mail címet elhagyhatjuk.
Sleep A Sleep() függvény felfüggeszti az aktuális expert végrehajtását a megadott időtartamra. A Sleep() nem hívható egyéni indikátorokból, mert az indikátorokat interfész felületen hajtjuk  végre és nem lassíthatjuk őket.