Bug MQL5 quando se trabalha com acesso iClose/iOpen timeseries, etc. - página 10

 
fxsaber:

Bobagem.

+1
 
fxsaber:

Bobagem.

Desde que "de repente" (c) não haja nenhuma questão de desempenho limitado do sistema (não importa qual).

 

Hoje em dia, tenho olhado mais de perto para a OnCalculate e feito um tick no tratamento de dados. Antes foi escrito que tudo é feito para evitar o "congelamento" de indicadores escritos incorretamente, mas se realmente quisermos processar todo o fluxo de dados de carrapatos desde a chamada anterior da OnCalculate, então a um rápido movimento de preços (e rollback) devemos obter uma matriz bastante "profunda", há alguma limitação na profundidade da matriz de carrapatos?

Eu não gostaria de ouvir uma resposta, como "OnCalculate receberá um carrapato(s) acumulado(s)..., para otimizar...".

Quem já está analisando dados de carrapatos, existe algum motivo para tais preocupações?

 
Farkhat Guzairov:

Hoje em dia, tenho observado como a OnCalculate e tick data processing funciona. Antes foi escrito que tudo é feito para evitar o "congelamento" de indicadores escritos incorretamente, mas se realmente quisermos processar todo o fluxo de dados de carrapatos desde a chamada anterior da OnCalculate, então a um rápido movimento de preços (e rollback) devemos obter uma matriz bastante "profunda", há alguma limitação na profundidade da matriz de carrapatos?

Eu não gostaria de ouvir uma resposta, como "OnCalculate receberá um carrapato(s) acumulado(s)..., para otimizar...".

Quem já está analisando dados de carrapatos, há alguma razão para tais medos?

Em 2008-2009 Renat uma vez escreveu que não há felicidade em carrapatos, ele deu um exemplo de um especialista. As carteiras são puladas de qualquer forma. Se você precisar, obtenhahttps://www.mql5.com/ru/docs/series/copyticks em cada chamada, mas você ainda perderá o 50/50 superior ou inferior que você deseja entrar.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
[in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики...
 

Só vou aparecer aqui por uma questão de publicidade. Há um mês venho tentando descobrir porque isto parou de funcionar:

long lastbardaytime=0;

int OnInit(){ 
}

bool isNewBar(string symbol_,ENUM_TIMEFRAMES period_){
    long curbar = SeriesInfoInteger(symbol_,period_,SERIES_LASTBAR_DATE)%86400;
    if(lastbardaytime == 0){
        lastbardaytime = curbar;
    }
    if(lastbardaytime != curbar){
        lastbardaytime = curbar;
        return(true);
    }
    return(false);
}


void OnTick(){
    if(isNewBar(MIX-12.18,PERIOD_M1)){ 
        Print("New bar");
///....
    }
} 


Aguardando o novo lançamento na Abertura.

 

Resumir questões relacionadas à otimização e carregamento de dados históricos.

1. O problema do trabalho correto das funções iClose/iOpen, e neste caso o iTime, existe e eu acho que não faz sentido esperar que tudo seja perfeito. Talvez eles devam ser simplesmente retirados da MQL5 para evitar cometer os mesmos erros novamente? (tenho um problema, mas não tenho tempo para descrevê-lo, porque encontrei uma solução, outra "reviravolta")

Talvez haja uma solução, mas eu gostaria que ela fosse documentada e não outra reviravolta da comunidade MQL5. Estamos falando de como lidar com as solicitações assíncronas, que por sua vez sincronizam os bancos de dados locais, por exemplo:

Nos indicadores a função CopyTicks() retorna o resultado imediatamente: Quando chamado de um indicador, CopyTick() retornará imediatamente os ticks disponíveis por símbolo, e também começará a sincronizar o banco de dados de ticks se não houver dados suficientes. Todos os indicadores em um símbolo funcionam em uma única linha comum, portanto o indicador não tem o direito de esperar pela conclusão da sincronização. Uma vez concluída a sincronização, a chamada subseqüente para CopyTicks() devolverá todos os ticks solicitados. A função OnCalculate() nos indicadores é chamada após cada tick recebido.


A frase chave é"Após terminar a sincronização, a próxima chamada do CopyTicks() retornará todos os ticks solicitados. ", senhores, como sabem quando a sincronização está terminada?? É escrito como se antes do final da sincronização CopyTicks() retornasse por exemplo -1, mas este não é o caso. Como resultado, após algumas recargas o indicador DB sincroniza e estamos realmente recebendo todo o conjunto de dados, mas se eu não estiver recarregando o indicador não estou recebendo este conjunto de dados, porque eu não sei o resultado de terminar esta maldita sincronização.

Um exemplo marcante foram os últimos golpes, houve um movimento brusco no EURUSD, embora o indicador estivesse ligado durante todo esse tempo e meio que tornou esse período normal, mas depois que eu o tinha recarregado (alterado os parâmetros de entrada), o indicador começou a refletir informações incorretamente, respectivamente foram iniciadas buscas por erros no indicador (recompilados e recarregados várias vezes), mas nada ajudou, e então esse "milagre" aconteceu, "Quandovocê chama CopyTick() de um indicador, ele retornará imediatamente os ticks disponíveis para o símbolo, e também inicia a sincronização da base de ticks", talvez você deva criar (ou ter) uma função que possa nos dizer que no momento em que a sincronização do banco de dados local não estiver concluída, esta função facilitaria nossa tarefa e nos permitiria escrever um produto de melhor qualidade para o Mercado.

P.S.: A função SymbolInfoTick infelizmente não tem esta funcionalidade.

 

Infelizmente, este exemplo nem sempre funciona:

//--- запросим тиковую историю с момента 1970.01.01 00:00.001 (параметр from=1 ms) 
      int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks); 
      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); 
        } 

