MQL4 könyv    Beépített függvények  Dátum és idő

Dátum és idő

A MetaTrader 4 online kereskedő rendszer két időforrás jeleit használja - a helyi időt (PC) és a szerveridőt.

Local time – helyi idő, a PC helyi idejét használjuk.

Server time - szerveridő – a szerver idejét használjuk.

TimeLocal() függvény

datetime TimeLocal()

A függvény visszatérési értéke a PC-időnek az 1970. január a1.00:00 óta számolt értéke másodpercekben kifejezve. Megjegyzés: Teszt üzemmódban a helyi idő az utolsó ismert szerveridővel egyezik.

Az ügyfélterminálban zajló események nagy többségét a szerveridőhöz viszonyítjuk. A tickek érkezését, új bárkezdetet, a megbízás megnyitás és zárási idejét a szerveridő alapján tartjuk nyilván. Az aktuális szerveridő értékét megkapjuk, ha használjuk a TimeCurrent() függvényt:

TimeCurrent() függvény

datetime TimeCurrent()

A függvény visszaküldi a szerveridő utoljára ismert értékét (az utolsó tick idejét) az 1970. január 1-je 00:00 óta eltelt másodpercekben kifejezve. Az ügyfélterminál frissíti az utolsó szerveridőt (a többi előre meghatározott változó értékével együtt) a különleges függvények végrehajtása előtt. Mindegyik ticknek egyedi jellemzője a szerveridő értéke, azt megkaphatjuk a TimeCurrent() függvény használatával. A különleges függvények végrehajtása alatt ez az érték csak a RefreshRates() függvényhívás eredményeképpen változhat meg, és csak akkor, ha az információt a RefreshRates() függvény utolsó végrehajtása óta frissítették, vagyis az előre meghatározott változók  a szervertől új értékeket kaptak.

A Time[i] bár nyitási időpontjának nem kell egybeesnie egy új tick érkezésével. Bármilyen időkeret nyitás ideje az időkeret értékével mindig osztható. Az időkeretben megjelenő első tick megalakítja a bárt; ha egy időbeli kereten belül nem érkezi tick a bárt nem fog megalakulni az idő kereten belül.

Például, a t0 (szerver) időpontban a terminálhoz érkező tick megalakít egy bárt a Time[i+2] időpontban (143. ábra). Az időkeret kezdete nem esik egybe a t0 pillanattal, bár ez véletlenül egyezhet is azzal. Azok a következő tickek, amik ugyanazon az időkereten belül érkeznek a terminálhoz, például a t1 és t2 a bár legmagasabb vagy legalacsonyabb ár paramétereit megváltoztathatják, de nem hatnak a bár nyitási idejére. A bárzárás időpontját nem tartjuk nyilván a MetaTrader 4 online kereskedő rendszerben (formálisan az utolsó tick érkezését az időkereten belül, vagy a következő időkeret nyitási idejét tekinthetjük egy bár zárási idejének 143. ábra).


143. ábra. A bár kialakulásának folyamata a MetaTrader 4 online kereskedő platformban.

A 143. ábrán láthatjuk, hogy előfordul az az eset, hogy bárok nem alakulnak meg egy időkeretben. Így, a t5 és a t6 pillanatban érkező tickek közötti időszakban egy új időkeret kezdődött és bezárult úgy, hogy új bár nem alakult abban az időszakban. Ebben az esetben a következő bár nyitási ideje, több mint egy egész időkeret értékével különbözik a szomszédos bár megnyitásának az idejétől, de ez a különbség az időkeret értékével mindig osztható. A bárok kialakulásának a folyamatát a  timebars.mq4 EA-val tudjuk demonstrálni, ahol megfigyelhetjük a tick érkezésének és a bár megnyitásának időpontját:

//--------------------------------------------------------------------
// timebars.mq4
// The program is intended to be used as an example in MQL4 Tutorial.
//--------------------------------------------------------------------
int start() // Spec. function start()
 {
 Alert("TimeCurrent=",TimeToStr(TimeCurrent(),TIME_SECONDS),
 " Time[0]=",TimeToStr(Time[0],TIME_SECONDS));
 return; // Exit start()
 }
//--------------------------------------------------------------------

timebars.mq4 EA működésének eredményét láthatjuk a 144. ábrán. Nyilvánvaló, hogy az első tick az 1 perces időkeretben 14:29:12-kor érkezett, ugyanakkor az új bár nyitási ideje - 14:29:00. Vedd észre, hogy az üzenetdoboz jobb oldali oszlopa a szerveridőt mutatja, a bal oldali oszlop pedig a helyi időt.


Fig. 144. Bar forming sequence in the online trading system MetaTrader 4.

Abban az esetben, ha a tickek ritkán jönnek (például, az európai kereskedés vége és az ázsiai kereskedés kezdete közötti időszakban), a  timebars.mq4 végrehajtása alatt megfigyelhetünk egy érdekes jelenséget: a szomszédos bárok nyitási ideje több mint egy perccel különbözhet egymástól (egy perces időkeretben). Ugyanakkor, a bárindexek megszakítás nélkül követik egymást.

Különböző dealing centerekben levő szerverek szerverideje változhat. A kereskedés kezdeti és zárási idejét egyénileg állítják be mindegyik szerveren és ez eltérhet a kereskedési nap kezdetétől és végétől. Néhány dealing centeren például vasárnap 23:00-kor indul a szerveridő. Ezért lehetnek nem teljes napi bárok, amelyeknek a tartamuk gyakorlatilag egyenlő egy órával (145. ábra).


145. ábra. A különböző bártörténet a különböző dealing centereken.

Az MQL4-ben a dátum és időfüggvények használata meglehetősen könnyű. Néhányuk átalakítja a szerveridőt vagy a helyi időt az 1970. január 1 00:00-óta eltelt másodpercek számából nappá, órává, perccé stb. Más függvények visszaküldenek egy olyan egész számot, ami megegyezik az aktuális, órával, nappal, perccel, stb.

TimeSeconds (), TimeMinute(), TimeHour(), TimeDay(), TimeMonth(), TimeYear(), TimeDayOfWeek () és TimeDayOfYear() függvények

Ez egy olyan függvényekből álló csoport, amelyek visszaküldik a másodpercekből számított a perc, óra, nap, hónap, év, a hét napja vagy az év napja értéket. Például:

int TimeMinute(datetime time)

A függvény visszaküldi a megadott idő percekben meghatározott értékét.

Paraméterek:

time - az 1970. január 1-je 00:00 óta eltelt másodpercek száma.

int TimeDayOfWeek(datetime time)

Ez a függvény visszaküldi a hét napját (0-vasárnap,1,2,3,4,5,6) ahová a megadott időpont esik.

Paraméterek:

time - az 1970. január 1-je 00:00 óta eltelt másodpercek száma.

A szóban forgó függvényeket például bármelyik bár nyitási idejének elemzésére használhatjuk. A bigbars.mq4 EA megkeresi azt a legközelebbi bárt, amelynek a mérete nem kevesebb az előre beállított méretnél.
//--------------------------------------------------------------------
// bigbars.mq4
// The code should be used for educational purpose only.
//--------------------------------------------------------------- 1 --
extern int Quant_Pt=20;                // Number of points
//--------------------------------------------------------------- 2 --
int start()                            // Spec. function start()
  {
  int H_L=0;                          // Height of the bar
  for(int i=0; H_L<Quant_Pt; i++)    // Cycle for bars
    {
      H_L=MathAbs(High[i]-Low[i])/Point;//Height of the bar
      if (H_L>=Quant_Pt)              // if the high bar is not found
        {
        int YY=TimeYear(  Time[i])// Year
        int MN=TimeMonth( Time[i])// Month        
        int DD=TimeDay(  Time[i])// Day
        int HH=TimeHour(  Time[i])// Hour        
        int MM=TimeMinute(Time[i])// Minute
        Comment("The last price movement more than ",Quant_Pt,//Message
        " pt happened ", DD,".",MN,".",YY," ",HH,":",MM);//output
        }
    }
  return;                            // Exit start()
  }
//--------------------------------------------------------------- 3 --

bigbars.mq4 EA megkeresi a legközelebbi bárt, amelynek a magassága (a minimum és maximum értéke közti különbség) több, vagy egyenlő azzal az értékkel, amit a Quant_Pt külső változóban megadtunk. A megtalált bár dátumát és idejét a Comment() függvénnyel jelenítjük meg a pénzügyi instrumentum ablakában.

Seconds(), Minute(), Hour(), Day(), TimeMonth(), TimeYear(), DayOfWeek () és DayOfYear() függvények

Ez az olyan függvényekből álló csoport, amelynek tagjai visszaküldik az aktuális másodpercet, percet, órát, napot, hónapot, évet, a hét napját és az év napját a legutolsó ismert szerveridőkor. Az utoljára ismert szerveridő az a szerveridő, ami megegyezik a programindítás pillanatával, (bármelyik különleges függvény indítása az ügyfélterminál által). A szerveridő nem változik meg a különleges függvények végrehajtása alatt.

int Hour()

Visszaküldi az utoljára ismert szerveridő aktuális óra értékét (0,1,2,..23).

int DayOfYear()

