Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 902

 

1.eu tenho tal pergunta, como posso apagar um elemento de um array através da memória, no momento eu apago um elemento movendo o array matematicamente através de um loop, é isso possível em mql4? Se for possível, dê um exemplo de como isso é feito em uma matriz unidimensional.

2. além disso, qual seria a forma mais eficiente, levando em conta: se eu apagar via memória, cortar um segmento com elementos desnecessários, o array será reduzido e seu número diminuirá pelo valor dos itens apagados, e no uso seguinte do array, teremos que restaurar o array ao seu estado original; se eu apagar via um método matemático, o processamento do ciclo, que envolve cálculos constantes para atribuir valores às variáveis, o que por sua vez afeta o programa?

 
Seric29:

1.eu tenho tal pergunta, como posso apagar um elemento de um array através da memória, no momento eu apago um elemento movendo o array matematicamente através de um loop, é isso possível em mql4? Se for possível, dê um exemplo de como isso é feito em uma matriz unidimensional.

2. além disso, qual será a maneira mais eficiente, levando em conta que se você apagar via memória, cortar um array com elementos desnecessários, o array irá reduzir e seu número irá diminuir pelo valor dos itens apagados, e no uso seguinte de um array, teremos que restaurar o array ao seu estado original; se você apagar via um método matemático, o processamento do ciclo, que envolve cálculos constantes para atribuir valores a variáveis, o que por sua vez afeta o programa?

Basta copiar a matriz "em si mesma" e reduzir o tamanho da matriz pelo número de elementos de que não precisa.

Para inserir um único elemento, basta aumentar o tamanho, copiar novamente "para si mesmo" e colar o valor desejado no espaço livre.

 
Alexey Viktorov:

Basta copiar a matriz "em si mesma" e reduzir o tamanho da matriz pelo número de elementos desnecessários.

Para inserir um único elemento, basta aumentar o tamanho, copiar novamente "para si mesmo" e colar o valor desejado no espaço livre.

Eu tentei inserir uma matriz tridimensional na função de cópia, não há erros, de modo que esta função pode funcionar com matrizes de diferentes dimensões ou simplesmente tem duplicatas para diferentes dimensões. Como acontece, esta função pode ser usada em vez de uma função de turno, sem necessidade de escrever a sua própria, gostaria de ter pensado nisso antes, como é arriscado copiar um array para si mesmo, está escrito que o resultado pode não ser definido.

 
Seric29:

Tentei inserir uma matriz tridimensional na função de cópia, sem erros, para que esta função possa funcionar com matrizes de diferentes dimensões ou simplesmente tenha duplicatas para diferentes dimensões. Como acontece, esta função pode ser usada em vez de uma função de turno, sem necessidade de escrever a sua própria, gostaria de ter pensado nisso antes, como é arriscado copiar um array para si mesmo, está escrito que o resultado pode não ser definido.

Ao copiar uma matriz multidimensional, você tem que considerar a dimensionalidade da segunda dimensão e das dimensões subseqüentes. Isto determina o quanto você tem que mudar ao copiar. Simplificando, como entendi em minhas experiências, todos os valores de uma matriz multidimensional estão alinhados em "uma fila" e depois alinhados novamente em "coluna por...".

Em suma, não posso recontar a teoria agora. Terei de verificá-lo novamente, se precisar usá-lo.

 
Alexey Viktorov:

Ao copiar uma matriz multidimensional, a dimensionalidade da segunda dimensão e das dimensões subseqüentes deve ser levada em consideração. Isto determina o quanto é necessário mudar ao copiar. Simplificando, como entendi em minhas experiências, todos os valores de uma matriz multidimensional estão alinhados em "uma fila" e depois alinhados novamente em "coluna por...".

Em geral, não posso recontar a teoria agora. Mais uma vez terá que ser verificado se há necessidade de utilizá-lo.

Em C++, não há diferença entre isso

   вывести в консоль massiv[0][0][0]
   или так
   вывести в консоль massiv[0]

em qualquer um destes casos, haverá uma saída. Como eles se encontram em um bloco de memória e C++ os acessa diretamente, enquanto em nossa memória de concha o acesso é fechado e não há como passar corretamente matrizes de diferentes dimensões em uma função, ou endereçá-las desta forma, a única nuança é que as matrizes multidimensionais em C++ estão dispostas em memória dinâmica, talvez até mesmo dispersa, embora ninguém tenha visto o mapa eletrônico. Então, copiar arrays multidimensionais pelo conceito em si é uma questão muito sutil ou pode não funcionar corretamente?

 
Como posso determinar programmaticamente se entrei em minha conta usando minha senha de investimento ou minha senha de negociação?
 

Tenho um código que não é executado em MQL5 no meu indicador

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

A questão é que sepreço == STO_LOWHHIGH tudo funciona corretamente, mas sepreço == STO_CLOSECLOSE a função atribui somente a variáveis estáticas

vhigh = 0; vlow = High[i];

... contornando o loop

 
Alexandr Sokolov:

Tenho um código que não é executado em MQL5 no meu indicador

A questão é que sepreço == STO_LOWHHIGH tudo funciona corretamente, mas se preço == STO_CLOSECLOSE a função atribui somente a variáveis estáticas

... contornando o loop

Algo está errado com os parênteses. Na minha opinião, eles não são de modo algum necessários aqui. Nenhuma delas é necessária.

Ou pelo menos mova os destacados antes do ponto de interrogação para a esquerda.

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

Em geral, você só precisa entender que ?: operador é equivalente a se mais

Você tem uma condição duas vezes. Uma condição como esta seria suficiente

vhigh = price == STO_LOWHIGH ? High[a] : Close[a];
vlow  = price == STO_LOWHIGH ? Low[a] : Close[a];
Ou eu não entendo onde você estava tentando chegar.
 
Alexey Viktorov:

Há algo de errado com os parênteses. Na minha opinião, eles não são de todo necessários aqui. Nenhum deles é.

Ou pelo menos mova os destacados para a esquerda antes do ponto de interrogação.

Em geral, você só precisa entender que ?: operador é equivalente a se mais

Você tem uma condição duas vezes. Tal condição seria suficiente.

Ou eu não entendo onde você estava tentando chegar.

Quero obter estocásticos normais maxHigh e minLow dentro do período K por Low/High e Close/Close

Baixa/alta durante a inicialização funciona bem, mas fechar/fechar não

 
Alexey Viktorov:

Há algo de errado com os parênteses. Na minha opinião, eles não são de todo necessários aqui. Nenhum deles é.

Ou pelo menos mova os destacados para a esquerda antes do ponto de interrogação.

Em geral, você só precisa entender que ?: operador é equivalente a se mais

Você tem uma condição duas vezes. Tal condição é suficiente.

Ou eu não entendo onde você estava tentando chegar.

Eu não entendi imediatamente, mas se você está falando sério.

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH) ? High[a] : Close[a] > vhigh ? (price == STO_LOWHIGH) ? High[a] : Close[a] : vhigh);
      vlow  = ((price == STO_LOWHIGH) ? Low[a] : Close[a] < vlow ? (price == STO_LOWHIGH) ? Low[a] : Close[a] : vlow);
     };
  }

não resolve meu problema.