Válasz erre: OrderCloseBy invalid 2012-04-14T11:30:33+00:00
deepstack
Tag
Bejegyzések száma: 4

Nagyon 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.