Erros, bugs, perguntas - página 1697

 
Karputov Vladimir:
Print(MQLInfoString(MQL_PROGRAM_NAME)); devolve o nome curto do indicador. Se não for especificado um nome abreviado, o nome completo será devolvido.
Obrigado.
 
Vladimir Pastushak:

Obrigado.

Alexey, o seu exemplo não funciona, os métodos dos pais continuam a ser despejados no herdeiro, que não deve ser despejado.


Não deveria ser assim, pode atirar o código?

Os dados que foram protegidos e públicosnos pais serão protegidos em heranças protegidas.

	          
 
  1. Colocamos o indicador num gráfico NONE com as nossas mãos
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_plots   1
    
    double Buffer[];
    
    int handle = INVALID_HANDLE;
    
    void OnInit()
    {
      ::SetIndexBuffer(0, Buffer, INDICATOR_DATA);
      
      handle = ChartIndicatorGet(0, 1, ChartIndicatorName(0, 1, 0));  
    }
    
    #define  TOSTRING(A) #A + " = " + (string)A + "\n"
    
    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 &tick_volume[],
                     const long &volume[],
                     const int &spread[] )
    {
      if (handle != INVALID_HANDLE)
      {
        Buffer[rates_total - 1] = MathRand();
        
        double BufferCopy[];
        
        if (CopyBuffer(handle, 0, 0, 1, BufferCopy) > 0)
          Print(TOSTRING(BufferCopy[0]) + TOSTRING(Buffer[rates_total - 1]));
      }
      
      return(rates_total);
    }
  2. Retirar o indicador do gráfico à mão.
  3. No registo, vemos que o indicador continua a correr. Pode fechar todos os gráficos do terminal, mas continuará a ser executado. E não vai ajudar, é claro,
    void OnDeinit( const int Reason )
    {
      if (handle != INVALID_HANDLE)  
        IndicatorRelease(handle);
      
      return;
    }
  4. A reinicialização do terminal pára a execução do indicador.
  5. Quantos indicadores podem ser ociosos e nem sequer sabemos sobre eles? Não há qualquer controlo.
 
fxsaber:
  1. Definição manual do indicador NULL no gráfico
  2. Retirar o indicador do gráfico à mão.
  3. No registo, vemos que o indicador continua a correr. Pode fechar todos os gráficos do terminal, mas mesmo assim será executado.
  4. A reinicialização do terminal pára a execução do indicador.
  5. Quantos indicadores podem ser ociosos e ainda nem sequer ouvimos falar deles? Não há qualquer controlo.

É impossível ler e olhar através de códigos com#define e com ::

Por favor, reescreva os códigos no estilo de MQL5 comum.

 
fxsaber:
  1. Definição manual do indicador NULL no gráfico
  2. Retirar o indicador do gráfico à mão.
  3. No registo, vemos que o indicador continua a correr. Pode fechar todos os gráficos do terminal, mas mesmo assim será executado.
  4. A reinicialização do terminal pára a execução do indicador.
  5. Quantos indicadores podem ser executados em modo inactivo e ainda nem sequer ouvimos falar deles? Não há qualquer controlo.
Adicionar a verificação _StopFlag não vai ajudar?
 
Karputov Vladimir:

É impossível ler e ver os códigos com#define e com ::

Por favor, reescrever os códigos no estilo comum MQL5.

Este é o estilo MQL5. Por favor, estudar o que é #define e o que é ::.
 
Alexey Kozitsyn:
Adicionar um cheque _StopFlag não vai ajudar?
Onde adicioná-lo e como pode, pelo menos teoricamente, ajudar. Isto é um bug do terminal. E é um insecto grave. Tive sorte - vejo no registo que o indicador funciona. Contudo, há muitos indicadores que funcionam no terminal sem qualquer informação sobre eles. Mas o tema surge, e porque é que o meu CPU está tão carregado num terminal vazio?
 
fxsaber:
Este é o estilo da MQL5. Por favor, estudar o que é #define e o que é ::.
Não é isso que eu quero dizer. O "::" não é de todo necessário nos seus exemplos - talvez seja o seu hábito, mas não é de todo necessário lá. O código também pode ser escrito normalmente sem #defane. Basta tentar reescrevê-lo e ver se algo se torna claro.
 
Karputov Vladimir:
Não é isso que eu quero dizer. ":::" não é de todo necessário nos seus exemplos - talvez seja o seu hábito, mas não é de todo necessário lá. O código pode ser escrito muito bem sem #defane. Basta tentar reescrevê-lo e ver se algo se torna claro.

Eu só tinha "::" num só lugar. E eu não escrevo códigos do zero. Como regra, retiro algo dos meus códigos. Aqui está :::: houve um através de copy-paste. Nunca tinha prestado atenção a isso, mas removi-o desde que o faz sentir-se muito melhor.

Mas não é uma questão de princípio não remover #define. 99% do código pode ser escrito sem ele. Esta não é uma ocasião para o tirar.

E há 1% (relativamente) quando não se pode passar sem #define!

 
fxsaber:

Eu só tinha "::" num só lugar. E eu não escrevo códigos do zero. Como regra, retiro algo dos meus códigos. Aqui está :::: houve um através de copy-paste. Nunca tinha prestado atenção a isso, mas removi-o desde que o faz sentir-se muito melhor.

Mas não é uma questão de princípio não remover #define. 99% do código pode ser escrito sem ele. Esta não é uma ocasião para o tirar.

E há 1% (condicionalmente) quando não se pode passar sem #define!

Se não copiar o tampão:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];

int handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=ChartIndicatorGet(0,1,ChartIndicatorName(0,1,0));
  }

#define  TOSTRING(A) #A + " = " + (string)A + "\n"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(handle!=INVALID_HANDLE)
     {
      Buffer[rates_total-1]=MathRand();

      double BufferCopy[];
      Print(__FUNCTION__);
      //if(CopyBuffer(handle,0,0,1,BufferCopy)>0)
      //   Print(TOSTRING(BufferCopy[0])+TOSTRING(Buffer[rates_total-1]));
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   Print("#1 OnDeinit");
   if(handle!=INVALID_HANDLE)
     {
      Print("#2 OnDeinit");
      IndicatorRelease(handle);
      Print("#3 OnDeinit");
     }
   Print("#4 OnDeinit");
   return;
  }
//+------------------------------------------------------------------+

então o indicador completa o seu trabalho com sucesso

2016.09.23 12:11:12.655 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:14.794 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:15.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:16.936 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #4 OnDeinit