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.:sorrriso:
    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, 15:58.
    https://tradingduepuntozero.com

    Comment


      #3
      Grazie per la segnalazione, Serghey.:sorrriso:
      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.:non sono stato io:

      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, 12:38.

        Comment

        Working...
        X