Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › Univerzális képlet
-
SzerzőBejegyzés
-
Hali Radu,
Még egy kérdés hirtelenjében: van-e valamilyen univerzális képlet, amivel brókerfüggetlenül meg tudod állapítani egy instrumentumról, hogy milyen értékkel osszál/szorozzál, hogy korrekt értéket kapjál, amikor a point-ból pip-re akarsz váltani.
Tudom, ez kicsit zagyvának tűnik, de írok példát:
Ez a kód:double Spread=MarketInfo(Symbol(),MODE_SPREAD)/Divider;
az egyik brókernél helyes értéket ad a spread pip-értékére vonatkozóan, a másiknál viszont nem.
Pl. az egyiknél a DAX spread-je 1.0 pip, a másiknál 0.1 pip.
A Divider meghatározásánál a Digits()-ből indultam ki.Szia!
Ezt próbáld meg:
double Spread=MarketInfo(Symbol(),MODE_SPREAD)/MarketInfo(Symbol(),MODE_POINT);
Szia, köszi, de sajnos ez így teljesen rossz.
Bocs csak fejből írtam. Nem emlékeztem rá, hogy a MODE_SPREAD mit is ad vissza. Az oszás helyett szorozni kell.
MarketInfo(Symbol(),MODE_SPREAD) * MarketInfo(Symbol(),MODE_POINT)
Nem, sajna így sem jó. Ennél összetettebb ez a probléma. Ennek, amit írtál, az eredménye pl. EURUSD esetén 0.00003.
Pipben akarom megkapni a spread-et egy olyan képlettel, ami minden instrumentre, minden körülmények között helyes eredményt ad. Jelenleg bróker-specifikus barkácsmegoldásaim vannak.Forex párok esetén ez viszonylag könnyű, megnézem hány digites, és van-e benne JPY. Ez alapján el tudom dönteni, hogy mennyi a Divider. De egyéb instrumenteknél ez már gázos.
Jó úton jársz. Tulajdonképpen neked FOREX instrumentumok esetén egy multiplier (szorzó) kell, a többi instrumentum (DAX, SP500, indexek, FUTURES-ök, stb.) pedig divider. Azért multiplier, mert te pipben várod az inputokat a felhasználótól, és azokat felszorzod majd a szorzó és a point értékével annak érdekében, hogy a programod és a brókercég számára alkalmas szám jöjjön ki. (Ez persze oda-vissza működik, vagy szorzol, vagy osztasz)
Én a következőképpen dolgozom:
- 2 vagy 4 digites párok esetén a multiplier értéke = 1 (0.0001 / 0.0001 / 1 = 10)
- 3 vagy 5 digites párok esetén a multiplier értéke = 10 (0.00010 / 0.00001 / 10 = 10)
- 0 vagy 1 digites párok esetén a multiplier szintén 1 (0.1 / 0.1 = 1)
Divideres korrekció pedig ott szükséges, ahol a traderi gondolkodás eltér a legkisebb elmozdulási egységtől. Pl. DAX. Ott minden trader 1 kerek egészben gondolkodik, vagyis hogy ha 1055.0-ról 1056.0-ra mozdul az ár, akkor azt mondják: „1 daxot ment arrébb a piac”. Itt a pip szó használata több félreértést okoz (persze lehet erőltetni, de minek).
A robotodban ezért a legkisebb elmozdulási egységgel osztod a különbséget ugye alapból: (1056.0 – 1055.0) / 0.1 = 10. Tehát kijön, hogy itt 10-zel kell osztanod a kapott értéket ahhoz, hogy traderi gondolkodáshoz alkalmas szám jöjjön ki.Univerzális szabály: a traderi nyelv egységértékét elosztod a legkisebb elmozdulás egységével, vagyis DAX esetén 1 tizedes pontosságnál: 1 / 0.1 = 10. Ugyanez származtatott terméknél két tizedesjegynél: 1 / 0.01 = 100.
Természetesen figyelembe érdemes venni a további számítások során a ticksize-t is, vagyis hogy az ár mennyivel változhat minimum értékként (pl. ha ticksize 0.5, akkor csak ötösre és nullára végződhet az ár).
Lehet, hogy van ennél jobb módszer is, de automatikusan lekérdezhetőről nem tudok – rengeteg bróker van, és a cél az, hogy mindenhol tudd használni a programot. Bedrótozni soha nem drótozok semmit.
Most fogom átolvasni amit írtál, addig is bemásolom, amit használok:
dig=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS); switch(dig) { case 1: {Divider=100.0;} break; case 2: { if(StringFind(Chart_Symbol,"GER")>-1 || StringFind(Chart_Symbol,"DE30")>-1 || StringFind(Chart_Symbol,"US30")>-1 || StringFind(Chart_Symbol,"US500")>-1 || StringFind(Chart_Symbol,"USTEC")>-1 || StringFind(Chart_Symbol,"HK50")>-1 || StringFind(Chart_Symbol,"UK100")>-1 || StringFind(Chart_Symbol,"STOXX50")>-1 || StringFind(Chart_Symbol,"JP225")>-1) { Divider=100.0; } else if(StringFind(Chart_Symbol,"XAU")>-1 || StringFind(Chart_Symbol,"GOLD")>-1) { Divider=10.0; } else { Divider=1.0; } } break; case 3: { Divider=10.0;} break; case 4: { Divider=1.0;} break; case 5: { Divider=10.0;} }
Ezt kéne univerzálissá tenni, hogy ne legyen ilyen barkács.
Mod: Chart_Symbol helyére természetesen Symbol()-t érts (elfelejtettem átírni, de nem lényeges).Huhh, elolvastam, itt egy picit bevittél a málnásba, nem értem pontosan, amit írsz.
Pl. nálam a DAX nem 1056.0, hanem 10560.00 (nem 4 hanem 5 jegyű, és 2 digites).
Az osztó/szorzó szerintem játék a szavakkal, attól függ, hogy felfelé (10,100,1000 ..) vagy lefelé (0.1,0.01,0.001 ..) nézzük.
Szóval igazából úgy kérdezném, tudsz-e konkrét KÉPLETET, ami brókerfüggetlenül helyes DAX spread-pipértéket ad?
Pl. nálam ezdouble Spread=MarketInfo(Symbol(),MODE_SPREAD);
a DAX-ra 100-at ad. Ebben az esetben én ezt ugye 100-al osztanám, hogy az általam reálisnak vélt 1-es spread-et kapjam. De ugyanaz a képlet, ami nálam 1-et ad, másnál 0.1-et adott. Ezt kéne rendbetenni, ha lehet egyáltalán.
Az alábbit kipróbáltam két brókeren (1. Bid = 10995.0 2. Bid = 10995.00)
MarketInfo(Symbol(),MODE_TICKVALUE) * MarketInfo(Symbol(),MODE_TICKSIZE) * MarketInfo(Symbol(),MODE_SPREAD) / MarketInfo(Symbol(),MODE_POINT)
Mindkettőn 1.0 lett az eredmény.
Köszönöm, kipróbáltam.
A DAX-on tényleg 1-et adott, ez nagyon jó, de sajnos a forex párokon 10-szeres értéket ad.
Pl. EURUSD-nél 3-at adott, holott a valós 0.3 volt.mpeter:
Nem ugyanarra gondolunk. Mi BillyBill-el a kvázi „pip”-szerű távolságmegadásról (egyfajta konvencióról) beszélünk, ennek semmi köze nincs pl. a tickvalue-hoz.BillyBill:
„Pl. nálam a DAX nem 1056.0, hanem 10560.00 (nem 4 hanem 5 jegyű, és 2 digites).”
Ez lényegtelen, példának szántam. Az árérték mindegy, nem azon volt a lényeg! Az árérték lehet 1 vagy 2 digites is, a lényeget egyébként leírtam 1 és 2 digitre is, példával együtt. 1056.0 és 1055.0 helyett lehet a két ár 10560.0 és 10561.0 is tőlem, a lényeg ugyanaz marad.Ugyanezt lehet SP500-ra vagy bármilyen más instrumentumra is alkalmazni, de semmiképp nem automatikusan. (Vagy ha nagyon azt szeretnéd, akkor bele kell drótozni pár dolgot a robotba – ez nehéz, mert valahol úgy hívják a DAX-ot pl. hogy DE30, valahol GER30, megint máshol DAX, vagy FDX – emiatt nehéz univerzális megoldást létrehozni).
Vagyis a lényeg (ezt is írtam már, de leírom picit kibővítve):
Univerzális szabály: a traderi nyelv egységértékét (1) elosztod a legkisebb elmozdulás egységével (0.1, 0.01 vagy akármi), vagyis DAX esetén 1 tizedes pontosságnál: 1 / 0.1 = 10. Ugyanez származtatott terméknél két tizedesjegynél: 1 / 0.01 = 100.
Vagyis ha a paraméterek között te azt akarod megadni, hogy 12 DAX távolság, akkor azt 12-ként írod majd be, belül pedig a következő játszódik le (2 digites DAX-nál):
12 * 0.01 * 100 = 0.12 * 100
Ha ezt nem így csinálod (nincs egyedi szorzó/osztó), akkor eleve 1200-at kellene megadnod 12 helyett, ami nagyon kényelmetlen annak, aki az egész számos DAX távolságméréshez van szokva.
Ennyi!
Ismétlem tehát, hogy a lényeg: nincs automatizmus, mivel itt elsősorban egy mesterséges traderi fogalmat akarsz automatizálni. Ennek fényében írtam le mident.
A FOREX instrumetumok kapcsán a pip annyival egyszerűbb, hogy ott univerzálisabban értelmezhető a szabály, és a 2/4 ill. 3/5 digites rendszer miatt a konvenciók is könnyebben kialakíthatóak.
Köszönöm. Kár ezért a kuszaságért, szerintem ezeket a dolgokat standardizálhatták volna.
Jelenleg azt látom a legjobb megoldásnak, ha forex-párokra automatizálom, egyebekre pedig adok egy user inputot, hogy írja be a user maga a „korrekciós faktort”. Nem túl elegáns, de ezekszerint nincs jobb.Pontosan ezt alkalmazom én is, lásd fentebb:)
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.