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 263
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
int Mas[];
então preencha o laço, se necessário, use
ArrayResize(Mas,tamanho);
ArrayInitialize(Mas,0);
Se não for muito incômodo, um pequeno exemplo, por favor...
"then loop fill"
Se não for muito incômodo, um pequeno exemplo, posso?
Foi-lhe dito que para preencher uma matriz dinâmica MACDBuffer[], você deve torná-la estática com ArrayResize() (caso contrário, o resultado da atribuição será sempre zeros),
e, para garantir a estabilidade na adequação dos cálculos, é melhor inicializar a matriz com o ArrayInitialize().
Foi-lhe dito que para preencher uma matriz dinâmica MACDBuffer[], você deve torná-la estática com ArrayResize() (caso contrário ela sempre retornará zeros como resultado da atribuição),
e ainda, para garantir a estabilidade na adequação dos cálculos, é melhor inicializar a matriz com o ArrayInitialize().
Obrigado!
A questão é que existe um Expert Advisor que trabalha.
int CD=0; // número de ordem de um comércio fechado
duplo Saldo=0; // resultado de um comércio fechado
duplo Mas[]; // conjunto de valores para os resultados de um comércio fechado
Como preencher a Mas[] com resultados de transações fechadas em int Start()?
Talvez algo precise ser escrito em init() e deinit()? Um inicializador ou algo mais?
Como seria o código correto?
A essência da questão é que existe um Expert Advisor em funcionamento.
int CD=0; // número sequencial de um comércio fechado
duplo Saldo=0; // resultado de um comércio fechado
duplo Mas[]; // conjunto de valores para os resultados de um comércio fechado
Como em int Start() preencher o Mas[] com resultados de negócios fechados?
Talvez eu precise acrescentar algo init() e deinit()? Um inicializador ou algo mais?
Como seria o código correto?
Todos têm uma noção diferente de "certo".
Talvez você queira Mas[CD]=Balanço na inicialização e atribuição ao Mas[CD]=Balanço no início quando você mudar o valor do CD?
Ou talvez você queira ter uma matriz bidimensional onde todos os dados necessários (balanço, tempo, pontos, max.equities, min.equities ....) seriam armazenados para cada negócio.
Foi-lhe dito que para preencher uma matriz dinâmica MACDBuffer[], você deve torná-la estática com ArrayResize() (caso contrário, o resultado da atribuição será sempre zeros),
e ainda, para assegurar a estabilidade da adequação dos cálculos, é melhor inicializar a matriz com o ArrayInitialize().
ArrayResize() muda o tamanho da matriz. Em mql4 todas as matrizes são estáticas por padrão.
Eu estava errado. O tutorial o confirma:
Se o tamanho de uma matriz unidimensional a ser inicializada não for especificado, ele é determinado pelo compilador, com base no tamanho da seqüência inicializadora. A inicialização do ArrayInitialize() também pode ser feita usando a função ArrayInitialize() padrão. Todas as matrizes são estáticas, ou seja, têm uma forma estática, mesmo que não especificada explicitamente durante a inicialização. Isso significa que todos os elementos da matriz mantêm seus valores no intervalo entre chamadas da função, no qual a matriz é declarada.
Mas por que então uma matriz tão "estática" não atribui valores? O resultado é nulo como esperado por causa do ArrayResize(buffer,0) do compilador?
Eu estava errado. O livro-texto o confirma:
Mas então porque é que uma matriz tão "estática" não atribui valores ??? O resultado é nulo como esperado por causa do ArrayResize(buffer,0) do compilador?
Porque a matriz é dinâmica. Seu tamanho na primeira dimensão pode ser visto com ArraySize() - para uma matriz unidimensional, e ArrayRange() - para uma dimensão específica de uma matriz multidimensional.
Estático não significa "tamanho padrão". Não confunda os dois conceitos "estático" e "dinâmico". Eles não são antônimos. Eles são de diferentes campos de aplicação aqui. Analogia: Uma matriz estática é uma "variável estática". Uma matriz dinâmica é "um tamanho que é programmaticamente definido e alterado".
Obrigado!
A questão é que existe um Expert Advisor que trabalha.
int CD=0; // número ordinal de um comércio fechado
duplo Saldo=0; // resultado de um comércio fechado
duplo Mas[]; // conjunto de valores de resultados de comércio fechado
Como preencher a Mas[] com resultados de transações fechadas em int Start()?
Talvez algo precise ser escrito em init() e deinit()? Um inicializador ou algo mais?
Como seria o código correto?
Eu estava errado. O livro-texto o confirma:
Mas então porque é que uma matriz tão "estática" não atribui valores ??? O resultado é nulo como esperado por causa do ArrayResize(buffer,0) do compilador?
Porque não é uma matriz, para ser preciso. Se você quiser mais detalhes - veja a descrição da linguagem C. Estou me referindo a ela porque desde o início os desenvolvedores disseram que o que não está claro ou está explicado de forma incompleta - veja o padrão C.
Quando você declara a variável buffer duplo[]; então a memória é alocada para uma variável, que em termos C é chamada de "ponteiro", tem tipo inteiro e armazena o endereço da célula de memória onde a matriz começa. Se você verificar a dimensionalidade da variável no MCL, você obtém o valor 0. Isto significa que a matriz em si não tem memória alocada e quando você tenta atribuir um valor, não há onde escrevê-lo: no MCL não há aritmética de endereço e os ponteiros não podem ser manipulados. Em C você pode escrevê-lo, mas com a memória "não alocada" geralmente leva a um colapso do sistema. Quando você aplica AreiResize(array,N), (N>0), isto aloca memória para o array (pelo menos um elemento) e cria espaço para escrever valores. Então, quando verificado, a dimensão da matriz será diferente de 0.
O conceito de matriz estática em termos de C tem vários significados:
1. uma matriz estática (assim como uma variável/tipo estática) são essas variáveis/arrays cuja dimensionalidade é conhecida na fase de compilação (pré-compilação para MKL4) . Por exemplo, quando o buff duplo[10000]; é descrito, o compilador é informado do tamanho da variável e pode imediatamente alocar memória. Em contraste com este conceito, existe o conceito de uma "matriz dinâmica", ou seja, uma matriz cujo tamanho é desconhecido em tempo de compilação e se torna conhecida apenas em tempo de execução; todas estas são matrizes de tamanho variável. Ao acessar tais arrays, a memória deve ser alocada com antecedência. A memória é alocada fora da memória estática do programa.
Em C/C++, se um array é descrito em um bloco, sua visibilidade é limitada pelo bloco - seja ele um array estático ou um array dinâmico. Erros em programas como "vazamentos de memória" estão associados a matrizes dinâmicas definidas localmente, ou seja, quando um ponteiro de memória é destruído porque deixa a área de visibilidade, mas a memória alocada a ele permanece ocupada.
2 O conceito de matriz "estática" como uma variável descrita com modificador estático - tais variáveis não são destruídas ao sair do escopo do bloco - elas estão localizadas em uma área de memória separada - daí os valores nelas contidos serem preservados. O risco de vazamentos de memória é reduzido. Um array declarado como dinâmico no sentido da p.1 (ou seja, o tamanho do array não é conhecido no estágio de compilação), também pode ser estático no sentido da p.2, ou seja, declarado com o modificador "estático".
Ao encerrar programas, a memória dinamicamente alocada deve ser liberada para evitar vazamentos de memória. Não sei se os desenvolvedores da MKL seguem isto, mas em meus programas eu sempre libero a memória - hábito da C - ArreyResize(array,0);
Na MKL todas as matrizes são estáticas no sentido do ponto 2.
Agora em relação à sua pergunta: "Por que uma matriz estáticanão pode ser duplamente tampão[]; ser atribuído valores? ".Porque nenhuma memória é alocada para ela (na verdade, é uma matriz dinâmica com um modificador estático). Antes de atribuir valores, a memória deve ser alocada, ou seja, o ArrayResize com tamanho maior que 0 deve ser aplicado a esta matriz. Para arrays, você precisa controlar a sobrecarga de memória (fora da matriz).
SZ Espero ter me feito entender. Tentei mantê-lo o mais simples possível.