Erros, bugs, perguntas - página 1679

 
fxsaber:
Seria bom torná-lo privado também nos descendentes. Para uma melhor compreensão. Não é o ponto, em suma.
Deve ser chamado em descendentes. )
 
Sergei Vladimirov:
Tem de ser convocado nos descendentes. )
A questão é precisamente que não é necessário. Ver o meu exemplo.
 
fxsaber:
A questão é precisamente que não é necessário. Ver o meu exemplo.
O seu exemplo é apenas diferente, mas a questão é a mesma - o descendente sobrepõe-se a um método virtual da classe base. Ok, bem, é claro para todos.
 

Erro nos amortecedores indicadores

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

class BUFFER
{
public:
  double Buffer[];
  
  BUFFER()
  {
    ::SetIndexBuffer(0, this.Buffer);
  }
};

BUFFER* Buf;

void OnInit()
{
  Buf = new BUFFER;
}

void OnDeinit( const int Reason )
{
  delete(Buf);
}

void Restart()
{
  OnDeinit(REASON_PARAMETERS);
  OnInit();
}

#define  PRINT(A) Print(#A + " = " + (string)A);

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[] )
{
  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;
  
  PRINT(ArraySize(Buf.Buffer));
  
  Buf.Buffer[0] = 0; // array out of range
  
  return(rates_total);
}

Resultado em log

2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      array out of range in 'Test.mq5' (56,13)
2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 0
2016.09.12 17:21:54.828 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 2067

O depurador diz teimosamente que Buf.Buffer SEMPRE é uma matriz dinâmica[0],I. Isto é, é um tampão indicador. Mas de tamanho zero, ao que parece.

Acontece que o depurador escreve mais no diário de bordo do que o lançamento. O lançamento não reporta tais coisas

2016.09.12 17:25:08.706 Test (RTS-9.16,M1)      Indicator buffer #0  detached
É possível definir o buffer indicador em MT5 apenas uma vez?
 

Porquê as complicações, se não é um segredo? Bem, para além do interesse da investigação, é claro.

Em vez disso (o que, a propósito, está errado em princípio, porque a reinicialização pode ser necessária durante o funcionamento, e não apenas no arranque):

  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;

Tal como este:

if(prev_calculated == 0)
   ArrayInitialize(Buf.Buffer, 0.0);
 
Sergei Vladimirov:

Porquê as complicações, se não é um segredo? Bem, para além do interesse da investigação, é claro.

Tenho casos em que uma matriz dinâmica, fixada como um tampão indicador, é eliminada. Depois tem de criar novamente uma matriz dinâmica e atribuí-la como um buffer indicador. O depurador mostra que lhe é atribuído. Mas apenas o seu tamanho é zero. Isto é um erro.

O problema é antigo, ao que parece.

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

Como ocultar a mensagem "Tampão indicador #x destacado".

Konstantin Ivanov, 2015.02.17 21:18

No meu indicador, guardo os buffers de arrays-buffers em instâncias do objecto.
Ao apagar um objecto em OnDeinit(), é exibida uma mensagem para todas as matrizes ligadas a buffers (SetIndexBuffer()):

"Tampão indicador #x destacado"

Como separar uma matriz de um buffer sem esta mensagem?
Ou como esconder esta mensagem?

Encontrei o ramo http://forum.mql4.com/63975, mas a opção sugerida para salvar buffers num contexto global não funciona para mim.


A opção de salvar buffers num contexto global também não funciona para mim. Curiosamente, funciona em MT4.

 

artigo Um guia passo-a-passo para escrever EAs em MQL5 para principiantes Há código:


Não é necessário dividir a três dígitos?

 
Aleksey Rodionov:

artigo Um guia passo-a-passo para escrever EAs em MQL5 para principiantes Há código:


Não é necessário dividir a três dígitos?

Este é um rudimento deixado por EURUSD (5 dígitos) e USDJPY (3 dígitos). Não há erro, mas é melhor não o fazer, especialmente para os principiantes.
 
Preciso de definir uma única interface para todas as classes herdadas. Deve ter sempre o método Init. Mas o Init é como um duplicado do construtor, por isso não é possível definir antecipadamente as variantes dos parâmetros de entrada. Como especificar tal interface?
 
MK, porque não tornar a seguinte sintaxe aceitável para funções importadas:
#import ...
 int send(SOCKET s, void &buf[], int len, int flags);
 int send(SOCKET s, void &buf, int len, int flags);
#import

Agora temos de fazer coisas feias:

#import ...
 int send(SOCKET s, char &buf[], int len, int flags);
 int send(SOCKET s, int &buf, int len, int flags);
 int send(SOCKET s, char &buf, int len, int flags);
 int send(SOCKET s, Cpoint &buf[], int len, int flags);
 ...
#import

Não o sugiro para funções em linha internas, mas para funções importadas deve ser seguro.