3 bejegyzés megtekintése - 1-3 / 3
  • Szerző
    Bejegyzés
  • kosza
    Tag
    Bejegyzések száma: 23

    Szia Radu!
    Az EA-mat felszereltem választható CloseBy lehetőséggel. Újabban nem akarja az igazat (régi(509) builden működött, igaz néha ott is kaptam hibaüzenetet). Most viszont rendre megkapom az „OrderCloseBy error 4108” hibaüzenetet, az „unknown ticket 13 for OrderCloseBy function” üzenettel. Minden hibaüzenetre igaz, hogy amit ismeretlen ticket-ként megad (itt 13), szerepel a kötéslistán. Egyszerűen gőzöm sincs mifenéért nem működik. Küldöm a kódrészletet is, megköszönném, ha megnéznéd.
    Lehet, hogy a pozi kiválasztásnál tolok el valamit?

    if(Merge==1 && CloseLosers!=1 && CloseAll!=1) //összemergeli az ellentétes pozikat, a maradék nyerőt EmHedTrail kíséri, mint nyerséges pozit
            {
             for(i=0; i<OrdersTotal(); i++) // Order searching cycle 
               {
                if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
                if(OrderSymbol()!=Symbol()) continue;
                if(OrderMagicNumber()!=Magic) continue;
                type=OrderType();
                if(type== OP_BUY)LongTicket=OrderTicket();
                if(type==OP_SELL)ShortTicket=OrderTicket();
                  {
                   RefreshRates();
                   OrderCloseBy(LongTicket,ShortTicket,clCloseBy);
                   OrderCloseBy(ShortTicket,LongTicket,clCloseBy);
                  }
                if(ShLot() *LoLot()==0)EmHedTrailPos();
               }
    
    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Nekem nem teljesen tűnik átláthatónak az a kódrész, amelyben a RefreshRates() és a két OrderCloseBy sor van, hiszen az a kódrész mindig lefut, függetlenül attól hogy mi az if kiértékelések eredménye.

    Illetve a két OrderCloseBy helytelen, hiszen egy nyitott pozíciót zársz a másik ellenében.

    A következő for iterációban pedig az egész indexelés felborul.

    Ha {} jelek nélküli ifet használsz, akkor az első pontosvessző után befejeződik az adott feltétel.

    int type = OP_BUY;
    
    if (type == OP_BUY) Print ("Ez egy BUY!");
    if (type == OP_SELL) Print ("Ez egy SELL!");
    

    A kódodban viszont a SELL feltétel sora után van egy { } kódrész, ami mindig lefutásra kerül. Javaslatom az, hogy az átláthatóság kedvéért minden feltételt – főleg, ha több utasítás van utánuk – így használj:

    int type = OP_BUY;
    
    if (type == OP_BUY) { 
       Print ("Ez egy BUY!");
    }
    
    if (type == OP_SELL) { 
       Print ("Ez egy SELL!");
    }
    

    Illetve, olvasd el még a Pozíciók zárása című cikkemet, mert a pozíciók indexelésének felborulása is okozhat kellemetlen meglepetéseket.

    A fentiek közül bármelyik okozhatja a hibák tömkelegét. Azonban ezek a hibák nem az új fordítótól, hanem eleve programozási hibákból erednek.

    A continue; használata is teljesen felesleges, hiszen akár egymásba ágyazott, akár párhuzamos if-ekkel kiválthatod őket.

    kosza
    Tag
    Bejegyzések száma: 23

    Köszi Radu!
    Azt írtad, hogy:
    „A kódodban viszont a SELL feltétel sora után van egy { } kódrész, ami mindig lefutásra kerül.”
    No, ettől megvilágosodtam: Csöppet sem okosan a closeby-t betettem a „for” ciklusba. Kidobtam a cikluson kívülre, egy gyors teszten már működik is.
    További jókat: Kosza

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