Erros, bugs, perguntas - página 1525

 
Yuri Evseenkov:

MT4. Mais uma vez, gostaria de chamar a vossa atenção para as peculiaridades da inicialização das variáveis globais do programa.

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Insectos, insectos, perguntas

Slawa, 2016.02.24 07:34

Fila de espera. O pedido tem apenas duas horas.

Em geral, tais questões devem ser colocadas no fórum. Porque muitos podem ser afectados. Tomarei a liberdade de o citar e responder imediatamente

Este é um comportamento planeado. Na realidade, está explicitamente descrito na documentação

O upload e o download envolvem uma reinicialização completa de tudo.

Em cinco, como notou correctamente, a situação é semelhante.

É verdade, foi historicamente em quatro, e mudámos este comportamento no início quando mudámos para a nova MQL4 (para que se comportasse como nos peritos, ou seja, como se espera). Mas muitas questões surgiram com os antigos indicadores, que se baseavam nesta inicialização. Fomos forçados a regressar

Nos cinco, este foi o caso imediatamente devido à arquitectura. Quando se alteram os parâmetros, o indicador antigo com os parâmetros antigos é destruído e é criado um novo indicador com parâmetros alterados.


 
Alexey Kozitsyn:

Obrigado. Conclusão - uma citação da documentação: "... função pré-definida OnInit(), cujo objectivo é a inicialização correcta de todas as variáveis globais e estáticas do programa".

Portanto, zero ou por defeito todas as variáveis ou matrizes globais para oOnInit().

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
События клиентского терминала - Программы MQL4 - Справочник MQL4
 

1. Eu crio um conjunto da forma:

CArrayString list[5];

2. Tento chamar a lista de métodos através de <Ctrl+Space>.

list[0].
A lista de métodos não aparece. É suposto ser assim?
 
Andrey Voytenko:

1. Eu crio um conjunto da forma:

2. Tento chamar a lista de métodos no código através de <Ctrl+Space>.

A lista de métodos não aparece. É suposto ser assim?

Deixe-me tentar fazer um palpite. Se houver outros erros no código para além do facto de o método/membro não estar especificado, a lista nem sempre aparecerá.

Experimentei-o. Não, pressuposto errado. Mas algumas prensas repetidas da combinação ajudaram.

 

Alexey Kozitsyn:

Mas algumas prensas repetidas da combinação ajudaram.

Infelizmente, a sua receita não funciona para mim.
 
Andrey Voytenko:
Infelizmente a sua receita não funciona para mim.
Não, isso mesmo, se houver um erro no código, a lista de membros/métodos abertos não aparece. Mas se não houver erro... depois problemas.
 

1. Código simples:

uint a=50;
int b=-20;
Print(fmax(a,b));

resultado: 50

2. Adicionando entrada de modificadores:

input uint  a=50;
int b=-20;
Print(fmax(a,b));

resultado: 4294967276

Esperava-se um resultado de 50. Onde é que estou errado?

 
Andrey Voytenko:

1. Código simples:

resultado: 50

2. Adicionamos um modificador de entrada:

resultado: 4294967276

Estava à espera de um resultado de 50. Onde é que estou errado?

fmax compara dois números duplos. Por isso, é assim:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.01"
#property script_show_inputs
//---
input uint a=50;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//uint a=50;
   int b=-20;
   Print("\"uint a=50\" as double:",DoubleToString((double)a,8));
   Print("\"int b=-20\" as double:",DoubleToString((double)b,8));
   Print(DoubleToString(fmax((double)b,(double)a),8));
  }
//+------------------------------------------------------------------+

e o resultado:

2016.03.03 16:00:24.821 Test (EURUSD,D1)        "uint a=50" as double:50.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        "int b=-20" as double:-20.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        50.00000000
Arquivos anexados:
Test.mq5  2 kb
 
Karputov Vladimir:

fmax compara dois números duplos. Por isso, é assim:

Na MQL, é declarada e realizada uma conversão de tipo implícito. Em particular uint -> duplo.

A questão é porque é que não funciona correctamente com variáveis de entrada.

 
Andrey Voytenko:

1. Código simples:

resultado: 50

2. Acrescentar o modificador de entrada:

resultado: 4294967276.

Estava à espera de um resultado de 50. Onde é que estou errado?

Por favor, dê-me o código completo.

Existem 2 possibilidades aqui e ambas estão erradas.

1. O código é executado fora de qualquer função.

2. A variável de entrada é declarada dentro da função