Announcement

Collapse
No announcement yet.

Help - costruzione efs

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

  • #31
    Alexis

    volevo disegnare sul chart un possibile takeProfit/StopLoss e tanto per provare ho messo (close(-1)+((high(-1)-low(-1))...viceversa il close-(high-low)

    quando vado ad applicare l'efs mi disegna solo un prezzo...come mai? Tieni presente che volevo includerlo nell'efs che abbiamo elaborato finora nelle onaction

    (ho preso spunto da un post/efs tuo)

    PHP Code:
    function preMain() {
        
    setPriceStudy(true);
        
    setStudyTitle("TakeProfit Long");
        
    setShowCursorLabel(false); 
    }

    function 
    main() {

        var 
    Price1 formatPriceNumber((close(-1))-(high(-1)-low(-1)));
        var 
    Price2 formatPriceNumber((close(-1))+(high(-1)-low(-1)));
        
        
    drawTextRelative(2,(close(-1))-(high(-1)-low(-1)),"t",Color.blue,null,Text.VCENTER,"Wingdings 3",8,1);
        
    drawTextRelative(4,(close(-1))-(high(-1)-low(-1)), Price1Color.blue,null,Text.VCENTER,"Arial",10,2);
        
    drawTextRelative(2,(close(-1))+(high(-1)-low(-1)),"t",Color.red,null,Text.VCENTER,"Wingdings 3",8,1);
        
    drawTextRelative(4,(close(-1))+(high(-1)-low(-1)), Price2Color.red,null,Text.VCENTER,"Arial",10,2);
        
        return;

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

    Fra

    Comment


    • #32
      Fra
      Te ne riporta soltanto uno perche stai usando lo stesso TagName (cioe' l'ultimo valore in ciascun comando) come parametro. Siccome puoi avere un solo oggetto grafico con quel nome ti riporta soltanto il risultato dell'ultimo comando eseguito.
      Prova a sostituire con il seguente
      Alex

      PHP Code:
      drawTextRelative(2,(close(-1))-(high(-1)-low(-1)),"t",Color.blue,null,Text.VCENTER,"Wingdings 3",8,"freccia1");
          
      drawTextRelative(4,(close(-1))-(high(-1)-low(-1)), Price1Color.blue,null,Text.VCENTER,"Arial",10,"prezzo1");
          
      drawTextRelative(2,(close(-1))+(high(-1)-low(-1)),"t",Color.red,null,Text.VCENTER,"Wingdings 3",8,"freccia2");
          
      drawTextRelative(4,(close(-1))+(high(-1)-low(-1)), Price2Color.red,null,Text.VCENTER,"Arial",10,"prezzo2"); 

      Comment


      • #33
        Grazie Alexis

        in effetti vedevo che escludendone uno alla volta con // li disegnava entrambi...ma insieme no...
        Sostieni il Meglio di te , aiutaci a fare di più!

        Fra

        Comment


        • #34
          Fra
          Se vuoi rendere leggermente piu efficiente il tuo efs dovresti modificarlo come da esempio. Devi tenere conto che l'efs effettua le computazioni ad ogni tick e quindi nel tuo caso deve ripetere I calcoli che determinano Price1 e Price2 ben tre volte per ciascun valore. Nell'esempio che ti propongo il calcolo viene invece effettuato una sola volta e poi riportato dove necessario usando la variabile (Price1 o Price2). Nota anche che ho aggiunto un null check dopo aver dichiarato le variabili
          Alex

          PHP Code:
          function preMain() {
              
          setPriceStudy(true);
              
          setStudyTitle("TakeProfit Long");
              
          setShowCursorLabel(false); 
          }

          function 
          main() {

              var 
          Price1 = ((close(-1))-(high(-1)-low(-1)));
              var 
          Price2 = ((close(-1))+(high(-1)-low(-1)));
              
              if(
          Price1==null || Price2==null) return;

              
          drawTextRelative(2,Price1,"t",Color.blue,null,Text.VCENTER,"Wingdings 3",8,"freccia1");
              
          drawTextRelative(4,Price1formatPriceNumber(Price1), Color.blue,null,Text.VCENTER,"Arial",10,"prezzo1");
              
          drawTextRelative(2,Price2,"t",Color.red,null,Text.VCENTER,"Wingdings 3",8,"freccia2");
              
          drawTextRelative(4,Price2formatPriceNumber(Price2), Color.red,null,Text.VCENTER,"Arial",10,"prezzo2");
              
              return;

          Comment


          • #35
            infatti mi chiedevo se avendo creato la variabile price1/price2 potevo utilizzare quelle invece di riscrivere close etcetc
            Sostieni il Meglio di te , aiutaci a fare di più!

            Fra

            Comment


            • #36
              Come ti dicevo pochi post fa, questa seconda parte nasce per essere integrata nel primo efs...quindi ho inserito

              PHP Code:
              function main() {

                  var 
              Price1 = ((close(-1))-(high(-1)-low(-1)));
                  var 
              Price2 = ((close(-1))+(high(-1)-low(-1)));
                  
                  if(
              Price1==null || Price2==null) return;

                  
                  if (
              vCCI20.getValue(CCIStudy.CCI) >= 100)
                      
              onAction1();
                  else
                      
              onAction1b(); //ETC ETC 
              e anche
              PHP Code:
              function onAction3() {
                  
              drawShape(Shape.UPTRIANGLE ,BelowBar2,Color.blue,"blue"+getCurrentBarCount());
                  
              drawTextRelative(2,Price1,"t",Color.blue,null,Text.VCENTER,"Wingdings 3",8,"freccia1"+getCurrentBarCount());
                  
              drawTextRelative(4,Price1,formatPriceNumber(Price1), Color.blue,null,Text.VCENTER,"Arial",10,"prezzo1"+getCurrentBarCount());
              }
              function 
              onAction3b(){
                  
              removeShape("blue"+getCurrentBarCount()) //ETC ETC 
              solo che sul chart va in errore
              line68 : ReferenceError Price1 is not defined

              ...dove sbaglio?

              grazie per la pazienza
              Sostieni il Meglio di te , aiutaci a fare di più!

              Fra

              Comment


              • #37
                Fra
                Quello ti succede perche la variabile Price1 e' "locale" e non "globale" in quanto e' dichiarata all'interno di una funzione e quindi non e' accessibile da altre funzioni.
                Le soluzioni sono due. La piu semplice e' quella di dichiarare la variabile come variabile globale (cioe' al di fuori di una specifica funzione - in questo caso main()).
                Questo vuol dire che la variabile sara persistente in memoria ad ogni iterazione dell'efs e sara disponibile anche ad altre funzioni.
                Eccoti di seguito un esempio di questa soluzione. Successivamente mostrero anche la seconda soluzione.
                Alex

                PHP Code:
                var Price1=null;//dichiaro la variabile fuori da main e quindi diventa globale

                function main() {

                    
                Price1 = ((close(-1))-(high(-1)-low(-1)));//siccome questa variabile e' dichiarata fuori 
                                                              //da main non richiede piu il var all'inizio
                    
                var Price2 = ((close(-1))+(high(-1)-low(-1)));//questa variabile e' ancora "locale" cioe'
                                                                  //dichiarata in main
                    
                    
                if(Price1==null || Price2==null) return;//null check

                    
                    
                if (vCCI20.getValue(CCIStudy.CCI) >= 100)
                        
                onAction1();
                    else
                        
                onAction1b(); 
                    
                //etc etc
                    
                    
                }// fine funzione main 


                //ora siccome la variabile Price1 e' globale anche tutte le funzioni che seguiranno potranno
                //usarla

                function onAction3() {
                    
                drawShape(Shape.UPTRIANGLE ,BelowBar2Color.blue"blue"+getCurrentBarCount());
                    
                drawTextRelative(2Price1"t"Color.bluenullText.VCENTER"Wingdings 3"8"freccia1"+getCurrentBarCount());
                    
                drawTextRelative(4Price1formatPriceNumber(Price1), Color.bluenullText.VCENTER"Arial"10"prezzo1"+getCurrentBarCount());
                }
                function 
                onAction3b(){
                    
                removeShape("blue"+getCurrentBarCount()) 
                //etc etc 

                Comment


                • #38
                  TY Alexis

                  tu sapevi già che sarebbe successo questo...

                  io ho provato a inserire un remove text (solo il prezzo, per il momento la freccia la lasciavo) ma ricevo il solito messaggio della referenceerror not definined... il che vuol dire che devo fargli digerire una variabile globale? un getCurrentBarCount?

                  PHP Code:
                  function onAction3() {
                      
                  drawShape(Shape.UPTRIANGLE ,BelowBar2,Color.blue,"blue"+getCurrentBarCount());
                      
                  drawTextRelative(2,Price1,"t",Color.blue,null,Text.VCENTER,"Wingdings 3",8,"freccia1"+getCurrentBarCount());
                      
                  drawTextRelative(4,Price1,formatPriceNumber(Price1), Color.blue,null,Text.VCENTER,"Arial",10,"prezzo1"+getCurrentBarCount()); 
                      
                  removeTextRelative("prezzo1"(-1)); 
                  Attached Files
                  Sostieni il Meglio di te , aiutaci a fare di più!

                  Fra

                  Comment


                  • #39
                    Fra

                    tu sapevi già che sarebbe successo questo...

                    Si. Quello ti succede perche stai passando l'istruzione di disegnare un oggetto grafico ogni qualvolta si verifica la condizione. Questa istruzione la dai assegnando all'oggetto grafico il nome + una variabile che ad ogni barra e' diversa (cioe getCurrentBarCount()). Elimina il +getCurrenntBarCount() e lascia soltanto il nome dell'oggetto e te ne disegnera uno soltanto nella fattispecie l'ultimo (vedi esempio)
                    Alex

                    PHP Code:
                    function onAction3() {
                        
                    drawShape(Shape.UPTRIANGLE BelowBar2Color.blue,"blue"+getCurrentBarCount());
                        
                    drawTextRelative(2,Price1,"t"Color.bluenullText.VCENTER,"Wingdings 3",8,"freccia1");
                        
                    drawTextRelative(4Price1formatPriceNumber(Price1), Color.bluenullText.VCENTER"Arial",10,"prezzo1");

                    Comment


                    • #40
                      allora dopo vari test e tentativi vari...

                      ho portato a "globale" anche la var Price2

                      PHP Code:
                      var vCCI20 = new CCIStudy(20"Close");
                      var 
                      vWMA15 = new MAStudy(150"Close"MAStudy.WEIGHTED);
                      var 
                      Price1=null
                      var Price2=null 
                      poi ho messo la condizione a onAction 5 e 6

                      PHP Code:
                      function onAction5(){
                          
                      setPriceBarColor(Color.lime);
                          
                      drawTextRelative(2,Price1,"t"Color.bluenullText.VCENTER,"Wingdings 3",8,"freccia1");
                          
                      drawTextRelative(4Price1formatPriceNumber(Price1), Color.bluenullText.VCENTER"Arial",10,"prezzo1"); 
                      PHP Code:
                      function onAction6(){
                          
                      setPriceBarColor(Color.red);
                          
                      drawTextRelative(2,Price2,"t"Color.rednullText.VCENTER,"Wingdings 3",8,"freccia2");
                          
                      drawTextRelative(4Price2formatPriceNumber(Price2), Color.rednullText.VCENTER"Arial",10,"prezzo2"); 
                      però ho dovuto inserire onAction 5b e 6b
                      PHP Code:
                      function onAction5b(){
                          
                      removeText("freccia1")
                          
                      removeText("prezzo1"
                      il risultato non è male, solo che in determinate condizioni le scritte si sovrappongono fastidiosamente
                      Attached Files
                      Sostieni il Meglio di te , aiutaci a fare di più!

                      Fra

                      Comment


                      • #41
                        e cert... non ho messo gli "else"

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

                        Fra

                        Comment


                        • #42
                          PHP Code:
                          if (vCCI20.getValue(CCIStudy.CCI) > && close() >= vWMA15.getValue(MAStudy.MA))
                                  
                          onAction5();
                              else
                                  
                          onAction5b(); 
                          idem per la onAction6 e via

                          Grazie Alexis

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

                          Fra

                          Comment


                          • #43
                            Originally posted by fra
                            volevo disegnare sul chart un possibile takeProfit/StopLoss e tanto per provare ho messo (close(-1)+((high(-1)-low(-1))...viceversa il close-(high-low)

                            Logicamente basta sostituire la condizione con quella che uno preferisce per crearsi un tp/sl personalizzato


                            buona serata Alexis,anche a quelli che,silenziosamente, ci stanno seguendo
                            Sostieni il Meglio di te , aiutaci a fare di più!

                            Fra

                            Comment


                            • #44
                              Fra
                              Un'altra modifica che farei per migliorare leggermente le prestazioni e' la seguente.
                              Siccome nel calcolare Price1 e Price2 tu usi sempre e soltanto I prezzi della barra precedente allora non hai bisogno di ricalcolare quelle variabili ad ogni tick perche nel corso della barra corrente non cambieranno mai di valore..
                              Quindi puoi racchiudere I calcoli delle due variabili dentro ad una condizione getBarState()==BARSTATE_NEWBAR e cioe forzi l'efs a calcolare quelle variabili soltanto al completamento della barra.
                              Di seguito puoi vedere come farlo
                              Alex

                              PHP Code:
                              if(getBarState()==BARSTATE_NEWBAR){//ad ogni nuova barra
                                      
                              Price1 = (close(-1)-(high(-1)-low(-1)));//calcola Price1
                                      
                              Price2 = ((close(-1))+(high(-1)-low(-1)));//calcola Price2
                                  

                              Comment


                              • #45
                                Fra
                                Come indicato in un precedente messaggio ci sono due opzioni per passare un valore ad una funzione esterna. Il primo e' quello che abbiamo usato e cioe quello di dichiarare la variabile che ci serve come variabile globale (chiamata anche variabile esterna).
                                Vedi seguente esempio (con commenti nel listato stesso)

                                PHP Code:
                                function preMain() {
                                    
                                setPriceStudy(true);
                                    
                                setStudyTitle("example");
                                    
                                setShowCursorLabel(false); 
                                }

                                var 
                                Price1 null;//variabile globale il che significa che sara disponibile per tutte le 
                                                  //funzioni in questo efs quindi sia main che onAction1

                                function main() {

                                    
                                Price1 = ((close(-1))-(high(-1)-low(-1)));//qui calcolo la variabile

                                    
                                if(1==1)//condizione
                                        
                                onAction1();//comando da eseguire
                                                    //in questo caso "chiamo" una funzione esterna cioe onAction1 che contiene il comando
                                                    //da eseguire

                                    
                                return;
                                }
                                //questa e' la funzione che viene chiamata
                                function onAction1(){
                                    
                                //questo e' il comando da eseguire
                                    
                                drawTextRelative(4,Price1formatPriceNumber(Price1), Color.blue,null,Text.VCENTER,"Arial",10,"prezzo1");
                                }
                                //fine funzione 
                                Ci possono pero essere delle situazioni in cui non desideriamo (o non possiamo) dichiarare la variabile come globale e ci serve invece mantenerla come variabile locale.
                                In questo caso come possiamo passare alla funzione esterna il valore che ci serve in quella funzione?
                                Se noti quando chiamiamo la funzione esterna questa e' immediatamente seguita da parentesi. Ad esempio

                                PHP Code:
                                if(1==1)
                                onAction1();//nota le parentesi dopo onAction1

                                //nota anche che la funzione stessa ha parentesi. Ad esempio
                                function on Action1(){ 
                                Quelle parentesi servono per passare valori, parametri ecc alla funzione quando questa viene chiamata (e alla funzione per riceverli). Quindi possiamo inserire Price1 all'interno della parentesi (e fare la stessa cosa nella funzione) per passare quel valore alla funzione specifica che cosi puo usarlo.
                                Nel listato che segue vedi la sintassi necessaria. Il risultato sara che Price1 pur essendo una variabile locale a function main sara ora disponibile anche alla funzione al quale lo stiamo passando
                                Alex

                                PHP Code:
                                function preMain() {
                                    
                                setPriceStudy(true);
                                    
                                setStudyTitle("example");
                                    
                                setShowCursorLabel(false); 
                                }

                                function 
                                main() {

                                    var 
                                Price1 = ((close(-1))-(high(-1)-low(-1)));//variabile locale il che significa che e' disponibile
                                                                                  //solamente per la funzione in cui si trova

                                    
                                if(1==1)//condizione
                                        
                                onAction1(Price1);//comando da eseguire
                                                          //nota che in questo caso all'interno della parentesi (che serve per passare 
                                                          //parametri, valori ecc alla funzione chiamata) ho inserito la variabile Price1
                                                          //con cio passando quel valore alla funzione chiamata

                                    
                                return;
                                }
                                //questa e' la funzione che viene chiamata
                                function onAction1(Price1){//nota che nella parentesi ho inserito il parametro/valore che questa funzione
                                                           //ricevera e usera al suo interno

                                    
                                drawTextRelative(4,Price1formatPriceNumber(Price1), Color.blue,null,Text.VCENTER,"Arial",10,"prezzo1");
                                }
                                //fine funzione 

                                Comment

                                Working...
                                X