Announcement

Collapse
No announcement yet.

Help - costruzione efs

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

  • Help - costruzione efs

    La mia intenzione era di costruirmi un efs piuttosto semplice... siccome non sono bravo prendo il wizard e faccio un efs che plotta in basso il cci e colora il fondo in verde quando va sopra 100 e rosso quando va sotto -100, mentre fa bianco tutte le altre volte

    solo che così devo guardare in basso... e allora decido cambiarlo...invece di metterlo nel pane inferiore deve fare qualcosa sul chart...disegnare delle frecce rosse/verdi


    PHP Code:
    var vCCI20 = new CCIStudy(20"Close");
    var 
    vLastAlert = -1;


    function 
    preMain() {
        
    setPriceStudy(true);
        
    setStudyTitle("");

    }

    function 
    main() {
            if (
                
    vCCI20.getValue(CCIStudy.CCI) >= 100
            
    onAction1()
        
            else if (
                
    vCCI20.getValue(CCIStudy.CCI) <= -100
            
    onAction2()
        
            else if (
                
    vCCI20.getValue(CCIStudy.CCI) == 0
            
    onAction3();
        
        return 
    null;

    }

    function 
    postMain() {
    }

        function 
    onAction1() {
            
    drawTextRelative(0low(), "é"Color.greennullText.TOP|Text.CENTER|Text.BOLD"Wingdings"10);
            
    vLastAlert 1;
        }
        function 
    onAction2() {
            
    drawTextRelative(0high(), "ê"Color.rednullText.BOTTOM|Text.CENTER|Text.BOLD"Wingdings"10);
            
    vLastAlert 2;
        }
        function 
    onAction3() {
            
    drawShapeRelative(0low(), Shape.CIRCLE""Color.RGB(0,0,0), Shape.LEFT);
            
    vLastAlert 3;
        } 
    così come è fatto però non va bene...in realtime disegna la barra con la freccia ben messa, ma poi se durante il completamento della barra torna indietro lascia la freccia dov'era e tocca fare refresh per pulire il chart

    si può risolvere?

    grazie per ogni aiuto
    Sostieni il Meglio di te , aiutaci a fare di più!

    Fra

  • #2
    Fra

    così come è fatto però non va bene...in realtime disegna la barra con la freccia ben messa, ma poi se durante il completamento della barra torna indietro lascia la freccia dov'era e tocca fare refresh per pulire il chart

    Questo succede perche ad un certo punto la condizione riporta true e quindi disegna l'oggetto grafico (nel tuo caso la freccia). Nel tuo efs manca pero la logica per rimuovere l'oggetto grafico se la condizione non e' piu true.
    Quindi devi anche inserire la logica necessaria perche l'efs sia in grado di distinguere quale degli oggetti grafici disegnati deve rimuovere. Per fare questo devi assegnare per prima cosa un nome ad ogni oggetto. Al momento siccome nessun oggetto ha un nome definito vengono disegnati tutti gli oggetti
    Nel caso di drawTextRelative() I parametri che ci interessano sono I seguenti

    drawTextRelative(xBar, yValue, Text, [FGColor], [BGColor], [Flags], [FontName], [FontSize], [TagName])

    ed in particolare l'ultimo parametro e cioe TagName che serve a dare un nome esclusivo all'oggetto. Quindi assegniamo un nome di nostra scelta per ciascun tipo di oggetto ergo I seguenti comando in onAction1() e onAction2()

    PHP Code:
    drawTextRelative(0low(), "é"Color.greennullText.TOP|Text.CENTER|Text.BOLD"Wingdings"10);

    drawTextRelative(0high(), "ê"Color.rednullText.BOTTOM|Text.CENTER|Text.BOLD"Wingdings"10); 
    verranno modificati cosi

    PHP Code:
    drawTextRelative(0low(), "é"Color.greennullText.TOP|Text.CENTER|Text.BOLD"Wingdings"10"verde");

    drawTextRelative(0high(), "ê"Color.rednullText.BOTTOM|Text.CENTER|Text.BOLD"Wingdings"10"rossa"); 
    dove "verde" e "rossa" sono I nomi che assegniamo a quel tipo di oggetto grafico in questo efs.
    Aggiungili al tuo listato e fammi sapere cosa succede
    Alex

    Comment


    • #3
      succede che restano le ultime due plottate...
      Sostieni il Meglio di te , aiutaci a fare di più!

      Fra

      Comment


      • #4
        così
        Attached Files
        Sostieni il Meglio di te , aiutaci a fare di più!

        Fra

        Comment


        • #5
          Fra
          Esatto. Nel momento in cui assegni il nome l'efs puo disegnare soltanto un oggetto con quel nome ergo rimpiazza continuamente l'oggetto lasciando soltanto l'ultimo di ciascuno.
          Per ovviare a questo dobbiamo indicare all'efs che ogni oggetto e' "unico" ed il modo piu semplice per fare questo e' quello di assegnargli il numero della barra usando la funzione getCurrentBarCount() Nota che la funzione e' disponibile soltanto dalla versione 7.9 in avanti. Per versioni precedenti si risolve in altro modo.
          Quindi modifichiamo I due comandi nel seguente modo

          PHP Code:
          drawTextRelative(0low(), "é"Color.greennullText.TOP|Text.CENTER|Text.BOLD"Wingdings"10"verde"+getCurrentBarCount());

          drawTextRelative(0high(), "ê"Color.rednullText.BOTTOM|Text.CENTER|Text.BOLD"Wingdings"10"rossa"+getCurrentBarCount()); 
          A questo punto abbiamo
          a) ristabilito tutte le freccie
          b) cosa piu importante assegnato un nome unico a ciascuna. Infatti ogni oggetto grafico sara identificato dall'efs con "nome"+numerobarra ad esempio "verde250"
          Ora che abbiamo fatto questo possiamo inserire la contro-condizione cioe

          PHP Code:
          if (vCCI20.getValue(CCIStudy.CCI) >= 100)//se la condizione e' true
                  
          onAction1()//esegui questa funzione
              
          else//altrimenti
                  
          onAction1b()//esegui questa funzione 
          e aggiungiamo una nuova funzione chiamata onAction1b() che conterra il comando per rimuovere la freccia se la condizione non riporta true.

          PHP Code:
          function onAction1b(){
              
          removeText("verde"+getCurrentBarCount())

          Ora pero va modificata leggermente anche la struttura delle condizioni in main() che non puo piu essere

          if (vCCI20.getValue(CCIStudy.CCI) >= 100)
          onAction1()
          else
          onAction1b()

          else if (vCCI20.getValue(CCIStudy.CCI) <= -100)
          onAction2()


          perche non puoi avere due else strutturati in quel modo per cui rimuovi il else della seconda condizione.
          L'efs a questo punto sara il seguente (nota che ho fatto qualche altra modifica commentandola)

          PHP Code:
          var vCCI20 = new CCIStudy(20"Close");
          var 
          vLastAlert = -1;

          function 
          preMain() {
              
          setPriceStudy(true);
              
          setStudyTitle("");
          }

          function 
          main() {

              if (
          vCCI20.getValue(CCIStudy.CCI) >= 100)
                  
          onAction1()
              else
                  
          onAction1b()
              
              if (
          vCCI20.getValue(CCIStudy.CCI) <= -100)//rimosso else
                  
          onAction2()
          /*per il momento escludi la seguente sezione e relativa funzione da eseguire    
              else if (vCCI20.getValue(CCIStudy.CCI) == 0)
                  onAction3();
          */
              
          return null;
          }

          /*siccome la funzione postMain non viene usata puo' essere rimossa
          function postMain() {
          }
          */

          function onAction1() {
              
          drawTextRelative(0low(), "é"Color.greennullText.TOP|Text.CENTER|Text.BOLD"Wingdings"10"verde"+getCurrentBarCount());
              
          vLastAlert 1;
          }
          //inseriamo la seguente funzione da eseguire SE la condizione riporta false
          function onAction1b(){
              
          removeText("verde"+getCurrentBarCount())
          }
          function 
          onAction2() {
              
          drawTextRelative(0high(), "ê"Color.rednullText.BOTTOM|Text.CENTER|Text.BOLD"Wingdings"10"rossa"+getCurrentBarCount());
              
          vLastAlert 2;
          }
          /*funzione che vienbe eseguita dalla condizione esclusa
          function onAction3() {
              drawShapeRelative(0, low(), Shape.CIRCLE, "", Color.RGB(0,0,0), Shape.LEFT);
              vLastAlert = 3;
          }
          */ 
          A questo punto aggiungi l'equivalente per la condizione della freccia rossa e dovresti avere il tuo efs completato
          Alex

          Comment


          • #6
            una curiosità...come mai se invece del disegnare la freccia, usando il comando setBarBgColor sul pane tutto funziona regolarmente (nel senso che il colore compare e scompare) ?
            Sostieni il Meglio di te , aiutaci a fare di più!

            Fra

            Comment


            • #7
              di tutto resta alla fine questo

              PHP Code:
              var vCCI20 = new CCIStudy(20"Close");
              var 
              vLastAlert = -1;


              function 
              preMain() {
                  
              setPriceStudy(true);
                  
              setStudyTitle("");

              }

              function 
              main() {
                      if (
              vCCI20.getValue(CCIStudy.CCI) >= 100
                      
              onAction1()
                      else
                        
              onAction1b()
                      
                      if (
              vCCI20.getValue(CCIStudy.CCI) <= -100
                      
              onAction2()
                      else 
                        
              onAction2b()

                  return 
              null;
              }

                  function 
              onAction1() {
                      
              drawTextRelative(0low(), "é"Color.greennullText.TOP|Text.CENTER|Text.BOLD"Wingdings"10"verde"+getCurrentBarCount());
                      
              vLastAlert 1;
                  }
                  function 
              onAction1b(){
                      
              removeText("verde"+getCurrentBarCount())
              }    
                  function 
              onAction2() {
                      
              drawTextRelative(0high(), "ê"Color.rednullText.BOTTOM|Text.CENTER|Text.BOLD"Wingdings"10"rossa"+getCurrentBarCount());
                      
              vLastAlert 2;
                  }
                  function 
              onAction2b(){
                      
              removeText("rossa"+getCurrentBarCount())

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

              Fra

              Comment


              • #8
                Grazie Alexis
                logicamente funziona bene plotta e cancella perfettamente

                ora...

                1) si possono far plottare due simboli, da due condizioni, uno sotto all'altro ?
                2) si può mettere una piccola finestrina dove far apparire il valore di un indicatore/oscillatore - al centro in basso del chart - ?
                Sostieni il Meglio di te , aiutaci a fare di più!

                Fra

                Comment


                • #9
                  Fra

                  una curiosità...come mai se invece del disegnare la freccia, usando il comando setBarBgColor sul pane tutto funziona regolarmente (nel senso che il colore compare e scompare) ?

                  Perche la freccia e' un oggetto che una volta applicato al grafico e' persistente mentre il colore della barra o del background e' una proprieta del grafico e puo essere quindi modificata in ogni momento
                  Alex

                  Comment


                  • #10
                    Fra

                    di tutto resta alla fine questo
                    var vCCI20 = new CCIStudy(20, "Close");
                    ecc. ecc


                    Esatto. Se lo desideri applica la terza condizione usando la medesima logica spiegata nei precedenti messaggi e cioe assegna un nome unico all'oggetto grafico (ad esempio "pallinonero"+getCurrentBarCount()), rimuovi il else superfluo in else if, aggiungi la contro-condizione ed infine la funzione per rimuovere l'oggetto
                    Alex

                    Comment


                    • #11
                      aspetta però...qualcosa sbaglio perchè facendo così

                      PHP Code:
                      var vCCI20 = new CCIStudy(20"Close");
                      var 
                      vLastAlert = -1;


                      function 
                      preMain() {
                          
                      setPriceStudy(true);
                          
                      setStudyTitle("");

                      }

                      function 
                      main() {
                              if (
                      vCCI20.getValue(CCIStudy.CCI) >= 100
                              
                      onAction1()
                              else
                                
                      onAction1b()
                              
                              if (
                      vCCI20.getValue(CCIStudy.CCI) <= -100
                              
                      onAction2()
                              else 
                                
                      onAction2b()
                                
                              if (
                      vCCI20.getValue(CCIStudy.CCI) >= 60
                              
                      onAction3()
                              else
                                
                      onAction3b()

                          return 
                      null;
                      }

                          function 
                      onAction1() {
                              
                      drawTextRelative(0low(), "é"Color.greennullText.TOP|Text.CENTER|Text.BOLD"Wingdings"10"verde"+getCurrentBarCount());
                              
                      vLastAlert 1;
                          }
                          function 
                      onAction1b(){
                              
                      removeText("verde"+getCurrentBarCount())
                      }    
                          function 
                      onAction2() {
                              
                      drawTextRelative(0high(), "ê"Color.rednullText.BOTTOM|Text.CENTER|Text.BOLD"Wingdings"10"rossa"+getCurrentBarCount());
                              
                      vLastAlert 2;
                          }
                          function 
                      onAction2b(){
                              
                      removeText("rossa"+getCurrentBarCount())
                          }
                          function 
                      onAction3() {
                              
                      drawTextRelative(0low(), "é"Color.bluenullText.TOP|Text.CENTER|Text.BOLD"Wingdings"10"blue"+getCurrentBarCount());
                              
                      vLastAlert 3;
                          }
                          function 
                      onAction3b(){
                              
                      removeText("blue"+getCurrentBarCount())

                      mi sostiuisce la blu alla verde...come far apparire le due frecce, una sotto all'altra?

                      e per la domanda due (il valore dell'indicatore) si può fare?

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

                      Fra

                      Comment


                      • #12
                        forse perchè...se è maggiore di 100 è anche maggiore di 60 e quindi plotta quella ?
                        ... ma era tanto per capire...la condizione 3 sarà data da un altro indicatore e il problema non ci sarebbe
                        Sostieni il Meglio di te , aiutaci a fare di più!

                        Fra

                        Comment


                        • #13
                          Fra

                          1) si possono far plottare due simboli, da due condizioni, uno sotto all'altro ?
                          2) si può mettere una piccola finestrina dove far apparire il valore di un indicatore/oscillatore - al centro in basso del chart - ?


                          1) Si. A quel punto passerei pero ad alcune modifiche usando I nuovi parametri disponibili dalla versione 7.9 in avanti.
                          2) Si, aggiungi il seguente in main() dopo le altre condizioni
                          Alex

                          PHP Code:
                          if(vCCI20.getValue(CCIStudy.CCI)==null) return;//null check necessario
                          drawTextRelative(0,0,vCCI20.getValue(CCIStudy.CCI).toFixed(2),Color.blue,null,
                                               
                          Text.RELATIVETOBOTTOM|Text.BOLD|Text.CENTER,"Arial",11,"valore"); 

                          Comment


                          • #14
                            Fra

                            forse perchè...se è maggiore di 100 è anche maggiore di 60 e quindi plotta quella ?

                            Esatto quindi devi modificare la condizione nel seguente modo
                            if (vCCI20.getValue(CCIStudy.CCI) >= 60 && vCCI20.getValue(CCIStudy.CCI) <100)
                            Alex

                            Comment


                            • #15
                              Fra
                              Approfitto dell'occasione per darti un suggerrimento.
                              Dunque in javascript se il comando da eseguire e' uno solo puoi inserirlo a seguito di una condizione senza la necessita di usare parentesi graffe. Ad esempio

                              if(vCCI20.getValue(CCIStudy.CCI)>=100)
                              setBarBgColor(Color.red);


                              Se invece I comandi da eseguire sono piu di uno e' necessario racchiuderli in parentesi graffe. Ad esempio

                              if(vCCI20.getValue(CCIStudy.CCI)>=100){
                              setBarBgColor(Color.red);
                              setPriceBarColor(Color.yellow);
                              }


                              Il suggerimento e' quello di usare sempre le parentesi graffe anche quando non sono proprio necessarie. Questo ti aiutera a meglio creare I blocchi condizione/comandi quindi

                              if(vCCI20.getValue(CCIStudy.CCI)>=100){
                              setBarBgColor(Color.red);
                              }else{
                              setBarBgColor(Color.red);
                              }


                              Ripeto non e' d'obbligo ma e' buona pratica secondo me
                              Alex

                              Comment

                              Working...
                              X