Erros, bugs, perguntas - página 590

 
Swan:

Para todas as barras, o indicador é calculado uma vez - ou seja, pode ser um pouco lento no arranque na história agromadic.

Posteriormente é recalculado um par de valores - tudo deve funcionar :)

Não esquecer que os programadores são pessoas que gostam de saltar manualmente através de prazos no seu tempo livre de programação. E cada novo período de tempo é outra desinicialização e inicialização da anatomia do indicador, todos os cálculos serão efectuados novamente. Portanto, ArrayInitialize() será activada sempre que se saltar de uma TF para outra. Se o indicador for complexo com vários amortecedores que necessitam de reinicialização, os atrasos acumular-se-ão, e nem sequer estou a falar de sobrecarga de memória, que é atribuída automaticamente.

Como sou ingénuo! Sempre me sinto confiante, que a iniciação no OnInit() é suficiente, e posso afundar a minha cabeça em tarefas mais urgentes no OnCalculate(). Mas não, não tenho. A propósito, a escrita mais ou menos bem sucedida de indicadores complexos não me deu uma compreensão clara porque é que o ArrayInitialize() deve ser contido exactamente no OnCalculate(), verificando-o em cada tick, em vez da inicialização primária e única no OnInit(). Através da minha experiência, só encontrei casos em que a recusa desta variante causou imediatamente problemas, mas sobre isto discutirei mais tarde. Por agora gostaria de notar que do ponto de vista da lógica humana simples e óbvia (em vez de lógica de código) ArrayInitialize() em OnCalculate() parece muito repreensível, tendo em conta que nunca me deparei com casos em que

if(prev_calculated<7) // или < чего-то там...
A primeira vez que o programa seria accionado mais de uma vez - no arranque inicial. Ou seja, aparecem novos fractais e a condição é o silêncio. Então o que raio está a fazer na OnCalculate()?

Sou ainda mais ingénuo na minha crença de que

handle=iFractals(_Symbol,_Period);

Sou supostamente obrigado a herdar automaticamente essas matrizes de limpeza e o efeito do algoritmo económico do Fractals.mq5 original, que também existe, mas de uma forma ligeiramente diferente. Mas - uma e outra vez não!!! Tive de pensar duas vezes e criar o meu próprio código copiando do indicador, cuja pega utilizo. Lembro-me de como analisei o código de indicadores pela primeira vez e fui surpreendido ao comparar Fractals.mq5 e o exemplo de iFractals da Ajuda, e percebi que o segundo código era maior do que o primeiro (mesmo depois de o abreviar muito). Não sei. Atirem-me todos os meus chapéus, mas os programadores esperam realmente ligar algo no seu código numa linha, referindo-se a uma biblioteca inteira, classe ou algo volumoso ali, mas aqui...

Agora vou revelar a essência do problema que mencionei anteriormente. Estou a anexar o código do indicador iFractals simplificado aos fractais superiores. No exemplo inicial, o tampão é preenchido para toda a história. Mudemos a situação, copiando apenas uma parte da história. Vamos comentar a atribuição dos valores copiados para o primeiro cálculo, e definir o nosso próprio valor mais pequeno:

values_to_copy=100; // то же, что amount
Agora vamos saltar sobre os prazos e ficar horrorizados com os artefactos fractais que apareceram. Não consegui pensar em nada melhor do que copiar automaticamente um bloco não merecido de códigos de limpeza de arrays de Fractals.mq5 para limpar aquela parte da história onde os fractais não são necessários:
   if(bars_calculated<7)
   {
      ArrayInitialize(FractalUpBuffer,EMPTY_VALUE);
      Print("the condition is true; ArraySize(FractalUpBuffer)=",ArraySize(FractalUpBuffer));
   }
Agora tudo(com muita redundância!!!) está perfeitamente limpo, e ao mesmo tempo Imprimir() mostra quando e quantas vezes a reinicialização funcionará mais mostra o tamanho do buffer. Podemos ver que não são 100, mas muito mais. Se precisar de limpar o pó de uma mesa, limpo o pó da mesa em vez de limpar o apartamento inteiro. Ou será o truque para me convencer a todo o custo de que a memória e o tempo excedidos não são nada, pode encontrar uma forma de resolver o problema indirectamente e ignorar a devoradora gritante de recursos fora do meu controlo?


Cisne:

Um fx, algum tamanho terá de ser definido... Porquê fazer um laço curvo com limites diferentes, quando se pode fazer um laço directo com os mesmos limites)

Caso contrário, o indicador será baseado em muletas.

Honestamente, eu não queria ser um fardo, mas compreendi de antemão que os simpatizantes iriam escavar todo o código. É como na anedota sobre Chapay e Petka, quando Vasily Ivanovich regressou, pediu uma pá - afinal estava partida - o cavalo foi enterrado - a aldeia foi atacada pelos Brancos enquanto Chapay estava fora. Percebendo, que acho que ninguém vai querer aprofundar os detalhes do código dos outros, só posso referir-me à saída do indicador, que (para além dos travões e outras coisas) será exactamente a mesma que é agora (https://www.mql5.com/ru/forum/1111/page577#comment_119227). E agora pense nisso e diga, será razoável pensar que tudo é simples aí e sugerir soluções aparentemente óbvias?

Não é por nada que eu simplifique e limite o código antes de perguntar qualquer coisa em qualquer parte em particular. É por isso que lhe peço que se limite a isso mesmo, e não exumar o cavalo inteiro, a menos que haja um amador...

Na verdade, o quarto - especial - tampão é, em princípio, mais longo do que os três primeiros (igual em comprimento), e graças a SetIndexBuffer() estende-se por toda a história! Se expandirmos os limites do laço para o quarto tampão e ao mesmo tempo redimensionarmos as três primeiras arrays para ele, então pelo menos o número de elementos do laço aumentará, o que aumentará o tempo estimado de leitura do segmento do elemento tampão completamente esquerdo. Isto é apenas a ponta de um iceberg de problemas, que surgirá com tal variante de algoritmo. Além disso, levará mais tempo a reinicializar outros amortecedores porque o seu tamanho é agora maior. O quarto conjunto especial não pode ser preenchido explicitamente com EMPTY_VALUE noutro ponto, pois o indicador tem uma transposição severa de fractais de outros prazos de acordo com um certo algoritmo, onde não há correspondência entre os índices dos três primeiros amortecedores e o quarto amortecedor...

Cisne:

// e EMPTY_VALUE valores são atribuídos a 0 e 1 elementos de matrizes, mm... e nas três últimas barras)

Como assim? Porque não todos eles? Não compreendo esta. Pode explicar? Na verdade, não estou a referir-me apenas à atribuição de valores reais (efectivos), mas sim à inevitável limpeza de todo o tampão. ArrayInitialize(), bem como muitas outras funções de array, baseiam-se num loop que está implícito para acabar com os programadores MQL.

A questão sobre memória excedida permanece válido, e os criadores devem pensar em introduzir um parâmetro adicional noArrayInitialize() que especificaria o número e ainda melhor os limites da reinicialização do buffer.

P.S.: Acho que posso adivinhar porque é que o ArrayInitialize() no OnInit() não é eficiente aqui. Os amortecedores são dinâmicos, mudam de tamanho, e em OnInit() inicializam-se com valores apenas uma vez e para o comprimento actual, não conhecendo ainda os tamanhos reais dos amortecedores em OnCalculate().

Arquivos anexados:
cleanup.mq5  2 kb
 
papaklass:

O indicador no visualizador não está a funcionar:

No terminal no terminal em linha, funciona bem:

Poderia dar algum detalhe? Como é que o indicador foi parar ao gráfico do visualizador?
 
papaklass:

Inseri as seguintes linhas no código do Conselheiro Especialista

Coloco estes três indicadores num gráfico limpo e guardo o modelo como Expert Advisor. A fotografia está online no meu post anterior.

Estou a gerir o Expert Advisor no visualizador.

1. Mostrar o modelo guardado

2. Tentar executar a visualização sem o modelo (ou seja, eliminar previamente o ficheiro tpl relevante). No mais recente, 555 construídos, os indicadores personalizados adicionados automaticamente devem ser exibidos correctamente.

 
papaklass:

Tudo funciona. Obrigado.

Removido o modelo. Em perito em OnInit() prescrito:

Mostre o seu modelo. O indicador também deve aparecer normalmente com o modelo (ou seja, há um problema e deve ser resolvido)
 
papaklass:

Envio do ficheiro *.tpl

Agora tentou novamente com o modelo - não funciona. Remoção do modelo - funciona.

Obrigado. Vamos analisar o assunto.
 

x100intraday:

Agora pense nisso e diga-me, vale a pena acreditar que tudo o que existe é simples e sugere soluções aparentemente óbvias?

todos os génios são simples.

Eu não podia fazer o resto. A anedota sobre a questão no fórum, como remover amígdalas lembra-me :)

Não tenho a certeza de como fazê-lo... Não tenho a certeza de como fazê-lo.

//+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//+------------------------------------------------------------------+
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  clrGray
#property indicator_color2  clrGray
#property indicator_label1  "Fractal Up"
#property indicator_label2  "Fractal Down"
//--- input parameters
input int BarsCount=100;
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Fractals                                                        |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,
                const datetime &Time[],
                const double &Open[],
                const double &High[],
                const double &Low[],
                const double &Close[],
                const long &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;
//---
   if(rates_total<5) return(0);
//---
   if(prev_calculated<7)
     {
      limit=2;
      if(rates_total-2>BarsCount) limit=rates_total-BarsCount;
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,limit);//отрисовываются и расчитываются только значения на последних BarsCount барах
      PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,limit);

      for(i=rates_total-2;i<rates_total;i++)//Последним двум барам присваивается EMPTY_VALUE. Исправил циферку в соответствии с iFractal(там фрактал может быть на 2ом баре)
         {
         ExtUpperBuffer[i]=EMPTY_VALUE;
         ExtLowerBuffer[i]=EMPTY_VALUE;
         }
     }
   else
      {
      limit=prev_calculated-3;//Здесь от prev_calculated правильнее считать..
      
      //---Добавленным с появлением нового бара элементам массивов присваиваем значение EMPTY_VALUE//Возможно всё будет нормально и без этого.
      if(rates_total>prev_calculated)
         {
         for(i=prev_calculated;i<rates_total;i++)
            {
            ExtUpperBuffer[i]=EMPTY_VALUE;
            ExtLowerBuffer[i]=EMPTY_VALUE;
            }
         }
      //---
      }
//---
   for(i=limit;i<rates_total-2 && !IsStopped();i++)//Исправил циферку
     {
      //---- Upper Fractal
      if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2])
         ExtUpperBuffer[i]=High[i];
      else ExtUpperBuffer[i]=EMPTY_VALUE;
      //---- Lower Fractal
      if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && Low[i]<=Low[i-1] && Low[i]<=Low[i-2])
         ExtLowerBuffer[i]=Low[i];
      else ExtLowerBuffer[i]=EMPTY_VALUE;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
Fractals
Fractals
  • votos: 8
  • 2010.01.26
  • MetaQuotes Software Corp.
  • www.mql5.com
Фракталы (Fractals) — это один из пяти индикаторов торговой системы Билла Вильямса, позволяющий обнаруживать дно или вершину.
 
Swan:

todos os génios são simples.

Eu não podia fazer o resto. A anedota sobre a questão no fórum, como remover as amígdalas lembra-me :)

O exemplo de fractal indicador imho ortodoxo limitado... talvez ajude...

Na verdade, eu escrevo o indicador através de uma pega. Mas gosto da ideia de recusar o ArrayInitialize() a favor do preenchimento manual explícito com valores de VAZIO_VALOR. Obrigado, vou tentar fazer uma nova confusão que espero não ter de limpar mais tarde. Embora haja subtilezas e inconvenientes, prevejo-os com antecedência. mas seja o que for.
 

Próximo código:

struct Pos
{
   int x;
   int y;
};

class Test
{
public:
   Test(const Pos& other)
      : pos(other)
   {
      Print("other = {", other.x, ", ", other.y, "}");
      Print("pos = {", pos.x, ", ", pos.y, "}");
   }
   
public:
   Pos pos;
};

int OnInit()
{
   Pos pos = {123, 456};
   Test test(pos);
   
   return(0);
}

Saídas:

2011.12.05 22:01:28 RectLabel (EURUSD,H1) pos = {12, 176314750}
2011.12.05 22:01:28 RectLabel (EURUSD,H1) outro = {123, 456}

Portanto, a lista de inicialização não funcionou, há lixo na estrutura. Isto é ou não um insecto?

 

Desligaram dois agentes da nuvem e continuam a ligar-se aos servidores da nuvem de 30 em 30 segundos.

Rede MO 0 00:00:17 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede LK 0 00:00:47 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede RG 0 00:01:17 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede NS 0 00:01:48 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
RO 0 Rede 00:02:18 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
OK 0 Rede 00:02:48 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
MG 0 Rede 00:03:18 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede DR 0 00:03:48 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
DN 0 Rede 00:04:18 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede EJ 0 00:04:48 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede GF 0 00:05:18 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
RR 0 Rede 00:05:48 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
NN 0 Rede 00:06:18 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
KJ 0 Rede 00:06:48 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
QF 0 Rede 00:07:18 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede HQ 0 00:07:48 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede PM 0 00:08:18 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
QI 0 Rede 00:08:48 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
KE 0 Rede 00:09:18 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
NQ 0 Rede 00:09:51 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede OM 0 00:10:18 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede RI 0 00:10:48 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede LE 0 00:11:18 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede EP 0 00:11:48 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede IL 0 00:12:18 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
Rede HH 0 00:12:48 ligada a 2.agents.mql5.com (através de um servidor proxy 192.168.0. )
FD 0 Rede 00:13:18 ligada a 2.agents.mql5.com (através de um servidor proxy

 
Konstantin83:

Desligaram dois agentes da nuvem e continuam a ligar-se aos servidores da nuvem de 30 em 30 segundos.

Vamos ao servicedesk.

Por favor especifique exactamente como é que desligou? Suprimiu (congelou) os serviços? Por favor anexar os registos dos agentes problemáticos.

As configurações de proxy nos seus registos são um pouco estranhas. Escreveu as definições de proxy nas suas configurações de agente? Por favor, anexe common.ini do seu agente gestor à candidatura.