Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 568

 
PolarSeaman:

Existem 3 ciclos deste tipo. Substituindo-os, o terminal congelou.

Contei quatro:

   int i;

   SetIndexDrawBegin(0,Bars-cb);
   SetIndexDrawBegin(1,Bars-cb);

   double avg;

   ki=2.0/(p+1);

   int total;
   int limit = GetRecalcIndex(total,rates_total,prev_calculated);

   for(i=limit; i>=0; i--) 
      fx1[i]=Close[i];

   for(int m=0; m<=s; m++)
     {
      z1=fx1[0];
      for(i=0; i<=limit; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

      z2=fx1[limit];
      for(i=limit; i>=0; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/2;}
     }

   fs=0;
   for(i=limit; i>=0; i--)
     {
      if(fx1[i]>fx1[i+1]) fs=1;
      if(fx1[i]<fx1[i+1]) {if(fs==1) fx2[i+1]=fx1[i+1]; fs=2;}
      if(fs==2) fx2[i]=fx1[i]; else fx2[i]=0.0;

      avg=iATR(NULL,0,ATR,i+10);
      upper[i] = hp[i] + distance*avg;
      lower[i] = hp[i] - distance*avg;

      if(Close[i+1+barsig]<upper[i+1+barsig] && Close[i+barsig]>upper[i+barsig])
         dnar[i]=High[i]+arrots*Point; else dnar[i]=EMPTY_VALUE;

      if(Close[i+1+barsig]>lower[i+1+barsig] && Close[i+barsig]<lower[i+barsig])
         upar[i]=Low[i]-arrots*Point; else upar[i]=EMPTY_VALUE;
     }

Nada pende. Não deve haver nenhuma ultrapassagem das matrizes. Exceto que o valor na barra de zero não é calculado corretamente, na minha opinião.

 
Ihor Herasko:

Contei quatro:

Nada pende. Não deve haver nenhuma ultrapassagem fora das matrizes. Exceto que eu acho que o valor na barra zero não é calculado corretamente.

Obrigado, está tudo bem. Não preciso dela na barra zero. Quero obtê-la na primeira barra, mas as posições são abertas caóticamente.

sell_1_B=NormalizeDouble(iCustom(Symbol(),0,"HiLo",1,1),Digits);
sell_1_1_B=NormalizeDouble(iCustom(Symbol(),0,"HiLo",1,2),Digits);

if(sell_1_1_B==0.0&&sell_1_B!=0.0)
{открываю sell}
if(sell_1_1_B!=0.0&&sell_1_B==0.0)
{открываю buy}

Por quê?

 
Ihor Herasko:

No testador, sobre a visualização está este

ooppe

a primeira dobra, o início do teste, o indicador que tem um erro, constrói uma linha reta quando eu a atiro no gráfico após o início do teste

nós quebramos algo)

 

Você pode me dizer como colocar uma "seleção"de uma ferramenta gráfica no botão do Expert Advisor, para que, clicando no botão, o ícone da ferramenta apareça sob o cursor e seja possível esticá-lo?

E já deve ter as propriedades especificadas

 
PolarSeaman:

No testador, sobre a visualização está este

a primeira dobra, o início do teste, o indicador que tem um erro, constrói uma linha reta quando eu a atiro no gráfico após o início do teste

nós quebramos algo)

Certo, é um indicador de redesenho que recalcula todo o histórico para um número especificado de barras em cada carrapato. Solução muito ruim. Então você tem que fazer desta maneira:

   int i;

   SetIndexDrawBegin(0,Bars-cb);
   SetIndexDrawBegin(1,Bars-cb);

   double avg;

   ki=2.0/(p+1);

   int total;
   int limit = GetRecalcIndex(total,rates_total,prev_calculated);

   for(i=total; i>=0; i--) 
      fx1[i]=Close[i];

   for(int m=0; m<=s; m++)
     {
      z1=fx1[0];
      for(i=0; i<=total; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

      z2=fx1[total];
      for(i=total; i>=0; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/2;}
     }

   fs=0;
   for(i=total; i>=0; i--)
     {
      if(fx1[i]>fx1[i+1]) fs=1;
      if(fx1[i]<fx1[i+1]) {if(fs==1) fx2[i+1]=fx1[i+1]; fs=2;}
      if(fs==2) fx2[i]=fx1[i]; else fx2[i]=0.0;

      avg=iATR(NULL,0,ATR,i+10);
      upper[i] = hp[i] + distance*avg;
      lower[i] = hp[i] - distance*avg;

      if(Close[i+1+barsig]<upper[i+1+barsig] && Close[i+barsig]>upper[i+barsig])
         dnar[i]=High[i]+arrots*Point; else dnar[i]=EMPTY_VALUE;

      if(Close[i+1+barsig]>lower[i+1+barsig] && Close[i+barsig]<lower[i+barsig])
         upar[i]=Low[i]-arrots*Point; else upar[i]=EMPTY_VALUE;
     }

Desagradável, é claro, mas funciona.

 
por que esta construção não funciona em declarações variáveis?
int K=20;
int TIKET[K];
 
igrok333:
por que esta construção não funciona em declaração variável?

Porque K é uma variável. Seu valor no momento da compilação é desconhecido. Para que funcione, temos que fazer de K uma constante:

#define  K 20
int TIKET[K];
 
Ihor Herasko:

Certo, porque é um indicador de redesenho que recalcula todo o histórico para um número especificado de barras a cada tick. Esta é uma solução muito ruim. Então você tem que fazer desta maneira:

Desagradável, é claro, mas funciona.

Obrigado. Eu passei tanto tempo com você e ainda assim, ainda tira 20(!) barras, talvez até mais.

Devemos criar uma petição?

Tenha uma leique proíba a distribuição de indicadores que tracem novamente mais de três barras!

Para sermos considerados pelo Parlamento, precisamos coletar um total de 100k assinaturas em um ano.

 
PolarSeaman:

Obrigado. Todo o tempo que perdemos e ele está desenhando 20(!) barras, talvez mais, eu não procurei mais.

Definindo um valor menor de cb, haverá menos barras que serão redesenhadas.

Devemos criar uma petição?

Tenha uma leique proíba a distribuição de indicadores que tracem novamente mais de três barras!

Serão necessárias apenas 100.000 assinaturas em um ano para serem consideradas pela Assembléia.

)))

 

Você pode me dizer como excluir/adicionar uma data específica para a EA?

Por exemplo, não comercializar em 2 de março de 2018. Tentei diferentes opções, me confundi com as datas.

TimeDayOfYear (TimeCurrent()) != StrToTime("2018.03.02")