Alguém pode dar uma ajuda nesse indicador (indexador de ativos)

 

Não sou programador, mas já fiz alguns indicadores.

Este indicador faz uma indexação intraday de ativos da Bovespa, uso para detectar qual ativo está forte ou fraco e qual as nuances que levam a mudança no rumo do mercado geral.

Todos os preços correntes são divididos pelo preço de abertura de cada ativo, isso me permite fazer a comparação em uma escala unitária (o índice marca 1 quando o preço do momento é igual ao de abertura).

Ele funcionou perfeitamente bem quando criei, porém poucos dias depois ele começou a apresentar erros, como atingir escalas acima de 1000, ou até mesmo não aparecer linha alguma. Ás vezes ele demora um tempo e depois aparece, ás vezes mudando o timeframe resolve, recompilando, dando refresh, mas agora ele travou geral...

Já tentei escrevê-lo de diversas formas e não estou conseguindo ver o problema no cálculo que o leva a estas incoerências. Segue o código abaixo, se alguém puder dar uma ajudo fico muito grato.

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   6


#property indicator_label1  "BASE"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlack
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "1"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

#property indicator_label3  "2"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrRed
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1

#property indicator_label4  "3"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrViolet
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1

#property indicator_label5  "4"
#property indicator_type5   DRAW_LINE
#property indicator_color5  clrOrange
#property indicator_style5  STYLE_SOLID
#property indicator_width5  1

#property indicator_label6  "5"
#property indicator_type6   DRAW_LINE
#property indicator_color6  clrGreen
#property indicator_style6  STYLE_SOLID
#property indicator_width6  1


input string symbol1="IBOV";
input string symbol2="PETR4";
input string symbol3="VALE3";
input string symbol4="B3SA3";
input string symbol5="WEGE3";
input string symbol6="ITUB4";
int i;


double        ind1[];
double        ind2[];
double        ind3[];
double        ind4[];
double        ind5[];
double        ind6[];

double        openday1;
double        openday2;
double        openday3;
double        openday4;
double        openday5;
double        openday6;


int OnInit()
  {

   SetIndexBuffer(0,ind1,INDICATOR_DATA);
   SetIndexBuffer(1,ind2,INDICATOR_DATA);
   SetIndexBuffer(2,ind3,INDICATOR_DATA);
   SetIndexBuffer(3,ind4,INDICATOR_DATA);
   SetIndexBuffer(4,ind5,INDICATOR_DATA);
   SetIndexBuffer(5,ind6,INDICATOR_DATA);
   
   ArrayInitialize(ind1,EMPTY_VALUE);
   ArrayInitialize(ind2,EMPTY_VALUE);
   ArrayInitialize(ind3,EMPTY_VALUE);
   ArrayInitialize(ind4,EMPTY_VALUE);
   ArrayInitialize(ind5,EMPTY_VALUE);
   ArrayInitialize(ind6,EMPTY_VALUE);
   
   openday1 = 0;
   openday2 = 0;
   openday3 = 0;
   openday4 = 0;
   openday5 = 0;
   openday6 = 0;
   

   return(0);
  }

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[])
  {

   openday1 = iOpen(symbol1,PERIOD_D1,0);
   openday2 = iOpen(symbol2,PERIOD_D1,0);
   openday3 = iOpen(symbol3,PERIOD_D1,0);
   openday4 = iOpen(symbol4,PERIOD_D1,0);
   openday5 = iOpen(symbol5,PERIOD_D1,0);
   openday6 = iOpen(symbol6,PERIOD_D1,0);
     
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);
   MqlRates rates3[]; ArraySetAsSeries(rates3,true);
   MqlRates rates4[]; ArraySetAsSeries(rates4,true);
   MqlRates rates5[]; ArraySetAsSeries(rates5,true);
   MqlRates rates6[]; ArraySetAsSeries(rates6,true);

 if(prev_calculated<rates_total)
     {
      for(i=0;i<rates_total;i++)
        {
         CopyRates(symbol1,0,time[i],1,rates1);
         CopyRates(symbol2,0,time[i],1,rates2);
         CopyRates(symbol3,0,time[i],1,rates3);
         CopyRates(symbol4,0,time[i],1,rates4);
         CopyRates(symbol5,0,time[i],1,rates5);
         CopyRates(symbol6,0,time[i],1,rates6);
        
         ind1[i]=rates1[0].close/openday1;
         ind2[i]=rates2[0].close/openday2;
         ind3[i]=rates3[0].close/openday3;
         ind4[i]=rates4[0].close/openday4;
         ind5[i]=rates5[0].close/openday5;
         ind6[i]=rates6[0].close/openday6;
        }
    }


   return(rates_total);
  }

 

Como fica

Estou o dia todo dando refresh e mudando do timeframe e agora finalmente consegui um exemplo kkkkk, mas quando alterei o frame para 1 minuto sumiu novamente, retornei pra 5 minutos e continou perdido..

Minha curiosidade é pra qual limbo meu indicador está indo? Porque funciona algumas vezes e outras não? que doidera

 
zuazo:

Estou o dia todo dando refresh e mudando do timeframe e agora finalmente consegui um exemplo kkkkk, mas quando alterei o frame para 1 minuto sumiu novamente, retornei pra 5 minutos e continou perdido..

Minha curiosidade é pra qual limbo meu indicador está indo? Porque funciona algumas vezes e outras não? que doidera

Boa noite Zuazo,

O código acima não está "indo" para limbo nenhum, apenas está calculando, e se você fica mudando de timeframe (pior para 1min), não dá tempo a terminar e mostrar o resultado.

Nos próximos códigos que faça, para saber por onde "anda", coloque algo que lhe mostre o que está fazendo. Por exemplo, coloque Print("Barra " + i), após o primeiro 'for' e verá o número a barra sendo impresso a cada iteração (tem que ter a 'Caixa de Ferramentas' visível).

Veja se assim fica bom para você. E por gentileza, nós explique um pouco mais da sua estratégia com o indicador.

//+------------------------------------------------------------------+
int OnInit()
{
   Print(" ");
   Print("Inicializando");
  
   SetIndexBuffer(0, ind1, INDICATOR_DATA);
   SetIndexBuffer(1, ind2, INDICATOR_DATA);
   SetIndexBuffer(2, ind3, INDICATOR_DATA);
   SetIndexBuffer(3, ind4, INDICATOR_DATA);
   SetIndexBuffer(4, ind5, INDICATOR_DATA);
   SetIndexBuffer(5, ind6, INDICATOR_DATA);
  
   ArrayInitialize(ind1, EMPTY_VALUE);
   ArrayInitialize(ind2, EMPTY_VALUE);
   ArrayInitialize(ind3, EMPTY_VALUE);
   ArrayInitialize(ind4, EMPTY_VALUE);
   ArrayInitialize(ind5, EMPTY_VALUE);
   ArrayInitialize(ind6, EMPTY_VALUE);
  
   openday1 = 1.0;
   openday2 = 1.0;
   openday3 = 1.0;
   openday4 = 1.0;
   openday5 = 1.0;
   openday6 = 1.0;

return(0);
}

//+------------------------------------------------------------------+
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[])
{
   MqlRates rates1[1], rates2[1], rates3[1], rates4[1], rates5[1], rates6[1];
   MqlDateTime ontem1, ontem2, ontem3, ontem4, ontem5, ontem6;
   ontem1.day= 0;
   ontem2.day= 0;
   ontem3.day= 0;
   ontem4.day= 0;
   ontem5.day= 0;
   ontem6.day= 0;
   ArraySetAsSeries(time, true);
   ArraySetAsSeries(open, true);
   ArraySetAsSeries(close, true);
   ArraySetAsSeries(volume, true);
   ArraySetAsSeries(ind1, true);
   ArraySetAsSeries(ind2, true);
   ArraySetAsSeries(ind3, true);
   ArraySetAsSeries(ind4, true);
   ArraySetAsSeries(ind5, true);
   ArraySetAsSeries(ind6, true);
   MqlDateTime hoje;

   if (prev_calculated < rates_total) {
      for(int i= rates_total-1; i > -1; i--)  {
         CopyRates(symbol1, 0, time[i], 1, rates1);
         CopyRates(symbol2, 0, time[i], 1, rates2);
         CopyRates(symbol3, 0, time[i], 1, rates3);
         CopyRates(symbol4, 0, time[i], 1, rates4);
         CopyRates(symbol5, 0, time[i], 1, rates5);
         CopyRates(symbol6, 0, time[i], 1, rates6);
         
         TimeToStruct(rates1[0].time, hoje);
         if (hoje.day != ontem1.day) {
             ontem1= hoje;
             double bb= openday1;
             openday1 = iOpen(symbol1, 0, i);
             if (openday1 <= 0)
                 openday1= bb; }
  
         TimeToStruct(rates2[0].time, hoje);
         if (hoje.day != ontem2.day) {
             ontem2= hoje;         
             double bb= openday2;
             openday2 = iOpen(symbol2, 0, i);
             if (openday2 <= 0)
                 openday2= bb; }
  
         TimeToStruct(rates3[0].time, hoje);
         if (hoje.day != ontem3.day) {
             ontem3= hoje;         
             double bb= openday3;
             openday3 = iOpen(symbol3, 0, i);
             if (openday3 <= 0)
                 openday3= bb; }

         TimeToStruct(rates4[0].time, hoje);
         if (hoje.day != ontem4.day) {
             ontem4= hoje;         
             double bb= openday4;
             openday4 = iOpen(symbol4, 0, i);
             if (openday4 <= 0)
                 openday4= bb;}

         TimeToStruct(rates5[0].time, hoje);
         if (hoje.day != ontem5.day) {
             ontem5= hoje;         
             double bb= openday5;
             openday5 = iOpen(symbol5, 0, i);
             if (openday5 <= 0)
                 openday5= bb; }

         TimeToStruct(rates6[0].time, hoje);
         if (hoje.day != ontem6.day) {
             ontem6= hoje;         
             double bb= openday6;
             openday6 = iOpen(symbol6, 0, i);
             if (openday6 <= 0)
                 openday6= bb; }

         ind1[i]=rates1[0].close / openday1;
         ind2[i]=rates2[0].close / openday2;
         ind3[i]=rates3[0].close / openday3;
         ind4[i]=rates4[0].close / openday4;
         ind5[i]=rates5[0].close / openday5;
         ind6[i]=rates6[0].close / openday6;  } }
        
return(rates_total);
}
 
Drmqlbrazil5:

Boa noite Zuazo,

O código acima não está "indo" para limbo nenhum, apenas está calculando, e se você fica mudando de timeframe (pior para 1min), não dá tempo a terminar e mostrar o resultado.

Nos próximos códigos que faça, para saber por onde "anda", coloque algo que lhe mostre o que está fazendo. Por exemplo, coloque Print("Barra " + i), após o primeiro 'for' e verá o número a barra sendo impresso a cada iteração (tem que ter a 'Caixa de Ferramentas' visível).

Veja se assim fica bom para você. E por gentileza, nós explique um pouco mais da sua estratégia com o indicador.

Olá Drmqlbrazil5,

Por favor utilize o editor de código quando postar trechos de código MQL5 aqui no site.

Veja a diferença:

1) Seu código:

ind4[i]=rates4[0].close / openday4;

2) Usando o editor:

ind4[i]=rates4[0].close / openday4;

Abraços,
Malacarne

 
Rodrigo Malacarne:

Olá Drmqlbrazil5,

Por favor utilize o editor de código quando postar trechos de código MQL5 aqui no site.

Veja a diferença:

1) Seu código:

ind4[i]=rates4[0].close / openday4;

2) Usando o editor:

Abraços,
Malacarne

... certo, Malacarne, nunca tinha utilizado o Editor. Agora ficou muito melhor !

Abraços

 
Drmqlbrazil5:

... certo, Malacarne, nunca tinha utilizado o Editor. Agora ficou muito melhor !

Abraços

Obrigado pelo esclarescimento, Seu código ficou mais ágil hehehe... Eu só fiz uma alteração, que foi iniciar calculando sobre o fechamento anterior. Ocorre que no timeframe de 1 minuto o erro acontece porque quando o IBOV abre, outros ativos ainda ficam em leilão por alguns minutos, acho que isso pode ser a causa dos bugs.

Sobre a estratégia:

A estratégia é parte da análise do mercado de uma forma geral.

Entendo o mercado como um corpo cheio de órgãos internos, que se interconectam e se influenciam mutuamente de forma permanente. Assim existem aqueles "órgãos" que são mais importantes, causam mais influências, e outros que são menos...

Pois bem, com relação ao nosso mercado Brasileiro, o índice IBovespa possui 2 grandes lideres (VALE3 e PETR4), mesmo que o ativo ABEV3 tenha maior % no índice os lideres Vale3 e petr4 causam maior influência, isso somente pode ser notado acompanhando o mercado e vendo as correlações que apresentei, pois numa análise leiga o raciocínio seria que o mais influente é o ativo de maior peso, porém não é.

Sabendo os líderes, os sub-líderes e os seguidores, você começa a entender melhor como o "Corpo" todo está funcionando.

Reversões de tendências começam nos líderes, primeiro 1, depois vai o outro e isso carrega os demais ativos. Isso acontece pois os players (principalmente os grandes players) não podem ficar líquidos ou com um posicionamento excessivo em apenas 1 ativo...

Então numa reversão de baixa por exemplo, a PETR4 pode apresentar a primeira guinada pra cima, depois a VALE3 enquanto isso a PETR4 tem uma leve correção ou se mantendo no patamar, depois que os players se posicionaram da forma como queriam, em quantidade e Preço médio nesses dois ativos, começam a procurar outras "pechinchas" no mercado e pode ser que queiram se desfazer de algum pequeno lucro pra pôr em outro ativo mais atraente, aí que o capital começa a se espalhar...Na reversão de baixa o pensamento é mais ou menos o contrário.

Como dizia Wickoff, o mercado não se quebra em 2. Ou os lideres sobem ou descem juntos ou ficamos numa lateralização, excepcionalmente em alguns casos uma situação diferente pode acontecer, mas não por muito tempo, não há tendências diferentes entre os líderes, não em longos períodos, somente em curtíssimos e excepcionais.

Além dessa análise, a ferramenta me permite saber por exemplo, qual ativo está mais fraco ou mais forte...

Por exemplo, se o mercado está em baixa, PETR4 está mais fraca que o IBOV (quando o IBOV sobe mas o ativo não) eu olho pro IBOV procurando qualquer sinal de esgotamento na subida e vou short na PETR4, a ferramenta me permite saber em qual ativo eu devo ir SHORT, no que estiver mais fraco claro, pois sei que quando o mercado inteiro cair, este ativo vai cair mais e se o mercado por um acaso subir, este ativo provavelmente vai cair ou se manter num patamar em que posso me desfazer das operações antes de um prejuízo.

Enfim, é UMA das análises que faço durante meus trades, aliando isso com outras análises consigo resultados consistentes, o que estava me atrapalhando era uma grande quantidade de gráficos por exemplo em minha tela, agora com a ferramenta ficou mais simples, isso quando não dá bug hehehehe


Obrigado mais uma vez! Um Abs

 

zuazo, Bom Dia!!


Fiquei interessado em seu indicador mas não tenho conhecimento para programar. Poderia compartilhar o indicador!!


Obrigado!!

 
Estou disponibilizando a última versão do indicador, pro pessoal que veio me perguntar no privado!
Arquivos anexados:
Razão: