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
Não agradeça :-). Você mesmo fará tudo :-).
Esclareça os passos passo a passo:
.
#1 (teste um, você não precisa fazer isso ;-) :
Em C++, criar uma matriz com número de linhas MAX_ROW = 5...10, colunas MAX_COL = 5...10 (números aleatórios).
Faça um preenchimento aleatório com dados.
.
#2 (teste um, você não precisa fazer ;-) : resolver o seguinte problema:
A matriz da etapa nº 1 precisa ser representada de forma unidimensional.
criar uma matriz unidimensional de tamanho duplo=MAX_ROW*MAX_COL, onde os dados são armazenados de acordo com a fórmula
for(line = 0 ... MAX_COL-1)
for(column = 0 ... MAX_COL-1)
array[linha*MAX_COL + coluna] = dados[linha][coluna];
.
#3: resolver o seguinte problema / como uma função
Você obtém uma matriz unidimensional dupla do passo (2), o número de filas e colunas.
Você deve colocar os dados desta matriz em um objeto ap::real_2d_array
.
#4: Você recebe o ap::real_2d_array / objeto como uma função
Você tem que convertê-lo para uma matriz unidimensional dupla, obter o número de filas e colunas.
.
#5 (teste um, você não tem que fazer ;-) :
É preciso converter a matriz unidimensional para uma matriz bidimensional (como no passo 1).
Compare a matriz resultante com a matriz original da etapa 1.
Em caso de descasamento, descubra-o.
.
As principais funções que serão necessárias são as funções 3 e 4.
Etapa 1,2 = treinamento, você terá que embalar os dados em Mql desta forma, etapa 5 = teste.
.
Em geral, eu faria funções para cada uma das 5 etapas.
.
Transformação singular em Mql.
https://www.mql5.com/ru/code/7359
Obrigado pela discriminação detalhada de como este singular algoritmo de decomposição deve funcionar. Os itens 1-3 são implementados. O problema permanece com o ponto 4, porque ainda não sou capaz de criar uma dll funcional com função export rmatrixsvd(...), como escrevi antes,
por causa da adição de "C" bool externo __declspec(dllexport) __stdcall rmatrixsvd(...) ao código C++ original, eu recebo erros... Embora se você compilar apenas bool rmatrixsvd(...) não haja erros... mas preciso de uma função exportável... É aí que fica confuso...
Obrigado pela ajuda.
Em relação ao ponto 4 (e todos os outros). rmatrixsvd não tem nada a ver com isso.
Nem o singular algoritmo de decomposição. Estes itens estão relacionados a
para enviar/receber dados de/para Dll.
.
A função de protótipo para escrever por item. 4:
vazio Convert_real_2d_array_to_double(
const ap::real_2d_array & arr,
duplo * dados,
int & lines,
int & colunas
);
.
Ou seja, você precisa aprender como obter o número de linhas, colunas e dados da ap::real_2d_array.
.
A partir daí:
const ap::real_2d_array & arr
---->>>
obtê-lo:
duplo * dados,
int & lines,
int & colunas
Muito obrigado mais uma vez por seu tempo.
Mais uma vez li todos os posts com muito cuidado e parece que finalmente descobri :-) o que fazer.
De fato, a função rmatrixsvd em si é uma espécie de "cavalo de batalha" aqui e você não precisa tentar exportá-la,
você só precisa colocar a carga no carrinho a tempo e depois descarregála no lugar certo quando ela for entregue
ao seu destino, figurativamente falando. Estou entendendo corretamente agora?
Em outras palavras, preciso fazer esses conversores de dados (3 e 4) em C++ e trabalhar com eles em MQL, ou seja, eles devem ser declarados em MQL, e em DLL eles
ser declarado como exportável, para que a Metatrader pudesse usá-los. Eu entendo meu problema corretamente?
Se é assim, e acho que o entendo agora, é ainda melhor, porque eu não tinha certeza de como ligar os arrays 2D e 1D naquela época.
Além disso, você não pode declarar array como a[ ][ ] em MQL, pode? Isto é, a matriz deve ser declarada pelo menos como a[ ][100]. É assim? ou estou enganado?
E isto não é muito conveniente porque você não sabe de antemão qual será a dimensão de uma matriz bidimensional, enquanto reservar a memória para uma matriz com antecedência não é o melhor caminho a seguir,
Mas não existe tal problema em C++? Então, uma matriz bidimensional pode ser chamada figurativamente de "borracha". É assim? Ou há algumas sutilezas em C++ também?
Gostaria também de lhe perguntar sobre a Borland Builder 2009. Talvez não seja tão falho como o 6°? É realmente possível trabalhar com ele?
Porque Alsu disse que ele é um retardador, tanto quanto sei. :-) Mas até onde eu entendi você programa usando o Visual Studio? É mais frio? E sem falhas? Qual é a versão mais recente neste momento?
Estou feliz por ter chegado ao fundo do meu problema com sua ajuda. Agora vou tentar implementar tudo isso...
Especialmente porque você não pode declarar array como a[ ][ ] em MQL, pode? Ou seja, você deve pelo menos declará-lo como a[ ][100]. É assim? ou estou enganado?
E isto não é muito conveniente porque você não sabe de antemão qual será a dimensão de uma matriz bidimensional, enquanto reservar a memória para uma matriz com antecedência não é o melhor caminho a seguir,
Ótimo! :-) Estou muito contente que o processo esteja se movendo em algum lugar :-).
.
É claro, você pode declarar matrizes bidimensionais em Mql4.
E da mesma forma, você pode importar funções de DLL
#importar myLib
showMatrix(double & array[][], int filas, int cols);
#importar
.
Mas há uma nuança aqui: em C, declaramos uma função que aceita uma matriz unidimensional,
o número de linhas e colunas vazias mostramMatrix(duplo *array, int filas, int cols);
E a matriz funciona como uma matriz unidimensional, endereçada na qual está disposta em um loop:
for(line = 0 ... MAX_COL-1)
for(column = 0 ... MAX_COL-1)
array[linha*MAX_COL + coluna] = dados[linha][coluna];
.
Ou seja, a Mql lança uma matriz bidimensional com um buffer contínuo.
.
Basta não pisar no mesmo ancinho - funções dos passos 3 e 4 são usadas dentro de seu Dll,
dentro da função de interface do Dll-ine, que tomará as matrizes unidimensionais com número de filas/colunas da Mql.
Ele irá convertê-los para ap::real_2d_array, passe para rmatrixsvd
e coloca o resultado no buffer de saída, que deve ter a linha e a coluna corretas
deve estar correto.
.
O buffer de saída deve ser reservado com antecedência, é claro - isso deve ser feito em Mql.
Se você não conhece as dimensões, minha opinião é que você deve fazer
uma matriz unidimensional de alta dimensionalidade, por exemplo
dobrar[2500];
e uma matriz de um elemento para os valores de saída das linhas/colunas
linhas duplas[1];
cols duplos[1];
.
O Visual Studio é mais legal. Especialmente com a Assistência Visual. Não sei como funciona a STL na Debuilder. Há quase 100% de problemas com o Unicode.
A ajuda de Win SDK não se compara com a MSDN. Há rumores de que para integrar com delphi o compilador Borland
para as vantagens sofreu mudanças não-positivas.
.
E trabalhar com memória é um tópico para uma classe.
Tudo parece estar teoricamente claro, vou começar com a implementação, e depois veremos :-). "Os olhos estão com medo, mas as mãos fazem o trabalho..."
Mais uma vez, obrigado pela valiosa orientação. Gostaria muito de implementar este algoritmo... Como de costume, a idéia já está distante estrategicamente, mas taticamente e praticamente
Eu tenho que alcançá-lo. Espero ser capaz de fazer isso. Se eu tiver alguma dúvida, por favor, não hesite em me ajudar com conselhos. Obrigado!
Gostaria de esclarecer mais uma vez sobre a dimensionalidade das matrizes dinâmicas.
Na MQL, uma matriz unidimensional pode ser definida como array[ ], e então quando o programa conhece a dimensão N da matriz,
você pode usar a função ArrayResize(array, N). Uma matriz bidimensional só pode ser definida como array[ ][100], ou seja, a segunda dimensionalidade
deve ser conhecido da mesma forma, e se você não souber, você deve tirar o máximo proveito para que seja suficiente em qualquer caso. Você pode definir em MQL
O compilador não se queixará disso, mas a função ArrayResize define um novo tamanho na primeira dimensão da matriz ,
Não existe tal função na MQL para a segunda dimensão. Se você definir uma matriz bidimensional[N][M], o compilador retornará um erro dizendo
um número inteiro, ou seja, a dimensionalidade deve ser definida de antemão, pelo menos a segunda dimensão da matriz.
É o mesmo em C++? Não há como fugir disso, não é mesmo? Mais uma vez, eu gostaria de esclarecer.
A decomposição individual utiliza a biblioteca AP para C++ (descrição em arquivo anexo). Há nele algumas funções que, tanto quanto entendi, resolvem
problemas da primeira e segunda dimensão dinâmica das arrays. Posso usá-los em meu caso dentro da DLL ao escrever conversores de dados?
void setbounds(int iLow1, int iHigh1, int iLow2, int iHigh2)
Atribuir memória para a matriz. Isto elimina o conteúdo da matriz antiga e libera a memória alocada para ela, depois aloca uma nova área de memória separada com o tamanho de (iHigh1-iLow1+1)*(iHigh2-iLow2+1) elementos.
A numeração dos elementos de uma nova matriz pela primeira dimensão começa com iLow1 e termina com iHigh1, o mesmo para a segunda dimensão.
O conteúdo da nova matriz não está definido.
Há também a seguinte função:
void setcontent(int iLow1, int iHigh1, int iLow2, int iHigh2, const T *pContent)
O método é similar ao método setbounds() com a exceção de que o conteúdo da matriz pContent[] é copiado para ela após a alocação de memória.
A matriz pContent contém uma matriz bidimensional escrita linha por linha, ou seja, o elemento [iLow1, iLow2] vai primeiro, depois [iLow1, iLow2+1], etc.
Se entendi corretamente, esta é exatamente a função que preciso, ou seja, faz uma matriz bidimensional a partir de uma unidimensional, ou seja, é essencialmente um conversor.
Eu acertei?
Biblioteca AP para C++
MQL : em uma dimensão, mudamos a dimensão como queremos, sim. Depois recebemos tudo por índices (linha * MAX_COL + col).
Em bidimensional, a 2ª dimensão é fixa. Ou seja, não podemos ler elementos da matriz [15][32] da matriz a[100][100].
.
E sugiro que você verifique como a biblioteca AP funciona.
Não pare no Dll. Escreva um exe, é mais fácil de executar e debugar.
Inserir uma impressão de debug.
Conselhos que eu certamente posso dar - mas para conselhos, você precisa testá-los -
escrever código de teste.
.
Quanto ao conteúdo da matriz e das variáveis - não importa onde -
é melhor fazer deles uma regra para inicializá-los forçosamente, de forma rígida.