Pergunta indicadora - página 7

 
Trata-se do escopo e do último valor estabelecido. Todas estas variáveis têm um escopo de pelo menos a Função em que se encontram, se forem declaradas globalmente, então elas têm escopo fora da Função. Se o valor de uma variável muda 3 vezes dentro de um laço, não é possível obter o segundo valor para o qual ela foi definida fora do laço porque no momento em que o código fora do laço é executado, a variável é definida para o seu terceiro valor.
 
Se eu usar algo como isto

E digamos que eu declaro val1 com turno 3
e então o laço, é claro, é turno i

Se eu me referir a val1 fora do laço, estarei falando de val1 global ou val1 com laço ?

Acho que estou me perguntando se eu deveria adicionar um fractal global separado para minhas declarações como val3 e val4 ou algo assim

Estou meio que ficando preso aqui, mas parece que o esquema ABCD está pelo menos fazendo um pequeno progresso

De qualquer forma, aqui está o código algumas idéias ?

//+------------------------------------------------------------------+
//|                                                  Agent86_5min.mq4 |
//|                                                    Unfinished POS |
//|                      my attempt at an ABCD scheme and fib retrace | 
//+------------------------------------------------------------------+
#property copyright "Unfinished POS by Agent86"


//---- input parameters
extern double    TakeProfit=20.0;
extern double    Lots=0.1;
extern double    StopLoss=10.0;
extern int MagicNumber=123486;

double val1;
double val2;


//++++ These are adjusted for 5 digit brokers.

int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)

    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   if (Digits == 5 || Digits == 3)
   {    // Adjust for five (5) digit brokers.
      pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
   } 
   else 
    {    
      pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; 
    }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
     
   
    
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
   
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   
        
   int i=0;                
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 
  


for(i=0; val1==0 || val2==0; i++)
     {
     if(iFractals(NULL, 0, MODE_UPPER,i) > 0 && val1 == 0) 
     val1 = iFractals(NULL, 0, MODE_UPPER, i);
     if(iFractals(NULL, 0, MODE_LOWER, i) > 0 && val2 == 0)
     val2 = iFractals(NULL, 0, MODE_LOWER, i);
     double A = val2;
     if(A !=0) 
     Print (A, " A loop down");
     double a = val1;
     if(a !=0)
     Print (a, " a loop up");
      
     //Print (" Last UPPER Fractal at ", val1, " Last LOWER Fractal at ", val2);
         
     }   
                            
      if(val1 > 0)
         {
         //Print (val1, " val1");
         //Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val1 time");      
         //datetime b = Time[3];
         ////Print (A, " A if");
         double Z=(val1-A)/2; //my attempt at a .50 retrace in pips but can be any fib level
         double C=A+Z; //using the calc above to get the retrace value at .50
         //Print (C, " C");
         if(Bid<=C && Bid > A) //C will be somewhere in between here
         Print (Low[0], " Low [0] ", C, " = C");
         // some other signal here to trade at retrace
         }        
         
         

      if(val2 < 0)
         {
         //Print (val2, " val2");
         //Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val2 time");
         //datetime c = Time[3];
         //Print(a, " a");
         double z=(a-val2)/2; //my attempt at a .50 retrace in pips but can be any fib level
         double c=a+z; //using the calc above to get the retrace value at .50
         //Print (c, " c");
         if(Bid<=c && c < a) //c will be somewhere in between here
         Print (Low[0], " Low [0] ", c, " = c");
         //some other signal here to trade at retrace
         }
         
                   
                
   return(0);
  }    

//+------------------------------------------------------------------+


Assim, o A seria o mínimo anterior e o val1 deveria ser o atual turno 3, e o mesmo com um e val2

Tenho que re-testar mais alguns para ter certeza de que A e a estão se referindo aos valores corretos porque acrescentei as declarações !=0 para que não imprima os valores vazios.
Parece estar tudo bem à primeira vista, mas preciso reconfirmar isto

De qualquer forma, para reafirmar isto:
O val1 no meu if(declaração) se refere corretamente à condição correta ou preciso de um iFractal completamente diferente para me referir ao deslocamento 3
Não consigo dizer se está funcionando corretamente ou não, parece estar funcionando, mas algo não parece estar correto e não consigo parar de colocar o dedo sobre ele.

Por favor, avise

Obrigado

Embora este não seja mais um tópico indicador, devo passar este para um novo tópico?

 
Agent86:
Se eu usar algo como isto

E digamos que eu declaro val1 com turno 3
e então o laço, é claro, é o deslocamento i

Se eu indicar val1 fora do loop, estarei falando de val1 global ou val1 looped ?

Acho que estou me perguntando se devo adicionar um fractal global separado para minhas afirmações como val3 e val4 ou algo assim...

val1 & val2 são declarados com escopo global, i é declarado localmente dentro de start().

val1 e val2 dentro ou fora do laço têm o último valor que lhes foi atribuído . . que acontece antes do laço e então os valores podem ser mudados dentro do laço . . uma vez que o laço tenha saído, os valores são o que são e permanecem assim até que seja chamado de start() da próxima vez, então eles são reiniciados e então possivelmente modificados no laço . . etc. etc.

 
RaptorUK:

val1 & val2 são declarados com escopo global, i é declarado localmente dentro de start().

val1 e val2 dentro ou fora do laço têm o último valor que lhes foi atribuído . . que acontece antes do laço e então os valores podem ser alterados dentro do laço . . uma vez que o laço tenha saído os valores são o que são e permanecem assim até que se chame start() na próxima vez, então eles são reiniciados e então possivelmente modificados no laço . . etc. etc.

Hmmm, portanto, as decisões.

Eu poderia tentar ir atrás dos valores enquanto estiver no loop e apenas redeclarar val1 e val2 =iFractal,,3 novamente. Para reiniciar as coisas, mas somente depois de declarar A=val2 e a=val1, então eu tenho um valor para estes que espero ser meu fractal anterior, se eu tiver este direito.

Ou eu poderia redeclarar val 1 e val2 fora do loop, mas não quero perder o valor para A ou a, então eu só tenho que resolver isso nos momentos apropriados que eu penso.

Eu também poderia estar fazendo tudo isso errado, mas não importa. Tenho que começar em algum lugar, então escolhi isto por enquanto; e posso ajustá-lo à medida que tiver mais experiência.

Obrigado pela ajuda
 
Então estes são irrelevantes ?

val1=iFractals(NULL, 0, MODE_UPPER,3);
val2=iFractals(NULL, 0, MODE_LOWER,3);

 

Acho que provavelmente eu deveria mudá-los para val3 e val4 a fim de usar o iFractal real para negociação e somente referência e uso (A) e (a) para referência ao meu fractal anterior.


Vou continuar trabalhando nisso

Obrigado

 
Ok

Depois de alguns dias pensando sobre isso e tentando trabalhar através da lógica, acho que agora tenho um código de trabalho melhor, embora não seja perfeito, mas está progredindo

//+------------------------------------------------------------------+
//|                                                  Agent86_5min.mq4 |
//|                                              Unfinished POS slate |
//|                                           See progress notes below |
//+------------------------------------------------------------------+
#property copyright "Unfinished POS slate by Agent86"


//---- input parameters
extern double    TakeProfit=20.0;
extern double    Lots=0.1;
extern double    StopLoss=10.0;
extern int MagicNumber=123486;

double val1;
double val2;
bool traded = false;

//++++ These are adjusted for 5 digit brokers.

int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)

    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   if (Digits == 5 || Digits == 3)
   {    // Adjust for five (5) digit brokers.
      pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
   } 
   else 
    {    
      pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; 
    }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
     
   
    
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   
        
   int i=0;
   int ticket,total,result;
   total = OrdersTotal();                 
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 


     
     if(val1 > 0 && traded == false)
      { 
      // in the absence of an && indicator above I get continous print statements
      // with indicator added && indicator above, then it prints A and B once as it should ???
      // I need to work this out so it won't print all the time aka trade all the time
      // A and B first values seems to initialize the whole block
      // just a reminder that they time stamps coordinate after this FYI
      // now work on C retrace and possibly signals
      // add options for user to select some candle patterns
      // add options to select indicators
      // add bells and whistles to make things fun
      // alerts,sounds,maybe poppup video animation or something
      
      double B = val1;
      Print(B, " B high");
         if(val2==0)
            {
            for (i=0; val2==0; i++)
               {
               val2=iFractals(NULL, 0, MODE_LOWER, i);
               double A = val2;
                  if(A!=0)
                     {
                     Print(A, " A low");
                     }
               }
             }  
      traded=true;
      }
     
     if(val2 > 0 && traded == true)
      {
      B = val2;
      Print(B, " B low");
         if(val1==0)
            {
            for (i=0; val1==0; i++)
               {
               val1=iFractals(NULL, 0, MODE_UPPER, i);
               A = val1;
                  if(A!=0)
                     {
                     Print(A, " A high");
                     }
               }
             }  
      traded=false;
      }
     
                    
                
   return(0);
  }    

//+------------------------------------------------------------------+


      

Então eu tenho meus valores A e B e enquanto uma declaração indicadora é colocada na inicial if(statements && indicators) os valores são impressos uma vez, por exemplo MACD mais rápido > mais lento ou algumas declarações indicadoras desse tipo.

Então eu recebo apenas A e B como eu gostaria

Não tenho certeza porque imprime várias vezes quando as opções do indicador são tiradas do meu if(statements)

De qualquer forma, estou me aproximando um pouco mais deste esquema do tipo ABCD que também pode ser usado em outros indicadores, não apenas em fractais, etc., para referência futura.

Favor informar

Obrigado

 

Isto pode ajudar você. É um indicador para acessar os últimos fractais e o turno para que você possa trabalhar com seu ABCD.

iCustom(Symbol(),0,"Fractal Store",0,"",0,0)

Isso dará os fractais superiores. Mude "" para "L" para os fractais inferiores.

iCustom(Symbol(),0,"Fractal Store",1,"",0,0)

Isso dará o fractal antes do fractal mais recente.

Arquivos anexados:
 
heelflip43:

Isto pode ajudar você. É um indicador para acessar os últimos fractais e o turno para que você possa trabalhar com seu ABCD.

Isso dará os fractais superiores. Mude "" para "L" para os fractais inferiores.

Isso dará o fractal antes do fractal mais recente.

Sim, eu vejo que

Antes de meu último código neste tópico, eu tinha trabalhado várias (para) declarações com alguma ajuda e era também um indicador de que eu era capaz de desenhar o que eu queria no buffer, mas isso me levou a outro problema de tentar extrair os valores e só imprimir esses valores uma vez para ser usado ou referenciado.

Uma vez que estes vários para declarações causam problemas para mim e são semelhantes ao código que você postou.
Nunca consegui obter os valores sem imprimir constantemente o valor a cada vez que ele se torna verdadeiro, o que é contínuo.
Eu trabalhei um pouco nisso, mas ainda assim nunca aprendi realmente como parar uma vez que uma condição é verdadeira.

Vejo em seu código uma coisa que pode ajudar é o bloco de data/hora estática e já usei isso apenas uma vez antes para me referir à condição apenas quando uma nova barra e um novo horário de barra chega.
Esta parte pode ser útil com o que estou trabalhando. E embora meu código atual produza o fractal atual e o fractal anterior, atualmente está funcionando

O único problema que tenho é que uma vez que a condição é verdadeira, ela imprime a declaração continuamente, o que poderia ser bom, mas isto significa que provavelmente também irá colocar um comércio continuamente quando eu chegar a esse ponto.

Talvez eu precise de mais experiência em como usar os indicadores iCustom e isto pode resolver muitos dos meus problemas, mas ainda não estou tão longe no meu aprendizado.

Vou rever este código um pouco mais, e as partes VAZIAS_VALORES. Agora que vejo que em uso, posso aprender com isso também. Foi sugerido antes, mas nunca entendi como usá-lo.

Vou continuar trabalhando nele
Obrigado pela ajuda
 
Um último pensamento eu notei que quando eu adiciono vamos dizer MACD ao if(val1 > 0 && mais rápido > mais lento && negociado == falso)

Então ele funciona e só dá exatamente o que eu quero que é imprimir o A baixo, B alto, então e/ou B baixo e A alto

Mas se eu tirar o mais rápido > mais lento e mais lento < mais lento em ambas as declarações, então eu noto que NUNCA imprime o A alto e também imprime continuamente os outros sobre os quais eu estou confuso


Vou continuar trabalhando, tenho certeza de que preciso imprimir a declaração uma vez, sem outras declarações de indicadores na EA, para saber que os indicadores não interferirão com as partes do ABCD do código

Voltar ao quadro de desenho


 

Acho que seu problema está em você não ter zerado val1 e val2. Portanto, uma vez que você tenha encontrado o alto e o último baixo, você precisa reinicializá-los:

double B = val1;
      Print(B, " B high");
         if(val2==0)
            {
            for (i=0; val2==0; i++)
               {
               //Print("i "+i);
               val2=iFractals(NULL, 0, MODE_LOWER, i);
               double A = val2;
                  if(A!=0)
                     {
                     Print(A, " A low");
                     }
               }
             }  
      traded=true;
      }
     
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 

     if(val2 > 0 && traded == true)
      {
      B = val2;
      Print(B, " B low");
         if(val1==0)
            {
            for (i=0; val1==0; i++)
               {
               val1=iFractals(NULL, 0, MODE_UPPER, i);
               A = val1;
                  if(A!=0)
                     {
                     Print(A, " A high");
                     }
               }
             }  
      traded=false;
      }
Esperamos que isso ajude.
Razão: