Precisa de ajuda! Não consigo resolver o problema, estou atingindo limitações de hardware - página 15
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Finalmente descobrimos o que é necessário, espero que esta versão seja definitiva.
Como dito Tudo é suficientemente simples para dividir e paralelizar, os principais passos:
1. a. Seria muito útil saber onde o início e o fim de cada seqüência (por causa disso sugeri da última vez que escrevi seus tamanhos em um arquivo separado)
б. Você mesmo pode analisá-los, mas neste caso você terá que voltar ao ler a próxima parte do arquivo do disco para ler a seqüência anterior aparada
Em seguida, considerarei a variante 1.a. Provavelmente, não é ótima, mas gosto mais dela.
2. Sabendo o tamanho das seqüências e o tamanho da memória de uma parte do arquivo (500 mb), podemos calcular o tamanho da parte do arquivo que precisamos baixar.
3. Em paralelo, calculamos coeficientes para as seqüências, pois conhecemos o início e o fim de cada seqüência.
4. O início e o fim de cada seqüência podem ser armazenados na fila multi-tarefa (preenchida durante o cálculo da etapa 2)
5. Resultado do cálculo - estrutura (matriz da estrutura onde tempo e coeficiente + número seqüencial))
6. Quando metade do tamanho inicial da memória alocada (250 mb) é processada, inicia-se o processo de reescrita com a formação da segunda fila com o início e o fim
7. Tendo chegado ao final da primeira linha, lemos da segunda; tendo chegado ao final da segunda linha, lemos da primeira.
8. Você pode simultaneamente calcular coeficientes e ler a partir do arquivo.
9. Mas cada resultado do cálculo dos coeficientes deve ser armazenado, e é melhor fundi-los de uma só vez na resposta:
temos que escrever funções de fusão: duas seqüências de coeficientes em um subresultado, dois subresultados em um subresultado ligeiramente completo
10. O processo de fusão também pode ser feito em paralelo.
11. Quando é o resultado? Quando os tamanhos das seqüências lidas do arquivo adicional estiverem terminados, então duas pilhas ficarão vazias, então o cálculo dos coeficientes estará terminado,
então temos que esperar que o processo de fusão de subresultados termine (também pode ser feito através de fila de segurança de linha)
e finalmente fundir subresultados de diferentes fios - resultado.
Aqui está uma variante com carga máxima de tudo possível, talvez algo melhor - ficarei feliz.
Eu preciso de funções:
formando uma seqüência de coeficientes a partir de uma seqüência de entrada
fusão de duas seqüências de coeficientes em um único subresultado (possível perda de precisão aqui)
fusão de dois sub-resultados em um sub-resultado ligeiramente completo (possível perda de precisão aqui)
Acho que é possível inventar um mecanismo inteligente de carga parcial, mas ele tem que ser inventado.
Por exemplo, na primeira leitura, encontre para cada passagem o último comércio fechado antes da Data de Início, volte atrás e leia X negócios anteriores, lembre-se do ponto no arquivo onde esse comércio termina.
Depois disso, encontre o primeiro negócio nos resultados, e depois trabalhe somente com dados novos: leia o arquivo desde o ponto desejado até a nova data real, e cada vez que houver um negócio de turno na matriz (teremos uma matriz de tamanho fixo - elementos X).
Isto resolverá o problema com múltiplas leituras (simplesmente não precisamos disso) e memória (somente se pudermos colocar X milhões de transações).
Sim, isso é o que o algoritmo fará.
Se conseguirmos alocar memória para X milhões de negócios(o tamanho da estrutura é conhecido antecipadamente), então seremos capazes de ler o arquivo uma vez.
Se não, então precisamos acrescentar a leitura dos últimos X acordos a cada retorno ao ponteiro Armazenado. Então, o arquivo será lido várias vezes, mas ainda assim economicamente.
A estrutura da seqüência será fixa: Nos, Trades[X], Critério, Posição FilePointer. Não há nada de desnecessário.
Ainda é preciso codificar =)
O que é o resultado mais desejável:
dll ou ainda mql para calcular?
Sim, nesta forma a tarefa é paralela - cada vez queo SeekDate muda,você pode executar uma busca simultânea pelo melhor critério em diferentes partes do conjunto de seqüências. Por exemplo, os dividimos em 20 partes e damos a tarefa a 20 Conselheiros Especialistas. E eles devem ler o arquivo, encontrar o negócio e enviar apenas a melhor seqüência (№№, Critério e posição do arquivo).
Muito obrigado a todos vocês!
O que é o resultado mais desejável:
dll ou ainda mql para calcular?
Não estou com o mql há meio ano, posso ser um pouco burro, esclarecer se estou errado:
Открываем файл, начинаем читать, последовательно заполняя массив сделок первого прохода
você está planejando fazer uma leitura separada do disco para cada passe? 10^6 vezes lido de disco?
Não pode haver um obstáculo na leitura individual em vez de ler um pedaço inteiro ao mesmo tempo? Ou tudo é implementado ao mais alto nível aqui com um sólido amortecedor a mais?
Se chegarmos a um comércio, cujo tempo de abertura é >= SeekDate (não é adicionado à matriz):
Eu não vejo onde a memória está sendo liberada, ela continua se acumulando.
Por que manter todo o conjunto por um critério? Você pode simplesmente compará-los ao calcular um novo critério e manter o critério apropriado.
Se você quiser encontrar 10 melhores critérios, é melhor fazer um conjunto de 10 critérios, preenchê-lo com valores, classificá-lo e depois inserir o próximo critério usando a busca binária.
Você está planejando realizar uma leitura separada do disco para cada passe? Ler 10^6 vezes do disco?
Teremos que ler o arquivo completo de qualquer maneira. Não podemos fazer tudo de uma vez (do começo ao fim), então teremos que ler em pedaços (mas ainda assim acabaremos com o arquivo inteiro).
Não pode haver um obstáculo na leitura de uma peça de cada vez em vez de ler toda a peça de uma só vez? Ou tudo é implementado ao mais alto nível aqui com um sólido amortecedor a mais?
Um pedaço é lido. O tamanho do pedaço é determinado pelo número de transações antes da Data de Busca, que estavam em uma seqüência particular.
Eu não vejo onde a memória está sendo liberada, ela continua se acumulando.
A memória é alocada uma vez para uma série de estruturas sequenciais.
A estrutura da seqüência inclui: No., Conjunto de estruturas de todas as transações da seqüência [X], Valor do critério, Posição do Ponteiro do Arquivo.
O próximo passo é apenas o preenchimento dos elementos da estrutura (incluindo as matrizes de negócios). Os negócios na matriz são deslocados, de modo que há sempre apenas X negócios de cada seqüência na memória.
Se você quiser encontrar 10 melhores critérios, é melhor criar um conjunto de 10 critérios, preenchê-lo com valores, classificá-lo e depois inserir o próximo critério usando a busca binária.
Incluindo para o paralelismo.
Mas eliminar um duplo de uma estrutura que contém uma série de estruturas de negócios não faz diferença dentro da estrutura da tarefa.
Compartilhando os resultados de minha pesquisa.
O arquivo de cache binário de 7529 MB lê:
Conclusão: a velocidade de leitura de um grande arquivo usando o disco RAM é cerca de 2,5 vezes.
Se o arquivo fosse classificado por tempo de negócios não dentro de seqüências, mas globalmente (por todas as seqüências), então o seguinte algoritmo seria possível:
- Calcular o critério para uma profissão, considerá-la um candidato
- Calculamos critérios para os negócios que começam dentro deste acordo, se conseguirmos o melhor, mudamos o candidato, se não o conseguirmos, consideramos o candidato selecionado e iniciamos um novo ciclo a partir da data de seu fechamento.
Também podemos ordenar por tempo próximo - neste caso, começamos do final
É claro que para o cálculo de um critério, o arquivo deve conter o número de seqüência para cada comércio.
A reordenação de tal arquivo provavelmente também não é uma coisa divertida, podemos tentar escrevê-lo "adequadamente" de uma só vez. Isto não é para gerar sequências inteiras uma a uma, mas para gerar uma transação para cada sequência e usar algum cache com inteligência ao escrever. Para alguns algoritmos de geração, é claro, isto pode ser inaceitável.
Se o arquivo fosse classificado por tempo de negócios não dentro de seqüências, mas globalmente (por todas as seqüências), então tal algoritmo seria possível:
- Calcular o critério para o negócio, considerá-lo um candidato
Suponha que eu grave tal arquivo (apenas convertendo o atual, mesmo que isso leve 15 horas de tempo de computador).
Mas então - sobre o primeiro ponto - há um obstáculo. Como calcular o Critério sobre as últimas X negociações da seqüência, tendo tal arquivo?
Mais uma vez, o critério não pode ser calculado uma vez, seus parâmetros podem mudar.