Perguntas de um "boneco" - página 62

 
x100intraday:
Um exemplo seria...

Assim (não a estrutura, mas a classe, é claro):

class TBuffer
{
public:
  double  MABuffer[ ];
};

//---------------------------------------------------------------------
TBuffer*  Buffer_Array[ ];
//---------------------------------------------------------------------

//---------------------------------------------------------------------
  ArrayResize( Buffer_Array, NUMBER );
  for( int i = 0; i < NUMBER; i++ )
  {
    Buffer_Array[ i ] = new TBuffer;
    SetIndexBuffer( i, Buffer_Array[ i ].MABuffer, INDICATOR_DATA );
  }

O que colocar onde, penso eu, é claro.

Não se esqueça no final:

  for( int i = 0; i < NUMBER; i++ )
  {
    delete( Buffer_Array[ i ] );
  }
 
Yedelkin:

Deixe-me reformular a frase. Está a perguntar-se se é possível, ao definir uma função

especificar apenas uma variável do tipo de estrutura como parâmetro formal, ignorando o nome da própria estrutura? Isto é, especificar, por exemplo, não void funcName(MqlTradeRequest & req), mas apenas void funcName(& req)?

Sim. É necessária uma função universal para qualquer estrutura simples --- Não há métodos, matrizes de din. etc. --- puramente uma sequência de tipos de dados específicos.

Uma vez que a composição do guião é pré-determinada por mim, posso especificar explicitamente o número de estruturas a tratar.

struct Data1
  {
   double param[1000000];
  };
struct Data2
  {
   int    temp;
   double k;
  };
struct Data3
  {
   int    temp;
   double k;
  };

Mas para passar qualquer uma destas estruturas para afunção com um nome, tenho de usar a sobrecarga.

void funWrite(Data1 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data2 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data3 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }

Há aqui algumas dificuldades.

1. o número de estruturas é limitado, porque a sobrecarga irá abrandar se tiver mais elementos.

2. Eu próprio posso cometer um erro ao copiar as funções de sobrecarga.

PS/// A funçãofunWrite() executa certos cálculos e executaFileWriteArray() com uma certa sequência e parâmetros calculados (de que índice escrever, quantos a ler).

 
rlx:

Sim. É necessária uma função universal para qualquer estrutura simples --- Não há métodos, matrizes de din. etc. --- puramente uma sequência de tipos de dados específicos.

Como a composição do guião é pré-definida por mim, posso especificar explicitamente o número de estruturas a tratar.

Mas para passar qualquer uma destas estruturas para uma função com um nome, tenho de usar sobrecarga.

Estou a ver. Há algum tempo atrás fiz uma pergunta semelhante sobre se era possível não especificar o tipo de arrays ao definir uma função. Logo abaixo, Roche aconselhou uma sobrecarga.

Assim, cheguei à conclusão que funções "incorporadas" comoFileWriteArray(), quetêm alguns parâmetros especificados com tipo vazio, são elas próprias funções sobrecarregadas. Apenas não vemos a sua implementação.

 
Yedelkin:

Estou a ver. Uma vez fiz uma pergunta semelhante antes sobre se era possível não especificar o tipo de arrays ao definir uma função. Logo abaixo, Roche aconselhou uma sobrecarga.

Assim, cheguei à conclusão que funções "incorporadas" comoFileWriteArray(), quetêm alguns parâmetros especificados com tipo vazio, são elas próprias funções sobrecarregadas. Apenas não podemos ver a sua implementação.

As funções incorporadas são escritas numa linguagem de programação completa.

Em C, por exemplo, pode passar qualquer número de variáveis, e já na função obter uma lista de parâmetros passados e examiná-los.

void fun(...)
  {
}

Na MQL5, não existe tal possibilidade. Em particular, faltam ligações e apontadores para tipos e estruturas de dados simples...

 

Deve ter algo a ver com a segurança. Acesso aos dados. Ir para fora da caixa de areia.

Mas ainda gostaria que estas características fossem implementadas na MQL5

 
rlx:

Deve ter algo a ver com a segurança. Acesso aos dados. Ir para fora da caixa de areia.

Mas ainda quero que estas características sejam implementadas na MQL5

Seria melhor escrever o seu pedido ao Service Desk. Caso contrário, perder-se-á rapidamente no fórum.
 
Dima_S:

Assim (não a estrutura, mas a classe, é claro):

Penso que é claro o que colocar onde.

No final, não se esqueça:

A isto é que eu chamo ajuda: real e bastante concreta. Obrigado. Onde está o sinal de mais?

A propósito... Tenho pensado que isso é suficientemente bom para mim. Mas não quero ser formalista... ... por curiosidade, decidi que não faria mal tentar organizar uma matriz bidimensional. A MQL faz-me lembrar algo do C/C++, que tenho esquecido ao longo dos últimos doze anos ou assim. Agora tentei fazê-lo desta forma (sem loop - simplifiquei-o intencionalmente):

class TBuffer
{
public:
  double MABuffer[][1];
};

//---------------------------------------------------------------------
TBuffer* Buffer_Array[][1];
//---------------------------------------------------------------------
int OnInit()
  {
   ArrayResize(Buffer_Array,1);
   Buffer_Array[0][0] = new TBuffer;
   SetIndexBuffer(0,Buffer_Array[0][0].MABuffer,INDICATOR_DATA);
// --- [...]
   delete(Buffer_Array[0][0]);
   return(0);
  }

O compilador gera o erro: "'MABuffer' - a conversão de parâmetros não é permitida".

O que será que estou a fazer mal? Se não me engano, ao declarar uma classe com matriz multidimensional é necessário especificar numericamente uma das medidas, tornando-a estática?ArrayResize, entretanto, estabeleceum novo tamanho para a primeira dimensão.

 

x100intraday:

O que será que estou a fazer mal?

1) SetIndexBuffer trabalha com um conjunto de duplas da mesma dimensão.

2) Não está claro porque é que está a usar TBuffer*, ou seja, usando dinâmicas onde não é necessário?

3) (DICA) No exemplo, poderia ter feito com uma estrutura em vez de uma classe, para guardar um pouco de memória e algumas centenas de ciclos de relógio.

 

mql5:

3) (DICA) No exemplo, poderia ter feito com uma estrutura em vez de uma classe, para guardar um pouco de memória e algumas centenas de ciclos de relógio.

Isto já foi verificado?
 

O conselheiro especializado utiliza o indicador num período de tempo diferente. Nos testes, a EA mostra dados incorrectos do indicador.

A própria EA funciona em M5, e o indicador em H4. Os indicadores que são chamados no mesmo período de tempo (M5) devolvem os valores correctos.

Os valores devolvidos são semelhantes aos valores do indicador, mas são diferentes dos valores reais que são visíveis quando o indicador é aplicado à janela do gráfico de preços.

Qual é o problema?

Exemplo de código de chamada de indicador:

int W_handle;
int OnInit()
  {
   W_handle=iCustom(NULL, PERIOD_H4, "WW");
  }

void OnNewBar() // моя функция
{
 double wave[10];
 ArraySetAsSeries(wave, true);

 CopyBuffer(W_handle,0,0,2,wave);
 if (wave[1] > 0) Buy(); 
// по замыслу в wave[1] должно лежать значение индикатора на предыдущем баре H4
// но так получается только на нескольких первых обращениях, потом результат начинает расходиться с реальностью
}
Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.
Razão: