Á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é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)
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!
Feladat
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. |
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. |