MQL4 könyv  Beépített függvények  Grafikus objektumok

Grafikus objektumok

A grafikus objektum egy kép a szimbólumablakban; azt kiválaszthatjuk, mozgathatjuk, módosíthatjuk vagy törölhetjük.

Grafikus objektumok lehetnek például vízszintes és függőleges vonalak, lineáris regressziós csatornák, Fibonacci szintek, téglalapok, feliratok, stb. Bizonyos alakzatok: indikátorvonalak, indikátorszintek, gyertyák, a Comment() függvény megjegyzései nem választhatók ki és nem törölhetők, azért mert nem tartoznak a grafikus objektumok közé.

A grafikus objektumokat az ügyfélterminál rajzolja a szimbólumablakba előre beállított koordinátákkal. Minden grafikus objektumnak a típusától függően van egy, két vagy három koordinátája és egyéb beállítható paramétere. Kézzel az ablakba tehetünk bármilyen grafikus objektumot (az eszköztár menüből), valamint elhelyezhetjük őket az ugyanabban az ablakban elindított Expert Advisor, script vagy egyéni indikátor végrehajtásának eredményeképpen is. A grafikus objektumok típusát és helyét módosíthatjuk kézzel vagy egy programmal ami a új koordináták és más paramétereket küldi a grafikus objektumnak.

A grafikus objektumok elhelyezésének módszere

Az MQL4-ben a grafikus objektumok elhelyezésének két módszere van: a grafikonhoz viszonyított és az ablakhoz viszonyított elhelyezés. A két módszer közti különbség bemutatására helyezzünk el kézzel két objektumot az ablakban: egy szöveget (OBJ_TEXT) és egy szöveg címkét (OBJ_LABEL). Használjuk az A és T gombokat az ügyfélterminál eszköztárán. Állítsuk be az ablakméretet a képernyőméret felére (134. ábra). Lássuk, hogy ezek a grafikus objektumok hogyan fognak reagálni az ablakméret-változásokra (és az árábra vízszintes és függőleges skálázására).


134. ábra. Grafikus objektumok egy szimbólumablakban a pozíció meghatározás különböző módszereivel elhelyezve.

A pozíció az ablakhoz rögzített

Az OBJ_LABEL grafikus objektum mozdulatlan fog maradni, ha az ablakot a jobboldali vagy az alsó szegély elmozdításával méretezzük át. De ha az ablakméretet a felső vagy a bal oldali szegély mozgatásával változtatjuk meg, akkor ezek a grafikus objektumok is elmozdulnak, de az objektumok pozíciója ezekhez a szegélyekhez képest változatlan maradi. Ez azért történik így, mert az OBJ_LABEL helyzetét az ablakhoz viszonyítjuk. Ebben az esetben a grafikus objektum viszonyítási pontja az ablak bal felső sarka. Az objektum koordinátái a referencia ponthoz viszonyítva 193 és 48 pixel (135. ábra).


135. ábra. Az OBJ_LABEL grafikus objektum beállításai.

Az objektum referencia pontja (ebben az esetben) a kurzorkeret bal felső sarkában található, amikor az egérrel az objektumot kijelöljük. A kurzorkeret bal felső sarkában láthatunk egy pontot, ennek a pontnak a pozíciója jelenti a grafikus objektum pozícióját. A szimbólum ablak többi sarkát is kijelölhetjük az objektumok referencia pontjaként.

Amikor az új bárok megjelennek az ablakban, OBJ_LABEL objektum helyzete az ablakhoz képest változatlan marad. Az ilyen objektumok kényelmesen használhatók az általános információk szöveges kijelzéséhez, például kereskedelemi megbízásokkal kapcsolatos információk, a megbízások távolságának legkisebb értéke, stb.

A pozíció a grafikonhoz rögzített

Az ablak méretének bármilyen módszerrel történő megváltoztatása, és a grafikon zoomolása nem fogja az OBJ_TEXT típusú objektumok helyzetét megváltoztatni. Az ilyen objektumok referencia pontja a kurzorkeret felső határoló vonalának a közepe, az X koordináta az idő, az Y koordináta pedig az ár (136. ábra).


136. ábra. Az OBJ_TEXT grafikus objektum beállításai.

Amikor az új bárok megjelennek az ablakban, OBJ_TEXT pozíciója a grafikonhoz viszonyítva nem változik, vagyis az új bárok megjelenésével az objektum a grafikonnal együtt el fog mozdulni balra; és egy idő után, amikor már elég bár lesz, az objektum tovább fog mozogni balra az ablakhatáron túl.

