Documentação atualizada.
Documentação atualizada.
datetime iTime( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período int shift // deslocamento );
double iOpen( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período int shift // deslocamento );
double iHigh( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período int shift // deslocamento );
double iLow( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período int shift // deslocamento );
double iClose( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período int shift // deslocamento );
long iVolume( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período int shift // deslocamento );
int iBars( string symbol, // símbolo ENUM_TIMEFRAMES timeframe // período );
int iBarShift( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período datetime time, // tempo bool exact=false // modo );
int iLowest( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período int type, // identificador de timeseries int count, // número de elementos int start // índice );
int iHighest( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período int type, // identificador de timeseries int count, // número de elementos int start // índice );
long iRealVolume( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período int shift // deslocamento );
long iTickVolume( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período int shift // deslocamento );
long iSpread( string symbol, // símbolo ENUM_TIMEFRAMES timeframe, // período int shift // deslocamento );
void TesterHideIndicators( bool hide // sinalizador );
Documentação atualizada.
Correções de crash-logs.
MetaTrader 5 build 1745 é a versão mais recente da plataforma de negociação, ela suporta o Microsoft Windows XP/2003/Vista.
Alguns meses atrás, nós anunciamos o fim do suporte a versões mais antigas dos sistemas operacionais.
Windows 2003, Windows Vista e, em particular, Microsoft Windows XP
estão desatualizados. Há um ano, a Microsoft deixou de dar suporte ao
Windows XP 3, uma vez que limitações técnicas não permitiam implementar
todo o potencial do hardware.
MetaTrader 5 build 1745, bem como versões liberadas anteriormente
continuarão a trabalhar nesses sistemas operacionais, mas sem
atualizações. Além disso, nesses sistemas operacionais, não serão
executados instaladores.
A versão mínima para trabalhar com o
MetaTrader 5 é o Windows 7, no entanto recomendamos que você use a
versão de 64 bits do Windows 10.
Na nova versão da plataforma será descontinuado o suporte a terminais desktop e móveis das versões mais antigas:
Para dar suporte a novos projetos de grupo, foi modificado o protocolo
de trabalho com o armazenamento online MQL5 Storage. Infelizmente, após a
atualização para uma nova versão da plataforma, você terá que
re-extrair todos os dados a partir do repositório. Os dados armazenados
nele não serão nem afetados nem perdidos.
Antes de atualizar
para uma nova versão da plataforma, recomendamos que você envie todas as
alterações locais para o repositório (executar Commit).
Por exemplo, você pode criar uma ferramenta que mostrará o índice do dólar (USDX). Sua fórmula é a seguinte:
50.14348112 * pow(ask(EURUSD),-0.576) * pow(USDJPY,0.136) * pow(ask(GBPUSD),-0.119) * pow(USDCAD,0.091) * pow(USDSEK,0.042) * pow(USDCHF,0.036)
Nota: na fórmula original do índice do dólar, são usados os pares
USDEUR e USDGBP. Como na plataforma há apenas pares invertidos, na
fórmula do instrumento sintético para eles é usada uma potência negativa
e o preço Ask, em vez do Bid.
A plataforma calculará em tempo
real o preço do novo instrumento com base nas cotações de outros seis
instrumentos diferentes fornecidos pela sua corretora. Na Observação do
mercado e no gráfico, você pode ver como se altera seu preço:
int CustomTicksAdd( const string symbol, // nome do símbolo const MqlTick& ticks[] // matriz com dados de ticks que é necessário aplicar ao instrumento personalizado );A função CustomTicksAdd permite enviar ticks, como se viessem do servidor da corretora. Os dados não são gravados diretamente no banco de ticks, em vez disso, são enviados para a janela "Observação do mercado". Em seguida, a partir dela, o terminal armazena ticks em seu banco de dados. Quando o volume de dados enviados numa única chamada é muito grande, a função muda o seu comportamento para economizar recursos. Ao carregar mais de 256 ticks, os dados são divididos em duas partes. A primeira parte (a maior) é imediatamente gravada no banco de ticks (como o faz CustomTicksReplace). A segunda parte, que consiste nos últimos 128 ticks, é enviada através da janela "Observação do mercado" e, em seguida, é armazenada na base do terminal.
Projetos com recursos completos estão agora disponíveis no
MetaEditor. O processo de desenvolvimento de programas se tornou muito
mais conveniente.
Agora o arquivo de programa principal MQ5 não
é apresentado como projeto. O projeto é um arquivo separado "MQPROJ",
em que são armazenadas as configurações do programa, os parâmetros de
compilação e informações sobre todos os arquivos utilizados. O acesso às
principais configurações do projeto é organizado através de uma caixa
de diálogo separada, não há mais necessidade de especificá-las no código
fonte através de #property.
Para o trabalhar facilmente com o projeto, existe uma guia
separada no Navegador. Ela mostra todos os arquivos usados por
categorias: incluídos, de recurso, de cabeçalhos, etc. Além disso, os
arquivos são adicionados ao navegador do projeto automaticamente. Por
exemplo, se você habilitar um novo arquivo MQH no código, ele será
exibido automaticamente na seção "Dependencies" do navegador.
Ao
mesmo tempo, nós tornamos possível trabalhar com novos projetos no
repositório online MQL5 Storage. Agora, o desenvolvimento de grandes
projetos pode ser realizado conjuntamente com outros participantes da
MQL5.community.
Para trabalhar com projetos em grupo, foi adicionada a nova seção Shared Projects. O projeto criado nesta seção é imediatamente enviado para o repositório: você pode distribuir rapidamente permissões de acesso a ele a outros participantes e começar o desenvolvimento conjunto.
Quando você compila o projeto no Shared Project, o executável EX5 é automaticamente copiado no catálogo local Experts, Indicators ou Scripts, dependendo do tipo de programa. Você pode imediatamente executar o programa dentro do gráfico, sem ter que copiar os arquivos manualmente de cada vez.
Alterações no trabalho com o repositório MQL5 Storage
Para uma experiência completa com projetos em grupo, foi refeito o protocolo de trabalho com o repositório MQL5 Storage. Infelizmente, após a atualização para uma nova versão da plataforma, você terá que re-extrair todos os dados a partir do repositório. Os dados armazenados nele não serão nem afetados nem perdidos.
Agora o comando "Extrair dados do repositório" (Checkout from Storage) está indisponível. Para extrair dados, são usados os comandos "Ativar MQL5 Storage" e "Obter arquivo do repositório":
Novos projetos: exemplo de criação e detalhes de trabalho
Ao MetaEditor foi adicionado o projeto. Trata-se de um arquivo com extensão mqproj, em que são armazenadas as propriedades gerais do programa, bem como informações sobre todos os arquivo utilizados. Agora é possível gerenciar facilmente as propriedades do programa numa caixa de diálogo separada do MetaEditor, em vez de alterá-las manualmente no código-fonte (diretiva #property).
Se você já tiver um projeto, a maneira mais fácil de experimentar novos projetos é usar o comando "Novo projeto a partir do arquivo-fonte."
No diretório em que o arquivo selecionado está localizado, será criado um novo arquivo de projeto com o mesmo nome e a extensão mqproj. As principais propriedades do programa especificadas no código-fonte via #property serão automaticamente adicionadas ao projeto, incluindo o nome, direitos de autor, versão, link para o site e programa de descrição do desenvolvedor.
Foram adicionadas duas novas opções para compilar programas MQL5:
Para trabalhar com o projeto, use a guia separada "Projeto" na janela "Navegador". Todos os arquivos usados no projeto são exibidos nesta guia convenientemente. Quando um projeto é gerado a partir de um arquivo de origem, todos os arquivos anexados (especificados usando a diretiva #include no arquivo MQ5 principal e em todos os arquivos incluídos no mesmo) são automaticamente adicionados à seção "Dependencies".
Quando você adiciona novos arquivos no código fonte, eles também aparecerão no Navegador do projeto. Os arquivos de cabeçalho usados serão adicionados à seção Headers, enquanto as imagens, sons e outros programas MQL5 são adicionados ao projeto como recursos na seção Resources. Na seção Sources, são exibidos os arquivos MQ5 com código-fonte. Na seção Settings and files, pode-se adicionar outros arquivo, por exemplo, configurações de teste e modelos de gráficos.
Para adicionar arquivos existentes a um projeto ou para excluir os arquivos a partir dele, use os comandos do menu contextual. Tenha cuidado ao excluir, pois você pode estar removendo um arquivo de projeto (remover a ligação) ou completamente excluí-lo do disco rígido:
Criar um novo projeto é tão facilmente como a criação de um programa MQL5 convencional. Clique em "Novo projeto", selecione o tipo de programa e especifique suas propriedades (nome, manipuladores de eventos, etc.) no Assistente MQL5, no modo normal.
Para obter um arquivo executável EX5, você pode abrir um projeto e pressionar F7 (o comando de compilação) ou abrir o arquivo MQ5 principal do programa e compilá-lo.
Projetos em grupo no MQL5 Storage: detalhes de trabalho
Projetos em grupo são gerenciados a partir da seção Shared Projects. Se você não tiver conectado o repositório ainda, execute o comando Activate MQL5 Storage no menu de contexto desta pasta. MetaEditor verificará se o seu armazenamento contém dados armazenados e se existem quaisquer projetos disponíveis para você. Os dados existente serão recuperados do seu repositório e carregados na seu computador (Checkout). Os projetos em grupo serão exibidos na seção Shared Project, para extrai-los clique em "Extrair arquivos do repositório" no menu contextual.
Para criar um novo projeto grupal, selecione a pasta Shared Projects e clique em "Novo projeto":
Em seguida, complete as etapas do Assistente MQL5: defina o tipo, nome e propriedades do futuro programa. Para projetos em grupo, escolha nomes claros e compreensíveis, para que os outros participantes possam encontrá-los facilmente. Nos nomes dos projetos só podem ser usadas letras latinas sem espaços.
Imediatamente após a criação do projeto, ele é automaticamente adicionado ao repositório MQL5 Storage. Os arquivos usados pela biblioteca padrão no repositório não são adicionados, você pode adicioná-los manualmente, se necessário.
Para permitir outros participantes trabalharem com o projeto, abra suas propriedades. Você pode, especificando o login da MQL5.community, conceder permissões a usuários, bem como estabelecer os parâmetros gerais do trabalho em grupo:
A fim de facilitar o trabalho, ao compilar o projeto grupal, o
executável final (EX5) é copiado automaticamente na pasta Experts,
Indicators ou Scripts, dependendo do tipo de programa. Assim, você pode
executar imediatamente o programa no terminal, sem ter que copiá-lo
manualmente no diretório desejado.
Projetos públicos no MQL5 Storage: participação no desenvolvimento
Como mencionado acima, cada projeto em grupo, na MQL5 Storage, tem configurações de disponibilidade ao público: o projeto pode ser privado ou aberto à participação de outros usuários. Agora, todos os projetos com participação livre são exibidos na guia separada "Projetos públicos".
Todo mundo pode encontrar um projeto interessante e participar em seu desenvolvimento. Basta pressionar "Ingressar" e, em seguida, receber o projeto a partir do repositório.
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- arquivo de modelo como matriz binária unsigned char my_template[]= { 0xFF,0xFE,0x3C, ... ,0x00 // a matriz de dados é reduzida }; //--- armazenamento e implementação do modelo if(FileSave("my_template.tpl",my_template)) { Print("Custom template saved in \\MQL5\\Files"); if(ChartApplyTemplate(0,"\\Files\\my_template.tpl")) Print("Custom template applied to the current chart"); else Print("Failed to apply custom template"); } else Print("Failed to save custom template"); }
Função | Ação |
---|---|
CustomSymbolCreate | Cria um símbolo personalizado com o nome especificado no grupo definido |
CustomSymbolDelete | Remove o símbolo personalizado com o nome especificado |
CustomSymbolSetInteger | Define o valor do tipo inteiro para o símbolo personalizado |
CustomSymbolSetDouble | Define o valor do tipo real para o símbolo personalizado |
CustomSymbolSetString | Define o valor do tipo cadeia de caracteres para o símbolo personalizado |
CustomSymbolSetMarginRate | Define o coeficiente de cobrança da margem - dependendo do tipo e direção da ordem - para o símbolo personalizado |
CustomSymbolSetSessionQuote | Define a hora de início e fim da sessão de cotação especificada para o símbolo especificado e dia da semana |
CustomSymbolSetSessionTrade | Define a hora de início e fim da sessão de negociação especificada para o símbolo especificado e dia da semana |
CustomRatesDelete | Exclui todas as barras no histórico de preço do instrumento personalizado, no intervalo de tempo selecionado |
CustomRatesReplace | Substitui todo o histórico de preços do instrumento personalizado pelos dados na matriz do tipo MqlRates, no intervalo de tempo definido |
CustomRatesUpdate | Adiciona ao histórico do instrumento personalizado as barras que faltam e substitui os dados existentes na matriz do tipo MqlRates |
CustomTicksAdd | Adiciona dados de uma matriz do tipo MqlTick ao histórico de preços de um símbolo personalizado. O símbolo personalizado deve ser selecionado na janela Market Watch (Observação do mercado). |
CustomTicksDelete | Exclui todos os ticks no histórico de preço do instrumento personalizado, no intervalo de tempo selecionado |
CustomTicksReplace | Substitui todo o histórico de preço do instrumento personalizado pelos dados na matriz do tipo MqlTick, no intervalo de tempo definido |
A biblioteca está localizada no diretório de trabalho do terminal na pasta Include\Generic.
bool ArraySwap( void& array1[], // primeira matriz void& array2[] // segunda matriz );A função implementa matrizes dinâmicas do mesmo tipo e as mesmas dimensões. Para matrizes multidimensionais, o número de elementos em todas as dimensões, excepto o primeiro, tem de ser o mesmo.
union LongDouble { long long_value; double double_value; };Em contraste com a estrutura, os diferentes membros da união pertencem ao mesmo local de memória. Neste exemplo, é declarada a união LongDouble, em que o valor do tipo long e o valor do tipo double dividem a mesma área de memória. É importante entender que é impossível fazer com que esta união armazene simultaneamente um valor inteiro long e um real double (como seria na estrutura), porque as variáveis double_value e long_value se sobrepõem (na memória). Por outro lado, o programa MQL5 é capaz de processar os dados da união como um número inteiro (long) ou um real (double) a qualquer momento. Consequentemente, a união permite a obtenção de dois (ou mais) variantes de representação da mesma sequência de dados.
union LongDouble { long long_value; double double_value; }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- LongDouble lb; //--- obtemos e exibimos o número inválido -nan(ind) lb.double_value=MathArcsin(2.0); printf("1. double=%f integer=%I64X",lb.double_value,lb.long_value); //--- maior número normalizado (DBL_MAX) lb.long_value=0x7FEFFFFFFFFFFFFF; printf("2. double=%.16e integer=%I64X",lb.double_value,lb.long_value); //--- menor positivo normalizado (DBL_MIN) lb.long_value=0x0010000000000000; printf("3. double=%.16e integer=%.16I64X",lb.double_value,lb.long_value); } /* Resultado de execução 1. double=-nan(ind) integer=FFF8000000000000 2. double=1.7976931348623157e+308 integer=7FEFFFFFFFFFFFFF 3. double=2.2250738585072014e-308 integer=0010000000000000 */
class Foo { int value; public: string Description(void){return IntegerToString(value);}; //--- construtor por padrão Foo(void){value=-1;}; //--- construtor com parâmetros Foo(int v){value=v;}; }; //+------------------------------------------------------------------+ //| estrutura contendo o objeto do tipo Foo | //+------------------------------------------------------------------+ struct MyStruct { string s; Foo foo; }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- MyStruct a,b; Foo an_foo(5); a.s="test"; a.foo=an_foo; Print("a.s=",a.s," a.foo.Description()=",a.foo.Description()); Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); //--- Print("b=a"); b=a; //--- Print("a.s=",a.s," a.foo.Description()=",a.foo.Description()); Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); /* Resultado de execução; a.s=test a.foo.Description()=5 b.s= b.foo.Description()=-1 b=a a.s=test a.foo.Description()=5 b.s=test b.foo.Description()=5 */ }No operador implícito, é realizada a cópia de objetos recebidos.
ENUM_POSITION_REASON | ENUM_DEAL_REASON | ENUM_ORDER_REASON | Descrição de razões |
---|---|---|---|
POSITION_REASON_CLIENT | DEAL_REASON_CLIENT | ORDER_REASON_CLIENT | Transação realizada como resultado da ativação de uma ordem colocada a partir de um terminal desktop |
POSITION_REASON_MOBILE | DEAL_REASON_MOBILE | ORDER_REASON_MOBILE | Transação realizada como resultado da ativação de uma ordem colocada a partir de um aplicativo móvel |
POSITION_REASON_WEB | DEAL_REASON_WEB | ORDER_REASON_WEB | Transação realizada como resultado da ativação de uma ordem colocada a partir da plataforma web |
POSITION_REASON_EXPERT | DEAL_REASON_EXPERT | ORDER_REASON_EXPERT | Transação realizada como resultado da ativação de uma ordem colocada a partir de um programa MQL5, Expert Advisor ou script |
- | DEAL_REASON_SL | ORDER_REASON_SL | Transação realizada como resultado da ativação de uma ordem Stop Loss |
- | DEAL_REASON_TP | ORDER_REASON_TP | Transação realizada como resultado da ativação de uma ordem Stop Loss |
- | DEAL_REASON_SO | ORDER_REASON_SO | Transação realizada como resultado do evento Stop Out |
- | DEAL_REASON_ROLLOVER | - | Transação realizada devido à transferência da posição |
- | DEAL_REASON_VMARGIN | - | Transação realizada após creditada/debitada a margem de variação |
- | DEAL_REASON_SPLIT | - | Transação realizada após o fracionamento (redução do preço) do ativo que tinha a posição aberta durante a declaração do fracionamento |
Documentação atualizada.
//+------------------------------------------------------------------+ //| Função de modelo | //+------------------------------------------------------------------+ template<typename T1,typename T2> string Assign(T1 &var1,T2 var2) { var1=(T1)var2; return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| Sobrecarga especial para o caso bool+string | //+------------------------------------------------------------------+ string Assign(bool &var1,string var2) { var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0); return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int i; bool b; Print(Assign(i,"test")); Print(Assign(b,"test")); }Como resultado da execução deste código, podemos ver que para o par int+string foi utilizada a função de modelo Assign(), enquanto, na segunda chamada, para o par bool+string já foi utilizada a versão sobrecarregada.
string Assign<int,string>(int&,string) string Assign(bool&,string)
template<typename T> T Func() { return (T)0; } void OnInit() { Func<double>(); // especialização explícita da função de modelo }Assim, a especialização não se realiza através do parâmetro de chamada, mas sim especificando os tipos.
Documentação atualizada.
Documentação atualizada.
#resource caminho_para_o_arquivo_do_recurso as tipo_de_variável_de_recurso nome_de_variável_de_recurso
#resource "data.bin" as int ExtData[] // declaração de matriz de tipo numérico, que contém dados a partir do arquivo data.bin #resource "data.bin" as MqlRates ExtData[] // declaração de matriz de estrutura simples, que contém dados a partir do arquivo data.bin #resource "data.txt" as string ExtCode // declaração de cadeias de caracteres, que contém dados a partir do arquivo data.txt #resource "data.txt" as string ExtCode[] // declaração de matriz de sequência de caracteres, que contém dados a partir do arquivo data.txt #resource "image.bmp" as bitmap ExtBitmap[] // declaração de matriz unidimensional, que contém em si a varredura a partir do arquivo BMP, tamanho da matriz = height * width #resource "image.bmp" as bitmap ExtBitmap2[][] // declaração de matriz bidimensional, que contém em si a varredura a partir do arquivo BMP, tamanho da matriz [height][width]
Documentação atualizada.
string str; ... if(str) // aparecerá o erro de compilação "Cannot convert type 'string' to 'bool'" (nas compilações anteriores não acontecia o erro) Print("str is true");É necessário escrever uma condição explícita:
string str; ... //--- verifica se a cadeia de caracteres é inicializada if(str!=NULL) Print("str is true"); ou //--- verifica se o valor da cadeia de caracteres é "true" if(StringCompare(str,"true",false)) Print("str is true"); ou //--- verifica se a cadeia de caracteres é um número e não é igual a zero if((int)str!=0) Print("str is true");
Correções de crash-logs.
void ArrayPrint( const void& array[], // matriz de saída uint digits=_Digits, // número de casas decimais const string separator=NULL, // delimitador entre os valores dos campos de estrutura ulong start=0, // índice do primeiro elemento de saída ulong count=WHOLE_ARRAY, // número de elementos de saída ulong flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN );ArrayPrint não exibe, no registro, todos os campos da matriz de estruturas, uma vez que os campos tanto de matriz como de ponteiros de objetos são omitidos. Para exibição de todos os campos dessa estrutura, será necessário escrever a função de saída em massa com a formatação desejada.
//--- exibe os valores das 10 últimas barras MqlRates rates[]; if(CopyRates(_Symbol,_Period,1,10,rates)) { ArrayPrint(rates); Print("Verificação\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]"); for(int i=0;i<10;i++) { PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i, TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS), rates[i].open,rates[i].high,rates[i].low,rates[i].close, rates[i].tick_volume,rates[i].spread,rates[i].real_volume); } } else PrintFormat("CopyRates failed, error code=%d",GetLastError()); //--- exemplo de saída /* [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747 17829 9 15632176000 [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 Verificação [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 */
void OnStart() { int arr[]; //--- quanta memória é usada inicialmente Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- quanta memória é usado para uma matriz de tamanho 1, mas com uma reserva de ArrayResize(arr,1,1024*1024); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- após aumentar a matriz, o tamanho da memória utilizada não é alterado pela reserva ArrayResize(arr,1024*512,1024*1024); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- após reduzir a matriz, o tamanho da memória utilizada também não é alterado ArrayResize(arr,1); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- a memória sem uso é liberada pela remoção da reserva ArrayResize(arr,1,-1); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); }
#include <Graphics/Graphic.mqh> double Func1(double x) { return MathPow(x,2); } double Func2(double x) { return MathPow(x,3); } double Func3(double x) { return MathPow(x,4); } void OnStart() { GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES); }Resultado:
#include <Math/Stat/Binomial.mqh> #include <Graphics/Graphic.mqh> void OnStart(void) { double vars[101]; double results[101]; const int N=2000; //--- MathSequence(0,N,20,vars); MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results); ArrayPrint(results,4); GraphPlot(results); //--- }Resultado:
Documentação atualizada.
Na biblioteca padrão, foi incluía a versão MQL5 da biblioteca de análise numérica ALGLIB.
Possibilidades da biblioteca
Como usar
Os arquivos da biblioteca ALGLIB estão localizados no diretório \MQL5\Include\Math\Alglib. Para usar as funções, adicione o arquivo principal da biblioteca ao seu programa:
A biblioteca padrão foram adicionadas funções de trabalho com estatística matemática. Agora, em MQL5, estão disponíveis as possibilidades da linguagem R, ela é um dos melhores instrumentos de processamento estatístico e análise de dados.<br1>
Possibilidades da biblioteca
A biblioteca estatística contém funções para cálculo de características estatísticas de dados, bem como funções para trabalhar com distribuições estatísticas:
Como usar
Os arquivos da biblioteca ALGLIB estão localizados no diretório \MQL5\Include\Math\Stat. Para usar as funções, adicione o arquivo com as funções desejadas ao seu programa, por exemplo:
#include <Math\Stat\Binomal.mqh> #include <Math\Stat\Cauchy.mqh>
Leia descrições detalhadas das funções da biblioteca no artigo Distribuições estatísticas em MQL5: pegamos as melhores a partir de R.
Na biblioteca padrão, foi incluía a versão MQL5 da biblioteca Fuzzy, ela implementa sistemas de inferência de lógica difusa Mastop e Sugeno.
Possibilidades da biblioteca
Como usar
Os arquivos da biblioteca Fuzzy estão localizados no diretório \MQL5\Include\Math\Fuzzy. Para usar as funções, adicione o arquivo com as funções desejadas ao seu programa, por exemplo:
#include <Math\Fuzzy\mamdanifuzzysystem.mqh> #include <Math\Fuzzy\sugenofuzzysystem.mqh>
Uma descrição detalhada da biblioteca pode ser encontrada ni Code Base: Fuzzy, biblioteca para trabalhar com lógica difusa
long FileLoad( const string filename, // [in] nome do arquivo void &buffer[], // [out] matriz na qual é tomado em consideração o arquivo uint common_flag=0 // [in] 0 - busca do arquivo na pasta Files do terminal, FILE_COMMON - na pasta comum dos terminais ); bool FileSave( const string filename, // [in] nome do arquivo const void &buffer[], // [in] matriz armazenada no arquivo uint common_flag=0 // [in] 0 - criação do arquivo na pasta Files do terminal, FILE_COMMON - na pasta comum dos terminais );Exemplo de como armazenar, numa pasta, uma matriz de ticks e, em seguida, lê-la.
//--- parâmetros de entrada input int ticks_to_save=1000; // número de ticks //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { string filename=_Symbol+"_ticks.bin"; MqlTick ticks[]; //--- int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save); if(copied!=-1) { PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied); //--- se o histórico de ticks estiver sincronizado, o código de erro será igual a zero if(!GetLastError()==0) PrintFormat("%s: Ticks are not synchronized. Error=",_Symbol,copied,_LastError); //--- armazenamos os ticks no arquivo if(!FileSave(filename,ticks,FILE_COMMON)) PrintFormat("FileSave() failed, error=%d",GetLastError()); } else PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError()); //--- agora lemos de volta estes ticks a partir do arquivo ArrayFree(ticks); long count=FileLoad(filename,ticks,FILE_COMMON); if(count!=-1) { Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags"); for(int i=0;i<count;i++) { PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x", TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000, ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags); } } }
//--- velas pintadas na mesma cor #property indicator_label1 "One color candles" #property indicator_type1 DRAW_CANDLES //--- foi indicado apenas uma cor, por isso todas as velas terão apenas uma cor #property indicator_color1 clrGreenSe forem indicadas duas cores, os contornos das velas serão desenhadas usando a primeira cor, enquanto o corpo usando a segunda.
//--- a cor das velas difere da cor das sombras #property indicator_label1 "Two color candles" #property indicator_type1 DRAW_CANDLES //--- sombras e contorno de velas de cor verde, corpo de cor branca #property indicator_color1 clrGreen,clrWhiteSe forem indicadas duas cores, os contornos das velas serão desenhadas usando a primeira cor, enquanto o as velas de alta e baixa serão definidas usando uma segunda e terceira.
//--- o cor das velas é diferente da cor das sombras #property indicator_label1 "One color candles" #property indicator_type1 DRAW_CANDLES //--- as sombras e contornos de cor verde; o corpo da vela de alta de cor branca; corpo da vela de baixa de cor vermelha #property indicator_color1 clrGreen,clrWhite,clrRedAssim, usando o estilo DRAW_CANDLES, é possível criar suas próprias opções personalizadas para colorir velas. Também é possível alterar dinamicamente todas as cores -no processo de trabalho do indicador- mediante a função PlotIndexSetInteger(índice_de_construção_DRAW_CANDLES, PLOT_LINE_COLOR, número_de_modificador, cor), aqui o número_de_modificador pode ter os seguintes valores:
//--- definimos a cor do contorno e das sombras PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue); //--- definimos a cor do corpo para a vela de alta PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen); //--- definimos a cor do corpo para a vela de baixa PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
Documentação atualizada.
class CFoo final { //--- corpo da classe }; class CBar : public CFoo { //--- тело класса };Ao tentar herdar a partir da classe com o modificador final, como foi mostrado no exemplo acima, o compilador exibirá o erro:
class CFoo { void virtual func(int x) const { } };Além disso, o método é substituído na classe herdada:
class CBar : public CFoo { void func(short x) { } };No entanto, de acordo com o erro, o tipo de argumento é alterado de int para short. De fato, neste caso, não acontece uma substituição, senão uma sobrecarga do método. Após agir segundo o algoritmo para determinar a função sobrecarregada, em determinadas situações, o compilador pode selecionar o método definido na classe base, em vez do método substituído.
class CBar : public CFoo { void func(short x) override { } };Se, durante a substituição, for alterada a assinatura do método, o compilador não poderá encontrar, na classe pai, o método com exatamente a mesma assinatura e exibirá o erro de compilação:
class CFoo { void virtual func(int x) final { } }; class CBar : public CFoo { void func(int) { } };Ao tentar substituir o método com o modificador final, como foi mostrado no exemplo acima, o compilador exibirá o erro:
Documentação atualizada.
class CFoo { }; class CBar { }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { void *vptr[2]; vptr[0]=new CFoo(); vptr[1]=new CBar(); //--- for(int i=0;i<ArraySize(vptr);i++) { if(dynamic_cast<CFoo *>(vptr[i])!=NULL) Print("CFoo * object at index ",i); if(dynamic_cast<CBar *>(vptr[i])!=NULL) Print("CBar * object at index ",i); } CFoo *fptr=vptr[1]; // emitirá o erro de apresentação de ponteiros, vptr[1] não é um objeto CFoo } //+------------------------------------------------------------------+
string text="Hello"; ushort symb=text[0]; // retorna o código do símbolo 'H'
Documentação atualizada.
Foi corrigido o cálculo da comissão em porcentagens anuais.Ъ
Foi corrigido o recálculo e a exibição do saldo no gráfico formado durante o teste.
Após 2 meses de testes públicos, anunciamos o lançamento oficial da versão web da plataforma multimercado MetaTrader 5. Ela permite negociar nos mercados financeiros através de qualquer navegador em qualquer sistema operacional. E, para isso, não é necessário instalar nenhum programa no computador, de fato, basta ter acesso à internet ou qualquer navegador web.
O aplicativo combina as vantagens chave da plataforma desktop (velocidade, faceta multimercado e características de negociação melhoradas) com a comodidade e o caráter multi-plataforma. A principal novidade da versão atualizada é o livro de ofertas para avaliar a profundidade do mercado, bem como a colocação num clique de ordens de mercado e pendentes.
A plataforma web permite realizar análise técnica e executar
negociações da mesma forma como na versão desktop. No aplicativo, você
tem à sua disposição: