Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 919
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
O seu cálculo do indicador é do princípio ao fim (dos dados históricos mais recentes aos dados actuais mais recentes). Isto é uma indicação de indexação como nas séries cronológicas. Assim, as matrizes devem ser indexadas em conformidade, que é o que se tem.
O que há de errado?
Tudo funciona como o meu porto em MQL5 da MQL4, mas vejo que o código é feio por causa doArraySetAsSeries(), foi por isso que perguntei
aqui estão ambos os códigos
ensina-me a escrever este indicador para o MT5! - O meu código não é simpático, ponto final! )))
ZSZ não se lembra como escrever indicadores para o MT5, sentou-se e reescreveu-o em 40 minutos usando a Ajuda, mas o resultado ... imho, não tão bom ((!
Sim, tudo funciona exactamente como o meu porto em MQL5 da MQL4, mas vejo que o código é feio por causa doArraySetAsSeries(), por isso perguntei
aqui estão ambos os códigos
ensina-me a escrever este indicador para o MT5! - O meu código não é simpático, ponto final! )))
Quando se inverte o laço, é necessário fazer necessariamente as arrays timeseries, caso contrário a indexação dos buffers no laço não coincidirá com a indexação dos dados necessários - o índice do laço na matriz de buffers indicadores irá do início ao fim, enquanto que em aberto[], alto[], baixo[], fechado[] e outros - do fim ao início. Ou, pode inverter o laço para corresponder à sua indexação de arrays abertos[], altos[], baixos[], fechados[] e o resto com indexação de amortecedores, o que é mais complicado.
Se quiser uma alegoria para o tornar mais claro, aqui está uma alegoria para si:
Está de pé nos carris dos caminhos-de-ferro e a olhar para dois comboios. Ou vão numa direcção - ambos da esquerda para a direita (ArraySetAsSeries(array,true) - primeiro comboio e um laço do limite para 0 - segundo comboio),
Ou vão um para o outro - (ArraySetAsSeries(array,false) - da direita para a esquerda - primeiro comboio, e o loop do limite para 0 - da esquerda para a direita - segundo comboio)
E, sim: eu não olhei através do código - não quero descarregar, guardar (já há muito código desnecessário no fórum), compará-los uns com os outros...
Seria mais fácil colocá-los em códigos na mensagem - um e segundo - depois seria visível de imediato o quê a quê.
Ou inverter o laço para corresponder à sua indexação de arrays abertos[], altos[], baixos[], fechados[] e o resto, que é mais difícil.
Hoje estive toda a noite a inverter a situação, a minha paciência esgotou-se (((
Tanto quanto sei, o problema:
- em MT5, as matrizes que são atribuídas aos amortecedores indicadores são indexadas da esquerda para a direita por defeito;
- em séries temporais MT5abertas[], altas[], baixas[], fechadas[] disponíveis na OnCalculate() são sempre passadas indexadas da direita para a esquerda
- ou seja, com base nos passos 1 e 2, a fim de calcular o indicador desde o fim do histórico até à barra de zero
a) ou reatribuir a indexação das matrizes tampão
b) ou para fazer um laço no qual os elementos da matriz serão recalculados da esquerda para a direita, e num outro laço da direita para a esquerda:
isto é,não há uma solução bonita para a minha pergunta? opção a) - nas minhas fontes é implementada, opção b) - não vejo a utilidade de fazer cálculos extra
fontes:
MT5:
MT4:
Passei a noite toda, mas a minha paciência esgotou-se (((
na medida em que entendo o problema:
- em MT5, as matrizes que são atribuídas aos amortecedores indicadores são indexadas da esquerda para a direita por defeito;
- em séries temporais MT5abertas[], altas[], baixas[], fechadas[] disponíveis na OnCalculate() são sempre passadas indexadas da direita para a esquerda
- ou seja, com base nos passos 1 e 2, a fim de calcular o indicador desde o fim do histórico até à barra de zero
a) ou reatribuir a indexação das matrizes tampão
b) ou para fazer um laço no qual os elementos da matriz serão recalculados da esquerda para a direita, e num outro laço da direita para a esquerda:
ou seja,não há uma solução bonita para a minha pergunta? variante a) - no meu código fonte está implementado, variante b) - não vejo a utilidade de fazer cálculos extra
Todas as arrays são indexadas da direita para a esquerda. Portanto, para cumprir totalmente o loop da esquerda para a direita (e é da esquerda para a direita - do limite para 0), é necessário definir todas as arrays utilizadas para a indexação necessária : buffers em OnInit(), timeservers usados - em OnCalculate().
Ou, fazer o ciclo de 0 a limite, o que nem sempre é fácil de fazer quando o mql4 é portado para mql5.
Portanto, a opção ArraySetAsSeries() é melhor neste caso.
Todas as arrays são indexadas da direita para a esquerda. Portanto, para cumprir totalmente o loop da esquerda para a direita (e é da esquerda para a direita do limite para 0), é necessário definir todas as arrays utilizadas para a indexação necessária : buffers em OnInit(), timeservers usados - em OnCalculate().
Ou, tem de se fazer o ciclo de 0 a limite, o que nem sempre é fácil de fazer quando o mql4 é portado para mql5.
É por isso que, neste caso, o método ArraySetAsSeries() funciona melhor.
Veja, remova todos osArraySetAsSeries() do seu código(acima em Init() e OnCalculate() nas primeiras linhas) e corrija o laço:
for(i=0;i<limit;i++)
Teoricamente, tudo deve encaixar! Mas não! Os gráficos ficaram diferentes - isto é o que não consigo perceber!
Olha, removi todos osArraySetAsSeries() do meu código(no topo em Init() e em OnCalculate() nas primeiras linhas) e fixei o laço:
for(i=0;i<limit;i++)
Em teoria, tudo deve encaixar! Mas não! Os gráficos ficaram diferentes, e isso é o que não consigo perceber!
Digo-vos - é mais complicado do que isso. É preciso mudar a lógica. Não é suficiente apenas inverter o laço.
Aqui está um pequeno exemplo: no código há
Buf_NTLine1[i+1])
Para onde irá o índice i+1 quando as arrays forem indexadas de forma diferente?
E há muito disso. IHighest() - início e número. Onde é que começa com uma indexação e onde é que começa com outra?
E assim por diante ...
e há muito disso. IHighest() - início e número de... Onde começa numa indexação e na outra?
oh meu! isso mesmo! bem feito!! sim, essa é a parte complicada!!!
Sim... muitas diferenças no MT5, muitos controlos e todo o tipo de precauções na cabeça do programador...
Quando a vi não há muito tempo, recebi uma mensagem de que em MT5 nem sempre tudoé inicializado correctamente emInit(), parece queInit() pode terminar mesmo que os prazos não estejam prontos.
Vi um bug ontem: se este indicador no MT5 muda de intervalo de tempo, por vezes os buffers indicadores podem não estar vazios - parece que os valores antigos permanecem se não atribuir um valor específico a cada elemento da matriz de indicadores no OnCalculate(), tenteicolocar o ArrayInitialize(arr, 0.0) noInit()- também funciona, depois não...
tanto quanto eu entendo correctamente:
- em MT5, na inicialização emInit(), os amortecedores indicadores não são inicializados automaticamente? (em MT4 não me lembro de nada que tenha ficado em amortecedores)
- em MT5 noInit() os tamanhos das matrizes tampão podem ser desconhecidos se o histórico não for carregado, é por isso queo ArrayInitialize(arr, 0.0) também nem sempre inicializa os amortecedores correctamente?
Raios! É isso mesmo! Muito bem!!! Sim, essa é a parte divertida!!!
Sim... Há muitas diferenças no MT5, o programador tem muitos controlos e todo o tipo de precauções...
Quando o vi não há muito tempo, recebi uma mensagem de que em MT5 nem sempre tudoé inicializado correctamente emInit(), parece queInit() pode terminar mesmo que os prazos não estejam prontos.
Vi um bug ontem: se este indicador no MT5 muda de intervalo de tempo, por vezes os buffers indicadores podem não estar vazios - parece que os valores antigos permanecem se não atribuir um valor específico a cada elemento da matriz de indicadores no OnCalculate(), tenteicolocar o ArrayInitialize(arr, 0.0) noInit()- também funciona, depois não...
tanto quanto eu entendo correctamente:
- em MT5, na inicialização emInit(), os amortecedores indicadores não são inicializados automaticamente? (em MT4 não me lembro de nada que tenha ficado em amortecedores)
- em MT5 noInit() os tamanhos das matrizes tampão podem ser desconhecidos se o histórico não for carregado, é por isso queo ArrayInitialize(arr, 0.0) também nem sempre inicializa os amortecedores correctamente?
Não entrou realmente na lógica da mesma.
Não entrou realmente na lógica da mesma.
Este é o caminho certo a seguir: não colocar pontos de entrada ao preço máximo/minuto - melhor ao preço de abertura.
E as linhas devem ser removidas - para que é que estão na tabela? Nem que seja apenas para arrastar uma paragem sobre eles?
declaração sem tipo
Se eu compilar um ficheiro de inclusão, não há erro. Se eu compilar o ficheiro principal do programa onde incluo este ficheiro, há uma declaração sem erro de tipo. Não vê o objecto declarado no ficheiro protegido *objecto CSomeClass *object. O ficheiro include tem a directiva #include "SomeClass.mqh". E no ficheiro principal, é criado um objecto da classe do ficheiro incluído e um dos métodos é chamado.