Arrays Dinâmicos
No máximo pode-se declarar arrays de 4 dimensões. Quando declarar um array dinâmico (um array sem valor especificado no primeiro par de colchetes), o compilador automaticamente cria uma variável da estrutura acima (um objeto array dinâmico) e fornece um código para a correta inicialização.

Arrays dinâmicos são automaticamente liberados quando ficam além da área de visibilidade do bloco em que eles foram declarados.

Exemplo:

double matrix[][10][20]; // array dinâmico de 3 dimensões
ArrayResize(matrix,5); // define o tamanha da primeira dimensão

Arrays Estáticos
Quando todas as dimensões significantes do array são explicitamente especificadas, o compilador pré-aloca o tamanho de memória necessário. Tal array é chamado estático. Contudo, o compilador aloca memória adicional para o array dinâmico, que é associado ao buffer estático pré-alocado (parte da memória para armazenar o array).

A criação de um objeto array dinâmico é devido a possível necessidade de passar este array estático como parâmetro para alguma função.

Exemplos:

double stat_array[5]; // array estático de uma dimensão
some_function(stat_array);
...
bool some_function(double& array[])
{
if(ArrayResize(array,100)<0) return(false);
...
return(true);
}

Arrays em Estruturas
Quando um array estático é declarado como membro de uma estrutura, um objeto array dinâmico não é criado. Isso é assim para assegurar compatibilidade com estruturas de dados usados em API's do Windows.

Contudo, arrays estáticos que são declarados como membros de estruturas, podem também serem passados para funções em MQL5. Neste caso, quando passar o parâmetro um objeto temporário de um array dinâmico, conectado com o array estático - membro da estrutura, será criado.