MQL4 könyv   A kereskedelmi műveletek programozása  A kereskedés gyakorlati végrehajtása

A kereskedés gyakorlati végrehajtása

Minden számítás és minden más esemény, ami egy alkalmazás végrehajtása során történik, a végrehajtás helyszíne alapján két csoportba osztható: azokra, amelyeket a felhasználó PC-jében hajtanak végre, és azokra, amelyek végrehajtása a szerveren történik. Jelentős mennyiségű számítás történik a felhasználó oldalán. Ez a csoport tartalmazza az alkalmazási programok végrehajtását. A kereskedés a második csoporthoz tartozik. A kereskedés végrehajtása során adatcsere történik a szerverrel.

A kereskedéssel kapcsolatban a következő meghatározásokat használjuk:

Market order. Piaci megbízás - egy vételi vagy eladási megbízás végrehajtása az aktuális áron. A megbízást annak lezárásáig látjuk a szimbólumablakban.

Pending order. Függőben levő megbízás – egy olyan vételi vagy eladási megbízás, ami az előre beállított árszint elérésekor teljesül. A függőben levő megbízást addig látjuk a szimbólumablakban, amíg nem teljesül vagy nem töröljük.

Trade Request. Kereskedelmi kérelem- egy olyan parancs, ami kéri a megbízás végrehajtását.

Trade. Kereskedés – a megbízás nyitása, zárása vagy módosítása.

A  kereskedés  folyamatábrája

Három összetevője van a kereskedés végrehajtásának: az alkalmazási program, az ügyfélterminál és a szerver (lásd a 65. ábrát). A kereskedelmi kérés az alkalmazási programban keletkezik (mint ahogy fent megemlítettük, az alkalmazási programokat csak a felhasználó PC-jében hajthatjuk végre; alkalmazási programokat nem telepíthetünk a szerverre). A kérést, amit a program létrehozott, átadja az ügyfélterminálnak, ami a kérést tovább küldi a szervernek. A szerver fogadja a kérést és dönt a kérés végrehajtásáról vagy az elutasításról. A döntés eredményével kapcsolatos információt a szerver visszaküldi az ügyfélterminálnak, ahonnan visszakerül a programhoz.


65. ábra. A kereskedelmi kérelem diagramja.

Kereskedelmi kérelem

A kereskedelmi kérelem származhat a kereskedőtől vagy egy programtól. A kereskedőnek lehetősége van rá, hogy kereskedelmi kérelmet küldjön az ügyfélterminál „Megbízás” paneljén keresztül (lásd az ügyfélterminál leírását). A kérelmeket a program a kereskedés végrehajtására vonatkozó algoritmus alapján adja. Sehol máshol (sem az ügyfélterminálban sem a szerveren) kereskedelmi kérések spontán nem keletkeznek.

Programjellemzők

Az algoritmustól függően egy program különböző kéréseket indíthat – nyitás, zárás vagy a függőben levő megbízások módosítása. A következő kereskedelmi függvényeket használjuk egy programban a kereskedelmi kérelmekhez:

  • OrderSend() – megbízás nyitása és függőben lévő megbízás;
  • OrderClose() és OrderCloseBy() – megbízás lezárása;
  • OrderDelete() - függőben levő megbízás törlése;
  • OrderModify() - piaci és függőben levő megbízás módosítása.

A fenti kereskedelmi függvényeket csak Expert Advisorban és scriptekben használhatjuk; ezeknek a függvényeknek az indikátorokban levő használata tilos (lásd: 2. táblázat).  Van több, a kereskedelemmel kapcsolatos függvény is (lásd a Meta Editor súgót és e könyv Kereskedelmi függvények részét).

Ezek végrehajtása az ügyfélterminál információs környezetével történő együttműködésre szolgál, és nem végződik azzal, hogy kéréseket küldjenek a szerverre.

Az ügyfélterminál jellemzői

A kérés, amit egy kereskedelmi függvény végrehajtásának eredményeképpen küld a program feldolgozásra az ügyfélterminálhoz kerül. Az ügyfélterminál elemzi a kérés tartalmat és a következő két művelet közül az egyiket végrehajtja: a kérést végrehajtásra elküldi a szervernek, vagy visszautasítja a kérést és semmit nem küld a szervernek.

Az ügyfélterminál csak a korrekt kéréseket küldi el a szervernek. Például, ha a program a kódja alapján, egy nem létező árnál történő megbízásra ad kérést az ügyfélterminál nem fogja ezt a kérést elküldeni a szervernek. Ha a program helyes kéréseket küld (a megbízások nyitása és zárása a legújabb ismert árnál történik és a megbízás a dealing center által megszabott tartományon belül van), akkor ezt a kérést tovább fogja küldeni a szervernek.

