Erros, bugs, perguntas - página 570

 

Ver Propriedades do Programa (#propriedade):

tester_indicator

string

Имя пользовательского индикатора в формате "имя_индикатора.ex5". Необходимые для тестирования индикаторы определяются автоматически из вызова функций iCustom(), если соответствующий параметр задан константной строкой. Для остальных случаев (использование функции IndicatorCreate() или использование неконстантной строки в параметре, задающем имя индикатора) необходимо данное свойство

tester_file

string

Имя файла для тестера с указанием расширения, заключенное в двойные кавычки (как константная строка). Указанный файл будет передан тестеру в работу. Входные файлы для тестирования, если необходимы, должны указываться всегда

tester_library

string

Имя библиотеки с расширением, заключенное в двойные кавычки. Библиотека может быть как с расширением dll, так и с расширением ex5. Необходимые для тестирования библиотеки определяются автоматически. Однако, если какая-либо библиотека используется пользовательским индикатором, то необходимо использовать данное свойство

 
 

No gráfico de tick (na visão geral do mercado) na conta de demonstração XAUUSD há um reset constante.

Também:

Abrir "detalhes" e passar o rato sobre o espaço vazio

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете - Документация по MQL5
 
gumgum:

No gráfico de tick (na visão geral do mercado) na conta de demonstração XAUUSD há um reset constante.

Também:

Abrir "detalhes" e passar o rato sobre o espaço vazio

Não tenho bem a certeza do que significa um reset permanente.

Que SO, que SO e capacidade terminal?

 
Rosh:

Aprender, pois diz na redacção da documentação - Indicadores Técnicos:

Isto significa que no primeiro início do indicador (ao mudar para um novo período de tempo pela primeira vez ), os valores do indicador ainda não foram calculados, portanto prev_calculados=0. Quando se regressa a este período de tempo, o indicador não é criado novamente, uma vez que o seu cabo ainda está vivo. Portanto, pré_calculado!=0

Estava prestes a aceitar a sua palavra, mas mudei de ideias. Os resultados que obtive externamente quase dizem que nem sempre tudo é tão suave, há algumas excepções... mas ainda não percebo se elas, estas excepções, estão relacionadas com cabos ou é algum outro problema?

"Nota: se a função OnCalculate devolver um valor nulo, os valores indicadores não são mostrados na Janela de Dados do terminal do cliente. "Apresso-me a assegurar-vos: é muito pior, se consegui relacionar correctamente os resultados na minha cabeça com a documentação e interpretar eu próprio o efeito resultante. Não só os valores do indicador não são exibidos - todo o indicador deixa de funcionar, a fila de comandos congela e não se pode esperar que os próximos comandos sejam processados. De facto, foi isto que consegui vislumbrar em alguns dos meus posts anteriores.

Como já foi mencionado, o código tem muita cópia... ...que não envolve um cabo, (ou seja, tudo excepto CopyBuffer). Se o resultado da cópia <= 0, obtemos o retorno(0), após o qual"o indicador deixou de funcionar" e o indicador fica completamente paralisado.

Quero lembrar que o não-desenhar inicial com a paralisia do acompanhante ocorre no modo sem janela terminal (ou seja, aos fins-de-semana ou fora de linha). Não o considere sem importância, porque ninguém quer depurar os seus indicadores nos fins-de-semana, fazendo gestos desnecessários, correndo através de prazos e artificialmente - manualmente - iniciando o primeiro desenho. E não se trata apenas de depuração.

Honestamente, não tinha mente suficiente para ligar as ligações gentilmente fornecidas a exemplos da documentação, onde se diz sobre o aumento da referência contrária ao cabo já existente (bem como com outras respostas dadas) ao problema existente. Não creio que esteja a crescer a partir daí.

Tente reproduzir o código em anexo nas seguintes condições: o período de tempo predefinido no código é D1, o período de tempo actual no terminal é D1, o terminal está em modo offline. Quando o indicador é anexado ao gráfico com o período de tempo actual especificado, os resultados do registo aparecerão instantaneamente no separador Especialistas.

Agora descarregue completamente o terminal, reinicie-o e mude para um período de tempo diferente de D1 . Coloque o indicador - ele não mudará até mudar para qualquer outro (não necessariamente D1) período de tempo.

Devido a esta desagradável característica, uma boa ideia desaparece juntamente com o indicador subscrito.

Os programadores, estou certo, podem encontrar explicações para este comportamento do indicador, mas é injusto, quando os dados da TF master-defined na sua pega são perfeitamente exibidos, quando um utilizador está nesse momento, mas se ele está noutro, ele tem de fazer movimentos desnecessários. Sou a favor da igualdade de prazos na utilização de alças de indicadores externos, os outros TFs não são culpados de nada.

P.S.: Então... Espere. Verifiquei-o mais uma vez - acontece que CopyHigh não influencia sequer esta paralisia. Agora não compreendo nada. Todas as minhas suspeitas caíram de repente sobre um cabo no OnInit...

P.P.S.: adicionado segundo exemplo de código - mesmo que não responda.

Arquivos anexados:
paralich.mq5  3 kb
paralich2.mq5  2 kb
 

Foi encontrado o limite do problema.

Comente-o:

   SetIndexBuffer(0,FractalUpBuffer,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ArrowShift);

- e o problema desaparece, mas depois é uma indicação clara de ligação tampão incorrecta ocasional através do SetIndexBuffer . E isso já aponta para a necessidade de abandonar a utilização doSetIndexBuffer e recorrer à manipulação manual do tamanho do tampão a ser monitorizado.

Além disso, o exemplo em anexo demonstra obviamente a incapacidade do BarsCalculated(handle )de calcular a tempo os valores do indicador chamado em qualquer TF actual, a menos que coincida com um pré-definido, ou a indisponibilidade em princípio para calcular qualquer coisa à primeira vez (muito provavelmente esta variante). Neste caso, o valor será <=0, retorno(0) e paragem como resultado.

Arquivos anexados:
 
alexvd:

Não é muito claro o que significa reinicialização permanente.

Que SO, que SO e bit terminal?

W7 e MT5 64 bit.

exemplo:

XAUUSD reinicia sempre para o início (XAGUSD é uma comparação)

 
x100intraday:

Encontrar o limite do problema.

Comente-o:

- e o problema desaparecerá, mas será então uma indicação clara de uma ligação tampão ocasional incorrecta através do SetIndexBuffer . E isso já aponta para a necessidade de abandonar a utilização doSetIndexBuffer e recorrer à manipulação manual do tamanho do tampão a ser monitorizado.

Além disso, o exemplo em anexo demonstra obviamente a incapacidade do BarsCalculated(handle) de calcular a tempo o valor do indicador chamado em qualquer TF actual, a menos que este coincida com um pré-definido. Neste caso, o valor será <=0, retorno(0) e paragem como resultado.

Para o primeiro exemplo (não olhei para o segundo), o indicador paralich tem uma função

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &up_arrows[],datetime &up_times[],int ind_handle,int amount)
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);
   else CopyTime(_Symbol,PERIOD_D1,0,amount,up_times);

   return(true);
  }

