Funçoes comuns : GetTickCount

A função GetTickCount() retorna o número de milissegundos decorridos desde o inicialização do sistema.

uint  GetTickCount();

Valor do Retorno

Valor de tipo uint.

Observação

O contador é limitado pelas restrições do timer do sistema. O tempo é armazenado como um inteiro sem sinal, assim ele é sobre-preenchido a cada 49.7 dias se um computador trabalhar ininterruptamente.

Exemplo:

#define MAX_SIZE 40
//+——————————————————————+
//| Script para medir o tempo de computação de 40 membros Fibonacci  |
//+——————————————————————+
void OnStart()
{
//— Lembra o valor inicial
uint start=GetTickCount();
//— Uma variável para obtenção do próximo número na série Fibonacci
long fib=0;
//— No loop calcular a quantidade específica de números de série de Fibonacci
for(int i=0;i<MAX_SIZE;i++) fib=TestFibo(i);
//— Obtém o tempo gasto em milissegundos
uint time=GetTickCount()-start;
//— Imprime uma mensagem para o diário Experts
PrintFormat(“Calculando %d primeiros números Fibonacci tiveram %d ms”,MAX_SIZE,time);
//— Script concluído
return;
}
//+——————————————————————+
//| Função para obter número de Fibonacci pelo seu número serial     |
//+——————————————————————+
long TestFibo(long n)
{
//— O primeiro membro da série Fibonacci
if(n<2) return(1);
//— Todos os outros membros são calculados pela seguinte fórmula
return(TestFibo(n-2)+TestFibo(n-1));
}

Funções comuns : GetPointer

A função retorna o ponteiro de objeto.

void*  GetPointer(
any_class anyobject      // objeto de qualquer classe
);

Parâmetros

anyobject

[in]  Objeto de qualquer classe.

Valor do Retorno

A função retorna o ponteiro de objeto.

Observação

Somente objetos de classe têm ponteiros. Instâncias de estruturas e variáveis de tipo simples não podem ter ponteiros. O objeto de classe não criado usando o operador new(), mas, por exemplo, criado automaticamente no array de objetos, tem um ponteiro. Mas este ponteiro será do tipo automático POINTER_AUTOMATIC, portanto o operador delete() não pode ser aplicado a ele. Além de que, o tipo ponteiro não difere dos ponteiros dinâmico do tipo POINTER_AUTOMATIC.

Como variáveis de tipo estrutura e de tipo simples não têm ponteiros, é proibido aplicar a função GetPointer() a elas. É também proibido passar o ponteiro como um argumento de função. Nos outros casos o resultado é indefinido.

Uma tentativa de chamar um ponteiro incorreto causa a finalização crítica de um programa. É por isso que a função CheckPointer() deve ser chamada antes de usar um ponteiro. Um ponteiro pode estar incorreto nos seguintes casos:

·o ponteiro é igual a NULL;

·o objeto foi excluído usando o operador delete.

Esta função pode ser usada para verificar a validade de um ponteiro. Um valor não-zero garante que o ponteiro pode ser usado para acesso.

Funções comuns : CryptEncode

Transforms the data from array with the specified method.

int  CryptEncode(
ENUM_CRYPT_METHOD   method,        // method
const uchar&        data[],        // source array
const uchar&        key[],         // key
const uchar&        result[]       // destination array
);

Parameters

method

[in]  Data transformation method. Can be one of the values of ENUM_CRYPT_METHOD enumeration.

data[]

[in]  Source array.

key[]

[in]  Key array.

result[]

[out]  Destination array.

Returned value

Amount of bytes in the destination array or 0 in case of error. To obtain information about the error call the GetLastError() function.

Example:

