Hozzászólások

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

    O.K. Köszönöm

    kosza
    Tag
    Bejegyzések száma: 23

    Nna, az első két kódrészletet újra küldöm. Nem vágom, hogy miért szövegként tette be. Bocs. Tehát sar váltásra pozi zárás

    if(SingleClSARChCl==1&&ClSARPrev>Close[ClSARSignalBar] && ClSARCurr<Close[ClSARSignalBar])
       {
          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_SELL)
               {
                RefreshRates();
    
                if(OrderProfit()>0)CloseOrder(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK));
               }
            }
         }

    a záró fgv

    bool CloseOrder(int ticket,double lot,double price)
      {
       if(!OrderSelect(ticket, SELECT_BY_TICKET)) return(false);
       if(OrderCloseTime() > 0) return(false);
    
       int dig=MarketInfo(OrderSymbol(),MODE_DIGITS);
       string _lot=DoubleToStr(lot,2);
       string _price=DoubleToStr(price,dig);
    
       bool res=OrderClose(ticket,lot,price,Slippage,clClose);
       if(res) 
         {
          Sleep(SleepOk);
          return (res);
         }
    
       int code=GetLastError();
       Sleep(SleepErr);
    
       return (false);
      }
    kosza
    Tag
    Bejegyzések száma: 23

    Szia! A gond az, hogy ugyanez a CloseOrder() függvény nagyszerűen működik a kód más részein. Pl a psar váltáskor a nyereséges pozik zárása:
    `if(SingleClSARChCl==1&&ClSARPrev<Close[ClSARSignalBar] && ClSARCurr>Close[ClSARSignalBar])
    {
    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)
    {
    RefreshRates();
    if(OrderProfit()>0)CloseOrder(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID));
    }
    }
    }`
    Azért ideteszem a függvényt:
    bool CloseOrder(int ticket,double lot,double price)
    {
    if(!OrderSelect(ticket, SELECT_BY_TICKET)) return(false);
    if(OrderCloseTime() > 0) return(false);

    int dig=MarketInfo(OrderSymbol(),MODE_DIGITS);
    string _lot=DoubleToStr(lot,2);
    string _price=DoubleToStr(price,dig);

    bool res=OrderClose(ticket,lot,price,Slippage,clClose);
    if(res)
    {
    Sleep(SleepOk);
    return (res);
    }

    int code=GetLastError();
    Sleep(SleepErr);

    return (false);
    }`

    Ideteszem újra a kicsit átfogalmazott problémás részt:

    if(ClMaxLoss==1&&LoLot()*ShLot()>0&&SellCnt>1)  // ha long és short is van és shortból több, mint egy darab
    {
    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_SELL)
               {
                RefreshRates();            
                if(MaxLossShort()==OrderProfit())CloseOrder(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK));  
               // ha olyat talál, aminek a vesztesége megegyezik a legnagyobb veszteségű short pozival, zárja le
               
               }
            }
    }

    Ehelyett azt csinálja, hogy nem a legnagyobb veszteségű pozit zárja, hanem az utolsónak megnyitottat.
    Ha a RefreshRates() utáni sort kicserélem erre:

    if(Ask-OrderOpenPrice()>=Delta*Point*fpc())CloseOrder(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK));            
               // ha az ask és megnyitott pozi nyitási ára közötti különbség nagyobb, mint "Delta" pip, zárja le a pozit;
               // (az fpc() a bróker digitjétől függen ad vissza 10-et vagy százat)

    ez működik, a megfelelő pozikat zárja le.
    Ezek szerint a hiba ott van valahol a kicserélt sorban. Nem segít az sem, hogyha az „orderprofit” helyett a nyitó és az aktuális „ask” segítségével határozom meg a veszteséget.
    Előre is köszönöm a segítségedet.

    kosza
    Tag
    Bejegyzések száma: 23

    Nem jól raktam be a záró-kódrészletet. Újra próbálom:

    if(ClMaxLoss==1&&LoLot()*ShLot()>0&&ShLot()>=LoLot())
    {
    
    for(i=0; i<OrdersTotal(); i++) // Order searching cycle 
            {
             if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
             if(OrderSymbol()!=Symbol()) continue;
             type=OrderType();
             if(type==OP_BUY)
               {
                RefreshRates();
                if(MaxLossLong()==OrderProfit()&&BuyCnt>1)CloseOrder(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID));            
               }
            }
    }
    kosza
    Tag
    Bejegyzések száma: 23

    Kösz, megnézem.

    kosza
    Tag
    Bejegyzések száma: 23

    Radu, ránéznél erre? Lehet az volt a baj, hogy a különböző párokon elfelejtettem más magic no-t megadni, így szerencsétlen különböző párokat akart mergelni OrderCloseBy()-el? Nem kellett volna zsákszám kapnom a hibaüzeneteket?
    Köszönöm

    if(PosTpClose==1&&LoLot()*ShLot()>0) //ha egy páron mindkét irányban van nyitott pozi….
    {
    if(((OpLoPr()*LoLot()+ OpShPr()*ShLot()))>MinPrPip()) // …és a pipben mért eredmény nagyobb, mint MinPrPip (OpLoPr()*LoLot() jelentése: nyitott long eredmény szorozva a pozimérettel)
    {
    for(i=0; i<OrdersTotal(); i++) // Order searching cycle
    {
    if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
    {
    if(type== OP_BUY)MagicLong=OrderMagicNumber();
    if(type== OP_SELL)MagicShort=OrderMagicNumber();
    if(MagicLong!=MagicShort)
    {
    CloseOrders(OP_SELL);
    CloseOrders(OP_BUY);
    }
    if(MagicLong==MagicShort)
    {
    type=OrderType();
    if(type== OP_BUY)LongTicket=OrderTicket();
    if(type==OP_SELL)ShortTicket=OrderTicket();

    RefreshRates();
    if(Merge==1) OrderCloseBy(LongTicket,ShortTicket,clCloseBy); // ha mergelés engedélyezett mergelje őket össze
    if(Merge!=1)
    {
    CloseOrders(OP_SELL);
    CloseOrders(OP_BUY);
    }
    }
    }
    }//for(i=0…..
    }
    }//if(PosTpClose==1&&LoLot()*ShLot()>0)

    kosza
    Tag
    Bejegyzések száma: 23

    Köszönöm. Ahogy megfejtettem, vagy -ami valószínűbb- lesz még kérdésem, szólok.

    kosza
    Tag
    Bejegyzések száma: 23
    Hozzászólás: Mászkáló Trail #4437

    köszönöm

    kosza
    Tag
    Bejegyzések száma: 23

    Köszi Radu, sajna így is folyamatosan változik a visszaküldött FRAM…, de így legalább biztos vagyok benne, hogy máshol kell a hibát keresnem.
    Kösz még egyszer: Kosza

    kosza
    Tag
    Bejegyzések száma: 23

    Köszönöm. Akkor mégsem egyszerű…
    Kosza

    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

    kosza
    Tag
    Bejegyzések száma: 23
    Hozzászólás: "Új" MQL nyelv #3266

    Kösz, időközben rájöttem: Az összes indi az i….(NULL….)-formában adtam meg, csak az iHigh(0….)-formában. Ezt nem szerette. Tehát iHigh(NULL,…..) a jó formátum.

    kosza
    Tag
    Bejegyzések száma: 23
    Hozzászólás: custom indi ex4 #3263

    Köszönöm

    kosza
    Tag
    Bejegyzések száma: 23
    Hozzászólás: Lassuló backteszt #2479

    Kösz a választ.
    1) Elsőre magam is arra gondoltam, hogy a robot a hunyó, de ugyanaz a robot, ugyanolyon beállításokkal ugyanazon időszakaszon elsőre-másodszorra normálisan fut, majd belassul.
    2) Komplett optimalizációra gondoltam, igen. De ha belassul akkor az „egyedi futások” is lassúak. Nem csak a terminált, a gépet is újraindítottam, nem segít.

14 bejegyzés megtekintése - 1-14 / 14