Bug MQL5 quando se trabalha com acesso iClose/iOpen timeseries, etc. - página 4

 
Renat Fatkhullin:

Logo após o código e o trabalho:

  1. A função CopyXXX nos indicadores não espera pelo download completo e síncrono dos dados, mas fornece o que está disponível. Caso contrário, os indicadores realmente desacelerariam.

  2. Parece haver um problema com o acompanhamento, se todos os dados não foram sincronizados na primeira vez.
    É necessário mudar para um modo suave "Vou esperar cuidadosamente pelo sucesso do download". Por exemplo, a OnCalculate não é chamada.

  3. O mau é que uma inicialização global com a carga máxima é colocada no OnInit onde o indicador conta e espera por um tempo muito longo.
    Neste caso, a atualização dos gráficos deste símbolo é bloqueada e muitos outros participantes têm que esperar e não receber novos dados. O indicador não deve levar recursos por muito tempo. É melhor esticar a longa inicialização passo a passo/símbolo de inicialização na OnCalculate, contando passo a passo.

  4. Este indicador bombeia cerca de 800 MB de dados históricos através da rede para sincronização.

  5. O indicador tem 512 linhas de desenho que são explicitamente alocadas para memória. Isto é extremamente caro. Apenas 100 linhas são utilizadas.

  6. O código é mal legível

1. sim, é por isso que eu tenho que chamá-los várias vezes com uma pausa, ou reiniciar o indicador manualmente várias vezes, mas mesmo isso nem sempre ajuda e o indicador pára de calcular depois de algum tempo

2. admito que a versão atual não é ótima; tentei diferentes variantes, incluindo a função recomendada na documentação (seção "organização do acesso aos dados"); na última versão simplifiquei um pouco, e provavelmente também não é ótimo chamar as funções iBarShift muitas vezes, mas, por outro lado, se você as rejeita, você precisa criar uma função especial para preparar dados sincronizados que eu ainda não posso escrever, é muito complicado, e não há uma função padrão, além disso, se o idioma tem uma característica padrão para solicitar o tempo n

3. o OnInit só define combinações de carteira e atribui buffers, sem pedidos no OnInit. opcionalmente tentei abrir gráficos de todos os instrumentos M1 em segundo plano para evitar o desaparecimento do cache, e parece ajudar, é claro que na carga máxima tudo é terrível, 28 gráficos... A primeira solicitação de dados está em OpsCalculate onde eu chamo CopyClose em loop com pausa (função RequestData) para que os dados sejam armazenados em cache e em série para todos os instrumentos a serem coletados e depois vem a chamada (SetupIntervals, CalculateEquity e outros) e eu pensei assim, todos os dados estarão prontos e todas as chamadas de iBarShift e iClose e outras funções úteis retornarão dados em cache, mas de alguma forma nem sempre funciona

4. Estes devem ser dados de 800 mb de carrapato...? Mas não sei como mais poderia formar um monte de portfólios com 28 instrumentos, eles deveriam ser solicitados de qualquer forma, em mt4 não houve problema com isso (provavelmente porque todos os prazos existem separadamente em mt4)

O problema é que o indicador assume que muitas combinações de carteira podem estar envolvidas, agora há uma combinação predefinida com 420 linhas + linhas de serviço (todos os tipos de varinhas, canais, etc.), teoricamente o usuário pode solicitar todas as 512 linhas, o número de buffers não pode ser limitado de antemão usando #property indicators_buffers, porque não se sabe quantos serão solicitados pelo usuário, em mt4 é lags at maximum load, mas funciona

6. comentarei sobre isso, se necessário.


P.S. Pensei que talvez você tivesse baixado a versão errada, porque cometi um erro na primeira vez e coloquei uma versão diferente, depois corrigi o anexo.

P.P.S. Quero aproveitar a oportunidade para esclarecer a funcionalidade dos gráficos sintéticos, esta funcionalidade será de alguma forma desenvolvida? Por exemplo, quero não só fazer os índices das fórmulas, mas simular a posição de compra/venda de um grupo de instrumentos, agora é difícil de fazer porque tenho que escrever uma fórmula incômoda para o valor do ponto e o tamanho do contrato, e o valor do ponto não muda na história ...

 

Renat Fatkhullin:

O indicador não deve consumir recursos por um longo período de tempo. É melhor esticar uniformemente a longa inicialização para uma iniciação passo a passo/característica na OnCalculate, calculando em pedaços.

É claro, para não atrasar outros programas no terminal, mas há uma contradição: ao calcular o modelo da carteira, o indicador precisa de todas as linhas de dados de uma só vez, porque o patrimônio da carteira é calculado por eles, ou seja, não pode calcular nada sem os dados prontos, e a carteira precisa de todos os componentes de uma só vez, e se há várias carteiras e se a comparação ou soma das carteiras é feita, então precisa de todas as carteiras, e então não é muito esticado - não é uma janela deslizante que pode ser calculada em partes, aqui primeiro o cálculo é feito - Foi por isso que levantei a questão sobre uma função padrão universal que prepararia corretamente um conjunto de dados sincronizados para o cálculo.

 
Vladimir Karputov:

Descarregado de

Agora são 18,10 e tudo funciona.


Eu o felicito, você teve sorte e não tem a CPU, a memória, o SO ou o que quer que seja... mas isso não faz com que o bug não seja real.

É real e não está acontecendo só comigo.

 
transcendreamer:

Isto é compreensível, para não atrasar outros programas no terminal, mas há uma contradição: ao calcular o modelo de carteira, o indicador precisará de todas as linhas de dados de uma só vez, porque o patrimônio da carteira é calculado usando-as, ou seja, sem dados prontos é impossível calcular nada, e a carteira precisa de todos os componentes de uma só vez, e se houver várias carteiras e se houver uma comparação ou soma entre carteiras, então para várias carteiras, e então não pode esticar, porque não é uma janela deslizante que pode ser calculada em partes, aqui primeiro é feito o cálculo - Foi por isso que fiz a pergunta sobre uma função padrão universal que prepararia corretamente um conjunto de dados sincronizados para o cálculo.

Essa é a principal falha. Eu tenho o mesmo problema.

O cálculo e a exibição funcionam instantaneamente em mt4, mas não há problema com indicadores em mt5, enquanto todos os gráficos de que preciso para obter os preços estão sempre abertos. Acontece que eu só posso escrever indicadores simples, como MAs com um tampão (

 

Definitivamente há um bug ligado:

1) Servidor 2012 (build 9200) sobre Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memória: 3033 / 3839 Mb, Disco: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, QEMU Versão virtual (cpu64-rhel6), Memória: 1340 / 2047 Mb, Disco: 15 / 28 Gb, GMT+2


 
Stanislav Dray:

Definitivamente há um bug ligado:

1) Servidor 2012 (build 9200) sobre Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memória: 3033 / 3839 Mb, Disco: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, QEMU Versão virtual (cpu64-rhel6), Memória: 1340 / 2047 Mb, Disco: 15 / 28 Gb, GMT+2

Eu tenho:

Windows 7 Service Pack 1 (build 7601) x64, IE 11, Intel Core i5-2400 @ 3.10GHz, Memória: 469 / 8182 Mb, Disco: 96 / 148 Gb, GMT+2

 
transcendreamer:

Isto é compreensível, para não atrasar outros programas no terminal, mas há uma contradição: ao calcular o modelo de carteira, o indicador precisará de todas as linhas de dados de uma só vez, porque o patrimônio da carteira é calculado usando-as, ou seja, sem dados prontos é impossível calcular nada, e a carteira precisa de todos os componentes de uma só vez, e se houver várias carteiras e se houver uma comparação ou soma entre carteiras, então para várias carteiras, e então não pode esticar, porque não é uma janela deslizante que pode ser calculada em partes, aqui primeiro é feito o cálculo - Foi por isso que fiz a pergunta sobre uma função padrão universal que prepararia corretamente um conjunto de dados sincronizados para o cálculo.

Você deve escrever o indicador com o claro entendimento de que não receberá tudo de uma só vez.

No OnInit você deve estimular o carregamento do histórico dos instrumentos necessários através de chamadas individuais do CopyXXX, mas você tem que esperar pela inicialização completa no OnCalculate.

Sua fase de inicialização parece ter um erro - você espera incorretamente pelos dados e bloqueio.

 
Renat Fatkhullin:

Coloque o código para funcionar. Até o momento, tudo bem.

Arquivo sem corpo, a propósito.

Em 2 horas tudo está bem, o cronômetro está correndo nos comentários com a data certa.
 
Vitaly Muzichenko:

Esta é a principal falha. Eu tenho o mesmo problema.

No mt4 o cálculo e a exibição funcionam instantaneamente, mas no mt5 há um problema completo com os indicadores, embora todos os gráficos dos quais você deseja receber os preços estejam sempre abertos. Acontece que eu só posso escrever indicadores simples, como MAs com um tampão (

Se estou procurando uma maneira diferente de obter a carta que você precisa, não vejo uma maneira universal e confortável de fazê-lo. Entendo que tudo é projetado para a velocidade do terminal e dos programas nele contidos.

 
Vitaly Muzichenko:

Esta é a principal falha. Eu tenho o mesmo problema.

No mt4 o cálculo e a exibição funcionam instantaneamente, mas no mt5 há um problema completo com os indicadores, embora todos os gráficos dos quais você quer obter os preços estejam sempre abertos. Acontece que só posso escrever indicadores simples, tais como MAs com um tampão (

Tenho que olhar para o código.

Aqui no código acima, há claramente um monte de problemas lógicos e de recursos.

Razão: