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.