Az ügyfélterminálban a kereskedés végrehajtása csak egy szálon futhat. Ez azt jelenti, hogy az ügyfélterminál egyidejűleg csak egy kéréssel foglalkozik. Ha különböző Expert Advisorok vagy scriptek az ügyfélterminállal kereskednek és valamely program egy kereskedelmi kérést küldött az ügyfélterminálnak, a többi Expert Advisor vagy script kereskedelmi kéréseit vissza fogja utasítani, amíg az ügyfélterminál befejezi aktuális kérés végrehajtását, vagyis amíg a kereskedelmi szál felszabadul.

Szerverjellemezők

A kereskedelmi eseményekkel, számlákkal kapcsolatos információk (nyíló, záró, módosító megbízások) a szerveren biztonságosa tárolva vannak és ezeknek az adatoknak a prioritása magasabb, mint az ügyfélterminálban lévő adatoké. Egy kérést, amit a szerver kap vagy végrehajt vagy visszautasít. Ha a kereskedelmi kérés végre lett hajtva (a kereskedés megtörtént), a szerver minden szükséges adat módosítást elvégzi. Ha a kereskedelmi kérést visszautasítja, a szerver nem változtat meg semmilyen adatot. A szerver kivétel nélkül minden döntéssel kapcsolatos információt átad az ügyfélterminálnak, hogy az szinkronizálja az eseményeket.

Figyelem!

Az a kereskedelmi kérés ami egy programvégrehajtás eredménye, és az a kereskedelmi kérés amit kézzel adott kereskedő a szerver szempontjából ugyanaz, a szerver nem tesz különbséget a kérések feldolgozása során.

Lehetséges, hogy a szerveroldal megtiltsa az Expert Advisornak, hogy az ügyfélterminállal kereskedjen. Ez akkor szükséges, ha a program végrehajtása konfliktusokat okoz. Például, ha egy helytelen algoritmus futtatása azzal végződik, hogy a program folytonosan nyitás és zárási megbízásokat ad, nagyon kicsi időközönként módosítja a megbízásokat (például minden ticknél), vagy ha a függőben levő megbízások nyitási, törlési vagy módosítási megbízásai túl gyakoriak.

A kereskedés folyamata

A kereskedelem végrehajtása interaktív és valós idejű módban valósul meg. A diagram (66. ábra) tartalmaz minden eseményt, ami a kereskedés végrehajtása alatt történik.


66. ábra. Az események láncolata a kereskedésben.


0. esemény: A programot a t0 pillanatban elindítjuk.

1. esemény: A t1 pillanatban a program egy kereskedelmi függvény végrehajtása következtében létrehoz egy kereskedelmi kérést. A kereskedelmi kérést átadja az ügyfélterminálnak. Abban a pillanatban a program átadja a vezérlést az ügyfélterminálnak és a program végrehajtása leáll (a piros pont a diagramban).

2. esemény:Az ügyfélterminál megkapta a vezérlést és a kérés tartalmával kapcsolatos információt. A t2 - t3 időszakban az ügyfélterminál elemzi a kereskedelmi kérés tartalmát és dönt a további eseményekről.

3. esemény:Az ügyfélterminál végrehajtja a meghozott döntését (a két alternatíva közül az egyiket).

1. alternatíva: Ha a kereskedelmi kérés, ami egy kereskedő függvény eredménye idejétmúlt vagy hibás, a vezérlés visszakerül a programba. Ebben az esetben a következő esemény a 4. esemény lesz (ez megtörténhet, ha például a program elküldött egy nyitási megbízást, ám annak a fedezet igénye meghaladja a rendelkezésre álló tőkét).

4. esemény: A program visszakapta vezérlést (t4pillanat, zöld pont) és végrehajtást folytatja attól a helytől, ahonnan a kérést korábban elindította. Ebben a pillanatban a program megkapta az információt arról, hogy a kereskedelmi megbízást nem hajtották végre. Tudomást szerezhet annak az okáról, hogy a kereskedelmi kérést miért nem hajtották végre azáltal, hogy elemezi a visszaküldött hibakódot. Lentebb be fogjuk mutatni, hogy hogyan teszi ezt. Itt csak azt kell felismerni, hogy nem minden kereskedelmi kérés végződik végrehajtással. Ebben az esetben a program egy hibás kérést küldött, ezért az ügyfélterminál visszautasította ezt a kérést, és visszaküldte a vezérlést a programba. Ebben az esetben nincs kapcsolatfelvétel a szerverrel. A t1- t2 - t3 - t4 közötti időintervallumok elhanyagolhatóan rövidek és nem nagyobbak összességükben néhány ms-nál.

