MQL4 könyv   CEgy szokásos program létrehozása  A megbízás méretét meghatározó függvény

A megbízás méretét meghatározó függvény

A szakmai gyakorlatban a kereskedőnek meg kell adni a lehetőséget, hogy meghatározza új megbízások kötésméretét. Eléggé nehéz létrehozni egy univerzális függvényt erre a célra, mert minden kereskedői stratégia egyedi töke menedzsmentet igényel. Például néhány stratégiában csak egy megbízást használhatunk, míg mások megengedik a meglévőkre való tekintet nélkül új megbízások nyitását. Szintén ismertek stratégiák, amelyek a különböző függőben levő megbízások menedzsmentjén alapulnak, különféle piaci és függőben levő megbízások egyidejű elérhetősége néhány esetben szintén megengedett.

Újonnan nyitott megbízások méretének a leggyakoribb számítási módszerei közül az egyik (azon stratégiák esetén, amik csak egy megbízás nyitását engedik meg egy időben) a progresszív befektetési módszer. E szerint a módszer szerint mindegyik új megbízás járulékos költsége arányos a kereskedelem pillanatában rendelkezésre álló szabad marginnal. Ha egy megbízás profittal zárul, az új megbízás megengedett összege növekszik. Ha veszteséggel zárul, a következő megbízás mérete csökken.

A lenti példában, a Lot() felhasználói függvény két alternatívát ajánl az új megbízások kötésméretének beállítására: 

1. alternatíva: A felhasználó kézzel állítja be az új megbízások lot összegét.

2. alternatíva: A megbízás lot összegét a felhasználó rendelkezésére álló pénz alapján számítjuk ki. Az új megbízásra fordítható összeg a szabad margin meghatározott százaléka.

Lot() felhasználói függvény

bool Lot()

A függvény kiszámítja az új megbízások lot összegét. A függvény végrehajtásnak eredményeképpen a Lots_New globális változó értéke megváltozik: a lot összege. A függvény visszaküldi a TRUE-t, ha a szabad margin elegendő ahhoz, hogy a minimális lot összegével kinyissunk egy megbízást, (azon a szimbólumon, amelynek ablakához az EA-t hozzácsatoltuk). Különben visszaküldi a FALSE-t.

A függvény a következő globális változók értékeit használja:

  • Lots – a felhasználó által beállított kötésméret lotban meghatározott értéke;
  • Percent - a felhasználó által a szabad margin százalékában meghatározott kötésméret.

Az üzenet megjelenítésére az Inform() adatfüggvényt használjuk. Ha az Inform() függvény nem része az EA-nak, az üzenet nem fog megjelenni.

A kötésméretet meghatározó Lot() függvényt a  Lot.mqh include fájlban valósítjuk meg:
//----------------------------------------------------------------------------------
// Lot.mqh
// The code should be used for educational purpose only.
//----------------------------------------------------------------------------- 1 --
// Function calculating the amount of lots.
// Global variables:
// double Lots_New - the amount of lots for new orders (calculated)
// double Lots - the desired amount of lots defined by the user.
// int Percent - free margin percentage defined by the user
// Returned values:
// true - if there is enough money for the minimum volume
// false - if there is no enough money for the minimum volume
//----------------------------------------------------------------------------- 2 --
bool Lot() // User-defined function
 {
 string Symb =Symbol(); // Symbol
 double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//!-lot cost
 double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Min. amount of lots
 double Step =MarketInfo(Symb,MODE_LOTSTEP);//Step in volume changing
 double Free =AccountFreeMargin(); // Free margin
//----------------------------------------------------------------------------- 3 --
 if (Lots>0) // Volume is explicitly set..
 { // ..check it
 double Money=Lots*One_Lot; // Order cost
 if(Money<=AccountFreeMargin()) // Free margin covers it..
 Lots_New=Lots; // ..accept the set one
 else // If free margin is not enough..
 Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Calculate lots
 }
//----------------------------------------------------------------------------- 4 --
 else // If volume is not preset
 { // ..take percentage
 if (Percent > 100) // Preset, but incorrectly ..
 Percent=100; // .. then no more than 100
 if (Percent==0) // If 0 is preset ..
 Lots_New=Min_Lot; // ..then the min. lot
 else // Desired amount of lots:
 Lots_New=MathFloor(Free*Percent/100/One_Lot/Step)*Step;//Calc
 }
//----------------------------------------------------------------------------- 5 --
 if (Lots_New < Min_Lot) // If it is less than allowed..
 Lots_New=Min_Lot; // .. then minimum
 if (Lots_New*One_Lot > AccountFreeMargin()) // It isn't enough even..
 { // ..for the min. lot:(
 Inform(11,0,Min_Lot); // Message..
 return(false); // ..and exit 
 }
 return(true); // Exit user-defined function
 }
//----------------------------------------------------------------------------- 6 --

A függvénynek egyszerű kódja van. Az 1-2 blokkban a globális változókat és azok visszatérési értékeit ismertetjük. A 2-3 blokkban, néhány változó értékét számoljuk ki. Számítások során a következő prioritást érvényesítjük: Ha a felhasználó egy nem nulla összegre állította be a kötésméretet, a szabad margin százalékának beállított értékét nem vesszük figyelembe. Lots és Percent külső változók leírását a  Variables.mqh fájl tartalmazza.

A 3-4 blokkban, abban az esetben végzünk számításokat, ha a felhasználó egy nem nulla értéket adott a Lots külső változónak. Ekkor a program egy ellenőrzést végez. Ha a szabad margin elegendő a beállított méretű megbízás nyitásához, akkor a Lots_New globális változó megkapja ezt az értéket és a továbbiakban ezt az értéket használjuk a megbízás méretének meghatározására. Ha a szabad margin nem fedezi ezt az összeget, akkor a lehetséges maximális kötésméretet kiszámoljuk, és a továbbiakban azt használjuk (lásd:  Matemetikai függvények).

Ha a felhasználó nem határozott meg lot méretet, a vezérlés átkerül a 4-5 blokkba. Ezekben a számításokban figyelembe vesszük a szabad margin százalékát, amit a felhasználó a Percent külső változóban beállított. A program egy ellenőrzést végez: Ha ez az érték nagyobb, mint száz (százalék), a 100-as értéket használja a számításokban. Ha a felhasználó a Percent értékét nullának határozta meg, a lot összege a dealing center által meghatározott minimális összeg lesz. Ha köztes értéket ad meg a felhasználó, akkor a program kiszámolja a megfelelő, beállítható értéket.

Az 5-6 blokkban a szükséges ellenőrzéseket végezzük. Ha a lot kiszámított összege kevesebb, mint a megengedett minimum (például nulla értéket kapunk a 4-5 blokkban, vagy a felhasználó a Percent a változó értékét túlságosan kicsire választotta), akkor a minimális megengedett értéket fogja kapni a Lots_New változó. Ezután a program ellenőrzi, hogy van-e elegendő szabad pénz a korábban kiszámított lot méretű megbízás nyitásához, (lehet, hogy kevés a számlán levő pénz). Ha a rendelkezésre álló pénz nem elég, a program bemutat egy üzenetet a felhasználónak és kilép a függvényből, a függvény a 'false' értéket küldi vissza. Ha a pénz elegendő a visszatérési érték 'true' lesz.