Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1213

 

Saúde! Ajuda :)

Do indicador (mt5) um histórico de carrapatos é copiado para processamento posterior. Eu copiei o algoritmo do livro de referência, só o mudei um pouco:

         int     attempts = 0;
         bool    success = false;
         MqlTick tick_array[];
         datetime startCopyTime = (copyTickTime < periodStartTime) ? periodStartTime : copyTickTime;
         datetime checkPoint;

         while(attempts < 3) {
            uint start = GetTickCount();
            checkPoint = TimeCurrent();
            int received = CopyTicks(_Symbol, tick_array, COPY_TICKS_ALL, startCopyTime, ticksSizeToCopy);
            if(received != -1) {
               PrintFormat("%s: received %d ticks in %d ms", _Symbol, received, GetTickCount() - start);
               if(GetLastError() == 0) {
                  success = true;
                  break;
               } else
                  PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
                              _Symbol, received, GetTickCount() - start, _LastError);
            }
            attempts++;
         }
         if(!success) {
            PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток", ticksSizeToCopy, _Symbol);
            return;
         }
         copyTickTime = checkPoint;

Mas recebi um aviso, a história do tick está fora de sincronia:

2020.07.12 10:07:12.092 Volumes (GBPUSD,H1)     GBPUSD: Ticks are not synchronized yet, 10103745 ticks received for 532 ms. Error=4403

E no manual diz:

ERR_HISTORY_TIMEOUT

4403

Tempo limite excedido a pedido do histórico

A intuição do Capitão me diz para sincronizar os carrapatos. é este o ponto que estou tentando fazer? Como fazer isso? Ou é possível trabalhar sem muito dano, mesmo sem sincronização, apenas removendo a verificação de sucesso ?

 
Yevhenii Levchenko:

Saúde! Ajuda :)

Um histórico de carrapatos é copiado de um indicador (mt5) para processamento posterior.

Os indicadores têm acesso assíncrono aos dados do histórico, enquanto os Expert Advisors e os scripts têm acesso síncrono, ou pelo menos é assim que os desenvolvedores de programas MQL chamam o comportamento quando trabalham com dados

em linguagem humana, ao acessar os dados do histórico no indicador, você precisa sair do ciclo de cálculo com um erro, e depois de um tempo você precisa reaplicar ao histórico

E não faz sentido chamar o histórico no indicador várias vezes em loop - este método funciona apenas em Expert Advisors e scripts

 
Igor Makanu:

Em indicadores acesso assíncrono a dados históricos, em Expert Advisors e scripts - acesso síncrono, ou pelo menos é assim que os desenvolvedores chamam o comportamento dos programas MQL quando trabalham com dados

em linguagem humana, ao acessar os dados do histórico no indicador, você precisa sair do ciclo de cálculo com um erro, e depois de um tempo você precisa reaplicar ao histórico

e não faz sentido chamar a história várias vezes no indicador - este método funciona apenas em Expert Advisors e scripts

Obrigado!

O sincronismo está relacionado à multithreading? "Os bilhetes ainda não estão sincronizados" - parece mais um aviso?

 
ANDREY:

Bobagem... Você não é bom em lógica, você não é bom em matemática ..... e, ao mesmo tempo, você moderou por muito tempo e com sucesso um fórum cujo tema é permeado tanto pela lógica quanto pela matemática.

Onde eu disse que não sou bom em lógica?

 
ANDREY:

Acho que o conhecimento possuído por um grupo de especialistas não era o conhecimento da própria Ford e nunca se tornou isso. Além disso - ele não tinha necessidade deste conhecimento, porque o chamava de desnecessário. E se esses especialistas tentassem transmitir seus conhecimentos à Ford, ele não seria capaz de assimilá-los e utilizá-los para fins práticos. É necessário ter mais do que uma idéia geral do assunto, que está associada a novos conhecimentos, a fim de absorvê-lo. No exemplo dado acima, os especialistas não forneceram conhecimentos para a Ford, mas para os advogados.

E em seu cérebro, como me parece, você tem uma quantidade suficiente de conhecimento sistematizado em matemática e lógica e este kit lhe permite formular rápida e corretamente uma consulta de busca por novas e ausentes informações e interpretá-las rápida e corretamente. Tenho certeza de que em seu cérebro não pode haver tais informações, já que todos os dias, durante muitas horas, passou neste fórum e passou por seu cérebro muitas informações associadas especificamente à matemática e à lógica. É como aprender uma língua estrangeira por imersão. É aprendido automaticamente, espontaneamente e talvez até contra a vontade do aprendiz.

Se 100 acadêmicos começarem a me explicar as regras de cálculo das equações integrais, eu não aprenderei como fazê-lo até que eles encham minha cabeça com todos os livros de matemática e álgebra, que eu tive que estudar na escola antes que o professor começasse a explicar as equações integrais.

Se você não entende o que é uma variável e para que serve, é difícil entender mesmo sabendo o que é uma variável, para não falar de outros conceitos que não são nem mesmo muito complicados.

Ford não disse que lhe seria ensinado o que é certo em sua área de interesse. Ele disse que estava cercado de tantos especialistas em diferentes campos que podia obter respostas às perguntas que precisava a qualquer momento. Por que um gerente precisa saber o que 200 especialistas podem saber, cada um deles dará a resposta certa em sua área? É impossível saber tudo em princípio. Mas para obter rapidamente as respostas para os problemas que você precisa com a ajuda de especialistas - era disto que a Ford estava falando, era isto que eu dizia sobre livros de referência e usando as informações corretas. E isso é em alguma área estreita que esse recurso oferece na forma de CodeBase e um fórum.

 
Yevhenii Levchenko:

Obrigado!

A sincronização está relacionada à multithreading? "Os bilhetes ainda não estão sincronizados" acaba sendo mais um aviso?

não

Os desenvolvedores implicam que o sincronismo significa algum tipo de processamento garantido de dados históricos ao chamar funções de histórico, mas não garante que os dados sejam necessariamente devolvidos quando as consultas são feitas

... aqui está a língua não-humana ))))


assíncrono é uma consulta e dados ou um erro. Após a ocorrência de um erro, a sincronização começa, mas o tempo final de sincronização (ou edifício TF) é desconhecido e, devido ao alto desempenho do MT5, você recebe um erro toda vez em vez de dados sincronizados

ZS: em MT5 tudo é complicado lá.... Ao solicitar o histórico você tem que sincronizar o servidor - terminal e depois o terminal - MQL-programa, alguém pode não ter prazos prontos ou dados de tick

 
Igor Makanu:

não

Os desenvolvedores implicam que a sincronização é algum tipo de processamento garantido de dados históricos ao chamar funções de histórico, mas não garante necessariamente o retorno dos dados quando consultados...

... aqui está a língua não-humana ))))


assíncrono é uma consulta e dados ou um erro. Após a ocorrência de um erro, a sincronização começa, mas o tempo final de sincronização (ou edifício TF) é desconhecido e, devido ao alto desempenho do MT5, você recebe um erro toda vez em vez de dados sincronizados

ZS: em MT5 tudo é complicado lá.... Ao solicitar o histórico você deve sincronizar o servidor - terminal e depois o terminal - MQL-programa, alguém pode ter tempos não prontos ou dados de tick

A resposta mais fácil é algo como isto:

Para esperar pela sincronização no indicador, você deve simplesmente sair da OnCalculate() com retorno 0 após receber um erro;

Neste caso, o primeiro acesso aos dados históricos inicia o processo de sincronização de dados e só resta verificar sua conclusão. Se houver um erro ao receber dados, então retornar zero - já que zero indica a quantidade de dados já calculados na chamada anterior (pré-calculada), e na chamada atual e carregamento bem sucedido dos dados históricos OnCalculate() será calculado sobre toda a profundidade do histórico (já que ao retornar 0 indicamos na chamada anterior que nada foi calculado).

 
a.lxrn:

Boa tarde a todos, podem me ajudar a resolver este problema, o problema está na lógica, eu quebrei meu cérebro hoje e cheguei a um ponto em que estou em uma confusão.

Eu escrevi uma amostra de código elementar, há um sinal se o fechamento da vela for maior que o do vagão, uma ordem é aberta.

O sinal permanecerá e continuará verdadeiro por muito tempo. Tenho certeza de que você sabe o que quero dizer,

Na verdade, como devo fazer um sinal para comprar um pedido aberto e pronto, até que a situação mude e o preço fechado seja menor que o preço da onda.

Posso usar bandeiras, mas elas não salvarão o pedido quando ele fechar e abrir ou atrasar por 15 minutos. É ainda mais frio quando as condições de abertura e fechamento de pedidos são verdadeiras ao mesmo tempo. A cada pedido)))) As bandeiras são se o sinal para abrir a ordem for verdadeiro e a bandeira de que a ordem está aberta for falsa, então nós abrimos a ordem. E se a bandeira de que a ordem está aberta for verdadeira, a ordem não será aberta). Um atraso é mais fácil e mais eficiente. Após o fechamento do pedido, estabelecemos um atraso.

 
Igor Makanu:

assíncrono é uma consulta e dados ou um erro, e após um erro a sincronização começa, mas o tempo do fim da sincronização (ou edifício TF) é desconhecido e devido ao alto desempenho do MT5 você recebe um erro toda vez que você chama novamente em vez de dados sincronizados

ZS: em MT5 tudo é complicado lá.... Você tem um servidor, um terminal e finalmente nosso programa MQL. Ao solicitar o histórico necessário para sincronizar servidor - terminal e depois o terminal - programa MQL, alguém pode ter prazos não prontos ou dados de tick


Aproximadamente... Obrigado :)

Artyom Trishkin:

Foi mais fácil responder aproximadamente desta forma:

Para esperar pela sincronização em um indicador, você tem que sair da OnCalculate() com retorno 0 após receber um erro;

Neste caso, o primeiro acesso aos dados históricos inicia o processo de sincronização de dados e só resta verificar sua conclusão. Se houver um erro ao receber os dados, então retornar zero - já que zero indica a quantidade de dados já calculados na chamada anterior (pré-calculada), e na chamada atual e carregamento bem sucedido dos dados históricos OnCalculate() será calculado sobre toda a profundidade do histórico (já que, retornando 0, indicamos assim na chamada anterior que nada foi calculado).

Mais simples não significa mais claro :)

Mudou para instrumentos em estoque e só foi impresso uma vez que eles estavam dessincronizados. Consultas subseqüentes não mostraram nada mais como isso.

Você pode me dizer por que o testador não mostra volumes?
 
Yevhenii Levchenko:

Entendido de forma grosseira... Obrigado :)

Mais simples não significa mais claro :)

Mudou para instrumentos em estoque e só foi impresso uma vez que eles estavam dessincronizados. Consultas subseqüentes não mostraram nada mais como isso.

Você pode me dizer por que o testador não mostra volumes?

Para manter os dados históricos em estado "quente" real, você precisa acessar esses dados uma vez a cada dois minutos usando qualquer uma das funções CopyXXX, iXXX, por exemplo CopyTime(), iTime(), etc...

Não sei que volumes você não recebe no testador. Há volumes reais e de carrapatos. Sem código, é impossível responder em essência.

Razão: