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

 
Alexey Viktorov:

As funções IntegerToString() e DoubleToString() representam apenas o número como uma string que é passada para a função. No exemplo

é a conversão de r em uma corda e as cordas são "adicionadas". Mas antes disso, o valor do r muda.

Não entendo bem a pergunta, mas se você precisa selecionar apenas elementos de numeração par da matriz, o laço deve ser construído desta forma


Obrigado pela explicação.

 
Alexey Viktorov:

As funções IntegerToString() e DoubleToString() representam apenas o número como uma string que é passada para a função. No exemplo

é a conversão de r em uma corda e as cordas são "adicionadas". Mas antes disso, o valor do r muda.



Não consigo entender o processo de "adição" de valores de variáveis de string. Vejo 2 variantes de "adicionar" cordas em meu código.

1. Eles somam o valor da variável string da iteração atual com o valor da mesma variável string da iteração anterior.

2. Na iteração atual, os valores das duas variáveis de termo são adicionados, ou seja, IntegerToString(r) + DoubleToString(LoY[r],4).

Parece-me que você quer dizer a primeira variante.

Mas então .... O valor de IntegerToString(r) sobre a iteração anterior = "0". e sobre a iteração atual = "1" . O resultado da adição deve ser "01".

Se na iteração atual antes de somar o valor IntegerToString(r) mudar do 0 anterior para o 1 atual, ainda teremos uma representação em cadeia de dois dígitos do número, i.e. "11".

Se usarmos o mesmo algoritmo para adicionar os valores da variável string DoubleToString(LoY[r],4), então o resultado da adição de duas strings deve ser valores como 1.61041.6105

Mas Print() imprime os resultados da adição como outros números (como deveriam ser)
Eu não entendo isso.
Aqui está seu exemplo de como os valores das variáveis de strings são somados "...... e se você somar stringsDoubleToString(2.3, 1)+DoubleToString(3.6, 1), será 2.33.6 como um fio". Ou seja, antes da adição, a representação em cadeia do número de cada variável era de 2 caracteres, mas após a adição de duas variáveis em cadeia, o resultado da adição é uma representação em cadeia do número de 4 caracteres. Por que a adição em seu código não resulta em um número com o dobro do número de caracteres?

 
Alexey Viktorov:


Eu não entendo bem a pergunta, mas se você quiser selecionar apenas elementos de uma matriz com números pares, então o laço deve ser construído assim


Na verdade, isto é o que eu quis dizer com.... Aqui está o código original preenchido com a CAIXA 2

int P1=0;
double LoY[31];
void OnTick()
{
if (P1==0)
{
for(int r=0; r<31;r++)
{
LoY[r]=1.6104+(r*2)*0.0001;
Print("-------------------------------------LoY[r]--------------=",  LoY[r]);
P1=1;
}
}
//*************************************************************  Б Л О К    N 2
for(int x=0; x<31;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("---LoY[0]--",  X, "---LoY[1]--" ,  X,   "---LoY[2]--" ,  X,  "---LoY[3]--" ,  X,  "---LoY[4]--" ,  X, ................  "---LoY[30]--" ,  X );
}
}
}

No segundo bloco, os valores dos elementos da matriz não diferem mais pelo mesmo delta que no primeiro bloco. O delta entre os elementos adjacentes pode ser diferente e, portanto, o algoritmo de conexão de cordas do primeiro bloco não é adequado para o segundo bloco.... me parece.

PERGUNTA Com que linguagem MQL4 constrói ou funciona no segundo bloco do código acima, a função Print(), no final do loop, imprimiráapenas uma vez, com todos os valores dos elementos do array preenchidos, dispostos em uma linha, ou seja, terá a seguinte forma

Imprimir("---LoY[0]--" , X,"---LoY[1]--", X,"---LoY[2]--" X,"---LoY[3]--", X,"---LoY[4]--", X................"---LoY[30]--", X );

Não me julgue duramente, mas não tenho certeza se consigo entender a explicação em palavras, porque o segundo bloco é muito mais complicado do que o primeiro.... que me parece.
Obrigado por sua ajuda.

 

Ao programar, há muito trabalho de rotina, pelo menos no início. Você pensa através da idéia, depois escreve o código, e depois o depura. Às vezes, o tempo de depuração leva mais tempo do que tudo o resto.

Acontece com freqüência que a idéia inicial não funciona. Você começa a olhar de cima para baixo, em ordem do que está errado.

Insira printf() em qualquer lugar, e veja se é isto que você espera ou não. Isto lhe dará uma compreensão mais rápida de como o código funciona e onde você tem um erro. Caso contrário, a compreensão demorará muito tempo.


Não é da minha conta, mas tente escrever de forma bonita. Escolha um estilo para você mesmo e mantenha-se fiel a ele. Coloque colchetes entre parênteses em etapas para que os anexos fiquem visíveis. Se você usar espaços entre declarações, então use-os em todos os lugares, ou, inversamente, não os use em todos os lugares.

for(int x=0; x<31;x++)

if (Bid < LoY[x] )