Para ser exato, funciona 1-2 vezes em cada 10 vezes.

Mas na situação descrita acima, não funcionou nem mesmo uma vez.

 

Novamente uma pergunta, o banco de dados é atualizado em tempo real?

Como escrevi acima, todo o período que foi problemático, o indicador funcionou, ou seja, a função CopyTicks() foi chamada regularmente, mas, como se vê, não teve efeito sobre o banco de dados local.... Isto é estranho....

 
Unicornis:

Em 2008-2009, Renat escreveu certa vez que não há felicidade em carrapatos, dando o exemplo de um especialista. Os carrapatos são pulados como estão. Se necessário, obtenhahttps://www.mql5.com/ru/docs/series/copyticks em cada chamada, mas você ainda perderá o 50/50 top/trough que você quer entrar.

Quem não tem, e quem precisa :) para ter dados reais, em particular carrapatos.
 
Farkhat Guzairov:

Resumindo questões relacionadas à otimização e ao carregamento de dados históricos.

1. O problema com o funcionamento correto das funções iClose/iOpen, e neste caso o iTime, provavelmente existe e não há razão para esperar que tudo seja perfeito. Talvez eles possam ser simplesmente removidos da MQL5 para evitar a repetição dos mesmos erros? (tenho um problema, mas não tenho tempo para descrevê-lo, porque encontrei uma solução, outra "reviravolta")

Talvez haja uma solução, mas eu gostaria que ela fosse documentada e não outra reviravolta da comunidade MQL5. Estamos falando de como lidar com as solicitações assíncronas, que por sua vez sincronizam os bancos de dados locais, por exemplo:

Nos indicadores a função CopyTicks() retorna o resultado imediatamente: Quando chamado de um indicador, CopyTick() retornará imediatamente os ticks disponíveis por símbolo, e também começará a sincronizar o banco de dados de ticks se não houver dados suficientes. Todos os indicadores em um símbolo funcionam em uma única linha comum, portanto o indicador não tem o direito de esperar pela conclusão da sincronização. Uma vez concluída a sincronização, a chamada subseqüente para CopyTicks() devolverá todos os ticks solicitados. A função OnCalculate() nos indicadores é chamada após cada recebimento de tick.


A frase chave é"Após terminar a sincronização, a próxima chamada do CopyTicks() retornará todos os ticks solicitados. ", senhores, como sabem quando a sincronização está terminada?? É escrito como se antes do final da sincronização CopyTicks() retornasse por exemplo -1, mas este não é o caso. Como resultado, após algumas recargas o indicador DB sincroniza e estamos realmente recebendo todo o conjunto de dados, mas se eu não estiver recarregando o indicador não estou recebendo este conjunto de dados, porque eu não sei o resultado de terminar esta maldita sincronização.

Um exemplo marcante foram os últimos golpes, houve um movimento brusco no EURUSD, embora o indicador estivesse ligado durante todo esse tempo e meio que tornou esse período normal, mas depois que eu o tinha recarregado (alterado os parâmetros de entrada), o indicador começou a refletir informações incorretamente, respectivamente foram iniciadas buscas por erros no indicador (recompilados e recarregados várias vezes), mas nada ajudou, e então esse "milagre" aconteceu, "Quandovocê chama CopyTick() de um indicador, ele retornará imediatamente os ticks disponíveis para o símbolo, e também começará a sincronizar a base de ticks", talvez você deva criar (ou ter) uma função que possa nos dizer que no momento em que a sincronização do banco de dados local não estiver concluída, esta função facilitaria nossa tarefa e nos permitiria escrever um produto final melhor para o Mercado.

P.S.: A função SymbolInfoTick infelizmente não tem esta funcionalidade.

O que a SERIES_SYNCHRONIZED retorna em tais casos?