//+——————————————————————+
//| ArrayToHex                                                       |
//+——————————————————————+
string ArrayToHex(uchar &arr[],int count=-1)
{
string res=””;
//— check
if(count<0 || count>ArraySize(arr))
count=ArraySize(arr);
//— transform to HEX string
for(int i=0; i<count; i++)
res+=StringFormat(“%.2X”,arr[i]);
//—
return(res);
}
//+——————————————————————+
//| Script program start function                                    |
//+——————————————————————+
void OnStart()
{
string text=”The quick brown fox jumps over the lazy dog”;
string keystr=”ABCDEFG”;
uchar src[],dst[],key[];
//— prepare key
StringToCharArray(keystr,key);
//— copy text to source array src[]
StringToCharArray(text,src);
//— print initial data
PrintFormat(“Initial data: size=%d, string=’%s'”,ArraySize(src),CharArrayToString(src));
//— encrypt src[] with DES 56-bit key in key[]
int res=CryptEncode(CRYPT_DES,src,key,dst);
//— check error
if(res>0)
{
//— print encrypted data
PrintFormat(“Encoded data: size=%d %s”,res,ArrayToHex(dst));
//— decode dst[] to src[]
res=CryptDecode(CRYPT_DES,dst,key,src);
//— check error
if(res>0)
{
//— print decoded data
PrintFormat(“Decoded data: size=%d, string=’%s'”,ArraySize(src),CharArrayToString(src));
}
else
Print(“Error in CryptDecode. Error code=”,GetLastError());
}
else
Print(“Error in CryptEncode. Error code=”,GetLastError());
}

Funções comuns : Comment

Esta função exibe um comentário definido pelo usuário no canto superior esquerdo de um gráfico.

void  Comment(
argument,     // primeiro valor
…           // próximos valores
);

Parâmetros
[in]   Quaisquer valores, separados por vírgulas. Para delimitar a exibição da informação em várias linhas, um símbolo de quebra de linha “\n” ou “\r\n” é usado. O número de parâmetros não pode exceder 64. O comprimento total do comentário de entrada (incluindo símbolos invisíveis) não pode exceder 2045 caracteres (símbolos em excesso serão eliminados da exibição)

Valor do Retorno

Sem valor de retorno

Observação

Arrays não podem ser passados para a função Comment(). Arrays devem ser alimentados elemento a elemento.

Dados de tipo double são impressos com precisão de até 16 dígitos após o ponto decimal, e podem ser impressos tanto na forma tradicional quanto na forma científica, dependendo de qual notação será a mais compacta. Dados do tipo float são exibidos com 5 dígitos após o ponto decimal. Para exibir números reais com uma outra precisão ou em um formato predefinido, use a função DoubleToString().

Dados de tipo bool são impressos como strings “true” ou “false”. Datas são mostradas como YYYY.MM.DD HH:MM:SS. Para mostrar datas em um outro formato, use a função TimeToString(). Dados de tipo color são impressos tanto como strings R,G,B quanto como nome de cor, se esta cor estiver presente no conjunto de cores.

Exemplo:

void OnTick()
{
//—
double Ask,Bid;
int Spread;
Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
//— Exibe valores em 3 linhas
Comment(StringFormat(“Mostrar preços\nAsk = %G\nBid = %G\nSpread = %d”,Ask,Bid,Spread));
}

Funções Comuns : CheckPointer

A função retorna o tipo do ponteiro de objeto.

ENUM_POINTER_TYPE  CheckPointer(
object* anyobject      // ponteiro de objeto
);

Parâmetros

anyobject

[in]  Ponteiro de objeto.

Valor de retorno

Retorna um valor da enumeração ENUM_POINTER_TYPE.

Observação

Uma tentativa de chamar um ponteiro incorreto resulta na finalização crítica de um programa. É por isso que é necessário chamar a função CheckPointer antes de usar um ponteiro. Um ponteiro pode estar incorreto nos seguintes casos:

·o ponteiro é igual a NULL;

·o objeto foi excluído usando o operador delete.

Esta função pode ser usada para checar a validade do ponteiro. Um valor não zero garante que o ponteiro pode ser usado para acesso.

Exemplo:

//+——————————————————————+
//| Exclui lista através da exclusão de seus elementos               |
//+——————————————————————+
void CMyList::Destroy()
{
//— ponteiro de serviço para trabalhar no loop
CItem* item;
//— percorre pelo loop e tenta excluir ponteiros dinâmicos
while(CheckPointer(m_items)!=POINTER_INVALID)
{
item=m_items;
m_items=m_items.Next();
if(CheckPointer(item)==POINTER_DYNAMIC)
{
Print(“Dynamic object “,item.Identifier(),” para ser excluído”);
delete (item);
}
else Print(“Objeto não-dinâmico “,item.Identifier(),” cannot be deleted”);
}
//—
}

Funções comuns : Alert

Exibe uma mensagem em uma janela separada.

void  Alert(
argument,     // primeiro valor
…           // outros valores
);

Parâmetros

argument

[in]  Quaisquer valores separados por virgulas. Para dividir a saída da informação em várias linhas você pode usar o caractere de quebra de linha “\n” ou “\r\n”. O número de parâmetros não pode exceder 64.

Valor do Retorno

Sem valor de retorno.

Observação

Arrays não podem ser passados para a função Alert(). Arrays devem ser fornecidos elemento a elemento. Dados do tipo double são exibidos com 8 dígitos após o ponto decimal, dados do tipo float são exibidos com 5 dígitos após o ponto decimal. Para exibir os números reais com uma precisão diferente ou em notação científica, use a função DoubleToString().

Dados do tipo bool são exibidos como strings “true” ou “false”. Datas são exibidas como YYYY.MM.DD HH:MM:SS. Para exibir uma data em um outro formato use a função TimeToString(). Dados do tipo color são exibidos tanto como uma string R,G,B ou como nome de cor, se a cor estiver presente no conjunto de cores.

As variáveis predefinidas

Para cada programa MQL5 executável, um conjunto de variáveis predefinidas é suportado, que reflete o estado do gráfico de preço corrente no momento em que um programa-mql5 é iniciado.

Os valores das variáveis predefinidas são definidas pelo terminal cliente antes de um programa MQL5 ser iniciado. Variáveis predefinidas são constantes e não podem ser alteradas a partir de um programa MQL5. Como exceção, existe a variáveis especial _LastError, que pode ser redefinida para 0 pela função ResetLastError.

_Digits : Número de casas decimais
_Point : Tamanho do ponto do ativo corrente na moeda de cotação
_LastError : O último código de erro
_Period : Janela de tempo do gráfico corrente
_RandomSeed : Status atual do gerador de números pseudo-aleatórios
_StopFlag : Flag de parada de programa
_Symbol : Nome do ativo do gráfico corrente
_UninitReason : Código do motivo da não inicialização

Variáveis predefinidas não podem ser definidas em uma biblioteca. Uma biblioteca usa tais variáveis que são definidas em um programa a partir do qual esta biblioteca é chamada.

Testando Estratégias de Negociação

A ideia de negociação automática é atraente pelo fato de que o robô de negociação pode trabalhar sem parar 24 horas por dia, sete dias por semana. O robô não fica cansado, em dúvida, ou com medo, ele é totalmente livre de quaisquer problemas psicológicos. Basta formalizar de forma clara as regras de negociação e implementá-las nos algoritmos, e o robô está pronto para trabalhar incansavelmente. Mas primeiro, você deve se certificar de que as duas condição importantes seguintes estão satisfeitas:

·O Expert Advisor realiza operações de negociação em concordância com as regras do sistema de negociação;
·A estratégia de negociação, implementada no EA, demonstra lucro no histórico.

Para obter respostas para estas questões, nos voltamos para o Provador de Estratégia, incluído no terminal cliente MetaTrader. Esta seção aborda as características do teste e otimização de programa no Provador de Estratégia:

·Modos de Geração de Tick
·Simulação de Spread
·As Variáveis Globais do Terminal Cliente
·O Cálculo de Indicadores durante um Teste
·Carregando Histórico durante Teste
·Teste Multi-Moeda
·Simulação de Tempo no Provador de Estratégia
·Objetos Gráficos no Teste
·A Função OnTimer() no Provador de Estratégia
·A Função Sleep() no Provador de Estratégia
·A função Print() no Provador de Estratégia
·Usando o Provador de Estratégia para Problemas de Otimização em Cálculos Matemáticos
·A Sincronização de Barras no modo “Somente Preço de Abertura”
·A função IndicatorRelease() no Provador de Estratégia
·Tratamento de Evento no Provador de Estratégia
·Agentes de Teste
·A Troca de Dados entre o Terminal e o Agente
·Usando a Pasta Compartilhada para Todos os Terminais Cliente
·Usando DLLs

Erros em Tempo de Execução

O subsistema de execução do terminal cliente tem a oportunidade de salvar o código do erro em caso de ocorrência durante a execução de um programa MQL5. Existe um variável predefinida _LastError para cada programa executável MQL.

Antes de iniciar a função OnInit, a variável _LastError é zerada. Em caso de uma situação de erro ocorrer durante a processamento de cálculos ou no processo de chamada de funções internas, o a variável _LastError recebe o código do erro correspondente. O valor armazenado nesta variável pode ser obtida usando a função GetLastError().

Existem diversos erros críticos cuja ocorrência faz com que um programa seja encerrado imediatamente:

·divisão por zero

·ir além dos limites de um array

·usando um ponteiro de objeto incorreto

Passando Parâmetros

Todos os parâmetros de tipos simples são passados por valor a menos que sejam explicitamente indicados que eles devem ser passados por referência. Quando uma string é passada, o endereço do buffer da string copiada é passado; se uma string é passada por referência, o endereço do buffer desta string sem copiá-la é passado para a função importada da DLL.

Estruturas que contém arrays dinâmicos, strings, classes, outras estruturas complexas, bem como arrays estáticos ou dinâmicos dos objetos listados, não podem ser passados como parâmetro para uma função importada.

Ao passar um array para uma DLL, o endereço do começo do buffer de dados é sempre passado (independentemente da flag AS_SERIES). Uma função dentro de uma DLL não sabe nada sobre a flag AS_SERIES, o array passado é um array estático de um comprimento indefinido; um parâmetro adicional deve ser usado para especificar o tamanho do array.