Preprocessador é um subsistema especial do compilador MQL5 que é destinado à preparação do código fonte do programa imediatamente antes do programa ser compilado.

O preprocessador permite melhorar a legibilidade do código fonte. O código pode ser estruturado por meio de inclusão de arquivos específicos contendo códigos fonte de programas-mql5. A possibilidade de atribuir nomes mnemônicos a constantes específicas contribui para melhoria da legibilidade do código.

O preprocessador também permite determinar parâmetros específicos de programas MQL5:

Declarar constantes
Definir propriedades de programa
Incluir arquivos no texto do programa
Importar funções
Conditional compilation
As diretivas do pré-processador são usadas ​​pelo do compilador para pré-processamento do código fonte antes de sua compilação. A diretiva sempre começa com o # (jogo da velha), por isso o compilador proíbe o uso deste símbolo nos nomes das variáveis, funções, etc.

Cada diretiva é descrita por um registro separado e opera antes da mudança de linha. Não se podem utilizar várias diretivas num só registro. Se o registro da diretiva for muito grande, ele pode ser dividido em várias linhas usando a barra invertida '\', neste caso, a próxima linha é considerada uma continuação do registro da diretiva.

//+------------------------------------------------------------------+
//| pseudo-operador foreach |
//+------------------------------------------------------------------+
#define ForEach(index, array) for (int index = 0, \
max_##index=ArraySize((array)); \
index<max_##index; index++)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string array[]={"12","23","34","45"};
//--- rastreamento da matriz usando o ForEach
ForEach(i,array)
{
PrintFormat("%d: array[%d]=%s",i,i,array[i]);
}
}
//+------------------------------------------------------------------+
/* Resultado de saída
0: array[0]=12
1: array[1]=23
2: array[2]=34
3: array[3]=45
*/

Para o compilador, estas três linhas da diretiva #define aparecerão como uma linha longa. Neste exemplo, também é usado o caractere duplo do jogo da velha ##, ele é chamado operador de fusão e é usado nas macros #define, para combinar dois tokens numa macro. O operador de fusão de tokens não pode ser o primeiro ou o último na definição de macro.