OnChartEvent

 

Boa tarde Pessoal,


tem alguma forma de quando clicar em um candle no gráfico me retornar a máxima ou a mínima do candle no qual foi clicado?

 
Sim. Tem as funções ChartGetInteger para saber a primeira e total de barras visíveis no gráfico, e as funções ChartXYToTimePrice e ChartTimePriceToXY para conversão de escala. Com essas informações podes criar uma caixa (região) para cada candle com as quais pode verificar se o clique foi sobre algum candle. Sabendo sobre qual candle foi o clique pode obter a máxima e mínima usando as funções iHigh e iLow.
 
Também vai precisar da função iTime, para saber o tempo de abertura da vela e obter a coordenada x. A coordenada y vai ser obtida sabendo máxima e mínima com as funções iHigh e iLow.
 

Fiz um modelo que podes usar como ponto de partida, já que em algum momento pode me ser útil.

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   if(id!=CHARTEVENT_CLICK)
     {
      return;
     }
   int first = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
   int total = ChartGetInteger(0,CHART_VISIBLE_BARS);
   int last = first - total +1;

   int x,y;
   int prev_x;
   int left;
   int right;
   int top;
   int bottom;

   int bar = -1;

   for(int i=0; i<total; i++)
     {
      int j = last+i;
      ChartTimePriceToXY(0,0,iTime(_Symbol,PERIOD_CURRENT,j),iHigh(_Symbol,PERIOD_CURRENT,j),x,top);
      ChartTimePriceToXY(0,0,iTime(_Symbol,PERIOD_CURRENT,j),iLow(_Symbol,PERIOD_CURRENT,j),x,bottom);
      ChartTimePriceToXY(0,0,iTime(_Symbol,PERIOD_CURRENT,j+1),0,prev_x,y);
      int dx = x-prev_x;
      left=x-dx/2;
      right=x+dx/2;
      Print(left,",",right,",",top,",",bottom);
      if(left<lparam && lparam<=right && top<=dparam && dparam<=bottom)
        {
         bar = j;
         break;
        }
     }
   if(bar>=0)
     {
      Comment("High: ",iHigh(_Symbol,PERIOD_CURRENT,bar),"\nLow: ",iLow(_Symbol,PERIOD_CURRENT,bar));
     }
  }
 
Samuel Manoel De Souza:

Fiz um modelo que podes usar como ponto de partida, já que em algum momento pode me ser útil.

Muito bom, obrigado por compartilhar.

 
Samuel Manoel De Souza:

Fiz um modelo que podes usar como ponto de partida, já que em algum momento pode me ser útil.

Muito obrigado,


vou estudar o código, vlww!!!