Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
negociar em um robô, varios ativos.
Rogerio Figurelli, 2019.09.15 12:53
Bem observado Trader_Patinhas, esse é o clássico problema técnico de tratamento por interrupção ou polling de qualquer sistema mais complexo, e no MT5 a solução de polling é a mais simples em termos de montagem de ambiente (apenas um gráfico e EA), mas certamente não é a ideal para estratégias que exigem menor latência, como no caso de scalpers.
Sds.,
Rogério Figurelli
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
COMO DIMINUIR A LATÊNCIA DO METATRADER
Rogerio Figurelli, 2019.09.26 12:06
Olá Trader_Patinhas, perfeitamente, minha observação foi apenas para não deixar margem para erros de interpretação, uma vez que o investimento é alto, e sua análise me parece dentro do escopo do fórum, afinal nada impede algum algotrader utilizar o próprio MT5 para acesso direto ao PUMA e rede local da B3, como, por exemplo, através de uma interface direta em protocolo FIX, mas sem dúvida essa é além de uma solução mais custosa, bem mais complexa. Na verdade, a grande maioria dos traders está buscando uma solução mais affordable, e o VPS com baixa latência entre cliente/servidor MT5 é sem dúvida o paradigma atual. Mas trazer opções e pensar "fora da caixa" — como você fez muito bem — também faz parte da lógica do fórum.
Por essa mesma lógica, não concordo com sua observação (Em tempo), já que o potencial de integração é ilimitado, e você pode justamente agregar sistemas integrados por FIX. Se desejar ir além, pode até mesmo integrar uma FPGA dedicada com protocolo FIX e algoritmos de HFT ao MT5, e nesse caso estar dentro desse rack é fundamental. Além disso, essa me parece uma arquitetura interessante para integrar trading systems que utilizam machine learning e linguagens externas, como Python, diretamente a decisões de HFT, já que a plataforma pode realizar as tarefas de integração em várias camadas e roteamento de ordens.
Sds.,
Rogério Figurelli
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Nova versão da plataforma MetaTrader 5 build 2170: escopos em MQL5, atualização global do testador de estratégia e hospedagem integrada
MetaQuotes Software Corp., 2019.10.03 21:58
Na sexta-feira, 4 de outubro de 2019, será lançada uma versão atualizada da plataforma MetaTrader 5. Ela contém as seguintes alterações:
Antes, para trabalhar com hospedagem virtual, era usado o menu de contexto da conta no Navegador. Agora todas as informações e comandos de controle necessários estão sempre à sua vista na guia "VPS":
No lado esquerdo, estão disponíveis informações básicas de assinatura:
Usando o botão Iniciar/Parar, você pode rapidamente parar e iniciar o terminal virtual.
A parte direita mostra informações sobre o equipamento no servidor-hospedagem, bem como gráficos de consumo de recursos usados pelo seu terminal. Se o seu Expert Advisor ou indicador usar uma quantidade excessiva de memória ou tempo do processador, você verá isso imediatamente e poderá responder oportunamente.
Também estão disponíveis informações sobre a migração mais recente do ambiente de negociação, bem como comandos para migrar novamente. Agora você não vai se esquecer de transferir o ambiente depois de comprar uma hospedagem.
Agora, o aluguel de hospedagem virtual também é realizado na guia "VPS". O processo em si não mudou, ainda requer apenas algumas etapas. Basta escolher uma tarifa e um sistema para pagamento. O melhor servidor para se conectar à sua corretora é selecionado automaticamente.
Agora você não precisa procurar as funções correspondentes em sua conta no site da corretora. Os comandos para navegar rapidamente para as páginas de depósito e retirada ficaram disponíveis diretamente nos terminais — no menu de contas no Navegador e na guia de negociação na Caixa de Ferramentas:
Categoria
A propriedade é usada para marcação adicional de instrumentos financeiros. Por exemplo, pode indicar setores de mercado relacionados com o símbolo: Agricultura, Petróleo e Gás, etc. Exibida apenas se as informações respectivas forem fornecidas pela corretora.
Bolsa de valores
Aqui é indicado o nome da bolsa ou da plataforma na qual é negociado o símbolo. Exibida apenas se as informações respectivas forem fornecidas pela corretora.
Comissão
Aqui são exibidas informações sobre as taxas cobradas pela corretora ao fazer trades do instrumento. São mostrados todos os detalhes do cálculo:
Por exemplo, a entrada a seguir significa que uma comissão é cobrada imediatamente após a entrada e saída de transações. Se o volume da transação for de 0 a 10 lotes, será cobrada uma comissão de US$ 1,2 por operação. Se o volume da transação for de 11 a 20 lotes, será cobrada uma comissão de US$ 1,1 por cada lote da transação.
0 - 10 | US$ 1.2 por transação
11 - 20 | US$ 1.1 por transação
Exemplo: no código são declaradas duas estruturas com o mesmo nome, mas em classes diferentes. Anteriormente, essa declaração gerava o erro de compilação "identifier already used". Agora esse código será compilado e executado com sucesso. Ao mesmo tempo, para acessar corretamente a variável/estrutura/função desejada fora de seu escopo, a classe deve ser indicada, neste caso, CBar::Item.
Adicionado suporte ao espaço de nomes (namespace), dando ainda mais liberdade ao usar códigos/bibliotecas de terceiros em nossos programas.
Como resultado da execução, o programa mostrará as seguintes linhas:
2019.09.18 13:39:35.949 TestScript (AUDCAD,H1) NS::func
2019.09.18 13:39:35.949 TestScript (AUDCAD,H1) C::C
2019.09.18 13:39:35.949 TestScript (AUDCAD,H1) NS::C::C
Neste exemplo, para as linhas "a1=a2" e "b1=b2", o compilador mostra os erros:
function 'void A::operator=(const A&)' was explicitly deleted here
attempting to reference deleted function 'void B::operator=(const B&)'
function 'void B::operator=(const B&)' was implicitly deleted because it invokes deleted function 'void A::operator=(const A&)'
O fechamento de posições podem ser realizado de três maneiras:
Exemplo de EA no qual o bloco de parâmetros de entrada é dividido segundo sua finalidade:
Ao iniciar este EA no testador de estratégia, você pode clicar duas vezes no nome do grupo para recolher e expandir o bloco de parâmetros de entrada, além de selecionar todos os seus parâmetros com um clique na caixa de seleção do grupo para otimização.
Anteriormente, a compilação deste tipo de código gerava o erro:
Agora, em vez do erro padrão, uma função MQL interna é usada como tendo uma prioridade mais alta. Para chamar a função importada, você deve especificar explicitamente o escopo:
Página inicial
Agora, ao iniciar o testador, em vez de muitas configurações, o usuário deve escolher uma das tarefas típicas e rapidamente começar a resolvê-la. Esta novidade é direcionada principalmente para usuários que não têm experiência.
Identificamos várias tarefas básicas para testar e otimizar estratégias e as apresentamos graficamente na primeira página. Além disso, a partir da página inicial, agora você pode reiniciar rapidamente uma das tarefas anteriores. Se você executar muitas tarefas, e todas elas não couberem na lista, use a barra de pesquisa. Ela permite encontrar testes por qualquer parâmetro: nome do programa, por instrumento, por período gráfico, por tipo de simulação, etc.
Omissão de parâmetros desnecessários
Escolhida um das tarefas na página inicial, você é reencaminhado para um ajuste mais preciso dos parâmetros de teste: escolha de EA, de instrumento, de período gráfico, etc. Para facilitar o trabalho, estão ocultos todos os parâmetros que não são necessários para a tarefa selecionada. Por exemplo, se você escolher cálculos matemáticos, precisará definir apenas dois parâmetros: escolha um programa para teste e um modo de otimização. As configurações para o período de teste, atrasos e geração de ticks serão ocultadas.
Configurações de teste convenientes
Por conveniência, foram reorganizados alguns parâmetros na página de configurações. Além disso, adicionadas informações estendidas para os parâmetros de atraso e de visualização. Além disso, as configurações de teste agora podem ser salvas e carregadas manualmente, o que permite que você retorne rapidamente aos resultados anteriores.
Você pode mudar rapidamente para a edição de programas no MetaEditor.
Cálculo de lucro em pips
Agora, nas configurações, você pode ativar o cálculo do lucro em pips. Isso permite acelerar o processo de teste, pois os lucros não são convertidos na moeda do depósito através de outras moedas (e, portanto, você não precisa fazer o download do histórico de preços). Também neste modo, não são calculados swaps e comissões.
Lembre-se de que, ao calcular o lucro em pips, o volume de transações não importa. Para cada um, é sempre calculado apenas o número de pips ganhos/perdidos. Também neste modo, praticamente não há controle de margem. Use-o apenas para uma rápida avaliação aproximada da estratégia e verifique os resultados em modos mais precisos.
Melhorias gerais
O botão Iniciar/Parar o teste, bem como a barra de progresso foram movidos para a barra de guias. Isso permite que você controle o processo, não importa em que seção do testador de estratégia você esteja. Além disso, comandos de início e parada de teste foram adicionados aos menus de contexto das seções de configuração e de entrada de parâmetros.
Anteriormente, os resultados das tarefas concluídas eram salvos em arquivos apenas durante a otimização dos EAs. Agora, os arquivos de cache são salvos durante um teste único, permitindo que você retorne aos cálculos anteriores a qualquer momento, para ver todas as estatísticas, bem como gráficos de saldo, patrimônio e depósito. Também no futuro, isso permitirá comparar os resultados dos testes.
Para carregar resultados de testes anteriores, use a nova página inicial do testador: clique em "Resultados Anteriores" e selecione o arquivo desejado:
No MetaEditor está embutido um estilizador de código que permite formatar automaticamente o código fonte de um programa de acordo com um padrão específico. Agora, além do estilo usual de design, você pode usar outros padrões populares. Para fazer isso, abra as configurações do MetaEditor e selecione o estilo desejado:
Além disso, para o estilizador, agora você pode definir os seguintes parâmetros:
Espaços de recuo
Determina o número de espaços inseridos ao alinhar estruturas aninhadas:
Substituir tabulação por espaços
Quando ativada esta opção, o estilizador substitui todos as tabulações no código por espaços. O número de caracteres de tabulação é determinado na seção "Geral".
Excluir linhas em branco
Quando ativada esta opção, o estilizador exclui do código todas as linhas que contêm apenas um caractere de quebra de linha.
Inserir espaços após vírgulas e após ponto e vírgula
Quando ativada esta opção, o estilizador separa visualmente os constructos contendo uma lista de elementos. Por exemplo:
Inserir espaços ao redor dos operadores de declaração
Quando ativada esta opção, o estilizador inserirá espaços ao redor dos operadores de atribuição, de igualdade, de comparação, etc. Por exemplo:
No total, a interface da plataforma agora está traduzida para 50 idiomas e, no total, eles são nativos para mais de 4 bilhões de pessoas.
Para mudar a interface para o seu idioma, use o menu "Exibir \ Idioma" na parte superior do terminal.
A atualização estará disponível através do sistema Live Update.
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Um checklist dos riscos dos robôs antes de operar em conta real
Rogerio Figurelli, 2019.10.04 18:44
Olá HT Saul, antes de mais nada, excelente post e obrigado pelo comentário a meu respeito.
Pela necessidade de "ressuscitar o tópico" e suposta popularidade dessa thread, de duas, uma: ou nossos robôs já estão todos seguros e não precisam mais de análise nesse sentido, ou estamos deixando de lado a segurança, acreditando que esse é um assunto resolvido e sem riscos!
Seja como for, na minha opinião, segurança é um processo, e não um ponto final, e portanto seus ótimos comentários podem ajudar muito nesse sentido.
Para não contaminar as respostas, e colaboração dos colegas, vou começar abordando o primeiro item e pergunta: 1-Existe tratamento para todas as situações de exceção das funções chamadas internamente pelo EA?
Pelo que você entendeu, "todas funções devem ter seu retorno checadas com if e caso não retornem o que seja esperado, é preciso ter algum tratamento". Eu diria que está correto, em parte, pois o mínimo que deve ser feito é checar o retorno das funções.
Mas o ponto principal são as exceções, e como já foi discutido em vários pontos nesse Fórum, um dos problemas do MT4/MT5 é não prever o tratamento de exceções. Dessa forma, considero o mais seguro para qualquer robô prever uma possível exceção em toda e qualquer rotina utilizada, principalmente nas chamadas de função.
Como por exemplo um retorno de valor fora da faixa prevista em documentação, um grande delay ou até mesmo travamento no retorno, no pior caso.
Para ser mais pragmático, vou citar um exemplo real: imagine que você está operando com uma exposição grande, e em determinado ponto decide chamar um Sleep(). O que acontece se o Sleep() dormir, literalmente, para sempre?
Não por menos, esse é um exemplo de função que evito ao máximo, pois me pare tão crítica quanto o GO TO de linguagens de programação do passado.
E esse é um ponto também relevante: muitas vezes a melhor decisão de segurança está em evitar o que tem maior chances de riscos.
E qualquer programador tem essa decisão nas mãos.
Sds.,
Rogério Figurelli
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Você negocia com ou sem Stop Loss?
Rogerio Figurelli, 2019.10.13 00:24
Olá Marcelo Mota Valerio, na verdade toda posição possui um Stop Loss, que se não for programado pelo usuário, será programado pela área de risco da corretora/broker.
Dessa forma, no mínimo é mais elegante que essa programação seja feita pelo próprio trader, seja de forma sistêmica, seja de forma discricionária.
Entretanto, na minha opinião a maior parte dos sistemas não faz uma boa gestão do S/L, principalmente por questões emocionais. Ou seja, vale a velha máxima ilógica de encerrar cedo uma posição vencedora, e prolongar uma perdedora.
Nesse sentido, recomendo a todos o bom artigo abaixo, com testes reais sobre alguns dos mitos relacionados ao uso do S/L:
https://blog.quantinsti.com/hidden-truths-stop-loss-trading/
Respondendo agora sua pergunta, pessoalmente, uso um método sistêmico próprio, que chamo de StopLoss Máximo, ou seja, de buscar atuar o S/L apenas como proteção contra falhas e erros, e não como decisão final de fechar uma posição, que para mim deve ser idealmente definida a mercado, pelos algoritmos de inteligência de cenários (passado, presente e futuro) do trading system, ocultando tanto da corretora, como do book, os alvos operacionais do robô.
Sds.,
Rogério Figurelli
input string termino="17:30"; //Horario de termino(entradas);
input string fechamento="17:45"; //Horario de fechamento(entradas);
//---
TimeToStruct(StringToTime(inicio),horario_inicio); //+-------------------------------------+
TimeToStruct(StringToTime(termino),horario_termino); //| Conversão das variaveis para mql |
TimeToStruct(StringToTime(fechamento),horario_fechamento); //+-------------------------------------+
//verificação de erros nas entradas de horario
if(horario_inicio.hour>horario_termino.hour || (horario_inicio.hour==horario_termino.hour && horario_inicio.min>horario_termino.min))
{
printf ( "Parametos de horarios invalidos!" );
return INIT_FAILED;
}
if(horario_termino.hour>horario_fechamento.hour || (horario_termino.hour==horario_fechamento.hour && horario_termino.min>horario_fechamento.min))
{
printf("Parametos de horarios invalidos!");
return INIT_FAILED;
}
{
TimeToStruct(TimeCurrent(),horario_atual);
{
// Hora atual igual a de início
if(horario_atual.hour == horario_inicio.hour)
// Se minuto atual maior ou igual ao de início => está no horário de entradas
if(horario_atual.min >= horario_inicio.min)
return true;
// Do contrário não está no horário de entradas
else
return false;
// Hora atual igual a de término
if(horario_atual.hour == horario_termino.hour)
// Se minuto atual menor ou igual ao de término => está no horário de entradas
if(horario_atual.min <= horario_termino.min)
return true;
// Do contrário não está no horário de entradas
else
return false;
// Hora atual maior que a de início e menor que a de término
return true;
}
// Hora fora do horário de entradas
return false;
}
bool HorarioFechamento()
{//Termina na linha 85
TimeToStruct(TimeCurrent(),horario_atual);
// Hora dentro do horário de fechamento
if(horario_atual.hour >= horario_fechamento.hour)
{
// Hora atual igual a de fechamento
if(horario_atual.hour == horario_fechamento.hour)
// Se minuto atual maior ou igual ao de fechamento => está no horário de fechamento
if(horario_atual.min >= horario_fechamento.min)
return true;
// Do contrário não está no horário de fechamento
else
return false;
// Hora atual maior que a de fechamento
return true;
}
// Hora fora do horário de fechamento
return false;
}
return false;
}
///Boa tarte estou tentando rodar esse código para determinar os horários para o Robo mas estou com esse problema que não consegui indentifcar.
Peço a ajuda de todos.
Obrigado
Erros da compilação corrigidos.
Funcionou!!!
Muito Obrigado!! Pela Sua Ajuda.
Feliz2020!!!
Erros da compilação corrigidos.
Vc se puder poderia apontar onde estava o erro?
Era "{" ?