Erros, bugs, perguntas - página 307

 
Jager:

Quando tento testar em usdjpy recebo uma mensagem como esta:

e parece continuar indefinidamente, quando chegou aos 3000 eu desliguei-o. Os testes tentaram ligar 2010.10.01 - 2010.10.10, apenas os preços de abertura.

bild 401

Também não se consegue que outro agente remoto comece, aqui está o registo:

também observou ontem um padrão semelhante... Parece que toda a história estava sobrecarregada e aparentemente houve alguns problemas em fazê-lo.

Parece que esperei até ao fim do processo ou reiniciei o terminal.

encontrou uma coisa interessante ontem. depois de recompilar a EA, as alterações não funcionam no testador até reiniciar o terminal - isso é a lata!!!

 
Im_hungry:
Apoio total - talvez servicedesk? (feche-o cem vezes)
qual é o objectivo? todos eles sabem perfeitamente bem...
 

A partir de ontem, os peritos começaram a viver a sua vida digital.

Ao testá-lo, dá um foco aleatório. Salta a função OnInit( ) de alguma forma mágica, depois gera uma matriz de erros fora do alcance na função DeInit().


O problema é que com os mesmos parâmetros pode começar e executar todo o teste, ou pode colidir.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Im_hungry:

Aqui está o desafio: tornar o parâmetro indicador dinâmico, quando se fecha uma posição, altera-se um dos parâmetros indicadores, por isso esse é o desafio.

Agora a minha solução:

Posso dizer que este código funciona como teste mostra um resultado diferente, mas não é claro porque funciona de vez em quando, procurei no registo - 1 semana tudo funciona como deveria, depois faz loops e produz os mesmos valores no buffer, embora isto seja impossível (2 semanas os mesmos valores no registo do testador), se não loops então apenas escreve um erro:

mensagem via Alerta

Tanto quanto pude compreender, o Conselheiro Especialista cria um cabo de algum indicador quando aparece uma nova barra e, ao mesmo tempo, necessita de copiar os amortecedores deste indicador. Mas isto não resolve a situação quando pode demorar algum tempo a calcular os amortecedores indicadores. Por outras palavras, o manípulo indicador pode ser criado com sucesso, mas os amortecedores indicadores ainda não foram calculados.
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
Yedelkin:
Tanto quanto pude compreender, o Conselheiro Especialista cria algum cabo indicador quando aparece uma nova barra e, ao mesmo tempo, necessita de copiar os amortecedores deste indicador. Mas a situação não é resolvida, quando o cálculo dos amortecedores indicadores pode demorar algum tempo. Por outras palavras, o manípulo indicador pode ser criado com sucesso, mas os amortecedores indicadores ainda não foram calculados.

Sim, concordo - foi por isso que experimentei este desenho:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{ 
   if (isNewBar()==true && proverkaHANDLA()==true)
     {
      if (!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
         {
          BSOpen();
         }
     }    
}
//+==================================================================+
bool proverkaHANDLA()
{
  ArraySetAsSeries(Sp1Buffer,true);
  ArraySetAsSeries(Sp2Buffer,true);
//----------------------
  vhandle=iCustom(NULL,0,"МТ5",Symbol1,100,Lots,1,Close());
  if(vhandle<0)
    {
     Alert("Ошибка при создании индиката: ",GetLastError());
     return(0);
    }
  if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
    {
     Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
     return(0);
    }
  return (true);
}

Funciona por agora! Obrigado pela sua ajuda

 

Mas de vez em quando dá:

Alert: Ошибка копирования буферов индикатора номер ошибки:4806
 
Im_hungry:

Sim, concordo - foi por isso que experimentei este desenho:

Está a funcionar até agora! Obrigado pela sua ajuda

Uma tal construção salta casos quando "a pega foi criada, mas os amortecedores indicadores ainda não foram calculados". Uma vez que a construção em si é chamada uma vez por período, pode tentar chamar a função CopyBuffer() várias vezes. Isto é, se CopyBuffer()<0, então chamar repetidamente a função, desde que o período seleccionado o permita (dentro do período de tempo seleccionado).
 
Im_hungry:

Mas, de vez em quando, de vez em quando, faz:

Pois bem, é isso mesmo. O seu provérbio funcional HANDLA() é um bloco independente, que internamente se refere aCopyBuffer() apenas uma vez.Assim, se os amortecedores não forem calculados, voltará sempre a aparecer. Até agora o seu provérbio funcionalHANDLA() não trata da situação de "cabo criado, mas amortecedores indicadores ainda não calculados", mas ignora-a.

 
Yedelkin:
Esta construção salta casos, quando "o cabo foi criado, mas os amortecedores indicadores ainda não foram calculados". Uma vez que a própria construção é chamada uma vez por período, pode-se tentar chamar repetidamente a função CopyBuffer(). Isto é, se o CopyBuffer()<0, então repetir a chamada de função, enquanto o período seleccionado o permitir (dentro do período de tempo seleccionado).

Ou seja, enquanto CopiarBuffer>0 calculamos, e o novo parâmetro (Fechar()

aparece no encerramento da posição. Ou seja, precisamos de fazer um loop through While. Acontece assim.

if(!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
  {
   While (vhandle>0)
    {
     if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
      {
       Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
       return(0);
      }
    }
  }
 
Tente ler sobre o BarsCalculated na ajuda, o que, a propósito, dá o exemplo certo.