2. alternatíva: Ha a program egy helyes kereskedelmi kérést indított, az ügyfélterminál ezt a kérést továbbküldi a szervernek; a következő esemény az 5. esemény lesz (t5) pillanat - a szerver meg fogja kapni a kereskedelmi kérést. A kapcsolattartás az ügyfélterminál és a szerver között az Interneten keresztül történik, ezért a kereskedelmi kérés eljutási ideje a szerverre (t3 - t5 időintervallum) teljes egészészében a kapcsolat minőségétől függ. Egy jó minőségű kapcsolat esetén ez az idő hozzávetőleg 5 - 10 ms lehet, míg egy rossz kapcsolatnál ezt másodpercekben mérhetjük.

5. esemény: t5 pillanatban a szerver megkapta a kereskedelmi kérést. A szerver visszautasíthatja vagy végrehajthatja ezt a  kérést. A döntés a végrehajtásról vagy visszautasításról a szerveroldalon egy bizonyos időszakon belül megszületik (t6 pillanat). A t5-t6 időintervallum eltarthat néhány milliszekundumtól több tucat másodpercig, a helyzettől függően. Abban az esetben, ha a szerver automatizált módban működik, gyors mozgások nincsenek a piacon és a többi kereskedő nem nagyon aktív a kereskedelmi kérést végrehajthatják vagy visszautasíthatják pár milliszekundumon belül. Más esetben, ha a szerver a kereskedők magas aktivitása miatt túlterhelt, vagy ha a végrehajtó vagy visszautasító döntés egy bróker hozza meg, a döntéshozatali idő több tucat másodperc is lehet.

6. esemény: Ha jelentős változások nincsenek az adott időintervallumon belül a piacon, vagyis attól a pillanattól, hogy a program meghozta a döntést a kereskedelmi kérésről (t1) addig a pillanatig, amíg a szerver feldolgozta a döntést (t6), a kereskedelmi kérést végre fogják hajtani. Ha a szimbólum ára ezen az intervallumon belül változott, vagy a nyitási megbízás tőkeigénye meghaladja a számla szabad tőkéjét, vagy a más akadályok történnek, akkor a szerver úgy dönt, hogy visszautasítja a kereskedelmi kérést.

Gyakori, hogy a szerver a kereskedelmi kéréseket elutasítja (annak ellenére, hogy az ügyfélterminál már ellenőrizte őket). Általában a legtöbb kereskedelmi kérést, amit kézbesítenek a szervernek, a szerver végrehajtásra elfogadja. Mindazonáltal néhány esetben egy kérést visszautasíthatnak, tehát az alkalmazási programodat úgy kell kódolni, hogy ilyen helyzetekben is megfelelően működjön.

Bármi is a szerver döntése (a kereskedelmi kérés végrehajtása/visszautasítása a 6. esemény során) az ezzel kapcsolatos információt elküldi a szerver arra az ügyfélterminálra, ami kézbesítette a kérést.

7. esemény:Az ügyfélterminál megkapta a szerver válaszát. A szerverválasz ugyanazt az utat járja e az Interneten keresztül mint a kérés amit kézbesítettek a szervernek; tehát az idő, ami a szerverválasz fogadásáig eltelik a kapcsolatminőségtől függ. A módosítások alapján, amiket a szerver végzett az ügyfélterminál vissza fogja tükrözni a megfelelő változásokat. Például, ha a szerver egy kereskedelmi kérés végrehajtása során bezár vagy kinyit egy megbízást, az ügyfélterminál megjeleníti ennek az eseménynek az eredményét a szimbólumablakban és a Terminal ablakban (a Kereskedés és Számlatörténet fülek). Ha a szerver visszautasította a kereskedelmi kérést, változások nem fognak történni az ügyfélterminál egyik ablakában sem.

8. esemény:Az ügyfélterminál befejezte a változások megjelenítését és átadja a vezérlést a programnak.

9. esemény: A program megkapta a vezérlést és továbbra is működhet.

Kérlek, jegyezd meg:

Figyelem!

Attól a pillanattól kezdve, mikor a program elküld egy kereskedelmi kérést (és egyidejűleg átadja a vezérlést) az ügyfél terminálnak, addig a pillanatig, míg ez az irányítást visszaküldik a programnak az utóbbi várakozó módban van. Műveleteket nem végez a program ez alatt az időszak alatt. A vezérlést visszaküldik a programnak, annak a függvénynek a hívás végrehajtás szabálya szerint, ami indította a kereskedelmi kérést.

Ha a kereskedelmi kérés helytelen a program nincs sokáig a várakozó üzemmódban (a t1- t4 időköz). Azonban, ha a kereskedelmi kérést az ügyfélterminál jóváhagyja és elküldi azt a szervernek, a program várakozási időszak hossza (t1-t9) más lesz és a kapcsolatminőségtől valamint a szerver döntéshozatali idejétől függően - néhány milliszekundumtól több percig is tarthat.

Amint a program visszakapja a vezérlést, továbbra is működhet. A működő program elemezheti az utolsó hiba kódját, amit visszaküldött az ügyfélterminál, és tudomást szerezz arról, hogy a kereskedelmi kérését végrehajtották vagy vissza utasították.

Konfliktusok a kereskedelmekben. 146. hiba

Amikor tárgyaltuk az ügyfélterminál jellemzőit megemlítettük azt, hogy az ügyfélterminál egy időben csak egy kérést hajthat végre. Vizsgáljuk meg, hogy milyen események fognak zajlani, ha több kérést, -amik különböző programoktól származnak- fognak küldeni az ügyfélterminálra.


67. ábra. Különböző programokból származó kérések konfliktusba kerülnek az ügyfélterminálban.


67. ábrán azt az esetet láthatjuk, amikor két Expert Advisort indítanak el egyidejűleg az ügyfélterminálon. Az EA1 a t1pillanatban indított egy kereskedelmi kérést és a t2 pillanatban átadta azt az ügyfélterminálnak.

Az EA2 szintén létrehozott egy kérést és továbbította az ügyfélterminálnak, akkor, amikor az ügyfélterminál az első kérést vizsgálja (t2 - t3 időpont). Ebben a helyzetben, az ügyfélterminál nem fogadja el az EA2 kérését, és azt vissza fogja utasítani, vissza fogja küldeni a vezérlést az EA2-nek. Jegyezd meg, azt ebben az esetben a kérést nem azért utasítja vissza az ügyfélterminál, mert a kérés helytelen, hanem azért mert a terminál a másik kérés feldolgozásával van elfoglalt. Az EA2 továbbra is működni fog. Elemezheti azt a hibakódot, ami jelzi az okot, hogy a kérést miért utasították vissza, (ez esetben ez a hibakód a 146).

Az EA2 (általános esetben egy vagy több kereskedő programunk van) átadja a kérését az ügyfélterminálnak a t1 - t4 időidőszakon belül, azután ezt a kérést vissza fogják utasítani (a rózsaszín terület eseményeinek a csoportja). Az ügyfélterminál a t4 (zöld pont) pillanatban szabaddá válik. Ettől a pillanattól kezdve, az EA2 sikeresen továbbíthatja a kérését az ügyfélterminálnak (a zöld területen lévő esemény csoport). Ezt a kérést meg fogja kapni és meg fogja vizsgálni az ügyfélterminál, ami végül visszautasíthat a helytelen volta miatt, vagy a kérést tovább küldheti a szervernek.

Ha az EA1által létrehozott kereskedelmi kérésről, az ügyfélterminál úgy dönt, hogy az helyes, ezt a kérést a t3 pillanatban el fogja küldeni az ügyfélterminál a szerverre. Ebben az esetben az ügyfélterminál várakozó módra kapcsol és nem fogad semmilyen másik kereskedelmi kérést. Az ügyfélterminál csak t9 pillanatban fog szabaddá válni, és ettől az időponttól fogad további kéréseket. A 2. alternatíva szerint az ügyfélterminál nem vizsgálja a kereskedelmi kéréseket a t1 - t9 időszakon belül. Ha ezen az időszakon belül, bármilyen program az ügyfélterminálhoz kereskedelmi kérést küld, az ügyfélterminál vissza fogja utasítani ezt a kérést és vissza fogja adni a vezérlést a programnak (a t6 - t7 időszak esemény csoportja) (rózsaszín terület). A program, amint megkapta a vezérlést, folytatja a műveleteit és elemezi a hibakódot, tudomást szerezhet arról az okról, amiért a kérést visszautasították, (ebben az esetben ez a 146. hiba).

A t9 pillanattól kezdve az ügyfélterminál, teljesen szabad lesz és fogadhat bármilyen másik kereskedelmi kérést. Az EA2 sikeresen   továbbítani tudja a kereskedelmi kérését az ügyfélterminálnak a t9 pillanatot követő időszakban. Az ügyfélterminál attól függően, hogy ez a kérés helyes vagy nem, a kérést továbbítja a szerverre vagy vissza fogja utasítani.

Az olyan hibák elemzését, amik a kereskedelem végrehajtása során történnek, később részletesen tárgyaljuk.