Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 600

 

Saudações! :)

Eu tenho aproximadamente o mesmo código que este indicador:

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

Eu o deixo cair na tabela M1. O indicador fica pendurado junto com o terminal, supostamente realizando cálculos.
Eu o fecho à força em 15 minutos e abro seu diário de bordo:

Pic1

Acontece que o indicador não reage a carrapatos recém-chegados (é lógico) até calcular a primeira vez. Mas esquece de dizer ao terminal durante a avaliação que o IndicatorConted() já deve ter um valor diferente de 0.
Então, acontece que os tiquetaques recebidos para avaliação lembram o valor atual do IndicatorCounted()?

Tentei controlá-la através de variável ocupada (comentei string - mesmo resultado).

Eu também tentei desta maneira:

int start()
{
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   return(0);
   .
   .
   .
}

Naturalmente, desta vez tudo funcionou corretamente:

Pic2

O que temos aqui? O sistema não tem tempo para escrever um novo valor no IndicatorCounted()? Em outras palavras, eu preciso fazer algo como dormir()? Eu sei que isso não é possível no indicador)
Ou, quando um novo tick chega, porque o tick antigo não terminou seus cálculos, ele se lembra que IndicatorCounte() ainda é igual a zero e quando chega sua hora, ele começa a calcular a partir do valor antigo IndicatourCounted()=0?

O que fazer? )

 
Expert:

Saudações! :)

Tenho aproximadamente o mesmo código que o indicador:


Diz tudo. A respeito deste código, a respeito desta resposta...para escrever?
 
peace1984:
Esta é minha primeira experiência, não julgue de forma muito dura:)
Para ser honesto, parece-me que o testador se lembra do valor passado da variável - desde o último teste. Como - eu não sei, não tenho muito tempo para depuração. Talvez seja um bug terminal. Acabei de colocar um comentário no código e enviar os valores para o log. Então acontece que cada vez que executo um novo teste, o valor do teste anterior é armazenado na variável do sistema. Que bagunça. Talvez outra pessoa veja, talvez meu olho esteja molhado...
Arquivos anexados:
11_1.mq4  8 kb
 
AlexeyVik:
Isto diz tudo. A aproximadamente este código, aproximadamente esta resposta...escrever?


A questão é que o resto do código é irrelevante. A essência do erro está descrita nesta peça.
Geralmente eu tinha medo de afugentar as pessoas com um grande posto. Então eu o inchei.

Em resumo, ele pode ser formulado da seguinte forma: se um indicador é calculado por um longo tempo (mais de um minuto), IndicatorCounted() sempre retorna 0.

 
artmedia70:
Para ser honesto, parece-me que o testador se lembra do valor passado da variável - desde o último teste. Como - não sei, não há muito tempo para fazer o balanço. Talvez um bug no terminal. Acabei de colocar um comentário no código e enviar os valores para o log. Então acontece que cada vez que executo um novo teste, o valor do teste anterior é armazenado na variável do sistema. Que bagunça. Talvez outra pessoa veja, talvez meu olho esteja molhado...

É que você esqueceu que a linha

int       sys=(Sys<0)?0:Sys;

Quando as propriedades do indicador forem lembradas, elas não serão executadas.

Eu não investiguei a fundo, mas talvez isto alcance o resultado desejado?

extern int Sys=0;
int       sys;    // изменено
double    opb;
double    ops;
double    cb;
double    cs;
double    lot;
double    next_order;
int       i=0;
int       x;
double    max;
double    min;
int       ticket;
int       tip;
int       count;
bool      res;
double    bal;
double    sl;
datetime  d;
double    N;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   sys=(Sys<0)?0:Sys;  // добавлено
   bal=AccountBalance();
   return(0);
  }
 
AlexeyVik:

Você acabou de esquecer que o fio

as propriedades indicadoras não serão executadas quando as propriedades forem lembradas.

Eu não investiguei a fundo, mas talvez isto alcance o resultado desejado?



Geralmente um conselheiro. Mas HZ, não há tempo para experimentar. Tenho todos os EAs trabalhando da maneira como escrevi. Eu terei que rastrear esta merda no testador. Quando eu tiver tempo suficiente.
 
Expert:


A questão é que o resto do código é irrelevante. A essência do erro está descrita nesta peça.
Geralmente eu tinha medo de afugentar as pessoas com um grande posto. Então eu o inchei.

Em resumo, ele pode ser formulado da seguinte forma: Se um indicador é calculado por um longo tempo (mais de um minuto), IndicatorCounted() sempre retorna 0.


Não é essa a questão. Ninguém precisa de seu código secreto completo. Basta escrever uma peça completa de código de teste com esse mal-entendido. E desta forma.

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

quando você limpou a linha destacada? Os telepatas não vão ajudar, os meros mortais ainda menos...

Depois há esta parte.

   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;

Não sei de qual programador ele veio, mas há algo inadequadamente escrito. Não é culpa sua. Você, como muitos outros, pegou o código e tentou consertá-lo...

Se a variável counted_bars for igual ao número de barras que permanecem inalteradas desde a última chamada do indicador (a primeira linha)

Como pode tornar-se menos do que zero que é verificado se(counted_bars < 0) eu nunca serei capaz de entender...

O resto também é um disparate, mas sou preguiçoso demais para analisá-lo...

 
AlexeyVik:

Você acabou de esquecer que o fio

Quando as propriedades do indicador forem lembradas, elas não serão executadas.

Eu não investiguei a fundo, mas talvez isto alcance o resultado desejado?




Eu tentei isso... não funciona...
 
artmedia70:
Geralmente um conselheiro. Mas HZ, não há tempo para experimentar. Tenho todos os EAs trabalhando da maneira como escrevi. Eu terei que rastrear esta merda no testador. Quando eu tiver tempo suficiente.

Bem, sim, claro, o Consultor Especialista. Então surge outra pergunta: por que a EA foi colocada no gráfico como um indicador de porão? Mas não muda a questão, ao reiniciar tanto o indicador quanto o EA, as variáveis de nível global não são reinicializadas e a linha int sys=(Sys<0)?0:Sys; não é executada.
 
peace1984:

Eu tentei isso... não funciona...
Provavelmente não foi exatamente assim que eu tentei.
Acabei de recompilar o código na EA e o executei. Quando altero o parâmetro Sys no comentário, este valor muda.