Meu Deus, como é difícil o MQL5...

 

Senhores, poderia pedir a ajuda de vocês? Eu tentei fazer a modificação desse indicador, mas não consegui.

//+------------------------------------------------------------------+
//|                                           High Low First Bar.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot High
#property indicator_label1  "High"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrTomato
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Low
#property indicator_label2  "Low"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSlateBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input ushort   InpHighCode=119;  // Symbol code to draw "High"
input ushort   InpLowCode=119;   // Symbol code to draw "Low"
//--- indicator buffers
double         HighBuffer[];
double         LowBuffer[];
//---
int            day_of_year;
datetime       first_bar;
double         first_high;
double         first_low;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HighBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,LowBuffer,INDICATOR_DATA);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,InpHighCode);
   PlotIndexSetInteger(1,PLOT_ARROW,InpLowCode);
//--- set the vertical shift of arrows in pixels
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,-5);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,5);
//---
   day_of_year=-1;
   first_bar=0;      // "0" -> D'1970.01.01 00:00';
   first_high=0.0;
   first_low=0.0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit;i<rates_total;i++)
     {
      MqlDateTime STime;
      TimeToStruct(time[i],STime);
      if(STime.day_of_year!=day_of_year)
        {
         day_of_year=STime.day_of_year;
         first_bar=time[i];
         first_high=high[i];
         first_low=low[i];
        }
      else if(first_bar==time[i])
        {
         first_high=high[i];
         first_low=low[i];
        }
      HighBuffer[i]=first_high;
      LowBuffer[i]=first_low;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

O que estou tentando fazer é colocar o TIMEFRAME como sendo um INPUT pra selecionar e poder ver os valores no PERIOD_CURRENT.

Dai tentei adicionar o seguinte:

input ENUM_TIMEFRAME   InpTimeFrame=PERIOD_M5;

iTime(_
symbol,InpTimeFrame,0) no TimeToStruct...

Mas acabou que ele não funcionou da forma que eu imaginava... Resumidamente, eu tentei pegar a primeira barra do período selecionado como input do indicador e não do período escolhido no gráfico. Será que alguém pode me ajudar a compreender o que está errado?

Agradeço qualquer ajuda. Estou tentando estudar o MQL5.

 
Aprendiz de Trader:

Senhores, poderia pedir a ajuda de vocês? Eu tentei fazer a modificação desse indicador, mas não consegui.

O que estou tentando fazer é colocar o TIMEFRAME como sendo um INPUT pra selecionar e poder ver os valores no PERIOD_CURRENT.

Dai tentei adicionar o seguinte:

input ENUM_TIMEFRAME   InpTimeFrame=PERIOD_M5;

iTime(_
symbol,InpTimeFrame,0) no TimeToStruct...

Mas acabou que ele não funcionou da forma que eu imaginava... Resumidamente, eu tentei pegar a primeira barra do período selecionado como input do indicador e não do período escolhido no gráfico. Será que alguém pode me ajudar a compreender o que está errado?

Agradeço qualquer ajuda. Estou tentando estudar o MQL5.

Não funciona assim, o OnCalculate só vai retornar coisas do periodo que o indicador foi colocado. Se quiser colocar um acesso a outro timeframe, seria como voce estava pensando com iTime/iClose/iHigh/etc. As vezes se voce pode querer acessar todos os campos pode fazer mais sentido fazer um CopyRates do que cada um individualmente. No Copyrates poderia fazer:

double valores[];
int copied = CopyRates(_symbol, InpTimeFrame, 0, 3, valores); // 0 para copiar da vela mais recente 3 velas; se fosse 1 seria da segunda vela mais recente copiando 3; e, etc.
//dai temos que
valores[0].close; // seria o fechamento mais antigo dos 3 copiados
valores[2].close; // seria o mais recente dos 3
//ou poderiamos fazer
ArraySetAsSeries(valores, true);
valores[0].close; // valor mais recente dos 3
valores[2].close; // valor mais antigo dos 3.
 
Ricardo Rodrigues Lucca #:

Não funciona assim, o OnCalculate só vai retornar coisas do periodo que o indicador foi colocado. Se quiser colocar um acesso a outro timeframe, seria como voce estava pensando com iTime/iClose/iHigh/etc. As vezes se voce pode querer acessar todos os campos pode fazer mais sentido fazer um CopyRates do que cada um individualmente. No Copyrates poderia fazer:

Pois é. Eu tentei usar o iTime, mas não funcionou pra mim.

 
Aprendiz de Trader #:

Pois é. Eu tentei usar o iTime, mas não funcionou pra mim.

Mostra o que tentou fazer que funciona sim. O que tu pode estar tendo de problema é mapeamento pro timeframe menor que isso eh muito ruim de fazer. Normalmente, eu prefiro ai ficar no timeframe atual, mas "corrigir" o input. Digamos, voce quer a máxima e mínima das 5 ultimas velas do m5. Pode ser aproximado, sem muita complicação, como sendo a máxima e mínima das 25 velas do m1.


Se quiser aproximar uma media de fechamento de 5 período do m5 no m1 também é parecido, mas se aborda de maneira diferente. Tu pegaria os 5 fechamentos somente dos minutos divisíveis por 5 sem resto para montar a media. Mesmo assim tende a ficar um resultado com aparência estranha.

 
Ricardo Rodrigues Lucca #:
Mostra o que tentou fazer que funciona sim. O que tu pode estar tendo de problema é mapeamento pro timeframe menor que isso eh muito ruim de fazer. Normalmente, eu prefiro ai ficar no timeframe atual, mas "corrigir" o input. Digamos, voce quer a máxima e mínima das 5 ultimas velas do m5. Pode ser aproximado, sem muita complicação, como sendo a máxima e mínima das 25 velas do m1.


Se quiser aproximar uma media de fechamento de 5 período do m5 no m1 também é parecido, mas se aborda de maneira diferente. Tu pegaria os 5 fechamentos somente dos minutos divisíveis por 5 sem resto para montar a media. Mesmo assim tende a ficar um resultado com aparência estranha.

//+------------------------------------------------------------------+
//|                                           High Low First Bar.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot High
#property indicator_label1  "High"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrTomato
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Low
#property indicator_label2  "Low"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSlateBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input ushort   InpHighCode=119;  // Symbol code to draw "High"
input ushort   InpLowCode=119;   // Symbol code to draw "Low"
input ENUM_TIMEFRAMES InpTimeFrames=PERIOD_M5;
//--- indicator buffers
double         HighBuffer[];
double         LowBuffer[];
//---
int            day_of_year;
datetime       first_bar;
double         first_high;
double         first_low;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HighBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,LowBuffer,INDICATOR_DATA);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,InpHighCode);
   PlotIndexSetInteger(1,PLOT_ARROW,InpLowCode);
