Announcement

Collapse
No announcement yet.

Calcolo lotti in modo automatico

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

    Calcolo lotti in modo automatico

    PHP Code:
    }
       
    double CalcolaSize(double RischioIns){

         
    double diff=MyStopLoss*Digits*Point;
         
    diff=NormalizeDouble(diff,Digits);
         
    Vol=(AccountFreeMargin()*RischioIns/100)/(MarketInfo(Symbol(),MODE_TICKVALUE)*diff*MathPow(10,MarketInfo(Symbol(),MODE_DIGITS)));
         return 
    NormalizeDouble(Vol,2);



    Per adattare questa funzione ai conti cent ho aggiunto "00"
    PHP Code:
     Vol=(AccountFreeMargin()*RischioIns/10000)/(MarketInfo(Symbol(),MODE_TICKVALUE)*diff*MathPow(10,MarketInfo(Symbol(),MODE_DIGITS))) 
    ma ho notato che nei cambi con "jpy " che hanno un numero minori di cifre decimali non apre nulla;
    ho provato pure a modificare il "100" con "MarketInfo(Symbol(),MODE_DIGITS)" e con "DIGTS" ma nulla non va...
    qualcuno può darmi una mano


    grazie 1000

    #2
    non tutti i broker permettono i microlotti e non tutte le coppie di valute lo permettono.

    E' necessario che ti stampi a video questi valori per sapere se puoi

    Code:
    Print("SYMBOL_VOLUME_MIN=",SymbolInfoDouble(Symbol(),SYMB OL_VOLUME_MIN));
    Print("SYMBOL_VOLUME_STEP=",SymbolInfoDouble(Symbol(),SYM BOL_VOLUME_STEP));
    Print("MODE_MINLOT=",MarketInfo(Symbol(),MODE_MINLOT));
    Print("MODE_LOTSTEP=",MarketInfo(Symbol(),MODE_LOTSTEP));
    il significato delle variabili lo leggi nella reference di mql4
    La vita non è un giro di prova, cogli l’attimo..
    Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

    Comment


      #3
      si lo so è ho fatto la funzione di questo broker il risultato è
      Lotsize 1000
      Minilot 0.01
      Lotstep 0.01
      MaxLott 100
      Tickvalue 0.009298692603819903
      Digts3
      SYMBOL_VOLUME_MIN=0.01
      SYMBOL_VOLUME_STEP=0.01

      infatti posso però vorrei che la funzione si adattasse da sola hai tipi di conti

      Comment


        #4
        dopo il consiglio mi sono studiato meglio le reference è ho tirato fuori questa funzione


        PHP Code:
        double CalcolaSizeA(double RischioInsdouble sl_points)
        {

           
        double riskRischioIns;
           
        double TickSize  SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
           
        double TickValue SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE);
           
        double PointSize SymbolInfoDouble(Symbol(),SYMBOL_POINT);
           
        double PointValueTickValue PointSize TickSize;
           
        double capital=AccountInfoDouble(ACCOUNT_BALANCE);
           
        double risk_money=risk/100.0*capital;
           
        double lots risk_money/sl_points/PointValue;
           
        double lotstep SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
           
        lots NormalizeDouble(lots/lotstep,0)*lotstep;
           return (
        lots);

        Però su un capitale di 1000 € mi calcola 362.43 lotti è ovviamente mi da errore dove ho sbagliato che ho mancato

        Comment


          #5
          Originally posted by texcs View Post
          Però su un capitale di 1000 € mi calcola 362.43 lotti è ovviamente mi da errore dove ho sbagliato che ho mancato
          se posti il codice di una funzione che ha due parametri RischioIns e sl_points di cui non fornisci il valore numerico,
          come pensi che si possa comprendere se è corretto che su un capitale di 1000 € "mi calcola 362.43 lotti" ?
          La vita non è un giro di prova, cogli l’attimo..
          Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

          Comment


            #6
            Hai ragione scusa
            allora deposito iniziale 200€
            StopLoss = 20;
            RischioIns = 2;
            P=
            Stop loss * p= 0.0002

            Comment


              #7
              nella funzione stai passando come parametro double sl_points,
              ma dovresti passare invece il numero di pip di stoploss, non la versione in point di stoploss.

              Comunque, un modo veloce per calcolare il numero LOTTI al tuo Trading System è ben descritto qui

              http://www.programmazionemql4.it/201...mero-di-lotti/
              La vita non è un giro di prova, cogli l’attimo..
              Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

              Comment


                #8
                Io sono partito da quella funzione di quel link che è:

                PHP Code:
                RischioIns =2
                SLBuyp 
                StopLoss p;
                SLBuy StopLoss
                double CalcolaSizeB
                (double RischioInsdouble StopLossIns)
                {

                     
                double diff=StopLossIns Digits *Point;
                     
                diff=NormalizeDouble(diff,Digits);
                     
                Vol=(AccountBalance()*RischioIns/100)/(MarketInfo(Symbol(),MODE_TICKVALUE)*diff*MathPow(10,MarketInfo(Symbol(),MODE_DIGITS)));
                     return 
                NormalizeDouble(Vol,2);  

                ho provato sia a passargli SLBuyp che SLBuy
                però alla riga di "vol" mi da questo errore "2020.04.19 23:47:39.658 2020.01.02 08:03:45 zero divide in......(109,85)

                c'è qualche errore che non riesco a vedere qualcuno può aiutarmi?

                Comment


                  #9
                  "zero divide" significa che alla riga
                  Vol=(AccountBalance()*RischioIns/100)/(MarketInfo(Symbol(),MODE_TICKVALUE)*diff*MathPow( 10,MarketInfo(Symbol(),MODE_DIGITS)));
                  stai dividendo per 0 e quindi hai errore.

                  Per valutare da te dove sta l'errore
                  è necessario che stampi il valore delle variabili così leggi dove sta l'errore

                  ad esempio
                  HTML Code:
                  Print("Vol="+DoubleToStr(Vol,Digits)+" AccountBalance()="+DoubleToStr(AccountBalance(),Digits)+" RischioIns="+DoubleToStr(RischioIns,Digits)+" (MarketInfo(Symbol(),MODE_TICKVALUE)="+DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),Digits)+" MathPow(10,MarketInfo(Symbol(),MODE_DIGITS))="+DoubleToStr(MathPow(10,MarketInfo(Symbol(),MODE_DIGITS)),Digits));
                  La vita non è un giro di prova, cogli l’attimo..
                  Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

                  Comment


                    #10
                    io mi sto incasinando perchè nella funzione che ho scaricato da quel link lui calcola lo stop sull'ask ma invece io so e (me lo hai confermato pure tu) che si calcola sul bid invece lui lo ha calcolato sull'ask (poi il tp non lo moltiplica per il point booo) ti mando tutto il codice:
                    Codice scaricato dal link :
                    PHP Code:


                    double SL_OrdineBuy
                    ;
                    double TP_OrdineBuy=1.18;
                    double Vol=1;

                    double extern Rischio=2;
                    int MyStopLoss=20;



                    int OnInit()
                      {
                       
                    SL_OrdineBuy=Ask-MyStopLoss*10*Point;
                       
                    Vol=CalcolaSize(Rischio);
                       
                    OrderSend(Symbol(),OP_BUY,Vol,Ask,0,SL_OrdineBuy,TP_OrdineBuy,"Ordine Buytex",0,0,clrBlack);

                    //   Comment("Stop =   " + MyStopLoss*10*Point+  "Calcolo tex " + NormalizeDouble(Vol,MarketInfo(Symbol(),Digits)));

                       
                    return(INIT_SUCCEEDED);
                      }

                    void visualizzaInfoConto()
                    {
                    Comment ("\nLotsize "MarketInfo(Symbol(), MODE_LOTSIZE) +"\nMinilot " MarketInfo(Symbol(), MODE_MINLOT)+"\nLotstep " MarketInfo(Symbol(), MODE_LOTSTEP)+
                             
                    "\nMaxLott " MarketInfo(Symbol(), MODE_MAXLOT) + "  \nTickvalue " MarketInfo(Symbol(),MODE_TICKVALUE)+ "  \nDigts" MarketInfo(Symbol(),MODE_DIGITS));
                    }
                       
                    double CalcolaSize(double RischioIns){

                         
                    double diff=MyStopLoss*Digits*Point;
                         
                    diff=NormalizeDouble(diff,Digits);
                         
                    Vol=(AccountFreeMargin()*RischioIns/100)/(MarketInfo(Symbol(),MODE_TICKVALUE)*diff*MathPow(10,MarketInfo(Symbol(),MODE_DIGITS)));
                         return 
                    NormalizeDouble(Vol,2);



                    https://www.youtube.com/watch?v=zE1u5EGM3J8&t=186s
                    qui trovi pure la spiegazione!!

                    PHP Code:
                    extern double     StopLoss              20;
                    extern double     TakeProfit            =60;

                    SLBuy =Bid StopLoss Point;
                    TPBuy =Bid TakeProfit Point;
                    SLBuy =Bid StopLoss Point;
                    TPBuy =Bid TakeProfit Point;

                    double CalcolaSize(double RischioIns)
                    {

                         
                    double diff=StopLoss*Digits*Point;
                         
                    diff=NormalizeDouble(diff,Digits);
                         
                    Vol=(AccountFreeMargin()*RischioIns/100)/(MarketInfo(Symbol(),MODE_TICKVALUE)*diff*MathPow(10,MarketInfo(Symbol(),MODE_DIGITS)));
                         return 
                    NormalizeDouble(Vol,2);


                    Grazie!! sto sclerando

                    Comment


                      #11
                      consiglio di contattare direttamente Davide: http://www.programmazionemql4.it/chi-sono/
                      La vita non è un giro di prova, cogli l’attimo..
                      Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

                      Comment


                        #12
                        il tipo non risponde cmq ne sto provando ad usare più di una funzione ma c'è sempre qualcosa che sbaglio non riesco proprio a sistemarle
                        te le posto vedi se ci riuscite a capire qualcosa in caso cono disposto pure a contatti privati.
                        PHP Code:
                        double CalcolaSize(double Riskdouble StopLossIns)
                        {
                           
                        double RiskMoney AccountBalance() * Risk 100;
                           
                        double TickValue MarketInfo(Symbol(), MODE_TICKVALUE);
                           
                        double TickSize MarketInfo(Symbol(), MODE_TICKSIZE);
                           
                        double PositionSize RiskMoney / (StopLossIns TickValue TickSize);
                           return 
                        NormalizeDouble(PositionSize,2);


                        e

                        PHP Code:
                        double CalcolaSizeA(double RischioInsdouble sl_points)
                        {

                           
                        double riskRischioIns;
                           
                        double TickSize  SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
                           
                        double TickValue SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE);
                           
                        double PointSize SymbolInfoDouble(Symbol(),SYMBOL_POINT);
                           
                        double PointValueTickValue PointSize TickSize;
                           
                        double capital=AccountInfoDouble(ACCOUNT_BALANCE);
                           
                        double risk_money=risk/100000*capital;
                           
                        double lots risk_money/sl_points/PointValue;
                           
                        double lotstep SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
                           
                        lots NormalizeDouble(lots/lotstep,0)*lotstep;
                           return (
                        lots);

                        Comment


                          #13
                          prova questo script, calcola il valore dell'esposizione del trade per uno stoploss in pip fissato, partendo da un capitale ed un rischio

                          Attached Files
                          La vita non è un giro di prova, cogli l’attimo..
                          Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

                          Comment


                            #14
                            Originally posted by umbertosm View Post
                            prova questo script, calcola il valore dell'esposizione del trade per uno stoploss in pip fissato, partendo da un capitale ed un rischio

                            Ti ringrazio moltissimo di avermi inviato questo script da cui ho ricavato questa funzione per testarla:
                            PHP Code:
                            double CalcoloTexOrigi()
                              {
                            //---
                               
                            double capitale      1000;
                               
                            double rischio       2;
                               
                            double stoplossPip   40;

                               
                            double _pip          Point;
                               
                            string spiega_pip    "";
                               if(
                            Digits==3
                                 { 
                                  
                            _pip 10*Point;
                                  
                            spiega_pip "Digit=3 --> pip = 10*Point";
                                 }
                               else if(
                            Digits==5
                                 { 
                                  
                            _pip 10*Point;
                                  
                            spiega_pip "Digit=5 --> pip = 10*Point";
                                 }
                               else 
                            spiega_pip "Digit="+IntegerToString(Digits)+" --> pip = Point";
                               Print(
                            spiega_pip);


                               
                            double RiskMoney  capitale rischio 100;

                               
                            double lots       RiskMoney/(stoplossPip * (_pip/Point) * (MarketInfo(Symbol(), MODE_TICKVALUE)/(MarketInfo(Symbol(), MODE_TICKSIZE)/MarketInfo(Symbol(), MODE_POINT))));
                               
                            //double pipVal = (MarketInfo(Symbol(), MODE_TICKVALUE)/(MarketInfo(Symbol(), MODE_TICKSIZE)/MarketInfo(Symbol(), MODE_POINT)))*(_pip/Point)*lots;

                             
                            return (lots);

                            A sto punto ho capito che la funzione sballa ( e probabilmente era il problema di tutte le funzioni che ho provato fino ad ora ma nn lo capivo) quando gli passi un numero con la virgola come capitale,
                            allora che ho fatto io ho provato a passargli:

                            double apitale =1000.51;// 99862;
                            double capitale = NormalizeDouble(apitale,2);

                            ma non ne vuole sapere..............

                            vorrei risolvere in modo da assegnare a capitale l'AccountEquity in modo che faccia tutto in automatico.

                            ho pure provato:
                            Capitale = NormalizeDouble(AccountEquity(),2);
                            mi potete aiutare





                            Comment


                              #15
                              texcs io non riesco a comprendere... ho allegato uno script contenente le variabili per calcolare l'esposizione di un trade una volta che hai deciso il numero di PIP di stoploss, il capitale a disposizione e la percentuale di rischio.

                              Se al posto della variabile
                              Code:
                               double capitale
                              ci metti
                              Code:
                              AccountEquity()
                              che è una variabile anch'essa double, deve funzionare tutto ugualmente!

                              Quando scrivi che "la funzione sballa quando gli passi un numero con la virgola"
                              per me è qualcosa di incomprensibile: la variabile double è per definizione un numero NON intero, decimale, numero con la virgola.

                              A me lo script che avevo postato funziona perfettamente.

                              Se a te non funziona, hai qualcosa che non va nel PC. Non so aiutarti ulteriormente.
                              La vita non è un giro di prova, cogli l’attimo..
                              Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

                              Comment

                              Working...
                              X