Pergunta indicadora

 

Olá a todos,

Eu estava aprendendo alguns tópicos gerais sobre arrays a partir de um indicador de base de código que tem iFractals com alguma grande ajuda de guru's nos fóruns.


De qualquer forma

Não fui capaz de adicionar operadores condicionais ou operações lógicas para adicionar a função de adição ao indicador

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[1000];
double v2[1000];
double v3[1000];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");
   

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");
  
   
   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A");
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), //MODE_MAIN
            slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL
           
            
   int i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0)
         {        
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+

Eu tentei inserir if(mais rápido > mais lento) em várias áreas do código apenas para brincar com a idéia. Normalmente estas idéias funcionariam em um EA, mas não em um indicador

IE if(v1 > 0 && mais rápido > mais lento)

mas isto faz com que o indicador desapareça.

Muitas outras combinações que eu pensei que deveriam produzir o indicador desejado se (outras condições) etc. e assim por diante.
Todas não produzem nenhum resultado de declaração impressa.

Que ponto estou perdendo aqui.

Por favor, informe
Obrigado





 

double v1[1000];
double v2[1000];
double v3[1000];<------ leave out the '1000' initialization for indicator buffers, as they don't require 

 
diostar:


Bem, eu fiz isso no início mas depois não consegui imprimir os valores do buffer que eu queria fazer

Bem, espere, deixe-me reafirmar isto:

Se eu não declarar o número de elementos no buffer, então o indicador funcionará como com v1[i]=High[i]
Mas Imprimir (v1[i]); não sairá porque pelo que posso dizer não há como imprimir valores de array não declarados se o número de elementos não foi declarado, portanto sempre imprimirá 0

Então se eu não declarar globalmente, então o indicador funciona, porém o if(mais rápido>baixo) ainda faz o indicador desaparecer, E eu também não posso imprimir os valores.

Se eu o declarar e também reinicializar novamente com v1[i]=High[i] novamente, então eu posso imprimir, porém qualquer adição como && mais rápido > mais lento removerá o indicador novamente.

Eu não entendo completamente o porquê.

Obrigado
 

Tirei seu código, tirei os valores das declarações tampão e funciona muito bem...

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 se


 
RaptorUK:

Tirei seu código, tirei os valores das declarações tampão e funciona muito bem...

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if < High

---------> neste momento Fractals inconsistent High is lower the prev Low <

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if <----Low

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if<----High

------> neste momento Fractals inconsistent High is lower the prev Low <------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if<----Low

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 if<----High

---------> neste momento, alternando Fractals consistente <

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if < Low
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 if < High


Interessante, thx para o resultado Agent86V2. Os fractais são de fato um desses intrigantes, mas podem ser uma forma lucrativa de comércio.

 
RaptorUK:

Tirei seu código, tirei os valores das declarações tampão e funciona muito bem...

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 se
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 se


Também posso imprimir o código sem produzir valores zero, o que não era o caso no outro fio.
Sinto muito, mas não entendo. Pensei que sim, mas parece que ainda me falta algo.

int start()
   {
   double test[];
   
   test[39] = 45.6;
   Print("test[39]= ",test[39] );
   

      return(0);
   }
Você me instruiu a declarar como acima :

E o senhor citou este tópico:

Quando você leu o Livro sobre Arrays, você viu onde ele dizia isto ?

"Ao declarar um array, o tipo de dados, nome do array e número de elementos de cada dimensão deve ser especificado:"

Portanto, por um lado, não posso imprimir a matriz como neste roteiro sem primeiro declarar teste duplo[40]; como você instruiu, mas agora parece que também posso imprimir sem declaração.

Portanto, parece que posso imprimir os valores no buffer, independentemente da declaração.

Entretanto, não posso acrescentar condições adicionais que normalmente produziriam o resultado desejado, como se (mais rápido > mais lento) ou && mais rápido > mais lento
Pode ser EMA qualquer coisa que eu só quero entender porque não está funcionando.
Faz com que os altos indicadores desapareçam e a saída de impressão v1 abandona a impressão. Eu esperava que ele caísse de acordo com a condição e que imprimisse a saída.

Tentei acrescentar blocos de código adicionais para isto também com os mesmos resultados.

Obrigado
 

Também escrevi isto . . .

RaptorUK:

Buffers indicadores são Arrays especiais . . não misturam Arrays e Buffers, eles são similares, porém diferentes.

No código original v1[] e v2[] são buffers, em seu último código são Arrays, quando você declara um Array você tem que lhe dar um tamanho, por exemplo, v1[50] tem 50 elementos de v1[0] a v1[49]. O Buffer redimensiona automaticamente quando há mais elementos necessários e os valores mudam automaticamente no Buffer. Considere a barra atualmente em formação, barra 0, quando esta barra completa um valor Indicador associado com aquela barra tem que mudar para o índice 1 . . . isto é feito automaticamente com Buffers . . se você quiser assim algo semelhante com Arrays você pode, mas você mesmo tem que codificá-lo.

 
Agent86:

Entretanto, não posso acrescentar condições adicionais que normalmente produziriam o resultado desejado, como se (mais rápido > mais lento) ou && mais rápido > mais lento
Pode ser EMA qualquer coisa que eu só quero entender porque não está funcionando.
Faz com que os altos indicadores desapareçam e a saída de impressão v1 abandona a impressão. Eu esperava que ele caísse de acordo com a condição e que imprimisse a saída.

Tentei acrescentar blocos de código adicionais para isto também com os mesmos resultados.

Obrigado

Mostre seu código, as coisas que não funcionam... Eu não uso Indicadores Técnicos. . . nunca, então não assuma que eu sei o que você quer dizer com EMAs, etc ;-) você precisa me mostrar seu código.
 
RaptorUK:

Também escrevi isto . . .

RaptorUK:

Buffers indicadores são Arrays especiais . . não misturam Arrays e Buffers, eles são similares, porém diferentes.

No código original v1[] e v2[] são buffers, em seu último código são Arrays, quando você declara um Array você tem que lhe dar um tamanho, por exemplo, v1[50] tem 50 elementos de v1[0] a v1[49]. O Buffer redimensiona automaticamente quando há mais elementos necessários e os valores mudam automaticamente no Buffer. Considere a barra atualmente em formação, barra 0, quando esta barra completa um valor Indicador associado com aquela barra tem que mudar para o índice 1 . . . isto é feito automaticamente com Buffers . . se você quiser assim algo semelhante com Arrays você pode, mas você mesmo tem que codificá-lo.

Verdadeiro. "Semelhante, porém diferente". Não vejo outra maneira melhor de dizer do que esta.
 
Ok, semelhante, mas diferente eu entendo, inicialmente tive grandes problemas até mesmo imprimindo v1[i] em qualquer ponto do código, mas agora parece imprimir como eu esperava que fosse originalmente.
Eu só criei um loop secundário porque não consegui imprimir dentro do primeiro loop indicador, mas agora ele está imprimindo
De qualquer forma, acho que não vou voltar a fazer isso, mas acho que já entendi.

Portanto, o código que não vai funcionar são alguns exemplos mostrados aqui:

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");
   

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");
  
   
   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A");
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), //MODE_MAIN
            slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL
           
            
   int i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0 && faster > slower) 
         // I think I need to add some more comparisons for the Low[i] also
         // the comparison works but shows indicator when faster < slower too.
         // adding additional code blocks instead of above and including the part below and inserting this instead 
         //                                               if(faster>slower)
         //                                                     {
         //                                                      v1[i]=High[i];
         //                                                     }
         //                                                      causes indicator to disappear
         
         {                             
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+

Obrigado

 
Agent86:

Portanto, o código que não vai funcionar são alguns exemplos mostrados aqui:

Obrigado

OK, posso lhe dizer qual é o seu problema ou posso lhe dar algumas pistas. . pistas primeiro, se você quiser que eu lhe diga e eu lhe direi . .

Inside the Loop, for(i=Bars; i>=0; i--) . . quais são os valores para mais rápido e mais lento?