Entendendo as plotagens que por vezes desaparecem

 

Pessoal, estamos dedicados em aprender MQL5, mas existem alguns comportamentos que estamos tendo dificuldade para compreender mesmo depois de ler a documentação.

Qual o critério para plotagem e ordem de plotagem? Deixe-me fazer entender melhor... Quando definimos, por exemplo: #property indicator_plots 5 (indicador com 5 plot lines). A ordem da plotagem é definida pelo SetIndexBuffer, é isso? Definindo, por exemplo, SetIndexBuffer com 0 quer dizer que a primeira linha da plotagem será o buffer definido nele? Agora outra dúvida é quanto ao ENUM definido depois. INDICATOR_DATA é definido quando esse buffer for ser exibido na plotagem, correto? INDICATOR_CALCULATIONS serve para definir um buffer que vai ser usado em cálculos intermediários e que o valor não será impresso na plotagem. Esse entedimento é correto?

Agora o mais surreal dos problemas que estamos nos deparando é com relação a plotagem em si. Vou dar um exemplo bizarro usando o mesmo indicador com 5 plots. Imagine que o Plot 0 (buffer = 0) seja o close[] do OnCalculate, e você define os outros 4 buffers com close[] * (0.5;-0.5;1.0;-1.0) - todos eles sendo INDICATOR_DATA. Não se prenda aos valores, quis apenas exemplificar 2 linhas acima e 2 linhas abaixo da linha do fechamento (que poderia ser uma média, por exemplo). Por que, por vezes, quando insiro o indicador ele só plota a linha do buffer 0 e deixa as outras 4 linhas sem plotar. Estranho, não é? Ex.: se eu remover e adicionar o indicador (com mercado parado) umas 10 vezes no gráfico, ao menos uma delas, ele vai plotar apenas a linha do buffer 0 e vai descartar as outras 4 linhas. Outra situação em que vejo isso acontecer durante estudos, é quando inserimos o indicador no gráfico e recompilamos ele. Nessa situação, por vezes as outras 4 linhas também desaparecem, e quando isso ocorre (das linhas desaparecerem), quando você fica clicando no botão de compilar da IDE, ele fica revezando a plotagem das 4 linhas, tipo: clica em compilar, as 4 linhas desaparecem, clicam em compilar de novo, elas voltam, clica em compilar novamente elas desaparecem, compilar de novo e elas voltam a aparecer (infinitamente). Só que a linha com plot 0 permanece a todo momento plotada. Apenas as 4 outras linhas (que derivam de algum tipo de cálculo tomando como base a linha do buffer 0) desaparecem.

Bem estranho esse comportamento, né? Quando insiro o indicador no gráfico e apenas a linha do plot 0 aparece, por exemplo, mudo os tempos gráficos e elas voltam, mas no M5 (tempo inicial da inserção do indicador no gráfico), as 4 outras linhas não aparecem.

Estou querendo tirar essa dúvida justamente porque essa é uma situação que ocorre aleatoriamente e até o momento não faz nenhum sentido ele plotar 1 linha e não plotar as demais. Alguém já passou por isso e tenha uma explicação lógica do motivo de acontecer esse comportamento? Será que é por conta do mercado está fechado que isso acontece?

MQL5: Crie o seu próprio indicador
MQL5: Crie o seu próprio indicador
  • www.mql5.com
O que é um indicador? É um conjunto de valores calculados que deseja-se que sejam exibidos em uma tela de forma conveniente. Os conjuntos de valores são representados em programas como arrays. Deste modo, a criação de um indicador significa escrever um algorítimo que manuseia algumas séries (séries de preço) e registra os resultados do manuseamento para outras séries (valores de indicador). Descrevendo a criação do Force Index, o autor mostra como escrever indicadores no MQL5.
 
b2tradingclub:

Pessoal, estamos dedicados em aprender MQL5, mas existem alguns comportamentos que estamos tendo dificuldade para compreender mesmo depois de ler a documentação.

