Announcement

Collapse
No announcement yet.

OnChartEvent: che cosa ho cliccato?

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

    OnChartEvent: che cosa ho cliccato?

    Buongiorno traders,
    ho bisogno di un aiuto su onchartevent. Voglio attivare un evento cliccando su una candela con il mouse. Ho usato OnChartEvent(), CHARTEVENT_CLICK per selezionare solo il click del mouse, ChartXYToTimePrice e iBarShift per sapere le coordinate x della candela. Fin qui tutto bene, l'evento si attiva. Ho però notato che l'evento si attiva anche quando clicco oltre (più in alto o più in basso della candela). Cerco un suggerimento per sapere se la coordfinata y corrisponde a un punto vuoto della chart o a un punto compreso nella candela (max, min) come vorrei.
    Grazie in anticipo

    #2
    Mi sembra che nella tua domanda ci sia già la risposta.
    Così come confronti la coordinata X del clic per vedere se è sulla candela che ti interessa puoi confrontare la coordinata Y per vedere se è compresa nella candela.
    Esempio:
    Code:
    int i=IndiceDellaCandelaCheMiInteressa;
    int window;
    datetime X;
    double Y;
    ChartXYToTimePrice(0,lparam,dparam,window,X,Y);
    int indice=iBarShift(Symbol(),0,X,true);
    
    if(indice==i) //L'ordinata del clic è sulla candela che mi interessa...
    if(High[indice]>=Y && Y>=Low[indice]) //L'ascisse del clic è all'interno della candela...
    Il codice l'ho scritto ora molto velocemente senza l'ausilio del compilatore e senza ricontrollare se ci sono errori.
    Dovrebbe comunque aiutarti come esempio.
    Skype: cadddami

    Comment


      #3
      Come ricavo i? E' proprio questo dato che mi manca, cioè le coordinate verticali della candela nella chart della candela individuata. Cioè nel tuo esempio, indice mi dà il numero della candela contando dall'ultima. Ma i=Indice della candela interessata?
      Questo è il mio codice:

      void OnChartEvent(const int id,
      const long &lparam,
      const double &dparam,
      const string &sparam)
      {
      if(id==CHARTEVENT_CLICK)
      {
      int x =(int)lparam;
      int y =(int)dparam;
      datetime dt =0;
      double price =0;
      int window=0;

      if(ChartXYToTimePrice(0,x,y,window,dt,price))
      {
      int shift=iBarShift(Symbol(),Period(),dt,true);
      double Price_High=iHigh(Symbol(),Period(),shift);
      double Price_Low=iLow(Symbol(),Period(),shift);

      if(y<=Price_High && y>=Price_Low) // qui non entra
      {
      ObjectDelete(0,"H1 Line");
      ObjectDelete(0,"H2 Line");
      ObjectCreate(0,"H1 Line",OBJ_HLINE,window,dt,Price_High);
      ObjectCreate(0,"H2 Line",OBJ_HLINE,window,dt,Price_Low);
      ChartRedraw(0);
      }
      }

      }
      }
      Last edited by fran; 22-11-2016, 08:41.

      Comment


        #4
        Grazie della tua attenzione Caddami, ma ho risolto. Mancavano due passaggi con ChartTimePriceToXY. Questa funzione ti restituisce le coordinate x e y di una candela nel grafico. Il passaggio in più è necessario perchè la posizione spaziale non coincide con il prezzo, quindi per trovare l'High e il Low devi convertirli con quella funzione. Allego per chi ci legge il codice giusto. Da notare che la coordinata y inizia dall'alto, non dal basso, per cui ho dovuto modificare una linea di if dove ho scritto "questo è stato modficato"

        void OnChartEvent(const int id,
        const long &lparam,
        const double &dparam,
        const string &sparam)
        {
        if(id==CHARTEVENT_CLICK)
        {
        int x =(int)lparam;
        int y =(int)dparam;
        datetime dt =0;
        double price =0;
        int window=0;

        if(ChartXYToTimePrice(0,x,y,window,dt,price))
        {
        int shift=iBarShift(Symbol(),Period(),dt,true);
        double Price_High=iHigh(Symbol(),Period(),shift);
        double Price_Low=iLow(Symbol(),Period(),shift);
        //+-------------------codice aggiunto----------------------------+
        int p=y;
        if(ChartTimePriceToXY(0,0,dt,Price_High,x,y)) // Time on the chart
        {
        int alto=y;
        }
        if(ChartTimePriceToXY(0,0,dt,Price_Low,x,y)) // Time on the chart
        {
        int basso=y;
        }
        //+------------------------------------------------------------
        if(p>=alto && p<=basso) //questo è stato modificato
        {
        ObjectDelete(0,"H1 Line");
        ObjectDelete(0,"H2 Line");
        ObjectCreate(0,"H1 Line",OBJ_HLINE,window,dt,Price_High);
        ObjectCreate(0,"H2 Line",OBJ_HLINE,window,dt,Price_Low);
        ChartRedraw(0);
        }
        }

        }
        }

        Comment

        Working...
        X