//--- set the vertical shift of arrows in pixels
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,-5);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,5);
//---
   day_of_year=-1;
   first_bar=0;      // "0" -> D'1970.01.01 00:00';
   first_high=0.0;
   first_low=0.0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit;i<rates_total;i++)
     {
      MqlDateTime STime;
      TimeToStruct(iTime(_symbol,InpTimeFrame,0),STime);
      if(STime.day_of_year!=day_of_year)
        {
         day_of_year=STime.day_of_year;
         first_bar=iTime(_symbol,InpTimeFrame,0);
         first_high=high[i];
         first_low=low[i];
        }
      else if(first_bar==iTime(_symbol,InpTimeFrame,0))
        {
         first_high=high[i];
         first_low=low[i];
        }
      HighBuffer[i]=first_high;
      LowBuffer[i]=first_low;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Coloquei assim, mas não deu certo.

 
Aprendiz de Trader #:

Coloquei assim, mas não deu certo.

Como eu disse tu tem que substituir os high[i] por iHigh(_symbol, InpTimeTimeFrame,0) e o low[i] iLow(), mas tu vai ter que quebrar a cabeca pra fazer o mapeamento certinho pra ele extender a linha pro timeframe atual.
 
Acho que sou meio burro. Tentei de todo jeito fazer e não consegui... Desisto! kkkk.
 
Aprendiz de Trader #:
Acho que sou meio burro. Tentei de todo jeito fazer e não consegui... Desisto! kkkk.

Eu não tinha visto que tinha uns erros de digitação e outras coisas, fiz a correção disso e apliquei a proposta que tinha falado acima. Dai ele mostra so da vela mais recente do timeframe que escolheu se quiser ajustar no historico precisa quebrar a cabeça. Mas, acredito que já ti ajuda um monte a ver funcionando.


#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot High
#property indicator_label1  "High"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrTomato
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Low
#property indicator_label2  "Low"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSlateBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input ushort   InpHighCode=119;  // Symbol code to draw "High"
input ushort   InpLowCode=119;   // Symbol code to draw "Low"
input ENUM_TIMEFRAMES InpTimeFrames=PERIOD_M5;
//--- indicator buffers
double         HighBuffer[];
double         LowBuffer[];
//---
int            day_of_year;
datetime       first_bar;
double         first_high;
double         first_low;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HighBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,LowBuffer,INDICATOR_DATA);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,InpHighCode);
   PlotIndexSetInteger(1,PLOT_ARROW,InpLowCode);
//--- set the vertical shift of arrows in pixels
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,-5);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,5);
//---
   day_of_year=-1;
   first_bar=0;      // "0" -> D'1970.01.01 00:00';
   first_high=0.0;
   first_low=0.0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit;i<rates_total;i++)
     {
      MqlDateTime STime;
      TimeToStruct(iTime(_Symbol,InpTimeFrames,0),STime);
      if(STime.day_of_year!=day_of_year)
        {
         day_of_year=STime.day_of_year;
         first_bar=iTime(_Symbol,InpTimeFrames,0);
         first_high=iHigh(_Symbol, InpTimeFrames, 0);
         first_low=iLow(_Symbol, InpTimeFrames, 0);
        }
      else if(first_bar==iTime(_Symbol,InpTimeFrames,0))
        {
         first_high=iHigh(_Symbol, InpTimeFrames, 0);
         first_low=iLow(_Symbol, InpTimeFrames, 0);
        }
      HighBuffer[i]=first_high;
      LowBuffer[i]=first_low;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Obrigado!!! Vou continuar tentando aqui, preciso estudar mais essa programação MQL5. Ainda não está funcionando da forma que preciso, mas já ajudou bastante!
Razão: