iCustom com ruído na importação.

 

Boa noite.

Fiz um indicador de histograma onde tenho uma condição para pintar o buffer[i] que atingir certo valor, e nesse mesmo valor uso para inserir uma linha no gráfico.

Fiz uma configuração para 3 timeFrames, M1, M2 e M5, mas gostaria de importar os dados do M1 "somente o valor para plotar as linhas"  em outro timeFrame, ex: estou no M5 onde já plota as linhas, mas quero o valor do M1 também.

Usei o iCustom importando o PERIOD_M1, ele puxa as informações mas aparece uns ruídos, linhas verticais, onde no indicador original não existe isso.

Esse é o histograma base e está funcionando perfeito.

//+------------------------------------------------------------------+
//|                                              HistogramaColor.mq5 |
//|                                                             Neto |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Neto"
#property link      ""
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| PROPRIEDADES DO INDICADOR (DIRETIVAS)                            |
//+------------------------------------------------------------------+
#property indicator_buffers 3
#property indicator_plots 1 
//---
#property indicator_label1 "HistogramaBase" 
#property indicator_type1 DRAW_COLOR_HISTOGRAM 
#property indicator_style1 STYLE_SOLID 
#property indicator_color1 clrDodgerBlue,clrRed //Cores do histograma
#property indicator_width1 2 
//#include <getfontname.mqh>
//###############
double wBuffer[]; 
double wColor[]; 
double cl[];
//
sinput string linhas = "Cor das linhas";
input color corUp = DodgerBlue;
input color corDown = Red;
//
sinput string largura = "Largura das linhas e estilo";
input int widthLineUp = 2;
input int widthLineDown = 2;
input ENUM_LINE_STYLE estilo = STYLE_SOLID;
//
sinput string selecao = "Habilita e desabilita clique nas linhas";
input bool selectionUp = false;
input bool selectionDown = false;
//
//input type_font FontType = Font7; // tipo da fonte
//string sFontType;
string name;

int OnInit()
  {
//--- Mapear os buffers do indicador
   SetIndexBuffer(0,wBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,wColor,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,cl,INDICATOR_DATA);

   IndicatorSetString( INDICATOR_SHORTNAME, "Wave Base" );
  
   //CFontName FONT;
   //sFontType = FONT.GetFontName(FontType);
   
   ChartSetInteger(0, CHART_SHOW_OBJECT_DESCR, true);
   name = "HighLine";
   ObjectCreate(0,name,OBJ_HLINE,0,0,0);  
   ObjectSetInteger(0,name,OBJPROP_COLOR,corUp);
   ObjectSetInteger(0,name,OBJPROP_STYLE,estilo);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,widthLineUp);
   ObjectSetString(0,name,OBJPROP_TEXT,"UP");
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,selectionUp);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,selectionUp);
         
   //Low
   name = "LowLine";
   ObjectCreate(0,name,OBJ_HLINE,0,0,0);           
   ObjectSetInteger(0,name,OBJPROP_COLOR,corDown);
   ObjectSetInteger(0,name,OBJPROP_STYLE,estilo);
   ObjectSetString(0,name,OBJPROP_TEXT,"DN");
   ObjectSetInteger(0,name,OBJPROP_WIDTH,widthLineDown);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,selectionDown);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,selectionDown);
   
   return(INIT_SUCCEEDED);
  }
  
  void OnDeinit(const int reason){
            ObjectDelete(0, "LowLine");
            ObjectDelete(0, "HighLine");
      //ObjectsDeleteAll(0, -1, OBJ_HLINE);
      ChartRedraw();
  }

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 i;
if(prev_calculated == 0) i = 2;
else i = prev_calculated-1;
  while(i < rates_total)
        {
          cl[i] = close[i];
          double vol = (double)volume[i];
         
         //***** Subindo 
        if (cl[i] >= cl[i-1]) { 
            if (cl[i-1] >= cl[i-2]) {
                wBuffer[i] = wBuffer[i-1] + vol;
                wColor[i] = 0;
            } else {
                wBuffer[i] = vol;
                wColor[i] = 0;
            }
            // ########################### valor positivo ###########
            if(Period() == PERIOD_M1){
               if(wBuffer[i] >= 180000){wColor[i] = 2;
                  ObjectMove(0,"HighLine",0,TimeCurrent(),high[i]);
               }
           }
           else if(Period() == PERIOD_M2){
               if(wBuffer[i] >= 320000){wColor[i] = 2;
                  ObjectMove(0,"HighLine",0,TimeCurrent(),high[i]);
               }
           }
           else if(Period() == PERIOD_M5){
               if(wBuffer[i] >= 922000){wColor[i] = 2;
                  ObjectMove(0,"HighLine",0,TimeCurrent(),high[i]);
               }
           }
           // #######################################
        
        // ***** Descendo     
        } else {                          
            if (cl[i-1] < cl[i-2]) {
                wBuffer[i] = wBuffer[i-1] - vol;
                wColor[i] = 1;
            } else {
                wBuffer[i] = -vol;
                wColor[i] = 1;
            }
            // ########################### valor negativo ###########
            if(Period() == PERIOD_M1){
               if(wBuffer[i] <= -180000){wColor[i] = 2;
                  ObjectMove(0,"LowLine",0,TimeCurrent(),low[i]);
               }
           }
           else if(Period() == PERIOD_M2){
               if(wBuffer[i] <= -320000){wColor[i] = 2;
                  ObjectMove(0,"LowLine",0,TimeCurrent(),low[i]);
               }
           }
           else if(Period() == PERIOD_M5){
               if(wBuffer[i] <= -922000){wColor[i] = 2;
                  ObjectMove(0,"LowLine",0,TimeCurrent(),low[i]);
               }
           }
           // ####################################### 
        }
        i++;
  }
   return(rates_total);
  }
//+------------------------------------------------------------------+

Esse de baixo é o que estou importando as configurações.


//+------------------------------------------------------------------+
//|                                                     DrawLine.mq5 |
//|                                                             Neto |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Neto"
#property link      ""
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| PROPRIEDADES DO INDICADOR (DIRETIVAS)                            |
//+------------------------------------------------------------------+
#property indicator_buffers 3
#property indicator_plots 1 
//---
#property indicator_label1  "Line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

//###############
double wave_buffer[]; 
double wave_color[];
double wave_cl[];
int wave_handleM1;

string name;

int OnInit()
  {
//--- Mapear os buffers do indicador
   SetIndexBuffer(0,wave_buffer,INDICATOR_DATA);
   SetIndexBuffer(1,wave_color,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,wave_cl,INDICATOR_DATA);
   
   wave_handleM1 = iCustom(Symbol(),PERIOD_M1,"histogramaBase.ex5");
   
   IndicatorSetString( INDICATOR_SHORTNAME, "Wave Base" );
   //High
   name = "MaxHLine";
   ObjectCreate(0,name,OBJ_HLINE,0,0,0);
   //Low
   name = "LowLine";
   ObjectCreate(0,name,OBJ_HLINE,0,0,0);

   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason){
            ObjectDelete(0, "MaxHLine");
            ObjectDelete(0, "MinHLine");
      //ObjectsDeleteAll(0, -1, OBJ_HLINE);
      ChartRedraw();
  }

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 i;
if(prev_calculated == 0) i = 2;
else i = prev_calculated-1;

CopyBuffer(wave_handleM1,0,0,rates_total,wave_buffer);
      while(i < rates_total){

               if(wave_buffer[i] >= 180000){
                  ObjectMove(0,"MaxHLine",0,TimeCurrent(),high[i]);
               }
               else if(wave_buffer[i] <= -180000){
                  ObjectMove(0,"MinHLine",0,TimeCurrent(),low[i]);
               }
        i++;
  }
   return(rates_total);
  }
//+------------------------------------------------------------------+

Em anexo, uma imagem com o ruído e outra com o histograma que foi importado as configurações.

Aproveitando, teria como fazer essa importação por um timeFrame diferente dentro do próprio indicador do histograma?

Arquivos anexados:
ruido.png  23 kb
 
prsc:

Boa noite.

Fiz um indicador de histograma onde tenho uma condição para pintar o buffer[i] que atingir certo valor, e nesse mesmo valor uso para inserir uma linha no gráfico.

Fiz uma configuração para 3 timeFrames, M1, M2 e M5, mas gostaria de importar os dados do M1 "somente o valor para plotar as linhas"  em outro timeFrame, ex: estou no M5 onde já plota as linhas, mas quero o valor do M1 também.

Usei o iCustom importando o PERIOD_M1, ele puxa as informações mas aparece uns ruídos, linhas verticais, onde no indicador original não existe isso.

Esse é o histograma base e está funcionando perfeito.

Esse de baixo é o que estou importando as configurações.


Em anexo, uma imagem com o ruído e outra com o histograma que foi importado as configurações.

Aproveitando, teria como fazer essa importação por um timeFrame diferente dentro do próprio indicador do histograma?

Sinceramente não curto muito ler dezenas de linhas de código... Tenho preguiça, sou sincero...

Mas, pelo que vejo pelo Print, são linhas verticais... OBJ_HLINE não imprimiriam linhas VERTICAIS, apenas HORIZONTAIS...


Outra dica, o MQL5 é BEM inconsistente com relação à inicialização de variáveis, começando que, variável NULL é zero, e não NULL... o que cria uma confusão dos diabos. Vai saber por quê... algum gênio da Metaquotes achou que facilitaria a vida dos programadores... Só que não...

Sugiro que qualquer variável/elemento de vetor NÃO PROCESSADO de um buffer, você coloque EMPTY_VALUE, assim os gráficos não ficam imprimindo valores doidos por aí...

;)

 
Flavio Jarabeck:

Sinceramente não curto muito ler dezenas de linhas de código... Tenho preguiça, sou sincero...

Mas, pelo que vejo pelo Print, são linhas verticais... OBJ_HLINE não imprimiriam linhas VERTICAIS, apenas HORIZONTAIS...


Outra dica, o MQL5 é BEM inconsistente com relação à inicialização de variáveis, começando que, variável NULL é zero, e não NULL... o que cria uma confusão dos diabos. Vai saber por quê... algum gênio da Metaquotes achou que facilitaria a vida dos programadores... Só que não...

Sugiro que qualquer variável/elemento de vetor NÃO PROCESSADO de um buffer, você coloque EMPTY_VALUE, assim os gráficos não ficam imprimindo valores doidos por aí...

;)

Sobre o ruído, descobri que precisava deixar " #property indicator_type1   DRAW_COLOR_HISTOGRAM ", estava em DRAW_LINE, e o original a ser importado é HISTOGRAM também.

Só não consigo fazer o mesmo indicador plotar 2 timeFrames diferentes, ele até plota, mas a linha do Período M1 sai fora do lugar.

Talvez seja algo com os valores que vc citou, mas nesse final de semana dou uma olhada melhor porque também não compreendo bem o funcionamento de plotar linhas, preciso testar bem isso.

No testador de estratégias, as linhas não obedeciam a condição imposta, mudavam de lugar quando queriam, mas no gráfico montado do índice, está no lugar certo.

Vou ver no pregão como se comporta as alterações que fiz hoje.

Razão: