OnChartEvent

Gustavo Barbeiro Alonso  

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?

Samuel Manoel De Souza  
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.
Samuel Manoel De Souza  
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.
Samuel Manoel De Souza  

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));
     }
  }
ArmandoJunior70  
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.

Gustavo Barbeiro Alonso  
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!!!

Razão: