Mászkáló Trail2015-07-01T13:29:43+00:00
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: 645

    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: 46

    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

A hozzászóláshoz jelentkezz be!

Adhatok Neked még több ingyenes tartalmat?

Értesítelek hetente megjelenő új tartalmaimról.

Hozzájárulok, hogy az adatvédelmi nyilatkozat szerint biztonságosan kezeld megadott adataimat, valamint hasznos anyagokat és egyedi ajánlatokat küldj nekem termékeiddel, szolgáltatásaiddal kapcsolatban e-mailben