Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 985

 

fazer { ... código de enchimento tampão

}

enquanto(estes dois valores não correspondem)

em resumo, obter os valores no laço até que coincidam, só depois executar o seguinte código
 
Maxim Dmitrievsky:

fazer { ... código de enchimento tampão

}

enquanto(estes dois valores não são os mesmos)

Em suma, obter os valores no laço, até que sejam os mesmos, só então executar o seguinte código

A questão é que até um indicador funcionar, os dados (fluxo) não são passados para o outro, ou seja, o laço no indicador sem oOnCalculate deste indicador não ajudará. E assim que o OnCalculate estiver terminado, os dados são passados ao Consultor Especialista, e está errado.

Ou talvez eu não compreenda a sua ideia.
 
Aleksey Vyazmikin:

Portanto, a questão é que até que um indicador funcione, os dados (fluxo) não são transferidos para outro, ou seja, o laço no indicador sem a terminação do OnCalculate deste indicador não vai ajudar.

recebe valores de amortecedores de outros indicadores um a um, se o seu número não for o mesmo, recebe-os novamente até que seja o mesmo, esqueça as correntes. Mas em geral, ninguém o faz desta forma - é muito lento

 
Aleksey Vyazmikin:

Portanto, a questão é que até que um indicador funcione, os dados (fluxo) não são passados para outro, ou seja, o laço no indicador sem o OnCalculate deste indicador não ajudará. Mas assim que o OnCalculate está terminado, os dados são passados ao Consultor Especialista, e estão errados.

Ou não compreendo a sua ideia.

é necessário que a condição seja preenchida, então apenas os amortecedores serão preenchidos, como eu entendo (o número de barras nos amortecedores de outros indicadores será o mesmo)

cumprir à força todas as condições antes de preencher os amortecedores do indicador actual

ou devolvê-lo ao programador errado - porque devemos resolver os seus problemas no campo errado?

 
Maxim Dmitrievsky:

obtém-se os valores dos amortecedores de outros indicadores um a um, se o seu número não for o mesmo, obtém-se novamente até ser o mesmo, esquece os fluxos. mas em geral, ninguém o faz desta forma - é perversão de indicadores a partir de indicadores, muito lento

Maxim Dmitrievsky:

é necessário que a condição seja preenchida, então apenas os amortecedores serão preenchidos, como eu entendo (o número de barras nos amortecedores de outros indicadores será o mesmo)

Execução forçada de todas as condições antes que os amortecedores do indicador actual sejam preenchidos

ou devolvê-lo ao programador com uma mão má, porque devemos resolver os seus problemas no lugar errado?

Se o cálculo não estiver pronto a partir de outros indicadores, os valores serão zero, por isso não faz sentido forçar o preenchimento aqui, pode preencher os dados passados, mas com o mesmo efeito, pode solicitar dados não para a barra actual do indicador, mas para a barra passada, e então o código não deve ser alterado de todo.

Porque a situação no testador e na conta real é diferente, a simulação de Sono funciona de forma muito estranha, e o recálculo do indicador para 15 segundos escorrega apenas uma vez, enquanto que deve ocorrer a cada tique, ou a pedido, e ocorre não em 15 segundos, mas em 13, de acordo com o registo.

Além disso, o problema de sincronização é relevante, e seria bom acrescentar para tais situações a possibilidade de informar o indicador sobre a necessidade de passar o fluxo de dados para outros indicadores, sem os quais é impossível realizar mais cálculos - esta seria uma solução - o comando para passar o fluxo para outro indicador sem conclusão de cálculo.

Respectivamente, o Conselheiro Especialista deve esperar pelos dados do indicador e saltar ticks até que o cálculo completo seja feito; agora, ao tentar usar a declaração "enquanto", o resultado do cálculo fica suspenso/mais parado (ou seja, nada acontece, o testador fica ali parado), e isso também não é correcto.

É claro que informei o promotor, mas não tenho notícias dele há mais de um mês - o custo do freelancing.

 

a situação no testador e na conta real é diferente, a simulação do sono funciona de forma muito estranha, e o recálculo do indicador para 15 segundos ocorre apenas uma vez, enquanto que deve ocorrer a cada tique, ou a pedido, mas não em 15 segundos, mas em 13, de acordo com o registo.

Além disso, o problema de sincronização é relevante, e seria bom acrescentar para tais situações a possibilidade de informar o indicador sobre a necessidade de passar o fluxo de dados para outros indicadores, sem os quais é impossível realizar mais cálculos - esta seria uma solução - o comando para passar o fluxo para outro indicador sem conclusão de cálculo.

Respectivamente, o Conselheiro Especialista deve esperar pelos dados do indicador e saltar os ticks até ao fim do cálculo completo, mas agora, ao tentar usar adeclaração "enquanto" para esperar pelos resultados correctos do cálculo, congela/gota (ou seja, nada acontece, o testador apenas fica ali parado), e isto também não é correcto.

 

CaroArtyom Trishkin!

Espero sinceramente que, uma vez que determinou que as perguntas acima são para principiantes, já sabe a resposta e pode ajudar-me!

Estou à espera de uma resposta de um profissional.

 
Aleksey Vyazmikin:

CaroArtyom Trishkin!

Espero sinceramente que, uma vez que determinou que as perguntas acima são para principiantes, já sabe a resposta e pode ajudar-me!

Estou à espera de uma resposta de um profissional.

O único conselho que posso dar é o seguinte: o indicador deve sair OnCalculate() se não tiver recebido o número de barras requerido para o cálculo: if(rates_total<number of_bars required) return 0;

O Consultor Especialista deve verificar os dados recebidos do indicador, e se estes não forem iguais ao valor do indicador vazio, só então efectuar cálculos com os dados recebidos.

  1. No indicador, primeiro, os amortecedores são inicializados com um valor vazio (o que é - pode ser definido no indicador)
  2. No indicador (os amortecedores já estão preenchidos com um valor vazio), verificar o número de barras disponíveis (acima descrito)
  3. Se a verificação da disponibilidade das barras for aprovada, o ciclo de cálculo do indicador é executado com o preenchimento dos amortecedores com os valores necessários.
    ... ... ...
  4. No Expert Advisor, verifique quantas barras são calculadas pelo indicador (existe uma função padrão BarsCalculated())
  5. Obter dados a partir do indicador
  6. Depende do que obtemos - depende da lógica do seu TS
    1. Se o indicador é uma linha, então o seu valor vazio indica que ainda não foi calculado - não o tomamos para cálculos
    2. Se o indicador - setas, então existe outra lógica (porque o valor vazio é também os seus dados de funcionamento), por exemplo, se for um fractal, então verificamos a barra número 3, e a partir dos valores obtidos empurramos para trás.
  7. Bem, inclua a sua própria lógica e não culpe tudo sobre os Bugs do terminal.
  8. Antes de mais, verifico os Bugs comigo mesmo.
  9. E você?
 
Artyom Trishkin:

Só posso aconselhar: o indicador deve sair de OnCalculate() se não obtiver o número certo de barras para o cálculo: if(rates_total<number_of_bars required) return 0;

Obrigado pela dica, não há problema com a saída, mas não resolve a situação, fiz como um cálculo falhado por agora

if(barsch!=channel.BarsCalculated())return(counted_bars=rates_total-1);

E de alguma forma preenche os amortecedores e obtém dados de outros indicadores e os dados só são passados à EA quando uma condição é satisfeita. Ainda não verifiquei a exactidão dos dados, mas parece correcta. Ou talvez eu esteja errado e algo esteja definitivamente errado?

Artyom Trishkin:

O Consultor Especialista deve verificar os dados recebidos do indicador e, se não for igual ao valor do indicador vazio, só então efectuar cálculos com os dados recebidos.

O Expert Advisor efectua cálculos um à chegada de uma nova barra, e respectivamente, a tentativa de esperar pelo valor correcto do indicador leva a uma paragem do testador.

Artyom Trishkin:
  1. No indicador os amortecedores são primeiro inicializados com um valor vazio (o que é - pode ser definido no indicador)
  2. No indicador (os amortecedores já estão cheios com um valor vazio) verificar o número de barras disponíveis (descritas acima)
  3. Se a verificação da disponibilidade das barras for aprovada, o ciclo de cálculo do indicador é efectuado enchendo os amortecedores com os valores necessários
    ... ... ...
  4. No Expert Advisor, verifique quantas barras são calculadas pelo indicador (existe uma função padrão BarsCalculated())
  5. Obter dados a partir do indicador
  6. Depende do que obtemos - depende da lógica do seu TS
    1. Se o indicador é uma linha, então o seu valor vazio indica que ainda não foi calculado - não o tomamos para cálculos
    2. Se o indicador - setas, então existe outra lógica (porque o valor vazio é também os seus dados de funcionamento), por exemplo, se for um fractal, então verificamos a barra número 3, e a partir dos valores obtidos começamos.
  7. Bem, inclua a sua própria lógica e não culpe tudo sobre os Bugs do terminal.
  8. Antes de mais, procuro bugs comigo mesmo.
  9. E você?

1. é verdade.

2. e assim acontece. Este cálculo será correcto no próximo tick, mas quero receber o cálculo correcto no primeiro tick, porque o Expert Advisor não espera no loop por outros tick ou a expectativa não é comensurável com a minha paciência, ou seja, não é realista - há um erro.

3.

4. Claro que sim.

5. Sim, temos, mas o indicador precisa de receber dados de outros indicadores e esse é o problema!

6. 1-2. não é correcto colocar dados deliberadamente falsos no tampão indicador, apenas complicará a detecção de erro de algoritmo no código do Expert Advisor.

7. Estou a descrever tudo logicamente, mas não escrevi o indicador, por isso é-me difícil compreender qual é a razão, descrevi a manifestação razoável do indicador, nomeadamente a incapacidade de efectuar um cálculo sem receber valores tampão de outros indicadores, devido ao monopólio do fluxo de dados (os indicadores são calculados sequencialmente).

8. Já notei aqui e antes de não ser o autor, passei muito tempo - quase um dia - a identificar as razões.

9. E estou à procura de uma solução para o problema, além disso, se alguém se tiver confrontado com isto, pode rapidamente ajudar-me. Repito, nessa linha comecei a escrever por causa do Sono, e depois saíram as outras características do testador, que também acredito no erro.

Obrigado pela resposta.

 
Aleksey Vyazmikin:

Obrigado pela dica, não há problema com o resultado, mas não resolve a situação, até agora fiz como um cálculo falhado

E de alguma forma preenche os amortecedores e obtém dados de outros indicadores, os dados não são passados à EA até que a condição seja satisfeita. Ainda não verifiquei a exactidão dos dados, mas parece correcta. Ou talvez eu esteja errado e algo esteja definitivamente errado?

O Expert Advisor efectua o cálculo sozinho quando chega uma nova barra e, portanto, ao tentar esperar pelo valor correcto do indicador, leva a uma paragem do testador.

1.

E assim é. 2. Este cálculo será correcto no próximo tick, mas preciso de obter um cálculo correcto no primeiro tick, porque o meu Conselheiro Especialista não espera no loop por outros tick ou a expectativa não é comensurável com a minha paciência, ou seja, não é realista - há um erro.

3.

4. Claro que sim.

5. Sim, temos, mas o indicador precisa de receber dados de outros indicadores e esse é o problema!

6. 1-2. não é correcto colocar dados deliberadamente falsos no tampão indicador, apenas complicará a detecção de erro de algoritmo no código do Expert Advisor.

7. Estou a descrever tudo logicamente, mas não escrevi o indicador, por isso é-me difícil compreender qual é a razão, descrevi a manifestação razoável do indicador, nomeadamente a incapacidade de efectuar um cálculo sem receber valores tampão de outros indicadores, devido ao monopólio do fluxo de dados (os indicadores são calculados sequencialmente).

8. Já notei aqui e anteriormente que não sou o autor, passei muito tempo - quase um dia - a identificar as causas.

9. E estou à procura de uma solução para o problema, além disso, se alguém se tiver confrontado com isto, pode rapidamente ajudar-me. Repito, nessa linha comecei a escrever por causa do Sono, e depois saíram as outras características do testador, que também acredito no erro.

Obrigado pela resposta.

No OnInit() chamar a série cronológica do símbolo: iTime(Símbolo,Prazo,1);

Logo no início, em OnTick(), pedir a barra de tempo requerida das séries de tempo requeridas usando o iFunc() correspondente, ou se( iTime(Símbolo,Prazo,10)==0) retornar;

Neste caso, o Conselheiro Especialista não detectará um novo bar e esperará pelo próximo tick.

No OnInit() solicitámos os dados das séries cronológicas, activando assim a paginação de dados.

Em OnTick() verificamos se o histórico minimamente necessário está disponível para a EA e se ainda não estiver disponível, esperamos pelo próximo tick.

E até que todos os dados requeridos pelo Conselheiro Especialista sejam recebidos, este esperará pelo próximo tick.

Assim que todos os dados necessários forem bombeados e obtidos, o Conselheiro Especialista começará a trabalhar com a nova barra e com o histórico necessário.

Para manter os dados em série actualizados, é imperativo que sejam acedidos pelo menos uma vez de dois em dois minutos. Fazer um segundo temporizador durante cerca de um minuto e meio (90 segundos) e nele referir-se simplesmente a qualquer série de tempos do símbolo desejado, por exemplo iTime(Symbol,Timeframe,1); Sem verificar os dados recebidos - basta "agitar" o histórico. Então, todos os dados sobre o símbolo estarão sempre actualizados.