Qual o critério para plotagem e ordem de plotagem? Deixe-me fazer entender melhor... Quando definimos, por exemplo: #property indicator_plots 5 (indicador com 5 plot lines). A ordem da plotagem é definida pelo SetIndexBuffer, é isso? Definindo, por exemplo, SetIndexBuffer com 0 quer dizer que a primeira linha da plotagem será o buffer definido nele? Agora outra dúvida é quanto ao ENUM definido depois. INDICATOR_DATA é definido quando esse buffer for ser exibido na plotagem, correto? INDICATOR_CALCULATIONS serve para definir um buffer que vai ser usado em cálculos intermediários e que o valor não será impresso na plotagem. Esse entedimento é correto?

Agora o mais surreal dos problemas que estamos nos deparando é com relação a plotagem em si. Vou dar um exemplo bizarro usando o mesmo indicador com 5 plots. Imagine que o Plot 0 (buffer = 0) seja o close[] do OnCalculate, e você define os outros 4 buffers com close[] * (0.5;-0.5;1.0;-1.0) - todos eles sendo INDICATOR_DATA. Não se prenda aos valores, quis apenas exemplificar 2 linhas acima e 2 linhas abaixo da linha do fechamento (que poderia ser uma média, por exemplo). Por que, por vezes, quando insiro o indicador ele só plota a linha do buffer 0 e deixa as outras 4 linhas sem plotar. Estranho, não é? Ex.: se eu remover e adicionar o indicador (com mercado parado) umas 10 vezes no gráfico, ao menos uma delas, ele vai plotar apenas a linha do buffer 0 e vai descartar as outras 4 linhas. Outra situação em que vejo isso acontecer durante estudos, é quando inserimos o indicador no gráfico e recompilamos ele. Nessa situação, por vezes as outras 4 linhas também desaparecem, e quando isso ocorre (das linhas desaparecerem), quando você fica clicando no botão de compilar da IDE, ele fica revezando a plotagem das 4 linhas, tipo: clica em compilar, as 4 linhas desaparecem, clicam em compilar de novo, elas voltam, clica em compilar novamente elas desaparecem, compilar de novo e elas voltam a aparecer (infinitamente). Só que a linha com plot 0 permanece a todo momento plotada. Apenas as 4 outras linhas (que derivam de algum tipo de cálculo tomando como base a linha do buffer 0) desaparecem.

Bem estranho esse comportamento, né? Quando insiro o indicador no gráfico e apenas a linha do plot 0 aparece, por exemplo, mudo os tempos gráficos e elas voltam, mas no M5 (tempo inicial da inserção do indicador no gráfico), as 4 outras linhas não aparecem.

Estou querendo tirar essa dúvida justamente porque essa é uma situação que ocorre aleatoriamente e até o momento não faz nenhum sentido ele plotar 1 linha e não plotar as demais. Alguém já passou por isso e tenha uma explicação lógica do motivo de acontecer esse comportamento? Será que é por conta do mercado está fechado que isso acontece?

Bom dia.

Provavelmente tem algum erro no código mas é difícil dizer sem ver...

Ou alguma função mais pesada que demora a ser calculada e em alguns casos não é finalizada antes da plotagem.

Indicadores rodam na thread do ativo, por isso quando os cálculos demoram o indicador não fica aguardando...

Veja seu looping se está ok.

Veja na aba expert se não dá nenhuma mensagem de erro nos casos em que os demais buffers ficam zerados.

Sucesso e bons trades!
 
b2tradingclub:

Pessoal, estamos dedicados em aprender MQL5, mas existem alguns comportamentos que estamos tendo dificuldade para compreender mesmo depois de ler a documentação.