A kétféle objektumtípus helyzet-meghatározási módszere az objektumtípusok jellemző tulajdonságai és azt nem tudja megváltoztatni sem a felhasználó sem valamelyik program. A grafikus objektumok többségét az időhöz és árhoz viszonyítva helyezzük el.

Grafikus objektumok létrehozása és a tulajdonságaik megváltoztatása

A grafikus objektumok létrehozása az előre definiált objektumtípusok (lásd: A grafikus objektumtípusok és azok tulajdonságai) szimbólum ablakba helyezését jelenti. Az objektumok létrehozására a következő függvényt használjuk:

ObjectCreate() függvény

bool ObjectCreate(string name, int type, int window, datetime time1, double price1, datetime time2=0, 
double
price2=0, datetime time3=0, double price3=0)

A függvény létrehozza az előre beállított névvel és típussal rendelkező objektumot meghatározott koordinátákkal a meghatározott segédablakban. A koordináták száma az objektumtípustól függően 1-3 lehet. Ha egy objektumot sikeresen létrehozott, a függvény TRUE-t küld vissza, más esetben a visszaküldött érték FALSE. További információt kapunk a hibáról a GetLastError() függvény hívásával.

A koordinátákat idő és ár párokban kell megadni. Például az OBJ_VLINE-nak egyedül az idő koordinátára van szüksége, de árat szintén meg kell adni (bármilyen érték lehet). Az OBJ_LABEL típusú grafikus objektumoknak a függvényben megadott koordinátái figyelmen kívül lesznek hagyva, ha az ObjectSet() függvénnyel beállítjuk az OBJPROP_XDISTANCE-t és OBJPROP_YDISTANCE értékeit.

Paraméterek:

  • name – az objektum neve;
  • type - objektumtípus (egy típus az előre definiált objektumtípusok közül);
  • window - annak az ablaknak a száma, amelyik ablakhoz az objektumot hozzá fogjuk adni. A segédablakok számozása (ha indikátor segédablakok vannak) 1-el kezdődik, a fő ablak száma mindig 0; a megadott ablak számának nagyobbnak vagy egyenlőnek kell lennie, mint 0, és kisebbnek a WindowsTotal() függvény visszatérési értékénél;
  • time1 - az első koordináta idő értéke;
  • price1 - az első koordináta ár értéke;
  • time2 - a második koordináta idő értéke;
  • price2 - a második koordináta ár értéke;
  • time3 - a harmadik koordináta idő értéke;
  • price3 - a harmadik koordináta ár értéke.

    Mindegyik grafikus objektumnak vannak további (rá jellemző) beállítható paraméterei. Például a koordináták megadásán túl megadhatjuk a színt, az üzenet szöveget ( néhány objektumnál), vonalstílusokat (más objektumoknál), stb. A tulajdonságok megváltoztatásához használjuk a következő függvényt:

    ObjectSet() függvény

    bool ObjectSet(string name, int prop_id, double value)

    A függvény megváltoztatja a megadott objektum tulajdonságát. Ha ez sikerül a függvény TRUE-t küld vissza, más esetben FALSE-t. Hibainformációt a GetLastError() függvény hívásával kapunk.

    Paraméterek:

    • name – az objektum neve;
    • prop_id – az objektum tulajdonság azonosítója (az objektum tulajdonságokat jezi);
    • value - a jelezett tulajdonság új értéke.

      Minden grafikus objektumnak lehet egy felirata. Az objektumok feliratát megváltoztathatjuk az objektum tulajdonságok eszköztárán keresztül, vagy programozott módon. OBJ_TEXT-nek és az OBJ_LABEL-nek ez a felirat a fő tartalmuk és mindig látható, a többi objektum felirata az objektum közelében látható, ha a "Show object descriptions" opció ezt lehetővé teszi a tulajdonságok ablakban (F8). A feliratok megváltoztatására a következő függvényt használjuk:

      ObjectSetText() függvény

      name, string text, int font_size, string font_name=NULL, color text_color=CLR_NONE)

      A függvény segítségével megváltoztathatjuk egy objektum feliratát. A siker végrehajtás esetében TRUE-t kapunk vissza, egyébként FALSE-t. Hibainformációt a GetLastError() függvény hívásával kapunk. A font_size, font_name és text_color paramétereket csak az OBJ_TEXT és OBJ_LABEL esetén használjuk. Az egyéb típusú objektumoknál ezeket a paramétereket figyelmen kívül hagyja a terminál.

      Paraméterek:

      • name – az objektum neve;
      • text – a felirat szövege;
      • font_size – a betűméret pontokban;
      • font_name – a betűtípus neve;
      • text_color - szövegszín.

      Elemezzünk egy példa Expert Advisort, amiben a fontosabb grafikus objektum függvényeket használjuk.

      Feladat

      32. feladat: Grafikus objektumok segítségével tájékoztassuk a felhasználót a MACD alapján meghatározott kereskedési ismertetőjelekről.

      A MACD indikátort nagyon gyakran használják a kereskedők a kereskedési ismertetőjelek előállítására. Az indikátort két vonal képviseli – a fő vonal és a signal vonal. Kereskedési jelzések akkor keletkeznek, amikor a szóban forgó vonalak kereszteződnek. Ha a fő indikátorvonalat (általában szürke hisztogram) lefelé keresztezi a szignálvonal (általában piros pontozott vonal), ez egy eladási jelzés, ha felfelé - vételi. A vonalak kereszteződése közötti időben a megbízásokat nyitva kell tartani, és mikor egy ellentétes ismertetőjel keletkezik, a megbízásokat zárni kell, ugyanakkor egy szemben lévő megbízást kell nyitni. Így négy üzenettípust kell lekereskedni: Buy nyitás, Sell nyitás, Buy tartása és Sell tartása.

      Ebben a feladatban az üzenetek kölcsönösen kizárják egymást, egyszerre lehetetlen kettőt vagy több üzenet megjelenítése. Ezért ebben az esetben egy grafikus objektumot használhatunk; az objektum mindig jelen lessz a képernyő, de azt időről időre meg fogjuk változtatni. Helyezzük el ezt az objektumot annak az ablaknak a jobb felső sarkába, amiben az EA működni fog! Mivel az felirat helyzetét nem kell megváltoztatni, célszerű az OBJ_LABEL az típust használni, mert ennek a helyzete az ablakhoz viszonyítva állandó.

      Oldjuk meg a 32 feladatot a grafobjects.mq4 EA segítségével, miközben az OBJ_LABEL grafikus objektumot használjuk:
      //--------------------------------------------------------------------
      // grafobjects.mq4
      // The code should be used for educational purpose only.
      //--------------------------------------------------------------------
      int start() // Special function start
       {
      //--------------------------------------------------------------- 1 --
       int Sit;
       double MACD_M_0,MACD_M_1, // Main line, 0 and 1st bar
       MACD_S_0,MACD_S_1; // Signal line, 0 and 1st bar
       string Text[4]; // Declaring a string array
       color Color[4]; // Declaring an array of colors
       
       Text[0]= "Opening of Buy"; // Text for different situations
       Text[1]= "Opening of Sell";
       Text[2]= "Holding of Buy";
       Text[3]= "Holding of Sell";
       
       Color[0]= DeepSkyBlue; // Object color ..
       Color[1]= LightPink; // .. for different situations
       Color[2]= Yellow;
       Color[3]= Yellow;
      //--------------------------------------------------------------- 2 --
       ObjectCreate("Label_Obj_MACD", OBJ_LABEL, 0, 0, 0);// Creating obj.
       ObjectSet("Label_Obj_MACD", OBJPROP_CORNER, 1); // Reference corner
       ObjectSet("Label_Obj_MACD", OBJPROP_XDISTANCE, 10);// X coordinate
       ObjectSet("Label_Obj_MACD", OBJPROP_YDISTANCE, 15);// Y coordinate
      //--------------------------------------------------------------- 3 --
       MACD_M_0 =iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); // 0 bar
       MACD_S_0 =iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);// 0 bar
       MACD_M_1 =iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); // 1 bar
       MACD_S_1 =iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);// 1 bar
      //--------------------------------------------------------------- 4 --
       // Analyzing situation 
       if(MACD_M_1=MACD_S_0) // Crossing upwards
       Sit=0;
       if(MACD_M_1>MACD_S_1 && MACD_M_0<=MACD_S_0)// Crossing downwards
       Sit=1;
       if(MACD_M_1>MACD_S_1 && MACD_M_0>MACD_S_0) // Main above signal
       Sit=2;
       if(MACD_M_1

      Az EA 1-2 blokkjában Text[] és Color[] tömbök elemértékeit határozzuk meg. A későbbiekben ezeket a paramétereket az objektum tulajdonságainak megváltoztatására használjuk. A 2-3 blokkban létrehozzuk az objektumot és valamennyi tulajdonságát beállítjuk. Elemezzük ezt a blokkot részletesen! Ebben az EA kódrészben egy grafikus objektumot hozunk létre abban az ablakban, amiben az EA-t végrehajtjuk:

       ObjectCreate("Label_Obj_MACD", OBJ_LABEL, 0, 0, 0);// Creating obj.

      A "Label_Obj_MACD" a létrehozandó objektum neve (az objektum nevét a programozó saját belátása szerint választhatja meg). Az OBJ_LABEL az objektum típusának azonosítója, ezzel az azonosítóval választjuk ki az objektum típusát (a lehetséges  típusok listájáról). A következő három nulla közül az első azt jelenti, hogy az objektumot a fő ablakban kell létrehozni (a fő ablaknak ahol a grafikon van az indexe 0).

      A következő két nulla beállítja a létrehozandó objektum koordinátáit. E szerint a koordináták szerint fog az objektum az ablakban elhelyezkedni. Ebben az esetben a létrehozott OBJ_LABEL nem használ időt és árkoordinátákat. Jegyezd meg: az OjectCreate() leírásában csak idő és árkoordinátákat adhatunk meg. 

      Azon túl, a második és harmadik koordináta pároknak alapértelmezett értékeik vannak, míg az első koordináta párnak alapértelmezett értékei nincsenek. Ez azt jelenti, hogy bár OBJ_LABEL objektumnak egyáltalán nincs szüksége idő és árkoordinátákra, az ObjectCreate() függvényhívásban valamilyen értéket meg kell adni. Ebben az esetben nullákat írtunk, de bármilyen más értékeket írhatnak, ezeket az értékeket az OBJ_LABEL létrehozásakor nem vesszük figyelembe.

      A következő három sorban a korábban létrehozott Label_Obj_MACD néhány tulajdonságát állítjuk be:

       ObjectSet("Label_Obj_MACD", OBJPROP_CORNER, 1); // Reference corner
       ObjectSet("Label_Obj_MACD", OBJPROP_XDISTANCE, 10);// X coordinate
       ObjectSet("Label_Obj_MACD", OBJPROP_YDISTANCE, 15);// Y coordinate

      A referencia sarok (OBJPROP_CORNER) beállítása 1, ami azt jelenti, hogy koordinátákat a korábban meghatározott fő ablak jobb fölső sarkához viszonyítjuk. A referencia saroktól a távolságot pixelekben határoztuk meg : a vízszintes távolság (OBJPROP_XDISTANCE) 10 pixel és a függőleges (OBJPROP_YDISTANCE) 15 pixel. A programvégrehajtás jelen állapotában az objektumot már létrehoztuk, van azonosító neve és meghatároztuk a fő tulajdonságait.

      Azért, hogy a felirat a megfelelő szöveget jelenítse  meg, el kell végeznünk az ehhez  szükséges számításokat. A  3-4 blokkban vizsgáljuk a MACD vonalak pozícióját az aktuális és az előző bárokon, azután 4-5 blokkban a meghatározzuk a Sit változót aktuális helyzetnek megfelelően (lásd:  107. ábra és callstohastic.mq4).

      A következő sorban az aktuális helyzettől függő objektum tulajdonságokat határozzuk meg:

       // Changing object properties
       ObjectSetText("Label_Obj_MACD",Text[Sit],10,"Arial",Color[Sit]);

      Az ObjectSetText() függvény végrehajtása után, ami a felirat szövegét meghatározza, az Label_Obj_MACD objektum szövege a Text[Sit] string változó értéke lesz. Ez az érték a különböző helyzetekben más lesz, és a Sit változó értékétől függ. Például, ha a 4-5blokkban a fő vonal lefelé keresztezi a szignál vonalat, a Sit értéke 1 lesz és a grafikus objektum szövege a Text[1] tömbelem lesz: "Opening of Sell". A többi paraméter: 10, Arial és Color[Sit] betűméretet, a felirat betűinek nagyságát, típusát és színét határozza meg.

      Az EA végrehajtásnak eredménye a következőképpen fog megjelenni az EURUSD ablakban:


       137.ábra.  A grafobjects.mq4 EA végrehajtásának az ereménye a sell jelzés megjelenésekor.

      137. ábrán a főablak és egy MACD kiegészítő ablak látható. Tudjuk, hogy az EA működéséhez ennek az indikátornak a jelenléte nem szükséges, mert az EA-ban a kereskedési ismertetőjelek kiszámításához szükséges adatokat a  a technikai indikátor függvény végrehajtásával szerezzük, ami nem áll kapcsolatban az indikátor megjelenítésével. Itt az indikátort csak a kereskedési ismertetőjelek meghatározásának vizuális bemutatására indítottuk el. Az EA hasonló módon fog működni minden más kombinációnál, mindig az indikátorvonalak kölcsönös helyzetének megfelelő feliratot látjuk.

      A grafikus objektumok törlése

      A vizsgált grafobjects.mq4 Expert Advisornak van egy kis szépséghibája. Miután az EA abbahagyja működés, ez a grafikus objektum ott fog maradni az ablakban (a tulajdonságai a legutoljára kapott tulajdonságok lesznek). A grafikus objektumok nem törlődnek automatikusan. Később az "Opening of Sell" üzenet nem lesz érvényes. Azért, hogy ne tájékoztassuk félre a felhasználót, a grafikus objektumokat törölni kell.

      A grafikus objektumot a törléséhez (függetlenül attól, a program vagy a felhasználó hozta létre) egyszerűen kijelöljük és megnyomjuk a Delete gombot. Azonban a helyesen megírt programnak meg kell tisztítania az ablakot, amikor bezárják. Más szóval, egy programnak tartalmaznia kellene egy olyan blokkot, ahol minden grafikus objektumot, amit létrehozott a program, a bezárásakor letöröl.

      ObjectDelete() függvény

      bool ObjectDelete(string name)

      Töröljük a megadott nevű objektumot. Ha egy objektumot sikeresen töröl, a függvény visszaküldi a TRUE-t minden más esetben FALSE-t. Hibainformációt a GetLastError() függvény hívásával kapunk.

      Paraméterek:

      • name – a törlendő objektum neve.

      Az ObjectDelete() nagyon könnyen kezelhető: egyszerűen meg kell adni a törlendő objektum nevét.

      Az előző példa hibáját kijavítandó, adjuk hozzá a  grafobjects.mq4 EA-hoz a különleges deinit() függvényt, ahol az objektumok törlése megtörténik:
      //--------------------------------------------------------------- 7 --
      int deinit() // Special function deinit
       {
       ObjectDelete("Label_Obj_MACD"); // Object deletion
       return; // Exit deinit()
       }
      //--------------------------------------------------------------- 8 --

      Most az EA által létrehozott Label_Obj_MACD objektum törlődni fog. Általában egy program több objektumot hozhat létre. Mindegyiket ezen algoritmus szerint tudjuk törölni.

      Grafikus objektumok módosítása

      Néha szükséges lehet egy objektum helyének megváltoztatására programozási módszerrel. Nagyon gyakran ez az igény az új bárok megjelenésekor merül föl. Például, egy EA-ban kereskedési ismertetőjeleket egy lineáris regressziós csatorna alapján alakítjuk ki, amit bizonyos számú történelmi bár alapján hozunk létre (például az utolsó 50 bár). Ha egyszerűen rajzolunk egy lineáris regressziós csatornát az ablakban, az változatlan marad legfeljebb a grafikonnal együtt elmozdul balra, amikor az új bárok megjelennek. Hogy megakadályozzuk egy objektum elmozdulását, azt újra kell rajzolni mindegyik új bárnál. Ezért az objektum új koordinátáit ki kell számítani és meg kell adni, és ezekkel a koordinátákkal újra kell rajzolni a az objektumot.

      Hogy megtudjuk, az adott objektum milyen tulajdonságokkal rendelkezik, használjuk a következő függvényt:

      ObjectGet() függvény

      double ObjectGet(string name, int prop_id)

      A függvény visszaküldi a kért objektumtulajdonság értékét. Hibainformációt a GetLastError() függvény hívásával kapunk.

      paraméterek:

      • name – az objektum neve;
      • prop_id - tárgytulajdonság azonosító. Bármilyen érték lehet a tárgytulajdonságok listájáról.

      Új koordinátákat adhatunk egy objektumnak az ObjectMove() függvénnyel.

      ObjectMove() függvény

      bool ObjectMove(string name, int point, datetime time1, double price1)

      Megváltoztatja egy pont koordinátáját. Ha a műveletet végrehajtotta visszaküldi a TRUE-t, minden más esetben FALSE-t. Hibainformációt a GetLastError() függvény hívásával kapunk. Az objektum koordinátáinak a számozása 0-val kezdődik.

      Paraméterek:

      • name – az objektum neve;
      • point – a koordináta indexe (0-2);
      • time1 – az új időérték;
      • price1 - új árérték.

      Feladat

      33. feladat: Hozzunk létre egy programot (egy Expert Advisort) a lineáris regressziós csatorna rajzolásához az utolsó 50 báron.

      A lineáris regressziós csatorna létrehozásához csak két időkoordinátát használunk. Az árkoordinátákat (ha ilyeneket megadtunk a programban) az objektum létrehozása alatt nem veszi figyelembe az ügyfélterminál. A lineáris regressziós csatornát a történelmi áradatok alapján számítja ki az ügyfélterminál és ezért nem lehet megjeleníteni a diagramon kívül (indikátor segédablakban). Ezért az objektum árkoordinátája kötött (a terminál figyelmen kívül hagyja az árkoordinátákat) az az objektum saját állandó tulajdonsága. A  moveobjects.mq4 Expert Advisor kezeli a grafikus objektum pozícióját a következő kód álapján:

      //--------------------------------------------------------------------
      // moveobjects.mq4
      // The code should be used for educational purpose only.
      //--------------------------------------------------------------------
      extern int Len_Cn=50; // Channel length (bars)
      extern color Col_Cn=Orange; // Channel color
      //--------------------------------------------------------------- 1 --
      int init() // Special function init()
       {
       Create(); // Calling user-def. func. of creation
       return; // Exit init()
       }
      //--------------------------------------------------------------- 2 --
      int start() // Special function start()
       {
       datetime T2; // Second time coordinate
       int Error; // Error code
      //--------------------------------------------------------------- 3 -- 
       T2=ObjectGet("Obj_Reg_Ch",OBJPROP_TIME2);// Requesting t2 coord.
       Error=GetLastError(); // Getting an error code
       if (Error==4202) // If no object :(
       {
       Alert("Regression channel is being managed",
       "\n Book_expert_82_2. deletion prohibited.");
       Create(); // Calling user-def. func. of creation
       T2=Time[0]; // Current value of t2 coordinate
       }
      //--------------------------------------------------------------- 4 --
       if (T2!=Time[0]) // If object is not in its place
       {
       ObjectMove("Obj_Reg_Ch", 0, Time[Len_Cn-1],0); //New t1 coord.
       ObjectMove("Obj_Reg_Ch", 1, Time[0], 0); //New t2 coord.
       WindowRedraw(); // Redrawing the image 
       }
       return; // Exit start()
       }
      //--------------------------------------------------------------- 5 --
      int deinit() // Special function deinit()
       {
       ObjectDelete("Obj_Reg_Ch"); // Deleting the object
       return; // Exit deinit()
       }
      //--------------------------------------------------------------- 6 --
      int Create() // User-defined function..
       { // ..of object creation
       datetime T1=Time[Len_Cn-1]; // Defining 1st time coord.
       datetime T2=Time[0]; // Defining 2nd time coord.
       ObjectCreate("Obj_Reg_Ch",OBJ_REGRESSION,0,T1,0,T2,0);// Creation
       ObjectSet( "Obj_Reg_Ch", OBJPROP_COLOR, Col_Cn); // Color
       ObjectSet( "Obj_Reg_Ch", OBJPROP_RAY, false); // Ray
       ObjectSet( "Obj_Reg_Ch", OBJPROP_STYLE, STYLE_DASH);// Style
       ObjectSetText("Obj_Reg_Ch","Created by the EA moveobjects",10);
       WindowRedraw(); // Image redrawing
       }
      //--------------------------------------------------------------- 7 --

      moveobjects.mq4 EA algoritmusa olyan, hogy az objektum, amit egyszer létrehoztunk a programvégrehajtás egész ideje alatt a képernyőn fog maradni. Ilyen esetben célszerű egy felhasználói függvény (ebben az esetben ez a Create() a 6-7 blokkban) használata az objektum létrehozására, és az a programból szükség esetén bármikor hívható. Az objektum felrajzolásához két időkoordináta megadása szükséges (T1 az objektum bal szélének, T2 pedig a jobb szélének az időkoordinátája):

       datetime T1 = Time[Len_Cn-1]; // Defining 1st time coord.
       datetime T2 = Time[0]; // Defining 2nd time coord.

      Ebben a példában az objektum jobb oldali határának mindig a null báron kell lennie, a második koordináta értékét a null bár nyitási idejéhez viszonyítjuk. A bal oldali koordinátát a felhasználó által beállított bárok száma (külső Len_Cn változó) alapján számoljuk ki, a megfelelő bár indexből meghatározzuk a bár nyitási idejét. Például, ha a csatorna hossza 50 bár, a bal oldali koordináta egyenlő lesz a 49-es indexű bár nyitási idejével.

      A Create() felhasználói függvény további soraiban az ObjectCreate() függvény segítségével létrehozzuk az OBJ_REGRESSION objektumot és az ObjectSet() függvénnyel beállítjuk a szükséges tulajdonságait (a külső változóban előre beállított színt , a rajzolás módját és a vonalstílust). Ebben a sorban:

       ObjectSetText("Obj_Reg_Ch","Created by the EA moveobjects",10);

      egy szöveges leírását adunk az objektumhoz. A korábban elemezett OBJ_LABEL-lel ellentétben az OBJ_REGRESSION szöveges leírása nem látható. A grafikus objektumok szöveges leírását megnézhetjük az objektum tulajdonságok fülén. Ez a gyakorlatban nagyon kényelmes, mert megkülönböztethetjük a kézzel és a programmal létrehozott objektumokat:


      138. ábra. A moveobjects.mq4EA által létrehozott ”lineáris regressziós csatorna” grafikus objektum általános tulajdonságai.

      Egy további függvényt alkalmazunk az aktuális ábra újra rajzolásához:

       WindowRedraw(); // Image redrawing

      WindowRedraw() függvény

      void WindowRedraw()

      A függvény erőszakosan újrarajzolja az aktuális ábrát. Általában az objektumok paramétereinek megváltoztatása után használjuk.

      Általában a grafikus objektumokat az ügyfélterminál az új tick érkezésekor rajzolja meg. Ezért ha nem használjuk a WindowRedraw() függvényt, az objektum paraméterekben bekövetkező változások csak a következő ticknél válnak láthatóvá a felhasználó számára, vagyis a rajzolás mindig egy ticket késik. A WindowRedraw() használata lehetővé teszi, hogy erőszakosan újrarajzoljunk minden objektumot közvetlenül a tulajdonságai megváltoztatása után. Ha több objektum tulajdonságait is megváltoztattuk a programban, elegendő csak egyszer használni a WindowRedraw() függvényt, az utolsó objektum tulajdonság megváltoztatása után.

      A felhasználói függvényt először a különleges init() függvényből hívjuk. Amikor az EA-t csatoljuk a szimbólumablakhoz, az init() végrehajtása elkezdődik, melynek során a lineáris regressziós csatorna megjelenik a szimbólumablakban.

      Két lehetséges helyzetet vizsgálunk a start() függvényben: (1) az objektumot időközben törölte a felhasználó (3-4 blokk) és (2) az objektumot jobbra kell mozgatni, amikor egy új nulla bár kezdődik (4-5 blokk). A grafikus objektum meglétét úgy érzékeljük, hogy kérjük az egyik koordinátájának az értékét. Ha a tárgy létezik, az ObjectGet() függvény  vissza fogja küldeni a kért koordináta értékét, a GetLastError() függvény pedig nulla értéket fog visszaküldeni (nem történt hiba a koordináta kérésekor). Azonban, ha a nevezett objektum nincs a szimbólumablakban, a GetLastError() függvény 4202 hibakódot fog vissza küldeni, az objektum nem létezik:
       T2=ObjectGet("Obj_Reg_Ch",OBJPROP_TIME2); // Requesting t2 coord.
       Error=GetLastError();  // Getting an error code

      Ha a hibaelemzés jelzi, hogy az objektum nem létezik, akkor a programnak létre kell hoznia azt, és a felhasználó helytelen beavatkozásáról üzenetet küld (a program nem töröl objektumokat, ezért azt csak a felhasználó törölhette). Az üzenet küldése után a program hívja a korábba említett Create() felhasználói függvényt, ami az objektumot újra létrehozza a szimbólumablakban.

      A következő blokk (4-5) végrehajtásának a kezdetén a grafikus objektum már létezik. Hogy eldöntsük, kell-e azt mozgatni, ismernünk kell az aktuális pillanatban az objektum pozícióját. E céléból elegendő elemezni az objektum első koordinátájának a korábban szerezett értékét. Ha ez az érték nem esik egybe a null bár megnyitás idejével, új koordinátákat kell adni az objektumnak.

      A koordinátákat az ObjectMove() függvénnyel változtatjuk meg:

       ObjectMove("Obj_Reg_Ch", 0, Time[Len_Cn-1],0); //New t1 coord.
       ObjectMove("Obj_Reg_Ch", 1, Time[0], 0); //New t1 coord.

      Itt, az Obj_Reg_Ch első koordinátája (0 koordináta) a Time[Len_Cn-1] értékét fogja kapni, míg a második koordináta a Time[0] értéke lesz Az ObjectMove() függvényben az  árkoordinátákat is meg kell adni, amelyeknek itt 0 értéket adtunk. Ezeket az ár paramétereket a függvényleírás szerint meg kell adni, de ebben az esetben ezeket figyelmen kívül fogja hagyni az ügyfélterminál. Ezen két programsor végrehajtása után a szóban forgó grafikus objektum tulajdonságai meg fognak változni. A WindowRedraw() függvény következő végrehajtása következtében az objektumot erőszakosan újra fogja rajzolni az ügyfélterminál - a koordináták új értékei szerint.

      Így, a start() függvény végrehajtása során a lineáris regressziós csatorna grafikus objektumot újra fogja rajzolni az ügyfélterminál minden új bár legelső tickjénél (lásd a 139. ábrát). Miután az EA végrehajtása véget ért, az adott grafikus objektumot a deinit() különleges függvény végrehajtása törölni fogja a szimbólumablakból (a program ki fogja ”söpörni” a munkahelyét, miután a munkát befejezte).


      139. ábra. A lineáris regressziós csatorna a moveobjects.mq4 EA végrehajtásakor.

      Általános esetben valamennyi grafikus objektumot törölhetünk és létrehozhatunk a programban kiszámolt paraméterekkel. Jelezhetjük a támasz/ellenállás vonalakat (OBJ_TREND), függőleges vonalakkal jelezhetjük a fontos események közeledtét (OBJ_VLINE), előre vetíthetjük a jelenlegi ármozgásokat, feliratokat használhatunk (OBJ_LABEL és OBJ_TEXT), stb.

      Azonban tudni kell, sok esetben nem szükséges grafikus objektumokat használni. Például, ha nagyszámú azonos karaktert kell a képernyőn elhelyezni (például, nyilak), erre a célra használhatjuk az indikátorvonalak megfelelő módon beállított stílusait. Ez a megközelítés meg fog szabadítani a sok objektum koordinátájának kezelésétől, és megakadályozza a képek véletlen törlését (azokat a jeleket, amelyeket az indikátorok hoznak létre, nem lehet se kiválasztani se törölni).

      Függvények a grafikus objektumokkal végzett munkához

      Függvény Összefoglaló információ
      ObjectCreate A függvény létrehozza az előre beállított névvel és típussal rendelkező objektumot, meghatározott koordinátákkal, a meghatározott segédablakban. A koordináták száma az objektumtípustól függően 1-3 lehet. Ha egy objektumot sikeresen létrehozott, a függvény TRUE-t küld vissza, más esetben a visszaküldött érték FALSE.
      ObjectDelete A megadott nevű objektum törlése. A sikeres végrehajtás esetén a függvény TRUE-t küld vissza, minden más esetben FALSE-t.
      ObjectDescription A függvény visszaküldi az objektum leírását. Az OBJ_TEXT és OBJ_LABEL típusok esetén a kiírt feliratot küldi vissza.
      ObjectFind A függvény megkeresi, hogy melyik ablakban van az adott objektum. A függvény visszaküldi az ablak indexét, ahol az objektumot megtalálta. Ha nem találja meg akkor -1-et küld vissza.
      ObjectGet A függvény visszaküldi az objektum adott tulajdonságának az értékét.
      ObjectGetFiboDescription A függvény visszaküldi a Fibo szintek leírását. A szintek száma attól függ, hogy az objektum melyik Fibo csoporthoz tartozik. A szintek maximális száma 32.
      ObjectGetShiftByValue A függvény kiszámítja és visszaküldi annak a bárnak az indexét (az aktuális bárhoz viszonyítva) ahol az objektum árkoordinátája a megadott árral egyezik. A bárindex kiszámítását az első és második koordinátákra felállított elsőfokú egyenlettel végzi. A trendvonalakra és hasonló objektumokra használhatjuk.
      ObjectGetValueByShift A függvény kiszámítja és visszaküldi az adott indexű báron (az aktuális bárhoz viszonyítva) az árkoordinátát.  Az árérték kiszámítását az első és második koordinátákra felállított elsőfokú egyenlettel végzi. A trendvonalakra és hasonló objektumokra használhatjuk.
      ObjectMove Megváltoztatja egy objektum valamely koordinátáját a charton. Az objektumok helyzetét meghatározó pontok száma 1-3 lehet az objektum típusa szerint. Ha a végrehajtás sikerül TRUE-t küld vissza, ha nem akkor FALSE-t.
      ObjectName A függvény az objektum sorszáma alapján visszaküldi az objektum nevét az objektum listából.
      ObjectsDeleteAll Töröl minden adott típusú objektumot a megadott ablakból, vagy segédablakból. A függvény visszaküldi a törölt objektumok számát.
      ObjectSet A megadott objektum valamely tulajdonságának megváltoztatása. A siker esetén a függvény visszaküldi a TRUE-t , egyéb esetben FALSE-t.
      ObjectSetFiboDescription A függvény új leírást ad a Fibo szintnek. A szintek száma függ Fibonacci objektum típusától. A szintek száma max. 32 lehet.
      ObjectSetText Megváltoztatja az objektum leírását. Az OBJ_TEXT és OBJ_LABEL leírását szövegként megjeleníti az ábrán. A siker esetén a függvény TRUE-t küld vissza, más esetben FALSE-t.
      ObjectsTotal Az ábrán lévő adott típusú objektumok számát küldi vissza.
      ObjectType A függvény visszaküldi a jelezett objektum típusát.