Announcement

Collapse
No announcement yet.

Help - costruzione efs

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

  • #46
    interessante anche questa come soluzione Alexis

    sono dovuto andare a rivedere qui le varie "aree" di un efs, riscaricando anche la guida che non trovavo più

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

    Fra

    Comment


    • #47
      Fra
      Tra l'altro questa soluzione diventa particolarmente utile se/quando si vuole rendere modulare un efs o comunque si ha necessita di eseguire alcune computazioni al di fuori di main.
      Continuando ad usare l'esempio sviluppato fino ad ora potremmo muovere fuori da main il calcolo per Price1 creando una funzione apposita e poi passare alla funzione onAction1() il valore di Price1 (vedi esempio allegato)

      PHP Code:
      function preMain() {
          
      setPriceStudy(true);
          
      setStudyTitle("example");
          
      setShowCursorLabel(false); 
      }
       
      function 
      main() {
       
          var 
      Price1 Prezzo1(2);//anziche calcolare Price1 qui in main creo una funzione separata
                                  //chiamata Prezzo1 alla quale passo un parametro - in questo caso 1 
          
      if(1==1)
              
      onAction1(Price1);//alla funzione onAction1 passo quindi il valore Price1 che e' calcolato
                                //nella funzione Prezzo1
       
          
      return;
      }
       
      //come puoi vedere ho creato una funzione chiamata Prezzo1. Nella parentesi assegno un nome alla
      //variabile o parametro che viene passato a questa funzione (in questo caso il valore 1)
       
      function Prezzo1(lookback){
          var 
      temp = ((close(-lookback))-(high(-lookback)-low(-lookback)));//nota che anziche scrivere
                                                                           //(-1) ho inserito il nome
                                                                           //del parametro passato da main
          //se in main ora cambi il valore passato nella parentesi da 1 a 2 (ad esempio) sara come 
          //se tu avessi scritto l'equazione cosi ((close(-2))-(high(-2)-low(-2)))
          
          
      return temp;//questo e' il riporto che main ricevera' in ritorno
      }//fine funzione Prezzo1
          
      function onAction1(Price1){
          
      drawTextRelative(4,Price1formatPriceNumber(Price1), Color.blue,null,Text.VCENTER,"Arial",10,"prezzo1");

      Se volessimo potremmo anche non chiamare la funzione Prezzo1 da main e chiamarla invece direttamente dalla funzione onAction1() quando ne ha bisogno.

      PHP Code:
      function preMain() {
          
      setPriceStudy(true);
          
      setStudyTitle("example");
          
      setShowCursorLabel(false); 
      }
       
      function 
      main() {
       
          if(
      1==1)
              
      onAction1();
       
          return;
      }
       
      function 
      onAction1(){
          var 
      Price1 Prezzo1(1);//qui chiamo la funzione Prezzo1 e passo il parametro 1
          
      drawTextRelative(4,Price1formatPriceNumber(Price1), Color.blue,null,Text.VCENTER,"Arial",10,"prezzo1");
      }
       
      function 
      Prezzo1(lookback){
          var 
      temp = ((close(-lookback))-(high(-lookback)-low(-lookback)));  
          return 
      temp;

      Come vedi anche con una formula relativamente semplice ci sono diversi modi per fare la stessa cosa.
      Fatto piu importante pero e' che nel tempo questo ti consente di creare intere sezioni di efs che possono essere facilmente copiate e incollate in altri efs
      Alex

      Comment


      • #48
        Originally posted by Alexis C. Montenegro
        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
            

        Alexis
        ho creato un efs "gemello" senza questa if per i chart daily da utilizzare la sera, altrimenti non mi dà lo SL aggiornato fino all'open
        Sostieni il Meglio di te , aiutaci a fare di più!

        Fra

        Comment


        • #49
          Fra
          Non sono sicuro di capire che differenza faccia. Le due equazioni per Price1 e Price2 sono calcolate sui valori della barra precedente quindi in entrambi I casi non puoi avere lo stop aggiornato fino a che non si forma una nuova barra. L'unica differenza che la condizione BARSTATE_NEWBAR introduce e' che effettua I calcoli una sola volta all'inizio della barra anziche ad ogni tick.
          Prova il seguente efs e dovresti vedere entrambi I prezzi aggiornati contemporaneamente
          Alex

          PHP Code:
          var Price1=null;
          var 
          Price1b=null;

          function 
          preMain() {
              
          setPriceStudy(true);
              
          setStudyTitle("test");
              
          setShowCursorLabel(false);
          }

          function 
          main() {
              
              if(
          getBarState()==BARSTATE_NEWBAR){
                  
          Price1 = (close(-1)-(high(-1)-low(-1)));
              }
              
              
          Price1b = (close(-1)-(high(-1)-low(-1)));
              
              
          drawTextRelative(4Price1formatPriceNumber(Price1), Color.bluenullText.BOTTOM"Arial",10,"prezzo1");
              
          drawTextRelative(4Price1bformatPriceNumber(Price1), Color.bluenullText.TOP"Arial",10,"prezzo1b");

              return;

          Comment


          • #50
            quindi Alexis

            per capire bene...non posso fargli fare calcoli in quanto non sa che la barra è finita fin quando non comincia l'altra? Ora per esempio , a mercato italiano chiuso, vedo quello relativo alla seduta di venerdì, calcolato sui valore HLC di giovedì...Devo sostituire (-1) con (0) insomma per utilizzarlo come EOD ? o creare una variabile per inserire a scelta -1 o 0...giusto?
            Sostieni il Meglio di te , aiutaci a fare di più!

            Fra

            Comment


            • #51
              Fra

              non posso fargli fare calcoli in quanto non sa che la barra è finita fin quando non comincia l'altra?

              Esatto

              Devo sostituire (-1) con (0) insomma per utilizzarlo come EOD ? o creare una variabile per inserire a scelta -1 o 0...giusto?

              Giusto.
              Alex

              Comment


              • #52
                Fra
                A questo punto se desideri poter modificare la variabile via Edit Studies (anziche modificando l'efs stesso) ci sono due metodi per poterlo fare (a dire il vero sono piu due varianti dello stesso metodo che non due metodi diversi)
                Assumiamo quindi di voler variare la barra di riferimento da usare nell'equazione (ergo il valore nella parentesi in open(), high(), etc. Per questo esempio useremo una versione semplificata dell'ultimo efs che ho postato e la prima variante disponibile (che e' piu semplice da implementare ma offre meno opzioni)

                PHP Code:
                var Price1=null;

                function 
                preMain() {
                    
                setPriceStudy(true);
                    
                setStudyTitle("test");
                    
                setShowCursorLabel(false);
                }

                function 
                main(Riferimento) {//nella parentesi inserisco il nome della variabile
                                            //cosi come verra usata nell'efs

                    //quindi inserisco una condizione che determina che se il valore della variabile 
                    //e' nullo l'efs dovra usare come default il valore assegnato qui
                    
                if(Riferimento==nullRiferimento 1;
                    
                    
                Price1 = (close(-Riferimento)-(high(-Riferimento)-low(-Riferimento)));//quindi uso la variabile
                                                                                          //nell'equazione
                    
                    
                drawTextRelative(4Price1formatPriceNumber(Price1), Color.bluenullText.BOTTOM"Arial",10,"prezzo1");
                    
                    return;

                Quando applichi questo efs ad un grafico e poi fai un click di destra sul grafico e selezioni Edit Studies avrai disponibile la schermata che ti consente di modificare direttamente la variabile (vedi immagine allegata).



                Inserisci 0 nella casella corrispondente alla colonna Value e l'equazione a quel punto fara riferimento ai valori della barra corrente. Se invece inserisci 2 l'equazione fara riferimento ai valori di due barre fa, etc (ti rammento che 1 e' il default).
                Nota che con questa variante non viene fornito in Edit Studies il valore di default. Quello sara invece disponibile quando useremo la seconda variante.
                Alex

                Comment


                • #53
                  Fra
                  In un precedente messaggio ti ho suggerito di usare la seguente sintassi per determinare il valore di Price1

                  PHP Code:
                  if(getBarState()==BARSTATE_NEWBAR){//ad ogni nuova barra
                          
                  Price1 = (close(-1)-(high(-1)-low(-1)));//computa l'equazione
                      

                  Come spiegato questa soluzione offre il vantaggio di essere computata una volta soltanto per barra anziche ad ogni tick.
                  Visto pero che ora desideri poter usare l'efs in "EOD" (per usare la tua stessa convenzione) e quindi devi poter vedere il valore attuale senza dover aspettare una nuova barra la soluzione offerta qui sopra non puo essere utilizzata.
                  Pero usando la variabile modificabile "Riferimento" descritta nel precedente messaggio possiamo creare delle condizioni un po piu articolate che ci consentono di avere entrambi I metodi a seconda della necessita. Quindi eccoti una leggera modifica che usa il valore "Riferimento" per determinare anche in quale contesto usare l'equazione e non solamente quale valore usare.
                  Alex

                  PHP Code:
                  var Price1=null;

                  function 
                  preMain() {
                      
                  setPriceStudy(true);
                      
                  setStudyTitle("test");
                      
                  setShowCursorLabel(false);
                  }

                  function 
                  main(Riferimento) {//all'interno della parentesi creo la variabile Riferimento

                      
                  if(Riferimento==nullRiferimento 1;//qui determino il valore di default di Riferimento
                      
                      
                  if(Riferimento==0){//se Riferimento e' uguale a 0 (il che significa che tu vuoi computare
                                         //Price1 in base ai valori della barra corrente
                          
                  Price1 = (close(0)-(high(0)-low(0)));//computa questa equazione
                      
                  }else if (Riferimento!=0){//se invece Riferimento e' un valore non uguale a 0
                          
                  if(getBarState()==BARSTATE_NEWBAR){//ad ogni nuova barra computa Price1
                              
                  Price1 = (close(-Riferimento)-(high(-Riferimento)-low(-Riferimento)));//usando Riferimento come valore
                          
                  }
                      }
                      
                      if(
                  Price1==null) return;//null check
                      
                      
                  drawTextRelative(4Price1formatPriceNumber(Price1), Color.bluenullText.BOTTOM"Arial",10,"prezzo1");
                      
                      return;

                  Comment


                  • #54
                    Perfetto Alexis

                    a questo punto dovrebbe essere abbastanza chiaro come utilizzare un efs con la singola variabile "modificabile" senza aprire un efs e come utilizzare il parametro nella costruzione degli eventi. Provo a utilizzare la tua cortese spiegazione nell'efs di partenza

                    ora abbiamo in effetti:

                    una parte iniziale in cui stabiliamo le 4 var (il CCI, la MM e i due prezzi SL da mostrare alternativamente)

                    poi il preMain dove stabiliamo l'aspetto dell'efs: plottato sul chart, il titolo, il nome nella finestra del cusrore etc etc

                    il Main, dove con l'ultima versione abbiamo specificato la var modificabile - chiamandola Riferimento - con il valore di default 1, la prima possibilità = 0 oppure il valore impostato manualmente nell'edit studies

                    a seguire le varie if per le action (da 1 a 6b) e il comando per scrivere cmq il valore del CCI (completo di null check)

                    per ultime le action...
                    Sostieni il Meglio di te , aiutaci a fare di più!

                    Fra

                    Comment


                    • #55
                      Fra
                      In sintesi quella che descrivi e' la struttura di un qualsiasi efs e cioe
                      - dichiarazioni delle variabili globali
                      - funzione PreMain che viene eseguita soltanto una volta quando l'efs viene caricato in un grafico (oppure ad ogni Reload) e che contiene le istruzioni di default di come l'efs verra plottato
                      - funzione main che viene eseguita ad ogni tick e che contiene variabili locali, il listato necessario per calcolare un indicatore, studio, ecc e le condizioni da valutare, oltre che il riporto da plottare sul grafico
                      - funzioni aggiuntive (opzionali) che contengono comandi o comunque istruzioni da eseguire quando vengono chiamate dalla funzione main (o da altre funzioni)
                      Alex

                      Comment


                      • #56
                        ho fatto una piccola modifica

                        invece di usare il barcolor, che non permetteva di utilizzare grafici a candele, ho inserito un altro drawshape

                        PHP Code:
                        unction onAction5(){
                            
                        drawShape(Shape.CIRCLE,BottomRow1,Color.green);
                            
                        drawTextRelative(2,Price1,"t"Color.bluenullText.VCENTER,"Wingdings 3",8,"freccia1");
                            
                        drawTextRelative(4Price1formatPriceNumber(Price1), Color.bluenullText.VCENTER"Arial",10,"prezzo1"); 
                        e quindi ora
                        Attached Files
                        Sostieni il Meglio di te , aiutaci a fare di più!

                        Fra

                        Comment


                        • #57
                          PS modificato a BottomRow2 altrimenti interferisce un pò con i pane inferiori quando è pottato un indicatore/osc in basso

                          PS non vorrei disabilitare la riga 648 del Pivot console, che interferisce con questo efs... non riesco a modificare però la posizione...Alexis un aiutino?

                          PHP Code:
                          //display our ATR
                              
                          if ( nATRType != ) {
                                  if ( 
                          nATRType == ) {
                                      
                          sStr "ATR ("+nATRPeriod+"-Day): "+rndnATR2)+"    Variable Pivot = "+
                                              
                          nVariablePivot" min.    Force RTH="+(sForceRTH=="T" "ON" "OFF");
                                  }
                                  else {
                                      
                          sStr "posATR ("+nATRPeriod+"-Day): "+rndnPosAtr2)+"  negATR ("+nATRPeriod+"-Day): "+
                                             
                          rndnNegAtr2)+"    Variable Pivot = "+nVariablePivot+" min.    Force RTH="+(sForceRTH=="T" "ON" "OFF");
                                  }
                                  
                          drawTextAbsolute(40,1sStr,  nATRColor,  null nATRFlags Text.LEFT |  Text.RELATIVETOLEFT Text.RELATIVETOBOTTOM
                                                  
                          nullnATRFontSizegID());           
                              } 
                          Last edited by fra; 09-28-2005, 04:15 AM.
                          Sostieni il Meglio di te , aiutaci a fare di più!

                          Fra

                          Comment


                          • #58
                            Fra
                            Mentre vado a rivederemi la formula del Pivot Console rispondo al tuo primo messaggio nel quale fai riferimento al non poter colorare le candele. In effetti il comando setPriceBarColor() include alcuni parametri opzionali che sono specifici per I grafici candlestick (vedi questo articolo nel EFS KnowledgeBase).
                            I parametri opzionali sono WickColor che serve a colorare l'ombra, bThinWick (dove b sta per Boolean quindi true/false) per lo spessore dell'ombra e bHollow (anche qui true/false) per colorare o meno il corpo della candela.
                            Al momento manca una opzione per colorare il contorno del corpo ma so che e' stata gia richiesta
                            Alex

                            Comment


                            • #59
                              Fra
                              Hai due soluzioni possibili e cioe' o sposti in alto le tue barre colorate oppure fai la stessa cosa con la scritta del Pivot Console.
                              Nel primo caso anziche usare BottomRow1 usa TopRow1 mentre per la seconda soluzione rimpiazza al rigo 648 Text.RELATIVETOBOTTOM con Text.RELATIVETOTOP
                              Alex

                              Comment


                              • #60
                                Grazie Alexis per entrambi i suggerimenti

                                per quanto riguarda il "Pivot Console" , modificando in RELATIVETOTOP quel RELATIVETOBOTTOM, la scitta scompare parzialmente dallo schermo. Inoltre va a sovrapporsi al valore CCI che l'altro efs plotta in alto a destra .

                                A questo punto, è il caso di sostituire il comando del PConsole DrawTextAbsolute con un "semplice" DrawText, per posizionarlo altrove? O cosa altro consigli?
                                Sostieni il Meglio di te , aiutaci a fare di più!

                                Fra

                                Comment

                                Working...
                                X