Qual o critério para plotagem e ordem de plotagem? Deixe-me fazer entender melhor... Quando definimos, por exemplo: #property indicator_plots 5 (indicador com 5 plot lines). A ordem da plotagem é definida pelo SetIndexBuffer, é isso? Definindo, por exemplo, SetIndexBuffer com 0 quer dizer que a primeira linha da plotagem será o buffer definido nele? Agora outra dúvida é quanto ao ENUM definido depois. INDICATOR_DATA é definido quando esse buffer for ser exibido na plotagem, correto? INDICATOR_CALCULATIONS serve para definir um buffer que vai ser usado em cálculos intermediários e que o valor não será impresso na plotagem. Esse entedimento é correto?

Agora o mais surreal dos problemas que estamos nos deparando é com relação a plotagem em si. Vou dar um exemplo bizarro usando o mesmo indicador com 5 plots. Imagine que o Plot 0 (buffer = 0) seja o close[] do OnCalculate, e você define os outros 4 buffers com close[] * (0.5;-0.5;1.0;-1.0) - todos eles sendo INDICATOR_DATA. Não se prenda aos valores, quis apenas exemplificar 2 linhas acima e 2 linhas abaixo da linha do fechamento (que poderia ser uma média, por exemplo). Por que, por vezes, quando insiro o indicador ele só plota a linha do buffer 0 e deixa as outras 4 linhas sem plotar. Estranho, não é? Ex.: se eu remover e adicionar o indicador (com mercado parado) umas 10 vezes no gráfico, ao menos uma delas, ele vai plotar apenas a linha do buffer 0 e vai descartar as outras 4 linhas. Outra situação em que vejo isso acontecer durante estudos, é quando inserimos o indicador no gráfico e recompilamos ele. Nessa situação, por vezes as outras 4 linhas também desaparecem, e quando isso ocorre (das linhas desaparecerem), quando você fica clicando no botão de compilar da IDE, ele fica revezando a plotagem das 4 linhas, tipo: clica em compilar, as 4 linhas desaparecem, clicam em compilar de novo, elas voltam, clica em compilar novamente elas desaparecem, compilar de novo e elas voltam a aparecer (infinitamente). Só que a linha com plot 0 permanece a todo momento plotada. Apenas as 4 outras linhas (que derivam de algum tipo de cálculo tomando como base a linha do buffer 0) desaparecem.

Bem estranho esse comportamento, né? Quando insiro o indicador no gráfico e apenas a linha do plot 0 aparece, por exemplo, mudo os tempos gráficos e elas voltam, mas no M5 (tempo inicial da inserção do indicador no gráfico), as 4 outras linhas não aparecem.

Estou querendo tirar essa dúvida justamente porque essa é uma situação que ocorre aleatoriamente e até o momento não faz nenhum sentido ele plotar 1 linha e não plotar as demais. Alguém já passou por isso e tenha uma explicação lógica do motivo de acontecer esse comportamento? Será que é por conta do mercado está fechado que isso acontece?

Ti dizer que eu vi isso ocorrer já mas em situações bem raras no qual da pra ver que o indicador foi recalculado porque deu uma piscada. Esse seu comportamento nunca vi, porque não abre outro tópico pedindo opinião sobre o código?

Sobre a ordem, a ordem é que voce definiu nos buffers. Exemplo digamos que definiu 2 plots e tem 6 buffers. Voce não pode colocar o buffer auxiliar como primeiro que ele vai ser desenhado. Além disso, se voce desenha por cima das velas alguns dos dois primeiros vai ter que ocupar 4 buffers em ordem (OHLC). Sobre o entendimento do enum esta correto, mas ele é só uma facilidade para evitar algumas chamadas. Por exemplo, se deixar teus calculos auxiliares como INDICATOR_DATA eles vão aparecer na área de dados mesmo sem plotagem e vai ter que fazer algumas chamadas adicionais pra desabilitar a exibição lá.

EDIT: escrevi em uma frase o inverso do que queria dizer.

 
Ricardo Rodrigues Lucca #:

Ti dizer que eu vi isso ocorrer já mas em situações bem raras no qual da pra ver que o indicador foi recalculado porque deu uma piscada. Esse seu comportamento nunca vi, porque não abre outro tópico pedindo opinião sobre o código?

Sobre a ordem, a ordem é que voce definiu nos buffers. Exemplo digamos que definiu 2 plots e tem 6 buffers. Voce não pode colocar o buffer auxiliar como primeiro que ele vai ser desenhado. Além disso, se voce desenha por cima das velas alguns dos dois primeiros vai ter que ocupar 4 buffers em ordem (OHLC). Sobre o entendimento do enum esta correto, mas ele é só uma facilidade para evitar algumas chamadas. Por exemplo, se deixar teus calculos auxiliares como INDICATOR_DATA eles vão aparecer na área de dados mesmo sem plotagem e vai ter que fazer algumas chamadas adicionais pra desabilitar a exibição lá.

EDIT: escrevi em uma frase o inverso do que queria dizer.

Ricardo, tudo bem? Estou debugando e colocando Print em tudo pra entender melhor o funcionamento. Percebi que quando essas linhas não aparecem, o valor do Buffer[i] dela aparece como inf/-inf ou nan/-nan. Resta entender porque esse comportamento acontece.

Eu li algumas recomendações que dizia pra inserir um !IsStopped() em laços como for e while e colocar um if (IsStopped()) return (0) durante partes condicionais do código. Talvez esteja acontecendo por causa disso. Eu não entendi bem o motivo de ter que usar esse IsStopped().

 
b2tradingclub #:

Ricardo, tudo bem? Estou debugando e colocando Print em tudo pra entender melhor o funcionamento. Percebi que quando essas linhas não aparecem, o valor do Buffer[i] dela aparece como inf/-inf ou nan/-nan. Resta entender porque esse comportamento acontece.

Eu li algumas recomendações que dizia pra inserir um !IsStopped() em laços como for e while e colocar um if (IsStopped()) return (0) durante partes condicionais do código. Talvez esteja acontecendo por causa disso. Eu não entendi bem o motivo de ter que usar esse IsStopped().

Oi, esses valores podem significar que voce esta interpretando dado de outro indicador que esta ti mandando um dado vazio (a maior parte dos indicadores usa DBL_MAX como EMPTY_VALUE) ou que tenha algum erro no seu calculo. Se um indicador que tu usa algo, ti devolver um EMPTY_VALUE e usar isso no seu calculo pode ser que tu tenha um overflow e fique como nan ou inf.

Sobre o isStopped(), eu uso ele. Alguns dos meus calculos demorram e as vezes pra trocar de timeframe eu não quero ficar com a janela travada até o calculo terminar, então esse isStopped() serve pra indicar que ele pode abandonar o calculo atual e evitar um abnormal termination error. Acredito fortemente que não tem haver com seu problema original isso, já que se fosse uma lentidão demasiada o terminal estaria logando algo como "indicador lento, otimize-o".

 
Ricardo Rodrigues Lucca #:

Oi, esses valores podem significar que voce esta interpretando dado de outro indicador que esta ti mandando um dado vazio (a maior parte dos indicadores usa DBL_MAX como EMPTY_VALUE) ou que tenha algum erro no seu calculo. Se um indicador que tu usa algo, ti devolver um EMPTY_VALUE e usar isso no seu calculo pode ser que tu tenha um overflow e fique como nan ou inf.

Sobre o isStopped(), eu uso ele. Alguns dos meus calculos demorram e as vezes pra trocar de timeframe eu não quero ficar com a janela travada até o calculo terminar, então esse isStopped() serve pra indicar que ele pode abandonar o calculo atual e evitar um abnormal termination error. Acredito fortemente que não tem haver com seu problema original isso, já que se fosse uma lentidão demasiada o terminal estaria logando algo como "indicador lento, otimize-o".

Realmente, não recebi esse tipo de erro de indicador lento. Existe alguma documentação de como usar corretamente o Debugger do Editor? Pois ainda estou, de forma arcaica, usando Prints pra debugar... Não consigo colocar breakpoints nos códigos pra analisar.

Razão: