O que atualiza o RefreshRates() - página 6

 
Mikhail Nazarenko:

O MT4 é uma caixa escura e eu só posso julgar o que acontece lá testando em condições reais. Inicialmente eu não usava o sono de forma alguma, mas quando eu estava recebendo besteira em algumas barras de hora eu adicionei o sono e o problema desapareceu. Eu não sei em que ordem e como a série cronológica MT4 é atualizada. Não tenho certeza do que fazer com ele, vou usá-lo como uma oportunidade para consertar meu problema e compartilhá-lo com outros.

Eu mesmo tenho vivenciado este problema, tudo está bem no Testador de Estratégia, mas no mercado real não é nada.

Estou dirigindo o Expert Advisor desde segunda-feira e estou surpreso.

Abri várias aberturas lucrativas e depois voltei para comprar em vez de vender, e vice-versa.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Quaisquer perguntas de novatos sobre MQL4 e MQL5, ou quaisquer dicas e discussões sobre algoritmos e códigos

Vitaly Muzichenko, 2021.02.15 21:48

Eu já comecei a trabalhar com a MQL4 para verificar meu algoritmo.

Eu nunca tinha experimentado antes, não saberia como usá-lo desde que estou trabalhando nele há muitos anos e ainda o estou usando como descrevi acima. Código simples, apenas 2 buffers indicadores



O código é muito simples

   double poi=Point();
   for(int i = limit-2; i>0; i--) {
      if(open[i+0] > close[i+0] && MathAbs(open[i+0] - high[i+0]) < 0.1 * poi)
         Dn[i] = high[i+0] + 30 * poi;
      if(open[i+0] < close[i + 0] && MathAbs(open[i+0] - low[i+0]) < 0.1 * poi)
         Up[i] = low[i+0] - 30 * poi;
   }
 
Vitaly Muzichenko:

Eu mesmo já enfrentei isso, tudo está bem no testador, mas no mercado real é um lixo.

Estou dirigindo o EA desde segunda-feira e estou surpreso.

Estou surpreso. Algumas aberturas estão corretas, mas depois disso estou comprando novamente em vez de vender e vice-versa.


O código indicador é simples.

Este é o mesmo problema que eu tinha antes de iniciar esta linha. Eu fiz a função isRefresh() acima. Experimente. Funcionou bem para mim.

E não é um deslize?

 
Vitaly Muzichenko:

O código do indicador é simples

o indicador abre negócios?

as setas são as mesmas - o problema está no código EA

 
Mikhail Nazarenko:

Se você começar a ensinar, então ajude, confirme com código, testes, um link para um tópico do fórum ou documentação. Tudo o resto é apenas masturbação cerebral.

Por favor, esclareça o que ainda não está claro. Após a leitura, parecia que a questão principal estava resolvida e restava discutir o quão obsoleto é o 4).

Não tive problemas após a inserção de tal período de tempo

bool HistoryCheck(int TF)
  {
   int err=0;   
   int i=0;
   datetime d1=0,d2=0;
   while(i<10)
    { 
    if((d1=iTime(NULL,TF,0))==0 || (d2=iTime(NULL,TF,InpPeriod*2))==0)          
        PrintFormat("itime=0, %s, %s", TimeToString(d1),TimeToString(d2)) ; 
   err=GetLastError();    
   if(err==4066)    
    {
    	PrintFormat("Error=4066") ; 
    	 Sleep(500);     	
    }
   else break;	
      SleepA(100);
      i++;                 
    } // while
   if(i==10)
	 { Comment("Update failed. Go to the next attempt."); return(false); }
   PrintFormat("HistoryCheck %d , %s, %s",i,TimeToString(d1),TimeToString(d2)) ;
   Comment(""); 
   return(true);
  }

Se você precisar acessar o período de tempo raramente e irregularmente, você deve (mas não necessariamente se o gráfico estiver aberto) realizar esse carregamento novamente antes de verificar

  if((iTime(NULL,TF,0)+PeriodSeconds(TF))<TimeCurrent()
   || (iTime(NULL,TF,1)+PeriodSeconds(TF)*2)<TimeCurrent())
   HistoryCheck(TF)
Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
ChartOpen - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

Isto é a mesma coisa que encontrei antes de abrir este fio. Por alguma razão o terminal fornece dados desatualizados sobre a função real, escrevi isRefresh() acima. Experimente. Funcionou bem para mim.

Mas não é um deslize?

Não, ele abre em uma nova barra 0 e o sinal é procurado na barra fechada, ou seja, 1.

Esta é a situação às vezes quando uma EA não obtém o que é esperado através do iCustom(). Novamente: às vezes, mas não com freqüência.

Aqui está outro - um novo. Eu abri corretamente uma posição de compra de acordo com o sinal e o próximo sinal do indicador é também de compra (seta abaixo). Mas a EA viaiCustom() recebeu um sinal de venda e fechou a posição de compra e abriu a de venda, embora deva haver outra posição de compra aberta.

Algo está errado com as séries cronológicas, eu ainda não entendi, foi encontrado há 4 dias e provavelmente não vou tentar descobri-lo. Eu não vi nenhum problema no testador

Agora mesmo.

--- E eu acabei de encontrar


 

E também, mas já em vez de uma venda, uma compra está aberta. Como eu disse, não é frequente, mas acontece

O código do indicador é simples - não há complicações


 
Aleksey Mavrin:

Por favor, esclareça o que ainda não está claro. Depois de ler isto, parecia que a questão principal estava resolvida e ainda precisamos discutir o quão obsoleto é o 4)

Eu não tive nenhum problema depois de inserir os prazos carregados desta maneira

Se você precisar acessar raramente e irregularmente um período de tempo, você deve (mas não necessariamente se o gráfico estiver aberto) fazer esse carregamento novamente antes de verificar, ou tal verificação ajudará

Isto é correto,

isto é da ajuda:

Os dados do indicador e da série temporal são acessados independentemente do fato de que os dados solicitados estejam prontos (o chamado acesso assíncrono). Isto é crítico para o cálculo de indicadores personalizados, portanto, na ausência dos dados solicitados as funções como Copiar...() retornam imediatamente um erro. No entanto, ao acessar de Expert Advisors e scripts, várias tentativas de receber dados são feitas, com uma pequena pausa, que tem como objetivo fornecer o tempo necessário para baixar as séries de tempos necessárias ou para calcular os valores indicadores.


Se forem solicitadas informações de outro gráfico (nome do instrumento e/ou valor do cronograma diferente do atual), a situação pode ocorrer, quando não houver um gráfico apropriado aberto no terminal do cliente e os dados necessários tiverem que ser solicitados ao servidor. Neste caso, o erro ERR_HISTORY_WILL_UPDATED (4066 - dados históricos solicitados em estado de atualização) será colocado na variável _Last_error e a solicitação deverá ser novamente testada após algum tempo (ver ArrayCopySeries() exemplo).

 
Vitaly Muzichenko:

E também, mas já em vez de uma venda, uma compra está aberta. Como eu disse, não é frequente, mas acontece

O código do indicador é simples - não há complexidades


O método mais confiável é escrever o registro. A cada transação, escreva os valores das variáveis-chave no arquivo. Por experiência: a condição não estrita <=0 em vez de <0 introduziu uma curvatura terrível.

 
Vitaly Muzichenko:

Eu mesmo já enfrentei isso, tudo está bem no testador, mas no mercado real é um lixo.

Estou dirigindo o EA desde segunda-feira e estou surpreso.

Estou surpreso. Algumas aberturas estão corretas, mas depois disso estou comprando novamente em vez de vender e vice-versa.


O código indicador é simples

   double poi=Point();
   for(int i = limit-2; i>0; i--) {
      if(open[i+0] > close[i+0] && MathAbs(open[i+0] - high[i+0]) < 0.1 * poi)
         Dn[i] = high[i+0] + 30 * poi;
      if(open[i+0] < close[i + 0] && MathAbs(open[i+0] - low[i+0]) < 0.1 * poi)
         Up[i] = low[i+0] - 30 * poi;
   }


Por que eu acrescentaria 0 a [i + 0] ?

 
Aleksey Mavrin:

Por favor, esclareça o que ainda não está claro. Depois de ler isto, parecia que a questão principal estava resolvida e ficamos para discutir o quão obsoleto é o 4)

Não tive nenhum problema depois de inserir prazos carregados desta maneira

Se você precisar se referir ao prazo raramente e irregularmente, então esse carregamento deve (mas não necessariamente se o gráfico estiver aberto) ser feito novamente antes da verificação, ou tal verificação ajudaria

Obrigado, essa é a questão. O terminal realmente dá um erro 4066 após acessar uma série cronológica não atualizada através do iTime? Eu encontrei o iClose dando informações não atualizadas em vez de zero.