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

    Szia Radu!
    Már megint kínom van. Csúszóstopot állítanék be, de nem csak a „jó” irányban csúszik, hanem visszafelé is.
    Ránéznél? Előre is köszönöm: Kosza

    void StepTrail()
    {
    double SumL=((LoLot()+ShLot())*LotSize)/AccountEquity();
    int TrailingStart=TrStart/(SumL/L);
    if(TrailingStart<5)TrailingStart=5;
    int TrailingSize=TrSize/(SumL/L);
    if(TrailingSize<5)TrailingSize=5;
     
      int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL) + 1;
      double sl;
      
      int cnt = OrdersTotal();
      for ( int i=0; i<cnt; i++) 
      {
        if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != Symbol()) continue;
        if (OrderMagicNumber() != MagicSth) continue;
    
        int type = OrderType();
        if (type == OP_BUY && LoLot()>=ShLot()) 
        
        {
          if (Bid-OrderOpenPrice() > TrailingStart*Point*fpc()&& LoLot()>=ShLot()) 
          {
            sl = Bid - TrailingSize*Point*fpc();
                    
            if (sl >= Bid - StopLevel*Point) continue;
            
            if (OrderStopLoss() < sl - 1*Point*fpc()|| OrderStopLoss() == 0) 
            {
           
            if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
            if (OrderSymbol() != Symbol()) continue;
            if (OrderMagicNumber() != MagicSth) continue;
              OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clModify);
            }
          }
        }
    
        if (type == OP_SELL && ShLot()>=LoLot())
      
        {
          if (OrderOpenPrice()-Ask > TrailingStart*Point*fpc() && ShLot()>=LoLot()) 
          {
            sl = Ask + TrailingSize*Point*fpc();
            
            if (sl <= Ask + StopLevel*Point) continue;
            
            if (OrderStopLoss() > sl + 1*Point*fpc() || OrderStopLoss() == 0) 
            {
            if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
            if (OrderSymbol() != Symbol()) continue;
            if (OrderMagicNumber() != MagicSth) continue;
              OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clModify);
            }
          }
        }
      }
    }
    
    
    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    A stopleveles ellenőrzés dicséretes, de a javított érték kapcsán mindig ellenőrizd, hogy maga a javított érték kedvezőbb-e mint a jelenlegi beállított stoploss érték (értsd: LONG esetén magasabb, SHORT esetén alacsonyabb). Ha ez a feltétel nem teljesül, akkor ne engedd a módosítást, mert akkor fog „táncolni” a stoploss.

    Illetve ez az 1 pont hozzáadás katasztrófális, soha ne drótozz ilyesmit a kódodba. Nincs szükség reszelésre, ha valami nem működik univerzálisan, akkor rosszul van felépítve:

    OrderStopLoss() > sl + 1*Point*fpc()
    

    Ezt felejtsd el! Használd a NormalizeDouble() eljárást, és hasonlítsd össze a konkrét, megfelelő tizedesjegyre kerekített értékeket. (Amúgy az fpc() függvény nem tudom mit csinál, mivel azt nem csatoltad.)

    Ez a sor (és a Bid-es párja) hibás, mivel az egyenlőség egyébként megengedhető:

     if (sl <= Ask + StopLevel*Point) continue;
    

    Értem, hogy mit akarsz, de javítsd ki mert ez így ebben a formában helytelen.

    Illetve még egy javaslatom van: a continue-k féktelen használata helyett a feltételek igaz ágára építs inkább, lévén hogy egy jól felépített kondíciós rendszernél a nem teljesülés miatt úgyis továbblép a ciklus, nem kell erre külön megkérni. Ráadásul ha már egyszer leellenőrzöd a feltételeket, akkor miért kell újra szűrni rájuk 4 sorral lejjebb? Gondolok itt az instrumentumra, magic számra, stb. Ugyanez igaz a többszöri OrderSelect-re is.

    kosza
    Tag
    Bejegyzések száma: 23

    köszönöm

    Roden
    Tag
    Bejegyzések száma: 52

    Hello kosza.

    Érdemes körülnézni az MetaTrader kódkönyvtárában.
    Sokat lehet tanulni az ott közzé tett kódokból.

    Egy működő TrailingStop megoldást pl. itt találsz:

    https://www.mql5.com/en/code/12232

    Igaz ez a kód nem csak követőstoppot hanem a TakeProfit és a StopLoss megoldását is tartalmazza.
    A view linkre kattintva láthatod a kódot.
    (Bár szvsz. még ezt is lehetne bőven tovább egyszerűsíteni, átláthatóbbá tenni)

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