Passando Parâmetros por Referência
Em MQL5, parâmetros de tipos simples podem ser passados tanto por valor como por referência, enquanto que parâmetros de tipos compostos são sempre passados por referência. Para informar ao compilador que um parâmetro deve ser passado por referência, o caractere "e comercial" & é adicionado antes do nome do parâmetro.

Passar um parâmetro por referência significa passar o endereço da variável, é por isso que todas as mudanças no parâmetro que é passado por referência será imediatamente refletida na variável origem. Usando parâmetros passados por referência, pode-se implementar o retorno de vários resultados de uma função ao mesmo tempo. A fim de evitar alteração de um parâmetro passado por referência, use o modificador const.

Assim, se o parâmetro de entrada de uma função for um array, um objeto de classe ou estrutura, o símbolo '&' é colocado no cabeçalho da função após o tipo da variável e antes de seu nome.

Exemplo

class CDemoClass
{
private:
double m_array[];

public:
void setArray(double &array[]);
};
//+------------------------------------------------------------------+
//| Preenchendo o array |
//+------------------------------------------------------------------+
void CDemoClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array, array);
}
}

No exemplo acima, a classe CDemoClass é declarada, e contém o membro array private - m_array[] de tipo double. A função setArray() é declarada, e o parâmetro array[] é passado por referência. Se o cabeçalho da função não contém a indicação de passar por referência, isto é, não contém o caractere "e comercial" (&), uma mensagem de erro será gerada na tentativa de compilar tal código.

Apesar do fato de que um array é passado por referência, não se pode atribuir um array ao outro. Nós precisamos realizar a cópia elemento a elemento de conteúdo do array origem para o array destino. A presença de & nas descrições de função é uma condição obrigatória para array e estruturas quando passado como parâmetro de função.

Palavra-chave this
Uma variável de tipo de classe (objeto) pode ser passado tanto por referência como por ponteiro. Assim como referência, o ponteiro permite ter acesso a um objeto. Após o ponteiro de objeto ser declarado, o operador new deve ser aplicado nele para criá-lo e inicializá-lo.

A palavra reservada this é destinado para obter a referência do objeto para si mesmo, que fica disponível dentro de métodos de classe e estrutura. this sempre referencia o objeto, dentro do método em que ele é usado, e a expressão GetPointer(this) retorna o ponteiro do objeto, cujo membro é a função na qual a chamada ao GetPointer() é realizado. Em funções MQL5 não se pode retornar objetos, mas eles podem retornar ponteiro de objeto.

Assim, se precisamos de uma função para retornar um objeto, nós podemos retornar o ponteiro deste objeto na forma de GetPointer(this). Vamos adicionar a função getDemoClass() que retorna o ponteiro do objeto para este classe, na descrição de CDemoClass.

class CDemoClass
{
private:
double m_array[];

public:
void setArray(double &array[]);
CDemoClass *getDemoClass();
};
//+------------------------------------------------------------------+
//| Preenchendo o array |
//+------------------------------------------------------------------+
void CDemoClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array,array);
}
}
//+------------------------------------------------------------------+
//| Retorna seu próprio ponteiro |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
{
return(GetPointer(this));
}

Estruturas não têm ponteiros, os operadores new e delete não podem ser aplicados a eles, GetPointer(this) não pode ser usado.