bool CalendarCountryById( const long country_id, // identificador do país MqlCalendarCountry& country // descrição do país );CalendarEventById — obtém a descrição do evento por identificador.
bool CalendarEventById( const long event_id, // identificador do evento MqlCalendarEvent& event // descrição do evento );CalendarValueById — obtém a descrição do valor do evento por identificador.
bool CalendarValueById( const long value_id, // identificador do valor MqlCalendarValue& value // descrição do valor );CalendarEventByCountry — obtém um array de notícias disponíveis por país.
bool CalendarEventByCountry( string country_code, // código do país MqlCalendarEvent& events[] // matriz do evento );CalendarEventByCurrency — obtém um array contendo as notícias disponíveis da moeda, que elas afetam.
bool CalendarEventByCurrency( string currency, // moeda MqlCalendarEvent& events[] // matriz de eventos );CalendarValueHistoryByEvent — obtém um array de valores para o período especificado de acordo com o identificador do evento.
bool CalendarValueHistoryByEvent( ulong event_id, // identificador do evento MqlCalendarValue& values[], // matriz de valores datetime datetime_from, // data inicial datetime datetime_to=0 // data final );CalendarValueHistory — obtém um array de valores de todos os pelo período definido com filtragem por país e/ou moeda.
bool CalendarValueHistory( MqlCalendarValue& values[], // matriz de valores datetime datetime_from, // início do período datetime datetime_to=0, // fim do período string country_code=NULL, // código do país string currency=NULL // moeda );CalendarValueLastByEvent — obtém o array dos últimos valores de evento por identificador. Esse recurso permite consultar apenas os valores que foram alterados desde a última consulta. Para fazer isso, é usado seu in/out parâmetro "change_id".
bool CalendarValueHistory( ulong event_id, // identificador do evento ulong& change_id, // identificador do último valor do calendário MqlCalendarValue& values[] // matriz de valores );CalendarValueLast — obtém o array dos últimos valores de todos os eventos com filtragem por país e/ou moeda. Esse recurso permite consultar apenas os valores que foram alterados desde a última consulta. Semelhante a CalendarValueLastByEvent, a propriedade "change_id" é usada para a consulta.
bool CalendarValueHistory( ulong event_id, // identificador do evento ulong& change_id, // ID da última alteração do calendário MqlCalendarValue& values[], // matriz de valores string country_code=NULL, // código do país string currency=NULL // moeda );
struct MqlCalendarCountry { ulong id; // identificador do país ISO 3166-1 string name; // nome do país string code; // código do país ISO 3166-1 alpha-2 string currency; // código da moeda do país string currency_symbol; // símbolo da moeda do país string url_name; // nome do país usado no URL no site mql5.com };MqlCalendarEvent — descrição do evento.
struct MqlCalendarEvent { ulong id; // identificador do evento ENUM_CALENDAR_EVENT_TYPE type; // tipo de evento ENUM_CALENDAR_EVENT_SECTOR sector; // setor ao qual está relacionado o evento ENUM_CALENDAR_EVENT_FREQUENCY frequency; // frequência de publicação de eventos ENUM_CALENDAR_EVENT_TIMEMODE time_mode; // modo de publicação de eventos por horário ulong country_id; // identificador do país ENUM_CALENDAR_EVENT_UNIT unit; // medida do valor do evento ENUM_CALENDAR_EVENT_IMPORTANCE importance; // importância do evento ENUM_CALENDAR_EVENT_MULTIPLIER multiplier; // multiplicador do valor do evento uint digits; // número de casas decimais no valor do evento string source_url; // URL da fonte string event_code; // código do evento string name; // nome do evento na linguagem do terminal };MqlCalendarValue — descrição do valor do evento.
struct MqlCalendarValue { ulong id; // identificador do valor ulong event_id; // identificador do evento datetime time; // hora e data do evento datetime period; // período de relatório do evento int revision; // revisão do indicador publicado em relação ao período de relatório long actual_value; // valor atual do evento long prev_value; // valor anterior do evento long revised_prev_value; // valor anterior revisado para o evento long forecast_value; // valor previsto do evento ENUM_CALENDAR_EVENT_IMPACRT impact_type; // impacto potencial na taxa de câmbio };
enum ENUM_CALENDAR_EVENT_FREQUENCY { CALENDAR_FREQUENCY_NONE =0, // não é usado CALENDAR_FREQUENCY_WEEK =1, // semana CALENDAR_FREQUENCY_MONTH =2, // mês CALENDAR_FREQUENCY_QUARTER =3, // trimestre CALENDAR_FREQUENCY_YEAR =4, // ano CALENDAR_FREQUENCY_DAY =5, // dia }; enum ENUM_CALENDAR_EVENT_TYPE { CALENDAR_TYPE_EVENT =0, // evento (reunião, discurso, etc.) CALENDAR_TYPE_INDICATOR =1, // indicador CALENDAR_TYPE_HOLIDAY =2, // feriado }; enum ENUM_CALENDAR_EVENT_SECTOR { CALENDAR_SECTOR_NONE =0, // não CALENDAR_SECTOR_MARKET =1, // mercado CALENDAR_SECTOR_GDP =2, // PIB CALENDAR_SECTOR_JOBS =3, // trabalho CALENDAR_SECTOR_PRICES =4, // preços CALENDAR_SECTOR_MONEY =5, // dinheiro CALENDAR_SECTOR_TRADE =6, // negociação CALENDAR_SECTOR_GOVERNMENT =7, // governo CALENDAR_SECTOR_BUSINESS =8, // negócio CALENDAR_SECTOR_CONSUMER =9, // usuário CALENDAR_SECTOR_HOUSING =10, // habitação CALENDAR_SECTOR_TAXES =11, // impostos CALENDAR_SECTOR_HOLIDAYS =12, // feriados }; enum ENUM_CALENDAR_EVENT_IMPORTANCE { CALENDAR_IMPORTANCE_NONE =0, // não CALENDAR_IMPORTANCE_LOW =1, // baixo CALENDAR_IMPORTANCE_MODERATE =2, // médio CALENDAR_IMPORTANCE_HIGH =3, // alto }; enum ENUM_CALENDAR_EVENT_UNIT { CALENDAR_UNIT_NONE =0, // não CALENDAR_UNIT_PERCENT =1, // porcentagem CALENDAR_UNIT_CURRENCY =2, // moeda nacional CALENDAR_UNIT_HOUR =3, // quantidade de horas CALENDAR_UNIT_JOB =4, // número de empregos CALENDAR_UNIT_RIG =5, // número de torres CALENDAR_UNIT_USD =6, // dólares estadunidenses CALENDAR_UNIT_PEOPLE =7, // número de pessoas CALENDAR_UNIT_MORTGAGE =8, // número de empréstimos hipotecários CALENDAR_UNIT_VOTE =9, // número de votos CALENDAR_UNIT_BARREL =10, // número de barreis CALENDAR_UNIT_CUBICFEET =11, // pés cúbicos CALENDAR_UNIT_POSITION =12, // número de empregos CALENDAR_UNIT_BUILDING =13 // número de edifícios }; enum ENUM_CALENDAR_EVENT_MULTIPLIER { CALENDAR_MULTIPLIER_NONE =0, // não CALENDAR_MULTIPLIER_THOUSANDS =1, // miles CALENDAR_MULTIPLIER_MILLIONS =2, // milhões CALENDAR_MULTIPLIER_BILLIONS =3, // bilhões CALENDAR_MULTIPLIER_TRILLIONS =4, // trilhões }; enum ENUM_CALENDAR_EVENT_IMPACRT { CALENDAR_IMPACT_NA =0, // desconhecido CALENDAR_IMPACT_POSITIVE =1, // positivo CALENDAR_IMPACT_NEGATIVE =2, // negativo }; enum ENUM_CALENDAR_EVENT_TIMEMODE { CALENDAR_TIMEMODE_DATETIME =0, // a fonte publica o tempo exato CALENDAR_TIMEMODE_DATE =1, // evento acontece durante todo o dia CALENDAR_TIMEMODE_NOTIME =2, // fonte não publica a hora do evento CALENDAR_TIMEMODE_TENTATIVE =3, // fonte não publica com antecedência o tempo exato do evento, apenas notifica o dia, o tempo é confirmado após a ocorrência do evento };
ERR_CALENDAR_MORE_DATA =5400, // matriz é pequena para o resultado inteiro (dados os valores que se ajustam na matriz) ERR_CALENDAR_TIMEOUT =5401, // expirado tempo de resposta da consulta de dados a partir do calendário ERR_CALENDAR_NO_DATA =5402, // dados não encontrados
bool CharArrayToStruct( void& struct_object, // estrutura const uchar& char_array[], // matriz uint start_pos=0 // posição inicial na matriz );StructToCharArray — copia uma estrutura POD para um array de tipo uchar.
bool StructToCharArray( const void& struct_object, // estrutura uchar& char_array[], // matriz uint start_pos=0 // posição inicial na matriz );
ushort MathSwap(ushort value); uint MathSwap(uint value); ulong MathSwap(ulong value);
bool StringReserve( string& string_var, // string uint new_capacity // tamanho do buffer para armazenar a string );StringSetLength — define para a string o comprimento especificado nos símbolos.
bool StringSetLength( string& string_var, // strings uint new_length // novo comprimento da string );
bool ArrayRemove( void& array[], // matriz de qualquer tipo uint start, // índice para começar a excluir uint count=WHOLE_ARRAY // número de elementos );ArrayInsert — insere o número especificado de elementos do array de origem no array de destino, iniciando no índice especificado.
bool ArrayInsert( void& dst_array[], // array de destino const void& src_array[], // array de origem uint dst_start, // índice no array de destino para inserir uint src_start=0, // índice no array de origem para copiar uint count=WHOLE_ARRAY // número de elementos a serem inseridos );ArrayReverse — inverte o número especificado de elementos no array, iniciando no índice especificado.
bool ArrayReverse( void& array[], // array de qualquer tipo uint start=0, // índice para começar a inverter o array uint count=WHOLE_ARRAY // número de elementos );
int CustomBookAdd( const string symbol, // nome do símbolo const MqlBookInfo& books[] // array com descrições de elementos do livro de ofertas uint count=WHOLE_ARRAY // número de elementos a serem usados );
bool CustomSymbolCreate( const string symbol_name, // nome do símbolo personalizado const string symbol_path="", // nome do grupo em que é criado o símbolo const string symbol_origin=NULL // nome do símbolo em cuja base é criado o símbolo personalizado );O nome do símbolo - do qual serão copiadas as propriedades do símbolo personalizado criado - é especificado no parâmetro "symbol_origin".
Adicionada tradução da interface do usuário para o idioma croata.
Documentação atualizada.
#import "TestLib.dll" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int x=41; TestClass::Inc(x); Print(x); }O código C# para a função Inc da classe TestClass é semelhante ao seguinte:
public class TestClass { public static void Inc(ref int x) { x++; } }Como resultado, o script retornará o valor 42.
struct MqlTick
{
datetime time; // Hora da última atualização de preço
double bid; // Preço Bid atual
double ask; // Preço Ask atual
double last; // Preço atual da última transação (Last)
ulong volume; // Volume para o preço Last atual
long time_msc; // Hora da última atualização de preço em milissegundos
uint flags; // Sinalizadores de ticks
double volume_real; // Volume para o preço Last atual com alta precisão
};
struct MqlBookInfo { ENUM_BOOK_TYPE type; // tipo de boleta a partir da enumeração ENUM_BOOK_TYPE double price; // preço long volume; // volume double volume_real; // volume com alta precisão };
//+------------------------------------------------------------------+ //| Default packing | //+------------------------------------------------------------------+ struct A { char a; int b; }; //+------------------------------------------------------------------+ //| Specified packing | //+------------------------------------------------------------------+ struct B pack(4) { char a; int b; }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { Print("sizeof(A)=",sizeof(A)); Print("sizeof(B)=",sizeof(B)); } //+------------------------------------------------------------------+Conclusão:
sizeof(A)=5 sizeof(B)=8Mais informações sobre o alinhamento em estruturas estão disponíveis no MSDN.
enum Main { PRICE_CLOSE_, PRICE_OPEN_ }; input Main Inp=PRICE_CLOSE; //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void OnStart() { }O compilador emitirá um aviso:
class X { }; void f(int) { } template<typename T> void a(T*) { new T(2); } // anteriormente neste lugar o compilador dava um erro template<typename T> void a() { f(0); } void OnInit() { a<X>(); }
Documentação atualizada.
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.