Boa noite.
Estou com dificuldades para entender onde pode estar o erro na lógica para plotar uma linha atráves de uma condição de um histograma.
Acontece o seguinte, quando atinge o valor e retorna abaixo desse valor especificado, ele move a linha, mas não devolve para a posição anterior, já que o valor não terminou dentro do pedido pela condição.
E outro erro, que acho ser só no testador de estatégia, ele plota a linha um candle a frente do que deveria, mas não percebi isso no gráfico normal.
Vou deixar o código e um print que sinalizei como acontece.
Edit: Uma coisa que esqueci de comentar, se removo o indicador e adiciono novamente, ele calcula certo as linhas.
Qual seria o comando para forçar recalcular?
Me parece um indicador de "Tempo Real", já que apenas 2 linhas são usadas.
- Sugiro retirar a movimentação das linhas de dentro do WHILE. Apenas guarde a última referência válida para a pintura.
- Saindo do WHILE você terá a variável final que vc usará para mover as linhas.
- Use logo após ChartRedraw().
Me parece um indicador de "Tempo Real", já que apenas 2 linhas são usadas.
- Sugiro retirar a movimentação das linhas de dentro do WHILE. Apenas guarde a última referência válida para a pintura.
- Saindo do WHILE você terá a variável final que vc usará para mover as linhas.
- Use logo após ChartRedraw().
Eu fiz 2 testes, e não funcionou, e não sei se era o que vc sugeriu.
Pode ser um tipo de lógica simples, mas confesso que estou com uma tremenda dificuldade para aprender a elaborar esse tipo de lógica.
O primeiro teste, apenas criei uma variável para guardar a posição de [ i ], e tirei todo o conteúdo para fora do while.
// ######### Condição para plotar as linhas //if(Period() == PERIOD_M1){ // if(wBuffer[i] >= 91500){ // wColor[i] = 2; //Color White // ObjectMove(0,"HighLineM1",0,TimeCurrent(),high[i]); // } // if(wBuffer[i] <= -91500){ // wColor[i] = 2; // ObjectMove(0,"LowLineM1",0,TimeCurrent(),low[i]); // //ChartRedraw(); // } //} // ##################################### pos = i; i++; } ChartRedraw(); // ######### Não pinta de branco e não plota as linhas if(Period() == PERIOD_M1){ if(wBuffer[pos] >= 91500){ wColor[pos] = 2; //Color White ObjectMove(0,"HighLineM1",0,TimeCurrent(),high[pos]); } if(wBuffer[pos] <= -91500){ wColor[pos] = 2; ObjectMove(0,"LowLineM1",0,TimeCurrent(),low[pos]); } } // ##################################### return(rates_total); }
No segundo teste, criei mais 2 variáveis do tipo int para guardar o evento caso se confirma-se.
// ######### Condição para plotar as linhas if(Period() == PERIOD_M1){ if(wBuffer[i] >= 91500){ posU = 1; //Guardando o evento //wColor[i] = 2; //Color White //ObjectMove(0,"HighLineM1",0,TimeCurrent(),high[i]); } if(wBuffer[i] <= -91500){ posD = -1; //wColor[i] = 2; //ObjectMove(0,"LowLineM1",0,TimeCurrent(),low[i]); //ChartRedraw(); } } // ##################################### pos = i; i++; } ChartRedraw(); // ######### Não pinta o histograma e plota as linhas uma sobre a outra. if(posU == 1){ wColor[pos] = 2; //Color White ObjectMove(0,"HighLineM1",0,TimeCurrent(),high[pos]); } if(posD == -1){ wColor[pos] = 2; ObjectMove(0,"LowLineM1",0,TimeCurrent(),low[pos]); } // ##################################### return(rates_total); }
No total declarei essas variáveis acima do while.
int posU = 0;
int posD = 0;
int pos;
Onde em tudo eu errei?
Eu fiz 2 testes, e não funcionou, e não sei se era o que vc sugeriu.
Pode ser um tipo de lógica simples, mas confesso que estou com uma tremenda dificuldade para aprender a elaborar esse tipo de lógica.
O primeiro teste, apenas criei uma variável para guardar a posição de [ i ], e tirei todo o conteúdo para fora do while.
No segundo teste, criei mais 2 variáveis do tipo int para guardar o evento caso se confirma-se.
No total declarei essas variáveis acima do while.
int posU = 0;
int posD = 0;
int pos;
Onde em tudo eu errei?
E, tem que testar, não me lembro o comportamento, mas o ObjectMove() precisa receber o Time da barra e não simplesmente o TimeCurrent(), ou seja, em um timeframe de M5, seria 2020.01.24 16:05:00, e não 2020.01.24 16:05:17. Estou desconfiado apenas, não tenho certeza... O MQL5 tem muitas dessas pegadinhas...
;)
E, tem que testar, não me lembro o comportamento, mas o ObjectMove() precisa receber o Time da barra e não simplesmente o TimeCurrent(), ou seja, em um timeframe de M5, seria 2020.01.24 16:05:00, e não 2020.01.24 16:05:17. Estou desconfiado apenas, não tenho certeza... O MQL5 tem muitas dessas pegadinhas...
;)
Para pintar o histograma, a coloração precisa ficar dentro do while mesmo.
Criei uma variável do tipo MqlDateTime para puxar o minuto e também não funcionou.
Com esse código modificado abaixo, ficou como no print em anexo, as linhas sobrepostas.
// ######### Condição para plotar as linhas if(Period() == PERIOD_M1){ if(wBuffer[i] >= 91500){ posU = 1; wColor[i] = 2; //Color White //ObjectMove(0,"HighLineM1",0,TimeCurrent(),high[i]); } if(wBuffer[i] <= -91500){ posD = -1; wColor[i] = 2; //ObjectMove(0,"LowLineM1",0,TimeCurrent(),low[i]); } } // ##################################### pos = i; i++; } // ######### Movendo a coloração para dentro do while, voltou a pintar o candle, mas linhas sobrepostas if(posU == 1){ // wColor[pos] = 2; //Color White ObjectMove(0,"HighLineM1",0,candle.min,high[pos]); //Criei uma variável candle / MqlDateTime candle; TimeCurrent(candle); / //ChartRedraw(); } if(posD == -1){ //wColor[pos] = 2; ObjectMove(0,"LowLineM1",0,0,low[pos]); // ChartRedraw(); } ChartRedraw(); // ##################################### return(rates_total);
E no código original com o erro de movimento, quando não ultrapassa o valor estipulado, plota no lugar correto e fica ali como no print.
Para pintar o histograma, a coloração precisa ficar dentro do while mesmo.
Criei uma variável do tipo MqlDateTime para puxar o minuto e também não funcionou.
Com esse código modificado abaixo, ficou como no print em anexo, as linhas sobrepostas.
E no código original com o erro de movimento, quando não ultrapassa o valor estipulado, plota no lugar correto e fica ali como no print.
Não é só vc usar:
time[pos]
pra pegar o tempo?
E, leia a documentação do ChartRedraw().
Basta 1 unica vez depois de mover os elementos do gráfico...
E, leia a documentação do ChartRedraw().
Basta 1 unica vez depois de mover os elementos do gráfico...
Eu estava só testando individualmente o ChartRedraw(), não deixava todos habilitados.
Sobre a hora, não tem o que faça, sempre o resultado é o mesmo, time[pos] também não funcionou e outros que tentei.
No indicador de pintar candle que tenho, tem as condições para pintar, e o else no final caso termine sem validar as anteriores, vai para um valor padrão
Nesse aqui não sei fazer um else onde buscaria a posição anterior como o valor padrão.
Por data/time não está fazendo efeito nenhum.
Eu gostaria que funciona-se rápido o indicador, mas também não me queixo de um pouco de dificuldade, afinal estou aprendendo ainda, só tenha paciência com o novato :)

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Boa noite.
Estou com dificuldades para entender onde pode estar o erro na lógica para plotar uma linha atráves de uma condição de um histograma.
Acontece o seguinte, quando atinge o valor e retorna abaixo desse valor especificado, ele move a linha, mas não devolve para a posição anterior, já que o valor não terminou dentro do pedido pela condição.
E outro erro, que acho ser só no testador de estatégia, ele plota a linha um candle a frente do que deveria, mas não percebi isso no gráfico normal.
Vou deixar o código e um print que sinalizei como acontece.
Edit: Uma coisa que esqueci de comentar, se removo o indicador e adiciono novamente, ele calcula certo as linhas.
Qual seria o comando para forçar recalcular?