Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › Kereskedés lezárása X árfolyamon
-
SzerzőBejegyzés
-
Hello!
Egy olyan kérdésem van, amire nem is tudom, hogy keressek rá, ezért kérdezlek téged/benneteket.
Elmagyarázom „röviden”, hogy mit szeretnék:Spread: 0.00020
Elvárt plusz, amivel kiszállhatok: 0.00030
Csak vételi pozíciókat nyitok.Első kereskedést nyitottam: 1.22550-en. Itt kell tehát kiszállni: 1.22600 (nyitás + Spread + elvárt nyereség)
(igen ám, de az árfolyam zuhant, nyitottam megint:)
Második kereskedést nyitottam: 1.22500-en. Itt kell tehát kiszállni: 1.22550 (nyitás + Spread + elvárt nyereség)Ha fogom a két kereskedés kiszállásának átlagát, ami (1.22550 + 1.22600) / 2, azaz 1.22575, akkor elmondhatom, hogyha ezt az árfolyamot eléri a grafikon, akkor mind a két kereskedést lezárhatom nyereséggel, így nem kell megvárni, hogy megint elérje az árfolyam az első kötés kiszállási szintjét.
Remélem érhető voltam…
Van X számú ilyen vétel kötésem egymás alatt sorban, és meg akarom határozni a KISZÁLLÁSI értékük átlagát, majd az összes kötésre beállítani ezt a zárást (amennyivel az első kötés veszteséges, annyival nagyobb nyereséget csinált az utolsó). Az átlag számításával nincs problémám.
A kérdésem:
Van-e arra mód, hogy a szervernek megmondjam, hogy a kötés(ek) mikor szálljanak ki, attól függetlenül, hogy azok nyereségesek, vagy veszteségesek. Ez nem STOP LOSS és nem TAKE PROFIT, mert azoknak feltételeik vannak a kötés és a jelenlegi árfolyam függvényében.Meg tudom-e így adni a szervernek, hogy az Expert Advisoromnak ne kelljen ezzel foglalkozni?
Vagy minden egyes kötést nyilván kell tartanom Ticket és OrderOpenPrice() szerint többdimenziós tömbben, azokat csoportosítani, meghatározni az átlagát, és tickenként figyelni, hogy ha eléri az árfolyam az aktuális csoport átlag értékét, akkor a robot zárja le a csoportban lévő kötéseket?Kicsit komplikált ezt nyilvántartani, azért lenne megnyugtató, ha a szervernek ezt ugyanúgy meg tudnám mondani, mint egy függő megbízást.
Köszönöm a segítséget!
Szia!
A fenti feladatra két megoldást tudok javasolni.
1) Ehhez a megoldáshoz az expert állandó futtatása szükséges, és ún. piaci zárással fogunk a pozíciókból kilépni. Ekkor sem TP, sem SL megadása nem szükséges mert a pozíciókat maga az expert fogja zárni. (olyan, mintha állandóan ott ülnél a gép előtt és kézzel lezárogatnád a pozikat egy adott időpillanatban). Ehhez a magic szám alapján összegyűjtöd az adott pozíciókat, és az OrderProfit() összeadásával megvárod azt a pillanatot, amikor megfelelő profitot/veszteséget gyűjtöttek a pozícióid. Ekkor OrderClose() -zal zárod egyenként a pozíciókat. Nyilván ez a módszer nem teljesen pontos, viszont cserébe nem kell átlagárakkal és lotméretekkel bíbelődni.
2) Ennél a módszernél a TP és SL kilépést fogjuk használni, amit nem az expert hanem a bróker végez el. Ergo kikapcsolt számítógépünk (szerverünk) nélkül is (nagy valószínűséggel) végbemegy a pozíciók zárulása. Ehhez viszont az kell, hogy a súlyozott átlagár és az elvárt profit alapján előre kiszámoljuk azt, az adott elvárt profit/veszteség szintünk árra vetítve hol lesz. Így több-kevesebb pontossággal beállíthatjuk azokat az árszinteket, ahol az általunk kívánt profit/veszteség megjelenik.
Természetesen ezt minden új szint nyitásánál újra kell kalkulálnunk, és az összes pozíciónak újra beállítanunk. A kilépés egyszerre fog történni, azaz relatíve pontos lesz az zárásunk (ezzel szemben az első megoldásnál zárás közben csúszkálhat a piac, ami nyereséget/veszteséget okozhat a zárás során; heves piaci mozgásnál keresztül húzhatja az előzetes számításainkat).
Mivel a TP és SL értékeinket előre látni fogja a brókercég, dealing desk -es bróker esetén manipulálhatja az árakat (stop hunting). ECN számlán ettől nem kell tartani.Ha további kérdésed van, akkor írd meg hogy melyik módszer a szimpatikusabb és segítek a továbbiakban.
Túlbuzgóságom miatt az első verziót megcsináltam éjszaka, méghozzá fájlba irkálással. Nem akarok belemenni miért, a tömbök nem voltak elegek nekem. Működőképes, de féltem az EA-t, hogy lassan dolgoz fel fileokat és így tovább… Meg persze a pontatlanság, amiről te is írtál. Sok kereskedés lezárásánál másodpercek is eltelhetnek, ami a halála lehetne az én stratégiámnak.
A második verzió érdekel, amikor befejezek egy un. „kereskedési ciklust”, akkor a ciklusban lévő összes vételnek egy zárási szintet szeretnék adni (ugye mindegyiknek ugyanazt), innentől az EA-nak nem kell vele törődni, hanem a szerver (bróker) önmagával dolgozik, az én munkám le van tudva. Az volt a problémám a SL-al és a TP-al, hogy nem rakhatom akárhova, hanem egy bizonyos szintre kell őket rakni az árfolyamhoz és az orderhez képest. Ha az order túl közel van a ST vagy TP értékhez (például ugyanaz), akkor nem engedi berakni, márpedig lehet, hogy az egyik kereskedésemet pont ott kell majd lezárni, ahol nyitottam (ha az átlag arra a szintre jött ki), ezért nem gondolkodtam Take Profit-ban és Stop Loss-ban. De ha ezt a két szintet bárhova rakhatom, akkor az lenne a megoldás, hogy a ciklus átlagértékére rakom a ciklusban levő összes kereskedés Take Profit és Stop Loss szintjét.
Ez lehetséges, és csak én csináltam valamit rosszul (mondjuk értékadásnál)?
Köszönöm még egyszer!
Az első verzióhoz nem kellenek sem tömbök, sem fájlba irkálás – nem teljesen értem, hogy miért volt szükséged ilyesmi megoldásra.
A TP és SL esetén valóban vannak szabályok, amiket be kell tartanod (nem lehet őket megkerülni). Az esetek 99%-ban bőven megfelelőek a szabályok, néhány esetben azonban valóban előfordulhat olyan helyzet hogy borsot tör az orrunk alá.
Alapvetően két dolgot kell szem előtt tartanod: takeprofit BUY pozi esetén csak az aktuális piaci ár fölé, SELL esetén pedig az aktuális piaci ár alá helyezhető el. Stoploss-nál pedig fordítva.
Tehát az elhelyezhetőség NEM a nyitóártól függ, ez szokott lenni a legnagyobb félreértés a témában. Magyarul: TP-vel is kiszállhat az ember veszteséggel, és SL-el is kiszállhat az ember nyereséggel.
Az, hogy mimimum mekkora az aktuális piaci ártól való „eltartás”, azt a stop szint (MarketInfo-ban MODE_STOPLEVEL) szabályozza. Ezen kívül érdemes még odafigyelni a MODE_FREEZELEVEL -re (fagyási szint) . Ezekről a fogalmakról érintőlegesen ebben a cikkben olvashatsz.
Amennyiben a kiszámolt TP és SL beállítása szabályba ütközik, érdemes azt korrigálni. Ilyenkor előfordulhat, hogy a kilépési szint akaratunk ellenére valamennyivel elcsúszik – de még ez is jobb megoldás, mintha egy szabály be nem tartása miatt a pozícióink kilépési érték nélkül maradnak.
Hogy világos legyen, leírom hogyan oldottam meg SL és TP nélkül, és miért kellett hozzá egy tömb, meg fileok. A robot a Martingale-módszeren alapul, amire a korábbi kérdéseimet figyelembe véve talán nyilvánvaló :) Csak vételekkel foglalkozok, viszont az egész folyamatot ciklusokra bontom.
Van egy tömböm deklarálva, amiben az átlagértékek lesznek sorban, ciklusonként.
EA indításnál indul az első ciklus. Vétel!
Létrehozok egy filet a ciklus id-jével 0.txt néven (merthogy ez a 0. ciklus), és beleírom az első vétel ticketjét, meg egy pontosvesszőt. A ciklusátlagok tömb nulladik elemének megadom azt, hogy 0.Tehát minden ciklushoz tartozni fog egy txt és egy tömb elem.
Nyílnak a kereskedések sorban (egy dinamikus rács szerint), bővül a txt, és amikor lezárul egy ciklus, akkor a következő történik:
– a ciklushoz tartozó txt ticketjeit sorban kiolvassuk
– megnézzük a hozzájuk tartozó vételi szintet, és átlagoljuk őket
– hozzáadjuk a spread-et és az elvárt nyereségi szintet, így megkapjuk a tényleges árszintet, amit el kell érni ahhoz, hogy a ciklusban lévő összes vételt nyereséggel zárjuk
– a ciklusátlagok tömb 0. elemébe (merthogy ez a 0. ciklus) beleírjuk ezt a számot
– új ciklust kezdünk (vásárolunk), új txt-vel (ciklusátlagok[1] = 0, 1.txt létrehozása a legutóbbi tickettel)
– …és innentől kezdve minden ticknél megnézzük ennek a tömbnek az értékeit (mindent vizsgálunk, ahol az érték != 0), hogy elérte-e az árszint.Ha igen, akkor
– kiolvassuk a tömbhöz tartozó txt-t, és a ticketek alapján sorban lezárjuk az összes kereskedést
– a ciklusátlagok tömb azon elemét, ami alapján aktiválódott a lezárási folyamat, 0-ra állítjuk, így azt már nem kell vizsgálni minden ticknél, mert az a tömb már „készen van”.Persze a robotba beleépítettem még sok minden mást is (biztonsági funkciókat), de a lényege ez. Ezt a tickenkénti vizsgálatot akartam a brókerre bízni a Stop Loss-szal és a Take Profit-tal, így nem húzom az időt a fileolvasással, a kereskedések egyenkénti visszaolvasásával (ticket), majd lezárásával. Azért írtam le mindezt, hogy lásd miért volt szükség tömbre és fileokra. Az mondjuk megeshet, hogy az egyszerűbb, evidens megoldás nem jutott eszembe, előfordult már ilyesmi :)
Mindenképpen a Take Profit és a Stop Loss verzió a nyertes a zárási sebesség miatt; ha csalni kell az átlag meghatározásánál, hát csalok.
Köszönöm a gyors segítséged, hálás vagyok neked.
Ha rájöttél, hogyan lehet a fent leírt folyamatot egyszerűbben megvalósítani (tehát TP és SL nélkül), akkor kérlek oszd meg velem pár mondatban, az érdekesség kedvéért.
Nem állítom, hogy 100%-ig tiszta amit leírtál, de sejtésem szerint globális változók + magic számok segítségével talán fájlműveletek nélkül megúszható a dolog. A tömbök használata talán maradna.
Egy megoldás habár nem mindig a legoptimálisabb, ha megbízhatóan és stabilan működik akkor nem baj ha néha eltérünk a „papírformától”.
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.