Problemas encontrados durante os testes posteriores e não é possível encontrar a causa raiz! - página 5

 
jollydragon:

. Ainda não consigo ver o desaparecimento dos picos. Como "reinicializá-lo"?

Você pode reinicializar, mudando os prazos

ou

abra a janela de entrada do indicador e clique em OK

 

GumRai2015.05.14 21:51#

You can re-initialise by either changing timeframes

or

abra a janela de entrada do indicador e clique em OK


Depois de tentar, entendo que é o mesmo significado que eu disse que os picos de mudança de local. Correto?

PrezadoGumRai,

 
WHRoeder:

Para cada iteração, (exceto a primeira,) Fish1 é o valor do elemento tampão anterior, mas você não o inicializa para ExtBuffer1[limite].

Assim, para a iteração inicial (quando limite == barras) você define ExtBuffer1[0] = 1,1*ExtBuffer1[1] .

Mas para os tiquetaques subseqüentes (quando limite == 1), você define ExtBuffer1[0] = 1,1*0,00001 .

Prezado WHRoeder,

Muito obrigado e vejo a questão um pouco melhor com sua direção.

No entanto, talvez ainda sejam necessárias mais algumas perguntas para esclarecer melhor:

1. Você pode ver "duplo peixe1=0,00001;" é definido no início e fora de todas as funções.

Portanto, deve ser uma variável global e entendo que foi atribuída com o último ExBuffer1[0], mesmo que um novo tick subseqüente venha.

Ou ela se recupera automaticamente para "0,00001" toda vez que um novo tick vem?

2. Agora que cada barra é pintada de maneira diferente com um único carrapato ou muitos carrapatos subseqüentes, por que posso ver a repintura de ..., barra[8], ..., ou barra[1], em um gráfico M1 vivo sem nenhuma interrupção?

3. Por que as localizações dos picos são alteradas após serem refrescadas?

4. Por que posso ver alguns picos (cerca de 959870576) formados muito, muito menos que"EMPTY_VALUE"(2147483647) em gráficos M1 ao vivo?

5. Se houver uma nova barra, o anterior ExtBuffer1[0] mudará automaticamente para ExtBuffer1[1]. Correto?

6. Como evitar qualquer potencial reinicialização ou repintura?

Talvez eu ainda esteja confuso em alguns pontos críticos e precise de sua grande paciência para ajudar! É muito apreciado se você puder ajudar com as perguntas uma a uma!

 

CaroWHRoeder,GumRai,

Atualizei meu indicador como o código abaixo de acordo com meu entendimento, após ler novamente seus posts.

Depois de usá-lo para testes posteriores, o resultado é muito mais consistente com o indicador. No entanto, ainda há dois problemas. Consulte os screenshots abaixo.

1. A negociação ocorre após 4 sinais indicadores no início da primeira ordem.

2. Ainda há uma ordem de troca que acontece 4 barras antes do sinal indicador.

Abaixo está o código do indicador atualizado.

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.50"
#property strict
#property  indicator_separate_window
#property  indicator_buffers 2

extern int    period=35;
extern double smooth=0.3;

datetime       lastAlertTime;
double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtValue[];
double         Value1=0,Buffer0_1=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(3);
   SetIndexBuffer(0,ExtBuffer0); SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,clrWhiteSmoke);
   SetIndexBuffer(1,ExtBuffer1); SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,clrGoldenrod);
   SetIndexBuffer(2,ExtValue);
   IndicatorShortName(" Solar Joy   ^v^  ");
   ArraySetAsSeries(ExtBuffer0,true);
   ArraySetAsSeries(ExtBuffer1,true);
   ArraySetAsSeries(ExtValue,true);

   SetIndexDrawBegin(1,period);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   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[])
  {
   if(rates_total<=period)    return(0);

   int    i,limit;
   double price,MinL,MaxH;

   if(prev_calculated<rates_total-1) limit=rates_total-period-1;
   else                              limit=1;

   for(i=limit-1; i>=0; i--)
     {
      MaxH = High[iHighest(NULL,0,MODE_HIGH,period,i)];
      MinL = Low[iLowest(NULL,0,MODE_LOW,period,i)];
      price=(High[i]+Low[i])/2;
      if(limit==1)
        {
         Value1=ExtValue[1];
         Buffer0_1=ExtBuffer0[1];
        }
      ExtValue[i]=(1-smooth)*(2*(price-MinL)/(MaxH-MinL)-1.0) + smooth*Value1;
      ExtValue[i]=MathMin(MathMax(ExtValue[i],-0.999),0.999); // Value=Value>0.999?0.999:Value<-0.999?-0.999:Value;
      ExtBuffer0[i]=(1-smooth)*MathLog((1+ExtValue[i])/(1-ExtValue[i]))+smooth*Buffer0_1;
      Value1=ExtValue[i];
      Buffer0_1=ExtBuffer0[i];
      if(ExtBuffer0[i]>0) ExtBuffer1[i]=3;
      else ExtBuffer1[i]=-3;
     }

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

 
jollydragon:

1. Você pode ver "double Fish1=0,00001; " é definido no início e fora de todas as funções.

Portanto, deve ser uma variável global e entendo que foi atribuída com o último ExBuffer1[0], mesmo que um novo tick subseqüente venha.

Ou ele se recupera automaticamente para "0,00001" toda vez que um novo tick vem?

Não e não. Qual parte de "mas você não inicializa para ExtBuffer1[limite]" não foi clara?
if(prev_calculated<rates_total-1){ limit=rates_total-period-1; Fish1=0.00001;       }
else                             { limit=1;                    Fish1=ExtBuffer0[1]; }
for(i=limit-1; i>=0; i--)
  {
   ExtBuffer1[i]=1.1*Fish1;
   Fish1=ExtBuffer1[i];
   if(Fish1>=EMPTY_VALUE)
      Fish1=1;
  }

Pessoalmente, acho que os argumentos de taxas_total/prev_calculado/OnCalculado são uma abominação, uma vez que gráficos/buffers são séries temporais, e o fariam da maneira antiga:
int counted = IndicatorCounted();
limit = Bars - MathMax(counted, period-1); // Lookback period-1
Fish1 = counted == 0 ? 0.00001 : ExtBuffer0[limit];
for(i=limit-1; i>=0; i--)
Razão: