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

 
evillive:

int Mas[];


então preencha o laço, se necessário, use

ArrayResize(Mas,tamanho);

ArrayInitialize(Mas,0);

"então preencha o ciclo".
Se não for muito incômodo, um pequeno exemplo, por favor...
 
Leo59:
"then loop fill"
Se não for muito incômodo, um pequeno exemplo, posso?


 double MACDBuffer[]; int x=20;       // если известен размер буфера то              
 ArrayResize( MACDBuffer,x);         // то можно и просто  MACDBuffer[20], но  MACDBuffer[] нельзя.
 double min,max;
 int start(){
    for(int i=0; i<20; i++)
      MACDBuffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
    min=ArrayMinimum(MACDBuffer);
    max=ArrayMaximum(MACDBuffer);
    Print(min,"____",max);
 }

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().

 
ALXIMIKS:


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?

 
Leo59:
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.

 
ALXIMIKS:


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.
 
artmedia70:
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?

int start(){
   double buffer[];
   for(int i=10;i>=0;i--){
      buffer[i]=i;
      Print ("buffer[i]=",buffer[i]);
   }
}
 
ALXIMIKS:

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".

int start(){
   double buffer[];
   for(int i=0;i<10;i++){
      ArrayResize(buffer,i+1);
      buffer[i]=i;
      Print ("Размер массива = "+(string)ArraySize(buffer)+", Значение в buffer["+(string)i+"] = ",buffer[i]);
   }
   return(0);
}
 
Leo59:

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?

Todos os resultados de negócios fechados podem ser visualizados no histórico da conta. Por software. Mas é necessário encher a matriz com eles o tempo todo? Pode haver muitos deles. É melhor limitar a profundidade necessária da história e preencher a matriz, se você realmente não pode viver sem ela.
 
Gente, alguém sabe como adicionar níveis auxiliares ao RSI no andróide?
 
ALXIMIKS:

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.