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

 
Taras Slobodyanik:

o formato dos comentários pode variar de corretor para corretor.

Eu não vi a ausência de "Para" e "De".
 
Artyom Trishkin:
Não vi a ausência de "Para" e "De".
Artem, veja minha pergunta acima....
 

Bom dia a todos vocês!

Você pode me dizer se existe uma função na MQL4 (ou na MQL5, mas trabalhando na MQL4) que converte a matriz LoY[2][7] em matriz LoY[7][2] e vice versa. Algo como transposição. Abaixo está uma amostra da transformação que eu preciso. Eu quero ter uma função. Eu já sei como converter uma matriz em loop.

Obrigado por sua ajuda.

 
ANDREY:

Bom dia a todos vocês!

Você pode me dizer se existe uma função na MQL4 (ou na MQL5, mas trabalhando na MQL4) que converte a matriz LoY[2][7] em matriz LoY[7][2] e vice versa. Algo como transposição. Abaixo está uma amostra da transformação que eu preciso.

Obrigado por sua ajuda.

Apenas para referência : em algoritmos clássicos (TI em geral) tal operação é chamada de zip,

Eu não consigo encontrar tal função na biblioteca. É um desperdício terrível e ineficiente. É mais fácil e mais rápido mudar os índices no algoritmo/programa ou usar acessos indiretos do que reorganizar TODOS os dados em arrays.

 
Maxim Kuznetsov:

É mais fácil e mais rápido mudar os índices no algoritmo/programa ou usar acessos indiretos do que reorganizar TODOS os dados nas arrays.

Muito obrigado por sua resposta. Infelizmente, não sou tão avançado em programação quanto você. Eu ficaria muito grato a você se pudesse escrever algum código mql4 que muda os índices de matriz para resolver meu problema. E se você der um exemplo de referência indireta, eu ficarei duplamente grato.

Entenderei melhor seu processo de pensamento e aprenderei algo novo e útil para mim graças a você.

 
ANDREY:

Muito obrigado por sua resposta. Infelizmente, não sou tão avançado em programação quanto você. Eu ficaria muito grato se você pudesse escrever algum código mql4 para mudar os índices de array para resolver meu problema. E se você der um exemplo de referência indireta, eu ficarei duplamente grato.

Entenderei melhor seu processo de pensamento e aprenderei algo novo e útil para mim graças a você.

void Convert_7x2_2x7 (const double &src[7][2],double &dst[2][7]) {

   for(int i=0;i<7;i++)

   for(int j=0;j<2;j++) {

dst[j][i]=src[i][j];

   }

}

É curto, mas é a pior coisa que se pode fazer :-) dois loops aninhados e cópia de arrays de elemento por elemento.

Quando você dentro de seu algoritmo, pode simplesmente renomear os índices. Basta mudar i para j em seu código e vice-versa...

 
Maxim Kuznetsov:

void Convert_7x2_2x7 (const double &src[7][2],double &dst[2][7]) {

   for(int i=0;i<7;i++)

   for(int j=0;j<2;j++) {

dst[j][i]=src[i][j];

   }

}

curto, mas é a pior coisa que você pode fazer :-)

Muito obrigado. E um exemplo do melhor???? :-).... para que eu tenha um entendimento completo.

A cópia elemento por elemento é longa e consome energia...especialmente para grandes matrizes...... se não estou enganado.

 
Andrei, por que você gostaria de fazer isso? Se os dados já estiverem coletados em uma matriz, você pode encontrar uma maneira de simplesmente utilizá-los como estão sem mover nada. Ou pré-montar em uma matriz na ordem correta. O que você quer obter?
 
Aleksei Stepanenko:
Andrei, por que você precisa disso? Se os dados já estiverem coletados em uma matriz, você pode encontrar uma maneira de simplesmente utilizá-los como estão sem mover nada. Ou você pode montá-los em uma matriz na ordem certa com antecedência. O que você quer obter?

Aqui está meu código simples para ilustrar o que eu preciso.

double LoY[2][31],LoU,LoU1;
int S,S1,S2;

void OnTick()
{
//*************************************************** БЛОК 1
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,10,0.5555);

S1=Minute();
}
//*************************************************** БЛОК 2
if (Minute()!=S)
{
LoY[0][S2]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("----LoY[0][1]-- Г ---  [0]  ",  LoY[0][0],"  [1] ",   LoY[0][1],"  [2] ",   LoY[0][2],"  [3] ",   LoY[0][3],"  [4] ",   LoY[0][4],"  [26] ",   LoY[0][26],"  [27] ",   LoY[0][27],"  [28] ",   LoY[0][28],"  [30] ",   LoY[0][30],"  [60] ",   LoY[0][60]);
Print("----LoY[1][0]-- В ---  [0]  ",  LoY[0][0],"  [1] ",   LoY[1][0],"  [2] ",   LoY[2][0],"  [3] ",   LoY[3][0],"  [4] ",   LoY[4][0],"  [26] ",   LoY[26][0],"  [27] ",   LoY[27][0],"  [28] ",   LoY[28][0],"  [30] ",   LoY[30][0],"  [60] ",   LoY[60][0]);
S2++;
if (S2==62)
{
S2=0;
}
S=Minute();
}
}

No bloco 1, ArrayFill(LoY,0,10,0.5555) roda e atribui aos primeiros 10 elementos da matriz o valor 0,5555. Depois disso, preciso ordenar toda a linha nula da coluna 0 para a coluna 31.

Quero classificá-la no bloco 2, usando ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); Mas não posso classificá-la porque esta função classifica uma matriz bidimensional por sua primeira dimensão, ou seja, por filas. E eu tenho um fio para ordenar apenas 1. ArraySort() na segunda dimensão, ou seja, as colunas não ordenam arrays bidimensionais (apenas uma dimensão).

Então pensei, talvez eu devesse converter LoY[2][31] após o primeiro bloco para LoY[31][2], para que ArraySort() pudesse ordenar os valores que eu preciso no bloco 2. E preciso ordenar todos os valores a partir da linha zero após o ArrayFil() ter mudado os primeiros 10 deles.

Posso classificar as matrizes bidimensionais pela segunda dimensão, ou seja, por colunas, usando alguma outra função, ou algo mais?
Desculpe... Eu não sei como apagar o código. Portanto, vou apenas dizer que há um erro na linha 180 ao invés de LoY[S2][0]=Bid; precisamos de LoY[0][52]=Bid;

Obrigado por sua ajuda.

 
Você quer ordenar os valores em ambas as linhas ou apenas na primeira?