Então, será mais fácil para você ler seu próprio código.

-----------------

No segundo bloco:

No segundo bloco, as letras minúsculas x e maiúsculas X são variáveis diferentes, o código não funcionará da maneira que você deseja.

Seria melhor classificar a matriz fora do laço.

Em Print você usa X muitas vezes, você imprimirá o mesmo número de vezes.

-----------------

Quanto ao código. É difícil entender a pergunta, por isso vou lhe dizer o que entendi.

Se você escrever Imprimir em loop, você obterá tantas impressões quanto aquele loop iterado. Se você precisar imprimir a saída uma vez, coloque a impressão após o laço.

Neste caso, use uma variável, na qual você escreverá o valor de cada iteração, para coletar as informações. Nossa variável é uma string, portanto, todos os números devem ser convertidos em string.

Temos uma variável de string porque a função Imprimir aceita uma string.

O que está acontecendo:

Primeiro passe. Antes da primeira passagem antes do loop, temos uma variável vazia: string str="";
Em seguida, atribuímos um valor vazio à variável mais "--LoY["+IntegerToString(r)+"]--, "+DoubleToString(LoY[r],4)+",";
aqui r é 0 e realmente adicionamos algumas strings:

"--LoY["+

IntegerToString(0)+

"]--, "+

DoubleToString(LoY[0],4)+

", ";

Segundo passe.

A tudo isso acrescentamos as informações do segundo elemento

"--LoY["+IntegerToString(1)+"]--, "+DoubleToString(LoY[1],4)+", ";

Isto não muda o fio do primeiro elemento.



É melhor explicar o propósito em palavras, o que você precisa e não como o faz. Caso contrário, poderemos discutir seu código por tanto tempo e seu objetivo poderá ser resolvido de outra forma.

 
ANDREY:

Não consigo entender o processo de "somar" os valores das variáveis de cadeia. Vejo 2 opções para "adicionar" cordas em meu código.

1. O valor da variável string da iteração atual é adicionado ao valor da mesma variável string da iteração anterior.

2. Na iteração atual, os valores das duas variáveis de termo são adicionados, ou seja, IntegerToString(r) + DoubleToString(LoY[r],4).

Parece-me que você quer dizer a primeira variante.

Mas então .... O valor de IntegerToString(r) sobre a iteração anterior = "0". e sobre a iteração atual = "1" . O resultado da adição deve ser "01".

Se na iteração atual antes da adição, o valor IntegerToString(r) mudar do 0 anterior para o 1 atual, ainda teremos uma representação em cadeia de dois dígitos do número, ou seja, "11".

Se adicionarmos valores da variável string DoubleToString(LoY[r],4) pelo mesmo algoritmo , então o resultado da adição de duas strings deve ser valores como 1.61041.6105

Mas imprimir() por alguma razão imprime resultados de adição como outros números (como deveriam ser)
Eu não entendo isso.
Aqui está seu exemplo de adição de valores de variáveis de string "...... e se você adicionar stringsDoubleToString(2.3, 1)+DoubleToString(3.6, 1), será 2.33.6 como um fio". Ou seja, antes da adição, a representação em cadeia do número de cada variável era de 2 caracteres, mas após a adição de duas variáveis em cadeia, o resultado da adição é uma representação em cadeia do número de 4 caracteres. Por que a adição em seu código não resulta em um número com o dobro do número de caracteres?

Na verdade, isto é como escrever qualquer texto. Começamos com uma folha de papel em branco, ou devo dizer uma linha em branco. Depois escrevemos a primeira palavra, anexamos a segunda palavra a ela e assim por diante14 E quando vemos números no texto, os escrevemos como um símbolo de linha. Ou seja, se somarmos 2 + 5, você recebe 7, e se apenas escrevermos esses mesmos números, então primeiro escreva 2 e depois 5... então recebemos dois números 25, escritos um ao lado do outro. Não sei mais como explicar isso.

Na verdade, se você ignorar os avisos do compilador, a conversão dos valores r em um fio em sua amostra não é necessária. Aqui você pode verificar estas duas opções

Print("Test 1 " + (string)1 + (string)2);
Print("Test 2 " + 1 + 2);
 
Aleksei Stepanenko:


Obrigado por sua ajuda e conselhos.

 
Alexey Viktorov:

Na verdade, é exatamente o mesmo que escrever qualquer texto. Primeiro temos uma folha de papel em branco, ou devo dizer uma linha em branco. Depois escrevemos a primeira palavra, adicionamos a segunda palavra a ela e assim por diante14 E quando vemos números no texto, os escrevemos como um símbolo de linha. Ou seja, se somarmos 2 + 5, você recebe 7, e se apenas escrevermos esses mesmos números, então primeiro escreva 2 e depois 5... então recebemos dois números 25, escritos um ao lado do outro. Não sei mais como explicar isso.

Na verdade, se você ignorar os avisos do compilador, a conversão dos valores r em um fio em sua amostra não é necessária. Aqui você está e verifique duas dessas variantes

Obrigado por tudo

 
ANDREY:

Isto é realmente o que eu quis dizer com.... Aqui está o código original, complementado pela CAIXA 2

No segundo bloco, os valores dos elementos da matriz não diferem pelo mesmo delta que no primeiro bloco. O delta entre os elementos adjacentes pode ser diferente e, portanto, o algoritmo de conexão de cordas do primeiro bloco não é adequado para o segundo bloco.... me parece.

PERGUNTA Com que linguagem MQL4 constrói ou funciona no segundo bloco do código acima, a função Print() imprimiráapenas 1 vez após o loop estar terminado, com todos os valores dos elementos da matriz preenchidos em uma linha, ou seja, terá a seguinte forma

Imprimir("---LoY[0]--" , X,"---LoY[1]--", X,"---LoY[2]--" X,"---LoY[3]--", X,"---LoY[4]--", X................"---LoY[30]--", X );

Não me julgue duramente, mas não tenho certeza se consigo entender a explicação em palavras, porque o segundo bloco é muito mais complicado do que o primeiro.... que me parece.
Obrigado pela ajuda.

E por que classificar a matriz em cada iteração do loop? Porque se você substituiu o valor do elemento 0 do array e depois de classificá-lo foi para o final do array, então zero será o valor que foi o primeiro, e o primeiro será o valor que foi o segundo. Assim, o valor do primeiro item da matriz será ignorado e você receberá "lixo". Em suma, todo o seu código é algo fora do lugar.

Para que você precisa do primeiro bloco no qual você está preenchendo a matriz? Preencha imediatamente a matriz com os valores que você precisa e depois classifique-a. É verdade, você terá que executar mais um loop para preencher o cordel e imprimir. Eu gostaria que mql4 tivesse ArrayPrint()... Mas são apenas experimentos, e você não precisará realmente imprimir os valores da matriz.

 
Aleksei Stepanenko:

Explique melhor seu objetivo em palavras, o que você precisa, não como você o faz. Caso contrário, poderemos discutir seu código por tanto tempo, e seu objetivo poderá ser resolvido de outra forma.

Ao estudar o mql4 (e um pouco de mql5), estou escrevendo vários códigos. Isto inclui códigos que utilizam matrizes. Muitas vezes é necessário verificar os itens da matriz em algum lugar do código. Aprendi como fazê-lo usando Print() em um loop. Mas, neste caso, a impressão() é impressa a cada iteração. Quando há muitas iterações, isso é inconveniente tanto para o programa quanto para a leitura. Você disse corretamente que Print() deve ser removido fora do laço para Print() com valores dos itens da matriz a serem impressos apenas uma vez. Eu tinha adivinhado antes de suas palavras.

Aprendi muito rapidamente a colocar a impressão() fora do laço. E agora estou tentando aprender como fazer Print() imprimir todos os valores dos elementos da matriz em uma linha.

Explicaram-me como fazer isso em relação ao primeiro bloco do meu código. Até agora, em termos gerais, eu entendi esta tecnologia. Continuarei a pensar para entender os detalhes deste método.
Mas no segundo bloco do meu código, como me parece, o método do primeiro bloco não é adequado porque, ao contrário do primeiro bloco, o delta entre os valores dos elementos da matriz no segundo bloco é diferente.
Se eu estiver certo e o método do primeiro bloco não se encaixar no segundo, eu ficaria grato se você pudesse me mostrar como fazer o mesmo que foi feito no primeiro bloco, mas com referência ao segundo bloco.

Eu corrigi o segundo bloco. Eu coloquei Print() e ArraySort() fora do loop. Eu removi a variável X de Print() para não enganar você.

int P1=0;
double LoY[31];
void OnTick()
{
if (P1==0)
{
for(int r=0; r<31;r++)
{
LoY[r]=1.6104+(r*2)*0.0001;
P1=1;
}
}
//*************************************************************  Б Л О К    N 2
for(int x=0; x<31;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
}
}
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("-LoY[0]-", (знач.эл.масс с инд.0), "---LoY[1]--" ,  (знач.эл.масс с инд.1),   "---LoY[2]--" ,  (знач.эл.масс с инд.2),  "---LoY[3]--" ,  (знач.эл.масс с инд.3),................  "---LoY[30]--" ,  (знач.эл.масс с инд.30) );
}
 
Print("-LoY[0]-", DoubleToString(LoY[0],4), "---LoY[1]--", DoubleToString(LoY[1],4), "---LoY[2]--" , DoubleToString(LoY[2],4), "---LoY[3]--" , DoubleToString(LoY[3],4),................  "---LoY[30]--" ,  DoubleToString(LoY[30],4) );

ou fazer uma função de impressão de matriz separada:

void PrintArray(double &eArray)
   {
   string eStr="";
   int eSize=ArraySize(eArray);
   for(int i=0; i<eSize; i++)
      {
      eStr+=IntegerToString(i)+": "+DoubleToString(eArray[i],4)+", ";
      }
   Print(str);
   }

E chame-a de qualquer lugar

PrintArray(LoY);
Razão: