Erros, bugs, perguntas - página 3032

 
Andrey Dik:

Obrigado, Andrew. É o único que compreendeu completamente a questão.


Agora tudo está a funcionar como pretendido, os indicadores calcularam completamente apenas uma vez durante a primeira corrida e depois apenas uma vez de cada vez na sua nova barra.


Espera-se que o código final do segundo indicador seja útil a alguém:

Aqui está o início do que deveria ter pensado

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Insectos, insectos, perguntas

Alexey Viktorov, 2021.05.28 08:36

Para que serve este cheque?

//проверка готовности данных и индикатора на другом TF
if (SeriesInfoInteger (Symbol (), tf, SERIES_SYNCHRONIZED))
{
  if (iBars (Symbol (), tf) != BarsCalculated (handleFr)) return 0;
}
else return 0;

Seria mais fácil escrever o retorno 0; sem quaisquer condições...

Em cada nova barra a condição será cumprida e todas as barras serão recalculadas, independentemente da sincronização. Escreveu um código irreflectido e finge que é um bug terminal.


E Igor Makanu disse isto ainda antes...
 

Gostaria de vos lembrar.

1. Para cada símbolo, para o qual pelo menos um gráfico está aberto, existe um fio separado para processar as carraças de entrada. Vários gráficos para algum símbolo podem ser abertos, mas haverá apenas um fio de qualquer forma.

2. O fio símbolo não processa gráficos, mas sim séries cronológicas. Ou seja, as mesmas matrizes de dados, que são submetidas ao pedido do CopyRates.

3. é inútil perguntar ao seu símbolo em OnTick ou OnCalculate, se ele está sincronizado. Claro que é!

4. Todas as séries temporais são tratadas em ordem, do mais baixo ao mais alto. Em primeiro lugar, é aplicado o tick, e depois o cálculo de todos os indicadores, criados nesta série temporal. Se pedir dados para o mesmo símbolo H1 ao indicador, trabalhando no M1, nunca obterá dados com o carrapato aplicado. Os dados serão sempre um tique de volta, independentemente dos truques que aplicar. Porque um fio por símbolo com processamento consecutivo no tempo.

5. A declaração anterior não se aplica a EAs e guiões, porque cada EAs e guiões funcionam nos seus próprios fios separados.

 
Slava:

Gostaria de vos lembrar.

1. Para cada símbolo, para o qual pelo menos um gráfico está aberto, existe um fio separado para processar as carraças de entrada. Vários gráficos para algum símbolo podem ser abertos, mas haverá apenas um fio de qualquer forma.

2. O símbolo de linha lida com as séries cronológicas, não com os gráficos. Ou seja, as mesmas matrizes de dados, que são submetidas ao pedido do CopyRates.

3. é inútil perguntar ao seu símbolo em OnTick ou OnCalculate, se ele está sincronizado. Claro que é!

4. Todas as séries temporais são tratadas em ordem, do mais baixo ao mais alto. Em primeiro lugar, é aplicado o tick, e depois o cálculo de todos os indicadores, criados nesta série temporal. Se pedir dados para o mesmo símbolo H1 ao indicador, trabalhando no M1, nunca obterá dados com o carrapato aplicado. Os dados serão sempre um tique de volta, independentemente dos truques que aplicar. Porque um fio por símbolo com processamento consecutivo no tempo.

5. A declaração anterior não diz respeito a Expert Advisors e guiões, porque os Expert Advisors e guiões trabalham nos seus próprios tópicos separados.

Por favor, enviem-me lembretes mais detalhados como este! Obrigado!

 
Slava:

Gostaria de vos lembrar.

4. Todas as séries temporais são processadas em ordem, desde a mais baixa até à mais alta. Primeiro a aplicação do tick, depois o cálculo de todos os indicadores criados nesta série temporal. Se estiver a pedir dados para o mesmo símbolo H1 a partir de um indicador, trabalhando em M1, nunca obterá dados com um tick aplicado. Os dados serão sempre um tique de volta, independentemente dos truques que aplicar. Porque um fio por símbolo com processamento consecutivo no tempo.

5. A declaração anterior não se aplica a EAs e guiões, porque EAs e guiões funcionam cada um no seu próprio fio condutor separado.

Estou a seguir correctamente, se um EA a trabalhar no M1 utiliza um indicador no M1 (ou em qualquer outra TF?) que tira dados da TF superior, então no primeiro tick de uma nova barra não poderá devolver o valor real em qualquer caso, porque a fila para o cálculo da TF superior vai chegar a ele depois de n ticks?

Eu simplesmente me confrontei com tal comportamento e estava à procura de um problema no indicador, e agora acontece que deveria ser assim. Mas se assim for, interfere fortemente com os testes porque tenho de saltar alguns carrapatos que são críticos ao testar em modo OHLC.

 
Slava:

2. O fluxo de símbolos não processa gráficos, mas sim séries cronológicas. Ou seja, as mesmas matrizes de dados que são dadas ao pedido de CopyRates

....

4. Todas as séries temporais são processadas em ordem, do mais baixo ao mais alto. Primeiro a aplicação do tick, depois o cálculo de todos os indicadores, criados nesta série cronológica. Se estiver a pedir dados para o mesmo símbolo H1 a partir de um indicador, trabalhando em M1, nunca obterá dados com um tick aplicado. Os dados serão sempre um tique de volta, independentemente dos truques que aplicar. Porque um fio por símbolo com processamento consecutivo no tempo.

Porque é que recebo ecrãs pretos de "Actualização" quando mudo de TF?

abriu o gráfico que estava a usar antes (H1 no EURUSD), deixou o indicador, não fez nada durante 2-3 minutos, depois mudou para um gráfico mais baixo (M30...M1), o ecrã preto "Update" pode aparecer durante 10 segundos

e este ecrã preto depende da construção - quando o terminal está sem ecrã preto, e quando realmente me aborrece, porque sabe exactamente que história está carregada, só precisa de entregar um gráfico ao terminal, e porquê esperar por este ecrã preto


isto é, se o indicador estiver a funcionar em M5 e a cada 30 minutos chamar o indicador em H1 - CopyBuffer() obterá sempre os dados correctos de H1 ?

ou não é um facto, portanto "puxar o indicador" em H1 em cada tic(a quebra da ligação ainda não é considerada)

 

como lidar com variáveis de um laço/função noutra função?

a visibilidade pode ser tornada mais global?

 
Igor Makanu:

porque é que aparecem ecrãs pretos de "Actualização" quando se muda de TF?

Abri o gráfico que utilizei antes (H1 no EURUSD), atirei o indicador, não fiz nada durante 2-3 minutos, depois mudei para um gráfico mais baixo (M30...M1) e um ecrã preto "refresh" pode aparecer durante 10 segundos

e este ecrã preto depende da construção - quando o terminal está sem ecrã preto, e quando realmente me aborrece, porque sabe exactamente qual é o histórico carregado, só precisa de entregar um gráfico ao terminal, e porquê esperar por este ecrã preto


isto é, se o indicador estiver a funcionar em M5 e a cada 30 minutos chamar o indicador em H1 - CopyBuffer() obterá sempre os dados correctos de H1 ?

ou não é um facto, portanto "puxar o indicador" em H1 a cada tick(ainda não consideramos as variantes de quebra de ligação)

Penso, com base nas palavras de Slava, que isso não é um facto.

Uma vez que todos os cálculos são efectuados apenas no tick, a cadeia de indicadores amarrados pode não estar completa e teremos de esperar pelo próximo tick.

Mas há alguns problemas interessantes, cujas respostas ainda não encontrei na documentação.

O que fazer, quando os ticks não ocorrem (por exemplo, no fim-de-semana)? Se colocar um indicador, que funcione no prazo actual, será desenhado sem problemas, e o que é interessante - não precisa de um tic para ser recebido! Mas se o indicador solicitar dados de outro prazo, não fará nada até que chegue um novo tic, e não há nenhum tic a chegar - fim-de-semana!

Se chamarmos ChartRedraw (ChartID ()) no temporizador, então para certos Comentários (cnt); ondecnt é incrementado em 1, vemos que cnt está a funcionar correctamente no ecrã, mas o indicador não é desenhado.

Quando actualizo o ecrã com o botão Actualizar a partir do menu de contexto, o indicador é redesenhado do princípio ao fim.

Mas assim que se actualiza o ecrã com Update do menu de contexto, o indicador é felizmente desenhado do princípio ao fim.


HH O seu exemplo do segundo indicador funciona, mas o código do Perito é mais rápido.

 
Andrey Dik:

o que fazer quando não há carrapatos (fim-de-semana, por exemplo)? se colocar um indicador a trabalhar no TF actual, ele será desenhado sem problemas, e o que é interessante - a chegada de um carrapato não é necessária para isso!

não é necessário

quando se desenha o indicador no gráfico, há uma sequência estritamente definida de chamadas: OnInit() e imediatamente OnCalculated(). ou seja, o primeiro OnCalculated() é chamado antes do tick receipt, por isso prev_calc precisa de ser comparado com 0. No tick receipt ou conexão com o servidor OnCalculated() será chamado novamente eprev_calc será igual a zero

Andrey Dik:

Acontece que ChartRedraw () e Update by button não são a mesma coisa, embora eu possa pensar o oposto.

muito provavelmente deve usar ChartSetSymbolPeriod() com parâmetros NULL e período actual, deve ajudar

 
Igor Makanu:

Muito provavelmente deve usar ChartSetSymbolPeriod() com parâmetros NULL e período actual, deve ajudar

ChartSetSymbolPeriod

O ChartSetSymbolPeriod call com o mesmo símbolo e o mesmo prazo pode ser utilizado para actualizar o gráfico (semelhante ao comando Refresh no terminal). A actualização do gráfico, por sua vez, desencadeia o recálculo dos indicadores que lhe estão associados. Assim, é possível recalcular o indicador no gráfico mesmo quando não há carraças (por exemplo, fins-de-semana).

ajudou. também, como me lembro agora, ac Pushkin costumava dizer:

Oh, quantas descobertas maravilhosas
Prepara onossoespírito iluminado
E a experiência, o filho dos erros duros,
E o génio, o amigo dos paradoxos,
E o acaso, Deus o inventor.

 
Andrey Dik:


O que fazer quando os carrapatos não vêm (por exemplo, fins-de-semana)? Se o indicador funcionar no prazo actual, será desenhado sem problemas, e o que é interessante - não precisa de um carrapato para vir! Mas se o indicador solicitar dados de outro prazo, não pode fazer nada até que chegue um novo carrapato, e não vem - fins-de-semana!


Do outro período de tempo serão obtidos os dados que estiverem prontos no momento. Assim, na saída, todos os dados serão perfeitamente sincronizados

Razão: