Erros, bugs, perguntas - página 1782

 
-Aleks-:

Quais funcionam?

A regra da perda de dígitos significativos e do seu preenchimento com trabalhos aleatórios

O resultado é longo, mas nos cálculos intermédios do dobro e é aí que se perdem dígitos significativos

(Dígitos+1)*3-1=17

 
A100:

A regra da perda de dígitos significativos e do seu preenchimento com trabalhos aleatórios

O resultado é longo, mas nos cálculos intermédios do dobro e é aí que se perdem dígitos significativos

(Dígitos+1)*3-1=17

Obrigado pela informação.

Contudo, a informação é difícil de apreender - ou seja, o número pode ser assim, mas não se pode fazer cálculos com ela?

Aqui está um exemplo de código onde é convertido de string para número

long CalcY=StringToDouble("111111111111111111");
Print ("CalcY=",CalcY);

Imprime o número 11111111111111111104.

Isto é, não há aqui cálculos ou estou errado?

É possível lidar com estes números ou estas são limitações linguísticas?

 
-Aleks-:

Então não há cálculos aqui, ou estou errado?

Um cálculo é qualquer operação (nestecaso, uma conversão). Para o número especificado StringToDouble devolve o dobro com perda de precisão

StringToInteger retorna longo, mas outras funções que funcionam com o dobro não podem ser utilizadas nos cálculos sem perda de precisão, tais como NormalizeDouble, MathPow

 
A100:

Computação - qualquer operação (neste caso, uma conversão). StringToDouble devolve o dobro - há uma perda de precisão

StringToInteger retorna longo, mas outras funções que funcionam com o dobro não podem ser utilizadas nos cálculos sem perda de precisão, tais como NormalizeDouble, MathPow,

StringToInteger trabalhou para expressar o número, mas depois fica pior, acho que o número deve ser decomposto nos seus componentes para operações matemáticas...

long CalcZ=StringToInteger("111111111111111111");
Print ("CalcZ=",CalcZ);

double Test=CalcZ;
Print ("Test=",Test);

Test=1.111111111111111e+17

 

Mais uma vez, está escrito no helpdesk

INT_MAX

Valor máximo que pode ser representado por tipo int

2147483647

Então como é que o StringToInteger realizou a conversão e armazenou-a por muito tempo se o número é maior do que o permitido?

 
-Aleks-:

Então como é que o StringToInteger converteu e armazenou para longo se o número é maior do que o permitido?

StringToInteger retorna originalmente longo dentro deLONG_MINLONG_MAX(também pode ser chamado StringToColobok)

 
A100:
StringToInteger retorna originalmente longo (poderia muito bem ter sido chamado StringToBoob)

Isto é certamente verdade, mas o ficheiro da Ajuda é tão inteligente.

"

Converte uma cadeia contendo uma representação de caracteres de um número para um número int(inteiro).

"

Foi isso que me enganou.

Obrigado pela informação.

Presumo que a representação numérica acima não caberá no buffer gráfico?

 
-Aleks-:

Presumo que o número acima não caberá no buffer gráfico?

Estão escritos como B'111111111111111111111111111111111111'.

 
A100:

Afirmo (e proponho-me verificar) que quando o cronograma é alterado de M5 para M15 nenhum comando M5 Deinit é enviado para o primeiro indicador (e apenas para ele - neste caso M5) e não será descarregado do gráfico até que o utilizador apague a EA

A glória está certa e o descarregamento funciona correctamente.

Note que em MT5, o núcleo de cálculo do indicador é um recurso partilhado com um contador de utilização no seu próprio gestor. Se diferentes programas ou janelas utilizarem o indicador com os mesmos parâmetros, uma cópia de cálculo com o contador de utilização funciona de facto. Isto poupa muito dinheiro quando um comerciante utiliza os mesmos indicadores nos gráficos e num Expert Advisor.

O gestor de indicadores é concebido de modo a remover fisicamente os indicadores de forma assíncrona e com um atraso. E entretanto, é criada uma nova cópia de trabalho com novos parâmetros, que é muitas vezes inicializada antes da antiga cópia ser fisicamente apagada.
 
Renat Fatkhullin:
O gestor de indicadores é concebido de modo a remover fisicamente os indicadores de forma assíncrona e com um atraso. E entretanto é criada uma nova cópia de trabalho com novos parâmetros, que é muitas vezes rubricada antes de a antiga cópia ser fisicamente apagada.

Vamos simplificar o indicador

//Test_i.mq5 //Индикатор
void Prn( string f, int i = -1 ) { Print( f, "->", StringSubstr( EnumToString( Period()), 7 ), (i == -1 ? "" : ":" + i )); }
void OnInit()                    { Prn( __FUNCTION__ );         }
void OnDeinit( const int reason ) { Prn( __FUNCTION__, reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }

Vamos anexar o Test.mq5 ao gráfico M5 e depois alterar o período do gráfico de M5->M15

Resultado:

2017.02.06 00:54:20.897 OnInit->M5
2017.02.06 00:54:25.553 OnInit->M15

Pergunta: Quando é que o OnDeinit->M5 será chamado ?

A minha resposta: Nunca!

A sua resposta acima: de forma assíncrona e com um atraso

Arquivos anexados:
Test.mq5  1 kb