Announcement

Collapse
No announcement yet.

Funzione MQL4 per rischio calcolato sullo Stoploss

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Funzione MQL4 per rischio calcolato sullo Stoploss

    So che ci sono molti fan del rischio percentuale calcolato sullo SL.
    Per questo apro questa discussione per condividere la funzione per effettuare questo calcolo.

    La funzione è la seguente:
    Code:
    //Variabili esterne...
    extern double Rischio=5;
    //----
    double LottiConRischioXsulloSL(double SL)
      {
       double lotti=0;
       double MaxLotti,MinLotti,ValoreSL,ValoreTick,Coefficiente; 
       
       MaxLotti=(AccountFreeMargin()*Rischio/100*10);
       
       if(Digits%2==0) ValoreTick=MarketInfo(Symbol(),MODE_TICKVALUE)/10;
       else ValoreTick=MarketInfo(Symbol(),MODE_TICKVALUE);
       
       ValoreSL=SL*ValoreTick;
       MinLotti=MarketInfo(Symbol(),MODE_MINLOT);
       Coefficiente=MaxLotti/ValoreSL;
       
       if(Coefficiente>=1)
        {
         lotti=(Coefficiente*MinLotti);
        }
       else
        {
         Print("Margine insufficiente. SL troppo stretto o rischio troppo basso.");
         return(-1);
        }
       
       return(NormalizeDouble(lotti,2));
      }
    Il parametro di questa funzione è lo SL in pip (ad esempio 10.5 pip).
    Una volta immessa la dimensione dello SL in pip, la funzione ci ritornerà perfettamente il volume con cui dobbiamo aprire la posizione per rischiare X%.
    La percentuale di quanto rischiare la si imposta dall'esterno ed è fatta.

    Ovviamente la funzione esegue qualche piccolo arrotondamento.
    Quindi se ad esempio vogliamo rischiare 100 euro (1% di 10.000), il rischio effettivo potrebbe essere leggermente di più o leggermente di meno.
    Questo dipende dalla valuta del conto e dai cambi su cui si opera.

    Spero possa essere utile a qualcuno.
    Se poi avete domande, sono disponibile a dare delucidazioni.
    Skype: cadddami

    #2
    Ciao.

    La funzione è un pelo incompleta.

    MarketInfo(Symbol(),MODE_TICKVALUE) ci restituisce il valore del tick. Il tick, per la MT4, giustamente, è la minima variazione di mercato riscontrata.
    Potrebbe anche essere un multiplo di Point (che sia Point == pip oppure Point == pip/10).

    Quindi dovresti verificare che l'ultimo tick corrisponda a Point.
    In questo ci aiuta la MarketInfo(Symbol(),MODE_TICKSIZE).
    Last edited by SerSer; 14-09-2015, 14:58.
    https://tradingduepuntozero.com

    Comment


      #3
      Grazie per la segnalazione, Serghey.
      Ero a conoscenza del fatto che alcune volte si deve dividere il TICKVALUE per il TICKSIZE, ma quando ho scritto la funzione, mi era totalmente passato di mente.

      Ecco la funzione con la piccola imperfezione corretta:
      Code:
      //Variabili esterne...
      extern double Rischio=5;
      //----
      double LottiConRischioXsulloSL(double SL)
        {
         double lotti=0;
         double MaxLotti,MinLotti,ValoreSL,ValoreTick,Coefficiente; 
         
         MaxLotti=(AccountFreeMargin()*Rischio/100*10);
         
         if(Digits%2==0) ValoreTick=MarketInfo(Symbol(),MODE_TICKVALUE)/MarketInfo(Symbol(),MODE_TICKSIZE)/10;
         else ValoreTick=MarketInfo(Symbol(),MODE_TICKVALUE)/MarketInfo(Symbol(),MODE_TICKSIZE);
         
         ValoreSL=SL*ValoreTick;
         MinLotti=MarketInfo(Symbol(),MODE_MINLOT);
         Coefficiente=MaxLotti/ValoreSL;
         
         if(Coefficiente>=1)
          {
           lotti=(Coefficiente*MinLotti);
          }
         else
          {
           Print("Margine insufficiente. SL troppo stretto o rischio troppo basso.");
           return(-1);
          }
         
         return(NormalizeDouble(lotti,2));
        }
      Skype: cadddami

      Comment


        #4
        ciao perchè qui al denominatore moltiplichi per 10?
        PHP Code:
        MaxLotti=(AccountFreeMargin()*Rischio/100*10
        e perechè qui dividi per 10?
        PHP Code:
        ValoreTick=MarketInfo(Symbol(),MODE_TICKVALUE)/MarketInfo(Symbol(),MODE_TICKSIZE
        poi come mai non hai messo
        PHP Code:
        return(NormalizeDouble(TakeProfit,MarketInfo(Symbol,MODE_TICKVALUE)) 
        anzicchè il numero?


        ciao e grazie
        Last edited by texcs; 08-04-2020, 11:38.

        Comment

        Working...
        X