Forex programozás Fórum Kérdések az MQL4 programozási nyelvvel kapcsolatban Nyitott pozíció egy részének lezárása

Címkézve: 

12 bejegyzés megtekintése - 1-12 / 12
  • Szerző
    Bejegyzés
  • Szalai Gergely
    Tag
    Bejegyzések száma: 8

    Szia!

    Kérlek segíts a következő probléma megoldásában:
    Ha egy nyitott pozíció egy részét szeretném csak bezárni. (Amelynek az oka lehet a nyereség egy részének a védelme illetve a veszteség csökkentése.) Milyen ésszerű megoldások léteznek?
    Tehát: Ha létezik egy nyitott BUY pozíció és mit tegyek ha egy általam megálmodott szinten be szeretném zárni a felét?

    Köszönöm a segítséget!

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Az OrderClose() függvénnyel lezárod a felét! Csak annyit kell ellenőrizned, hogy a pozíció lotmérete felezhető-e. Ha nem, akkor kozmetikáznod kell az értéken.
    Pl. 1.25 méretű pozíciónál nem tudsz bezárni 0.625 -öt, csak 0.62 -t vagy 0.63-at (a legtöbb brókernél; előfordulhat olyan is, hogy csak 0.6-ot vagy 0.7-et)

    Szalai Gergely
    Tag
    Bejegyzések száma: 8

    Nagyon szépen köszönöm a gyors választ!

    g
    ps: nagyon tetszik az oldal! rengeteg hasznos információt találtam már. Hajrá, hajrá…

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Örülök, további jó olvasást! ;)

    káROBOTi
    Tag
    Bejegyzések száma: 28

    Szia!

    Ezzel a témával kapcsolatban az a kérdésem hogyan lehet azt jól megoldani, hogy mondjuk egy 0.3 lotos pozíciót 3 részletben lezárni?

    OrderClose()függvénnyel próbáltam megvalósítani, de vannak problémáim.

    Az 1.részt 15 pipes, a 2.részt 30 pipes haszonnál akarnám lezárni. A maradék 0.1 lotot pedig a TakeProfit-ra(ami 60 pipes haszon) bíznám.

    Türelmedet és válaszodat előre is köszönöm!

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Annak, hogy hol történik a rész-zárás nincs jelentősége.

    OrderClose -zal tudod ezt megoldani, és kizárólag piacon (tehát brókernek előre nem tudsz rész-zárásra megbízást adni).

    Az OrderClose() használatáról itt olvashatsz bővebben.

    Ha az utolsó (második) zárás is megtörtént, akkor beállíthatod a 60 pipes takeprofitot, és az a pozíció már a bróker által fog tudni zárulni.

    káROBOTi
    Tag
    Bejegyzések száma: 28

    Így próbáltam megoldani:
    TC_1=15;
    TC_2=30;

    // első részzárás
    if(OrderOpenPrice()<=(Bid-TC_1*Point)){
    OrderClose(Ticket,0.1,Bid,5,Lime);}

    // második részzárás
    if(OrderOpenPrice()<=(Bid-TC_2*Point)){
    OrderClose(Ticket,0.1,Bid,5,Blue);}

    Az a baj, hogy amíg igaz a feltétel addig folyamatosan zárja befelé a pozíciót 0.1 lotonként.
    Úgy szeretném megoldani, hogy ha a az első részzárás feltétele igaz akkor csak egyszer zárjon be egy 0.1 lotot a pozícióból és ne többször.
    Ezután jönne második részzárás.

    Köszönöm segítségedet!

    COF258
    Tag
    Bejegyzések száma: 30

    Hello!

    Ezt egyszerűen megteheted. Pozíciónként létrehozol egy globális kapcsolót. Amíg ez az egyik állapotában van addig engeded csak lezárni. Lezáráskor egy másik állapotba állítod. Majd amikor már nincs mit zárni újra alapértékre állítod.

    kapcsolo_0=0;
    kapcsolo_1=0;

    //----------------
    // első részzárás
    if(OrderOpenPrice()<=(Bid-TC_1*Point) && kapcsolo_0==0)
    {
    OrderClose(Ticket,0.1,Bid,5,Lime);
    kapcsolo_0=1;
    }

    // második részzárás
    if(OrderOpenPrice()<=(Bid-TC_2*Point) && kapcsolo_1==0)
    {
    OrderClose(Ticket,0.1,Bid,5,Blue);
    kapcsolo_1=1;
    }

    Remélem tudtam segíteni.
    Üdv!

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    COF258, köszönöm a választ!

    A megoldásod alapnak mindenképpen jó, de egy változó is elég hozzá. Plusz arra kell figyelni, hogy ha a robot eltávolításra majd visszahelyezésre kerül, a globálisan definiált változók értékei elvesznek. Így valami más megoldást is biztosítani kell, akár logikai alapon, akár pl. a terminál globális változói segítségével.

    káROBOTi
    Tag
    Bejegyzések száma: 28

    Nagyon köszönöm a segítségeteket!

    Sikerült megoldani:

    if(OrderOpenPrice()<=(Bid-TC_1*Point) && 0==GlobalVariableGet(„Részzárás”)){
    OrderClose(Ticket,0.1,Bid,5,Lime);
    GlobalVariableSet(„Részzárás”,1);}

    if(OrderOpenPrice()<=(Bid-TC_2*Point) && 1==GlobalVariableGet(„Részzárás”)){
    OrderClose(Ticket,0.1,Bid,5,Lime);
    GlobalVariableSet(„Részzárás”,2);}

    if(Ticket==false){
    GlobalVariableSet(„Részzárás”,0);}

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Alapnak jó a megoldás, de arra figyelj, hogy a GlobalVariableGet akkor is nullát ad vissza, ha a globális változó egyáltalán nem is létezik. Használd a biztonság kedvéért a GlobalVariableCheck függvényt is!

    káROBOTi
    Tag
    Bejegyzések száma: 28

    Rendben, megfogadom a tanácsod!
    Köszönöm a segítséged!

12 bejegyzés megtekintése - 1-12 / 12
  • Be kell jelentkezni a hozzászóláshoz.