Hozzászólások
-
SzerzőBejegyzés
-
Hozzászólás: OrderCloseBy invalid #1410
Igen, valamit félreértesz: nem a profit megőrzése a cél, hanem a veszteség minimalizálása (stop loss). Végig erről beszéltem. Vagyis csak azt az esetet vizsgáljuk, amikor az árfolyam a rossz irányba fordul. Ezért kell STOP megbízás és nem LIMIT megbízás. Idézet a blogodra belinkelt könyvből:
„Buy Stop – egy függőben levő megbízás, egy olyan vételi megbízás, ami magasabb az aktuális árnál. A megbízást akkor fogják végrehajtani (piacira módosított Buy megbízással) ha az Ask ár a függőben levő megbízásban meghatározott értékre emelkedik.
Sell Stop – egy függőben levő megbízás, egy olyan eladási megbízás, ami alacsonyabb, mint az aktuális. A megbízást akkor fogják végrehajtani (piacira módosított Sell megbízással) ha a Bid árajánlat a meghatározott értékre csökken.”
Ezért SELL pozi esetén BUY STOP megbízásra van szükség a veszteség minimalizálására, BUY pozi esetén pedig SELL STOP-ra. És ennek megnyílása esetén tök mindegy merre megy az árfolyam, az aktuális profit/veszteség az adott mennyiségre nézve fix marad.
Az OrderCloseBy-jal való plusz játék az ára annak a követelménynek, hogy a szerver hajtsa végre ezt a műveletet.Hozzászólás: OrderCloseBy invalid #1407Nagyon köszönöm, h foglalkoztál a kérdéseimmel. Igazán hálás vagyok érte.
„Cserébe” :) megpróbálom újra leírni , hogy mi az elv, mert az utolsó megjegyzésedből úgy látszik, rosszul fogalmaztam az első postban. Talán Te is és más olvasók is kapnak egy ötletet. A megoldás működik, csak az Equilor MT4-ben nem, mert ezek szerint az nem támogatja a kérdéses funkciót.Feladat: Egy megnyitott pozíciót részben kell kistoppolni egy adott – az aktuálisnál rosszabb – árfolyamon.
Követelmény: Ne a terminál-ban futó EA végezze a zárást („felezést”), hanem „stoploss”-szerűen a szerver.
Elemzés: Milyen lehetőségek vannak a „stopploss”-szerű zárásra az MT4-ben:
– OrderModify(), stoploss beállítása: nem jó, mert a teljes mennyiségre vonatkozik.
– OrderClose(), ha az aktuális árfolyam (Bid / Ask) megegyezik a „stoploss” árfolyammal, zárás adott mennyiségre: nem jó, mert az EA hajtja végre, nem a szerver.
– OrderSend(), ellentétes irányú függő pozi nyitása a lezárandó mennyiségre a „stoploss” árfolyamon: jó, mert a részleges mennyiségre vonatkozik, és a szerver hajtja végre.
Megvalósítás OrderSend() segítségével:
Mi legyen a command? Mivel ellentétes irányú függő pozit kell nyitni, olyan árfolyamon, ami rosszabb, mint az aktuális (azaz stoploss-ról van szó), ezért stop megbízást kell adni, azaz long pozi esetén: OP_SELLSTOP, short pozi esetén: OP_BUYSTOP.
Továbbá az eredeti pozi (amit „felezünk”) ticket-je legyen: eredeti_ticket. Ezt írjuk bele a comment-be: „STOPLOSS#{eredeti_ticket}”. Erre még szükség lesz.
A stop megbízás elhelyezése a szokásos módon történik:
int stoploss_ticket = OrderSend(Symbol(), command, {lezárandó mennyiség}, {stoploss árfolyam}, {slippage}, null, null, comment, {magicnumber});
Ez már majdnem jó, csak annyi a bibi, hogy ha ez is megnyílik (a szerver által!), akkor van két nyitott pozink egymással szemben, ami gyakorlatilag már megvalósította a részleges zárást a „stoploss” árfolyamon, csak „normalizálni” kéne ezeket úgy, hogy csak a le nem zárt mennyiségre vonatkozó pozi maradjon. Ez már nem kell, hogy a szerver oldalon történjen (bár jó lenne), hisz a kistoppolás már gyakorlatilag megtörtént.
Pont ezt valósítja meg az OrderCloseBy(eredeti_ticket, stoploss_ticket) művelet. Vagyis annyiban bonyolultabb most a helyzet, hogy észre kell venni, hogy a szerver megnyitotta a stop megbízást, vagyis meg kell hívni az OrderCloseBy()-t. Ezért jelöltük meg a comment-ben a „STOPLOSS” megbízást, és rögzítettük ott az eredeti pozi ticket-jét. Az észrevevés csak annyi, h minden iterációban átnyálazzuk a megnyitott pozikat az ezen a blogon is jól megismert módon, keresve ez a comment-et.
Hát ennyi lett volna.Hozzászólás: OrderCloseBy invalid #1403Köszönöm a választ!
Bosszant, hogy van egy jó kis függvény, ami nem használható, ha „hordozható” EA-t akarok írni…
Amúgy csak azért került képbe, hogy a szerver végezze el a felezést, mert így kisebb a kockázat, hogy tényleg megtörténik. A zárásokat szívesebben bízom a szerverre. Szóval lehet, hogy inkább felvállalom a többlet menedzselést.
Apropó, az szerinted lekérdezhető, hogy támogatott funkció-e az OrderCloseBy()? -
SzerzőBejegyzés