Announcement

Collapse
No announcement yet.

x Alexis - efs - costruire un indicatore - help

Collapse
This topic is closed.
X
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • #31
    perfetto Alexis ! ma non capisco... c'è il controllo della sintassi e non mi diceva nulla...

    cmq questo è il frutto di questo primo lavoro... ho cambiato lo spessore

    Sostieni il Meglio di te , aiutaci a fare di più!

    Fra

    Comment


    • #32
      Fra
      Strano perche io ho usato il Syntax Checker sulla tua formula e mi ha dato tutti quegli errori.
      Aggiungi ora l'altra condizione che hai citato prima e dovresti avere completato il tuo indicatore
      Alex

      Comment


      • #33
        PHP Code:
        var vMACD12_26 = new MACDStudy(12269"Close"false);
        var 
        vEMA10 = new MAStudy(100"Close"MAStudy.EXPONENTIAL);


        function 
        preMain() {

            
        setPriceStudy(true);
            
        setStudyTitle("Indicatore Prova");
            
        setCursorLabelName("Somma"0);
            
        setDefaultBarStyle(PS_SOLID0);
            
        setDefaultBarFgColor(Color.lightgrey0);
            
        setDefaultBarThickness(30);
            
        setPlotType(PLOTTYPE_LINE0);

        }

        function 
        main() {
            

        var 
        vSomma vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA) ;
        var 
        vSomma1 vMACD12_26.getValue(MACDStudy.MACD,-1) + vEMA10.getValue(MAStudy.MA,-1) ;
        var 
        vSomma2 vMACD12_26.getValue(MACDStudy.MACD,-2) + vEMA10.getValue(MAStudy.MA,-2) ;

        if(
        vSomma vSomma1 && vSomma1 vSomma2setBarFgColor(Color.green); 
        if(
        vSomma vSomma1 && vSomma1 vSomma2setBarFgColor(Color.red); 
        //if(vSomma1 > vSomma2 && vSomma < vSomma1) setBarFgColor(Color.blue);
        //if(vSomma1 < vSomma2 && vSomma > vSomma1) setBarFgColor(Color.magenta); 


             
        return vSomma

            

        Alexis

        ho inserito per didattica ma poi ho preferito togliere le ultime due per motivi di visualizzazione...preferisco così

        decidi poi tu se è il caso di continuare con altre spiegazioni/implementazioni

        grazie...mille grazie per il supporto!
        Sostieni il Meglio di te , aiutaci a fare di più!

        Fra

        Comment


        • #34
          Fra
          In effetti rimane ancora una cosa da fare per correggere un errore che si verfiica quando uno solo dei due indicatori riporta dati (nel caso specifico all'inizio del tracciato).



          Per correggere questo errore basta implementare un null check cioe definire una condizione nella quale se uno degli indicatori non riporta valori allora l'efs non riporta il tracciato sul grafico.
          if(vMACD12_26.getValue(MACDStudy.MACD) == null || vEMA10.getValue(MAStudy.MA) == null)
          return;

          Le due || barrette verticali (in inglese pipes) stanno a significare OR in javascript/efs. Quindi se l'uno o l'altro studio non riporta valori la formula non riportera nulla sul grafico dato che il return e' lasciato volutamente vuoto. Il risultato e' visibile nell'immagine che segue



          Ecco di seguito il listato con la nuova aggiunta
          Alex

          PHP Code:
          var vMACD12_26 = new MACDStudy(12269"Close"false);
          var 
          vEMA10 = new MAStudy(100"Close"MAStudy.EXPONENTIAL);


          function 
          preMain() {

              
          setPriceStudy(true);
              
          setStudyTitle("Indicatore Prova");
              
          setCursorLabelName("Somma"0);
              
          setDefaultBarStyle(PS_SOLID0);
              
          setDefaultBarFgColor(Color.lightgrey0);
              
          setDefaultBarThickness(30);
              
          setPlotType(PLOTTYPE_LINE0);

          }

          function 
          main() {

          if(
          vMACD12_26.getValue(MACDStudy.MACD) == null || vEMA10.getValue(MAStudy.MA) == null)
          return;   

          var 
          vSomma vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA) ;
          var 
          vSomma1 vMACD12_26.getValue(MACDStudy.MACD,-1) + vEMA10.getValue(MAStudy.MA,-1) ;
          var 
          vSomma2 vMACD12_26.getValue(MACDStudy.MACD,-2) + vEMA10.getValue(MAStudy.MA,-2) ;

          if(
          vSomma vSomma1 && vSomma1 vSomma2setBarFgColor(Color.green); 
          if(
          vSomma vSomma1 && vSomma1 vSomma2setBarFgColor(Color.red); 
          //if(vSomma1 > vSomma2 && vSomma < vSomma1) setBarFgColor(Color.blue);
          //if(vSomma1 < vSomma2 && vSomma > vSomma1) setBarFgColor(Color.magenta); 


               
          return vSomma

          Comment


          • #35
            Ok !

            ora una curiosità...se uno volesse plottare invece l'indicatore in uno study pane in basso ...si può modificare questo o bisogna crearne uno uguale partendo sempre dal FW e impostandolo in partenza?

            PS le altre due variabili che ho messo in basso (dopo le //) son giuste?
            Sostieni il Meglio di te , aiutaci a fare di più!

            Fra

            Comment


            • #36
              Fra
              Si e' possibile con un solo piccolo cambiamento. In preMain il primo comando e' setPriceStudy(true); che significa che lo studio plottera nella price pane. Se vuoi che lo stesso studio plotti in una finestra a parte allora rimpiazza true con false
              Si la parte aggiuntiva andava bene.
              Alex

              Comment


              • #37
                ok ! perfetto...quando vorrai fare un'altra "lezione"... bussa pure
                Sostieni il Meglio di te , aiutaci a fare di più!

                Fra

                Comment


                • #38
                  piccolo problema impostando la visualizzazione in study pane... vede solo due decimali...

                  Last edited by fra; 05-05-2004, 09:55 AM.
                  Sostieni il Meglio di te , aiutaci a fare di più!

                  Fra

                  Comment


                  • #39
                    Fra
                    Non e' possibile controllare via efs il numero di decimali visualizzabili nel study pane.
                    L'unica soluzione che mi viene in mente al momento e' quella di moltiplicare vSomma per 1000 nel return
                    Alex

                    Comment


                    • #40
                      la cosa strana è che lo fa solo col fut euro/$....
                      Sostieni il Meglio di te , aiutaci a fare di più!

                      Fra

                      Comment


                      • #41
                        Fra
                        Da quello che vedo riporta due decimali anche con altri simboli.
                        Comunque eccoti una soluzione in alternative a quella che ti ho suggerito prima (cioe' di moltiplicare vSomma per 1000). Questa soluzione offre il vantaggio di non dover modificare il moltiplicatore a seconda del simbolo usato. Sostituisci l'attuale return con il seguente
                        return (formatPriceNumber(vSomma))*1;
                        Alex

                        Comment


                        • #42
                          Fra
                          A questo punto puo essere interessante vedere come la stessa formula possa essere scritta usando costrutti, sintassi e funzioni completamente diverse.
                          Anche se al momento alcune di queste soluzioni potranno sembrare incomprensibili avranno comunque l'effetto di evidenziare la flessibilita del linguaggio e soprattutto potranno servire in futuro come mascherine per altri studi (ergo estendendo l'aspetto didattico che desideravi per questo thread)
                          A questo proposito ti suggerirei di concentrare la prima parte della tua ricerca/studi su efs sui costrutti delle formule piuttosto che sulla sintassi e/o le funzioni. Questo perche una volta che si sia ben afferrato il costrutto si possono piu facilmente creare efs anche se non si conoscono la sintassi e/o le funzioni che si possono sempre copiare dai vari help files. Nel tempo vedrai che efs e' sufficientemente modulare da consentire di copiare intere sezioni e trasportarle ad altri efs sempre pero a condizione che si abbia una conoscenza del costrutto della formula.

                          Comunque ecco la prima variante dello stesso studio che si e' sviluppato fino ad ora. Nota che per queste varianti ho eliminato le condizioni addizionali - che erano comunque disattivate - cosi da evidenziare I commenti e le spiegazioni che ho aggiunto nei vari listati.
                          In questo caso ho completamente eliminato l'uso di variabili invocando invece direttamente gli oggetti nelle condizioni. Di tutte le versioni possibili questa e' certamente la piu semplice da costruire anche se la piu tediosa dato che costringe a riscrivere in ogni condizione ciascun oggetto usato.
                          Da notare che questa specifica versione dell'efs si puo anche costruire usando il solo Fomula Wizard.

                          PHP Code:
                          var vMACD12_26 = new MACDStudy(12269"Close"false);
                          var 
                          vEMA10 = new MAStudy(100"Close"MAStudy.EXPONENTIAL);

                          function 
                          preMain() {

                              
                          setPriceStudy(true);
                              
                          setStudyTitle("Indicatore Prova2");
                              
                          setCursorLabelName("Somma"0);
                              
                          setDefaultBarStyle(PS_SOLID0);
                              
                          setDefaultBarFgColor(Color.lightgrey0);
                              
                          setDefaultBarThickness(30);
                              
                          setPlotType(PLOTTYPE_LINE0);
                          }

                          function 
                          main() {

                          if(
                          vMACD12_26.getValue(MACDStudy.MACD) == null || vEMA10.getValue(MAStudy.MA) == null)
                          return;   

                          if((
                          vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA)) > //se la somma dei valori attuali
                                                                                                   //di questi oggetti e maggiore
                             
                          (vMACD12_26.getValue(MACDStudy.MACD,-1) + vEMA10.getValue(MAStudy.MA,-1)) && //della somma degli stessi 
                                                                                                          //oggetti di una barra fa E
                             
                          (vMACD12_26.getValue(MACDStudy.MACD,-1) + vEMA10.getValue(MAStudy.MA,-1)) > //la somma degli oggetti di 
                                                                                                         //una barra fa e' maggiore
                             
                          (vMACD12_26.getValue(MACDStudy.MACD,-2) + vEMA10.getValue(MAStudy.MA,-2))) //di quella degli oggetti di 
                                                                                                        //due barre fa
                                  
                          setBarFgColor(Color.green); //colora la linea in verde
                                  
                          if((vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA)) <  //logica come sopra ma invertita
                             
                          (vMACD12_26.getValue(MACDStudy.MACD,-1) + vEMA10.getValue(MAStudy.MA,-1)) &&
                             (
                          vMACD12_26.getValue(MACDStudy.MACD,-1) + vEMA10.getValue(MAStudy.MA,-1)) <
                             (
                          vMACD12_26.getValue(MACDStudy.MACD,-2) + vEMA10.getValue(MAStudy.MA,-2)))
                                  
                          setBarFgColor(Color.red); 


                              return (
                          vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA)); //riporta la somma degli oggetti

                          Il risultato di questa formula e' esattamente il medesimo che si ottiene con quella che si e' costruita assieme
                          Alex

                          Comment


                          • #43
                            La variante allegata a questo messaggio fa invece uso di una funzione efs, nella fattispecie getBarState() (vedi gli Help Files per la spiegazione e sintassi). In questa versione tra l'altro introduco il concetto di variabile globale creata cioe al di fuori della funzione main() e quindi peristente in memoria.
                            In questo caso uso getBarState() per definire il momento in cui viene creata una nuova barra (con BARSTATE_NEWBAR). In quell'istante con una semplice traslazione di valori assegno all variabile vSomma2 il valore di vSomma1 appena completato e alla variabile vSomma1 il valore di vSomma appena completato creando di consequenza una serie storica di due barre.
                            Questo e' un metodo molto semplice per creare serie storiche brevi (due o tre barre) specialmente utile quando non si usino studi builtin con I quali e' possibile reperire I valori storici (come si e' fatto nella prima versione in questo thread).

                            PHP Code:
                            var vMACD12_26 = new MACDStudy(12269"Close"false);
                            var 
                            vEMA10 = new MAStudy(100"Close"MAStudy.EXPONENTIAL);

                            function 
                            preMain() {

                                
                            setPriceStudy(true);
                                
                            setStudyTitle("Indicatore Prova3");
                                
                            setCursorLabelName("Somma"0);
                                
                            setDefaultBarStyle(PS_SOLID0);
                                
                            setDefaultBarFgColor(Color.lightgrey0);
                                
                            setDefaultBarThickness(30);
                                
                            setPlotType(PLOTTYPE_LINE0);
                            }

                            //dichiaro le variabili fuori da main cosi da renderle globali anziche locali
                            //ergo rimangono in memoria durante la vita dell'efs
                            var vSomma null;
                            var 
                            vSomma1 null;
                            var 
                            vSomma2 null;

                            function 
                            main() {

                            if(
                            vMACD12_26.getValue(MACDStudy.MACD) == null || vEMA10.getValue(MAStudy.MA) == null)
                            return;   

                            if(
                            getBarState() == BARSTATE_NEWBAR){ //appena si forma una nuova barra
                            vSomma2 vSomma1//assegna alla variabile vSomma2 il valore di vSomma1 appena completato 
                            vSomma1 vSomma;  //assegna alla variabile vSomma1 il valore di vSomma appena completato
                            }
                            //in questo modo formo una serie storica di vSomma senza dover creare le variabili separatamentei

                            vSomma vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA);

                            if(
                            vSomma vSomma1 && vSomma1 vSomma2setBarFgColor(Color.green); 
                            if(
                            vSomma vSomma1 && vSomma1 vSomma2setBarFgColor(Color.red); 


                                 return 
                            vSomma

                            Il risultato finale e' ancora una volta il medesimo
                            Alex

                            Comment


                            • #44
                              La terza variante di questa serie fa invece uso di un altro comando nella fattispecie ref(). Questo comando consente di salvare valori storici del riporto (o riporti) listati nel return (per ulteriori informazioni, sintassi ed esempi vedere gli Help Files).
                              L'utilita di questo comando non e' particolarmente evidente in questo specifico esempio dove il riporto (cioe' vSomma) e' un valore singolo e per di piu costituito da variabili per le quali e' facile avere I valori storici, ma e' invece molto utile quando il return comprende piu elementi e/o I metodi descritti fino ad ora non sono applicabili.

                              PHP Code:
                              function preMain() {

                                  
                              setPriceStudy(true);
                                  
                              setStudyTitle("Indicatore Prova4");
                                  
                              setCursorLabelName("Somma"0);
                                  
                              setDefaultBarStyle(PS_SOLID0);
                                  
                              setDefaultBarFgColor(Color.lightgrey0);
                                  
                              setDefaultBarThickness(30);
                                  
                              setPlotType(PLOTTYPE_LINE0);
                              }

                              var 
                              BarCntr 0//variabile globale che serve come contatore (necessario con l'uso di ref())

                              function main() {

                              if(
                              vMACD12_26.getValue(MACDStudy.MACD) == null || vEMA10.getValue(MAStudy.MA) == null)
                              return;   

                              var 
                              vSomma vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA) ;

                              if(
                              getBarState()==BARSTATE_NEWBAR){ //appena si forma una nuova barra
                                  
                              BarCntr += 1//incrementa il contatore di 1
                                  

                                  if (
                              BarCntr 5) { //se il contatore e maggiore di 5 (questo deve essere un valore
                                                     //sempre superiore a quello della serie storica che si desidera creare e
                                                     //serve ad assicurarsi che ci siano sufficienti dati per creare I valori storici
                                  
                              var vSomma1=ref(-1); //assegna alla variabile vSomma1 il riporto (cioe return) di una barra fa
                                  
                              var vSomma2=ref(-2); //assegna alla variabile vSomma2 il riporto di 2 valori fa  
                                  
                              }  

                              if(
                              vSomma vSomma1 && vSomma1 vSomma2setBarFgColor(Color.green); 
                              if(
                              vSomma vSomma1 && vSomma1 vSomma2setBarFgColor(Color.red); 


                                   return 
                              vSomma

                              Il tracciato risultante da questa versione e' identico alle altre.
                              Alex

                              Comment


                              • #45
                                L'ultima variante fa uso della funzione Array (spiegazioni, sintassi ed esempi sono disponibili negli Help Files) ed e' la piu complessa da creare ma e' anche quella che offre la maggiore flessibilita.
                                Di solito non viene usata per casi come questo ma per creare serie storiche estese - di uno o piu elementi - utili ad esempio per creare medie mobili, trovare valori minimi/massimi ecc.

                                PHP Code:
                                var vMACD12_26 = new MACDStudy(12269"Close"false);
                                var 
                                vEMA10 = new MAStudy(100"Close"MAStudy.EXPONENTIAL);

                                function 
                                preMain() {

                                    
                                setPriceStudy(true);
                                    
                                setStudyTitle("Indicatore Prova5");
                                    
                                setCursorLabelName("Somma"0);
                                    
                                setDefaultBarStyle(PS_SOLID0);
                                    
                                setDefaultBarFgColor(Color.lightgrey0);
                                    
                                setDefaultBarThickness(30);
                                    
                                setPlotType(PLOTTYPE_LINE0);
                                }

                                var 
                                aSomma null//variabile globale Array 

                                function main() {

                                if(
                                vMACD12_26.getValue(MACDStudy.MACD) == null || vEMA10.getValue(MAStudy.MA) == null)
                                return;   

                                var 
                                vSomma vMACD12_26.getValue(MACDStudy.MACD) + vEMA10.getValue(MAStudy.MA) ;

                                    if (
                                aSomma == null) { //se l'Array aSomma e' uguale a null
                                        
                                aSomma = new Array(5); //crea una Array che contenga 5 valori (che saranno numerati da 0-4)
                                    
                                }
                                    if (
                                getBarState() == BARSTATE_NEWBAR) { //appena si forma una nuova barra
                                        
                                aSomma.pop();  //elimina il piu vecchio dei 5 valori dell'Array
                                        
                                aSomma.unshift(vSomma); //aggungi il piu recente prendendolo da vSomma
                                    
                                } else { //altrimenti
                                        
                                aSomma[0] = vSomma//il valore corrente dell'Array aSomma e' vSomma
                                    
                                }
                                // a questo punto ho creato una Array chiamata aSomma che e' composta da aSomma[0] cioe il valore
                                // attuale (che sappiamo pari a vSomma) fino ad aSomma[4] cioe il valore di vSomma di 4 barre fa
                                // e saranno questi valori aSomma che uso nelle condizioni che seguono

                                if(aSomma[0] > aSomma[1] && aSomma[1] > aSomma[2]) setBarFgColor(Color.green); 
                                if(
                                aSomma[0] < aSomma[1] && aSomma[1] < aSomma[2]) setBarFgColor(Color.red); 


                                     return 
                                vSomma//qui potrei usare anche aSomma[0] se volessi

                                Di seguito il risultato creato da questa variante.
                                Alex

                                Comment

                                Working...
                                X