Visszaküldi az év aktuális napját (az 1. január - december 31.ig ;1...365(6)),  vagyis  azt  a napot  amelyre  az  aktuális  szerveridő  esik.  Tesztelés  alatt a  szerveridő  értékét a program  modellezi.

timeevents.mq4 EA elvégez néhány olyan feladatot, melyeknek során megfigyelhetjük a fent említett idő függvények használatát: (Figyelem! A kód nem helyes! - a szerkesztő)

//--------------------------------------------------------------------
// timeevents.mq4
// The code should be used for educational purpose only.
//--------------------------------------------------------------- 1 --
extern double Time_Cls=16.10; // Orders closing time
bool Flag_Time=false; // Flag, there are no messages yet
//--------------------------------------------------------------- 2 --
int start() // Spec. start function
 {
 int Cur_Hour=Hour(); // Server time in hours
 double Cur_Min =Minute(); // Server time in minutes
 double Cur_time=Cur_Hour + Cur_Min100; // Current time
 Alert(Cur_time);
 if (Cur_time>=Time_Cls) // If the time for the event has come
 Executor(); //.. then perform devised actions
 return; // Exit from start()
 }
//--------------------------------------------------------------- 3 --
int Executor() // User-defined function
 {
 if (Flag_Time==false) // If there are no messages yet
 { // .. then report (1 time)
 Alert("Important news time. Close orders.");
 Flag_Time=true; // Now the message has already appeared
 }
 return; // Exit user-defined function
 }
//--------------------------------------------------------------- 4 --

A start() különleges függvényben meghatározzuk órákban és percekben a szerveridőt (2-3 blokk). Ezek a programsorok:

 double Cur_time = Cur_Hour + Cur_Min100; // Current time

képviseli az aktuális szerveridőt, amit a Cur_time változó értéke kifejez ki. A változókat az összehasonlító műveletekben kényelmesen használhatjuk:

 if (Cur_time >= Time_Cls) // If the time for the event has come

Ha az aktuális idő több vagy egyenlő Time_Cls értékével, amit a felhasználó adhat meg, akkor megtörténik az Executor() felhasználói függvény hívása. Ebben a példában a felhasználói függvény az üzenetében kereskedési ajánlásokat ad. Általában ez a függvény bármilyen kódot tartalmazhat, például kereskedhet, e-maileket küldhet, grafikus objektumokat hozhat létre, stb.

A dátum és idő függvények

Function Description
Day Visszaküldi a hónap aktuális napját, vagyis a hónap utoljára ismert nappját a szerveridő alapján.
DayOfWeek Visszaküldi a hét napjának az indexét (vasárnap-0,1,2,3,4,5,6), az utoljára ismert szerveridő alapján.
DayOfYear Visszaküldi az év aktuális napját (az első január 1, a 365(6). december 31.), az utoljára ismert szerveridő alapján.
Hour Visszaküldi az aktuális óra értékét (0,1,2,..23)  a program kezdetekor (az érték nem változik meg a program (start függvény) végrehajtása alatt).
Minute Visszaküldi az aktuális perc érték a program kezdetekor (0,1,2,..59) (az érték nem változik meg a program végrehajtása alatt).
Month Visszaküldi az aktuális hónap számát (1.-január,2,3,4,5,6,7,8,9,10,11,12) az utoljára ismert szerveridő alapján.
Seconds Visszaküldi szerveridő aktuális percének a kezdete óta eltelt másodpercek számának a program kezdetekori értékét (az érték nem változik meg a program végrehajtása alatt).
TimeCurrent Visszaküldi az utolsó ismert szerveridőt (az utolsó tick érkezési idejét), ami az 1970. január 1 00:00-óta eltelt másodpercek száma.
TimeDay Visszaküldi, hogy a megadott idő a hónap melyik napjára esik (1 - 31).
TimeDayOfWeek Visszaküldi, hogy a megadott idő a hét melyik napjára esik (0-vasárnap,1,2,3,4,5,6).
TimeDayOfYear Visszaküldi, hogy a megadott idő az év melyik napjára esik (1.január 1.,..,365(6). december 31.)
TimeHour Visszaküldi a megadott idő óra értékét.
TimeLocal A függvény visszatérési értéke a PC-időnek az 1970. január a1.00:00 óta számolt értéke másodpercekben kifejezve.
TimeMinute Visszaküldi a megadott idő perc értékét.
TimeMonth Visszaküldi a megadott idő hónap értékét. (1-január,2,3,4,5,6,7,8,9,10,11,12).
TimeSeconds Visszaküldi a megadott időponttól eltelt másodpercek számát.
TimeYear Ez visszaküldi a megadott időpont év értékét. A visszaadott érték az 1970 - 2037-es tartományon belül lehet.
Year Visszaküldi az aktuális év értékét, vagyis az utoljára ismert szerveridő évét.