Portanto, imagine que o seu indicador está em D1 e tenta copiar os dados do período de tempo H1 para o seu buffer de indicadores. O número de elementos não coincidirá. Penso que é aqui que reside o seu problema - não há verificação antes de copiar os dados.

Exemplos de indicadores que tiram dados de outros prazos estão disponíveis na ajuda para cada indicador técnico. Por exemplo https://www.mql5.com/ru/docs/indicators/iama:

//--- узнаем количество рассчитанных значений в индикаторе
   int calculated=BarsCalculated(handle);
   if(calculated<=0)
     {
      PrintFormat("BarsCalculated() вернул %d, код ошибки %d",calculated,GetLastError());
      return(0);
     }
//--- если это первый запуск вычислений нашего индикатора или изменилось количество значений в индикаторе iAMA
//--- или если необходимо рассчитать индикатор для двух или более баров (значит что-то изменилось в истории)
   if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
     {
      //--- если массив iAMABuffer больше, чем значений в индикаторе iAMA на паре symbol/period, то копируем не все 
      //--- в противном случае копировать будем меньше, чем размер индикаторных буферов
      if(calculated>rates_total) values_to_copy=rates_total;
      else                       values_to_copy=calculated;
     }
   else
     {
      //--- значит наш индикатор рассчитывается не в первый раз и с момента последнего вызова OnCalculate())
      //--- для расчета добавилось не более одного бара
      values_to_copy=(rates_total-prev_calculated)+1;
     }
Документация по MQL5: Технические индикаторы / iAMA
Документация по MQL5: Технические индикаторы / iAMA
  • www.mql5.com
Технические индикаторы / iAMA - Документация по MQL5
 
x100intraday:

Tente reproduzir o código em anexo nas seguintes condições: o período de tempo predefinido no código é D1, o período de tempo actual no terminal é D1, o terminal está em modo off-line. Quando um indicador é anexado a um gráfico com o período de tempo actual especificado, os resultados do registo aparecerão instantaneamente no separador Especialistas.

E em geral, já tentou usar a depuração em vez do registo, de modo a não receber toneladas de mensagens? Ajuda no MetaEditorDesenvolvimento de ProgramasDepuração
 
Rosh:

Portanto, imagine que o seu indicador está em D1 e está a tentar copiar dados do período de tempo H1 para o seu buffer de indicadores. O número de elementos não coincidirá. Penso que é aqui que reside o seu problema - não há verificação antes de copiar os dados.

Antes de mais, vou esclarecer: os casos de transbordamento de matriz quando se copiam valores via Copy...-funções causando um erro de transbordamento"Array out of range" em Peritos do terminal do cliente? Lembro-me que tais mensagens são por vezes geradas após uma compilação bem sucedida, enquanto o indicador está a funcionar, mas não posso dizer exactamente. Penso que não está em Copiar...-função, mas sim numa referência a um índice inexistente ou algo do género.

Em segundo lugar, apresso-me a assegurar-lhe que a sua hipótese sobre a ausência de verificação não é totalmente correcta. Pode falar apenas da geração incorrecta do filtro if-else-filter, mas não da sua ausência completa. Já tropecei nela mais de uma dúzia de vezes. Recentemente fiz aqui ou em "Dummies" uma pergunta sobre análogo de taxas_total para prazos, diferente do actual, mas não recebi resposta de ninguém. A questão é que o rates_total é um dos parâmetros para o período de tempo actual, e é absolutamente inútil para mim, porque trabalho com muitos outros períodos de tempo, e se por acaso utilizar um dos pré-definidos, continuo a utilizar o universal calculated=BarsCalculated(handle) para os cálculos em vez do rates_total. Talvez eu esteja a cometer um grande erro, mas não vejo a utilidade das tarifas_total para esta tarefa.

Em terceiro lugar, há muito que sou capaz de conseguir isso, estando num TF elevado, posso copiar e redistribuir com sucesso valores de TFs mais baixos, e vice-versa. Os exemplos que dei há alguns dias são mínimos mas exaustivos, está tudo aí. A discrepância entre as quantidades de duas TFs diferentes pode ser de dois tipos: escassez e excesso. O primeiro caso não é terrível, mas vou verificar se o segundo está a transbordar e tentar limitá-lo, se algo estiver errado. Mas também se bloqueia se as barras copiadas de outro período de tempo forem menores do que o número de barras no actual.

Em quarto lugar, o indicador foi cozido e verificado já há cerca de uma semana, não mostra quaisquer erros óbvios (nem na compilação nem durante a operação), existem apenas alguns problemas implícitos, um dos quais é o não desenho inicial das barras em certas TFs e o acentuado aumento do tempo de cálculo no M1 quando se volta a ligar-lhe (durante a primeira vez, tudo é calculado dentro de 2-3 segundos). O indicador parece sufocar nos cálculos (fuga de memória da avalanche?) Limitei o número de elementos copiados usando CopyBuffer - a 200 em vez de toda a história, mas não alterou a situação. Notei, que offline no M1 e em todo o lado o cálculo é sempre rápido, pois pela primeira vez, online a situação muda drasticamente (provavelmente, o problema está naquele mesmo filtro, que salta alguma coisa em cada tick, embora não deva ser, porque a frequência de redesenho depende de redesenhar uma nova barra de zero e não pode ser anterior à mais jovem TF predefinida numa das pegas). Problemas pequenos mas desagradáveis: a menor tentativa de percorrer o gráfico com a roda do rato desmaterializa todos os fractais e temos de esperar que sejam recalculados e desenhados (embora não tenham chegado novas barras, parece não haver nada a recalcular).