Preciso converter um simples indicador MT4 para a plataforma MT5, porém estou com o seguinte entrave:
O código possui a função iBandsONArray(), de fato, no mt5 não existe função similar.
Preguiça de pensar, algúem tem algum script que converta essa funão para MT5?
Abraços.
Olá
Nelson Silva, recomendo o
artigo
https://www.mql5.com/pt/articles/81 que, apesar de não ser atual, tem um bom
repertório de migração MQL4/MQL5 que talvez possa te ajudar nessa e em outras demandas similares.
Sds., Rogério Figurelli
Muitos desenvolvedores acumularam muitos indicadores e estratégias de negócios escritas no MQL4. Para usá-las no Metatrader 5, elas devem ser convertidas para o MQL5. Não é fácil reescrever todos os programas no MQL5. Seria muito mais fácil convertê-los se houvesse uma tradução referência e melhor com exemplos. Nesse artigo eu gostaria de...
Olá
Nelson Silva,
complementando sua sugestão em termos de programação, recomendo também analisar o artigo
https://www.mql5.com/pt/articles/599 para escolha de melhor abordagem para isso, com vários
códigos já prontos para uso.
Sds., Rogério Figurelli
Olá
Trader_Patinhas, essa é uma
ótima pergunta, pois na minha opinião isso é muito dinâmico e depende da política de risco da corretora de forma individual para
cada classe de instrumentos, e suas características diversas como volatilidade, liquidez, etc. Por exemplo, quando o MT5
começou no Brasil esse preenchimento era permitido para ativos BMF e funcionava muito bem.
Dessa forma, minha recomendação para todos desenvolvedores é fazer um teste de forma programática, por exemplo através do código
exemplo abaixo presente na documentação do MT5 no link
https://www.mql5.com/pt/docs/constants/environment_state/marketinfoconstants#symbol_filling_mode, que já faz justamente o
teste por ativo.
//+------------------------------------------------------------------+ //| Verifica se um modo de preenchimento específico é permitido | //+------------------------------------------------------------------+ bool IsFillingTypeAllowed(string symbol,int fill_type)
{
//--- Obtém o valor da propriedade que descreve os modos de preenchimento permitidos int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
//--- Retorna true, se o modo fill_type é permitido return((filling & fill_type)==fill_type);
}
Dessa forma, o EA não fica dependendo da política da corretora, e pode tomar a decisão de priorizar cada tipo de ordem, além do que
considero o mais relevante, que é poder tratar diretamente qualquer exceção particular para um instrumento, e com um algoritmo
proprietário, que é o que eu faço em meus robôs em produção.
Sds., Rogério Figurelli
É só criar um contador de velas puladas e retornar enquanto ele não atingir o número de velas que vc quer pular:
// no inicio do programa você pode definir um parâmetro com a quantidade de velas a serem puladas// pode ser uma constante fixa, como abaixo, ou uma variável do tipo "input", se preferir#define NUMBER_OF_CANDLES_TO_BE_SKIPPED 1// numero de velas a serem puladas// logo antes do trecho do programa que vc postou, vc declara o contador de velas puladasstaticint SkippedCandles = 0;
// trecho original que vc postou:
staticdatetime PrevBars=0;
datetime time_0=iTime(0);
if(time_0==PrevBars)
return;
PrevBars=time_0;
// logo em seguida, vc testa o contador de velas puladas:
// se ainda nao atingiu a qtde de velas a serem puladas,
// incrementa o contador de velas puladas e retornaif ( SkippedCandles < NUMBER_OF_CANDLES_TO_BE_SKIPPED )
{
SkippedCandles++;return;
}
// se não retornou, reinicia o contador com zero
SkippedCandles = 0;
inputstring inicio="10:30"; //Horario de inicio(entradas);inputstring termino="17:30"; //Horario de termino(entradas);inputstring fechamento="17:45"; //Horario de fechamento(entradas);MqlDateTime horario_inicio,horario_termino,horario_fechamento,horario_atual;
intOnInit()
{
//---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 horarioif(horario_inicio.hour>horario_termino.hour || (horario_inicio.hour==horario_termino.hour && horario_inicio.min>horario_termino.min))
{
printf ( "Parametos de horarios invalidos!" );
returnINIT_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!");
returnINIT_FAILED;
}
bool HorarioEntrada()
{
TimeToStruct(TimeCurrent(),horario_atual);
if(horario_atual.hour >= horario_inicio.hour && horario_atual.hour <= horario_termino.hour)
{
// Hora atual igual a de inícioif(horario_atual.hour == horario_inicio.hour)
// Se minuto atual maior ou igual ao de início => está no horário de entradasif(horario_atual.min >= horario_inicio.min)
returntrue;
// Do contrário não está no horário de entradaselsereturnfalse;
// Hora atual igual a de términoif(horario_atual.hour == horario_termino.hour)
// Se minuto atual menor ou igual ao de término => está no horário de entradasif(horario_atual.min <= horario_termino.min)
returntrue;
// Do contrário não está no horário de entradaselsereturnfalse;
// Hora atual maior que a de início e menor que a de términoreturntrue;
}
// Hora fora do horário de entradasreturnfalse;
}
bool HorarioFechamento()
{
TimeToStruct(TimeCurrent(),horario_atual);
// Hora dentro do horário de fechamentoif(horario_atual.hour >= horario_fechamento.hour)
{
// Hora atual igual a de fechamentoif(horario_atual.hour == horario_fechamento.hour)
// Se minuto atual maior ou igual ao de fechamento => está no horário de fechamentoif(horario_atual.min >= horario_fechamento.min)
returntrue;
// Do contrário não está no horário de fechamentoelsereturnfalse;
// Hora atual maior que a de fechamentoreturntrue;
}
// Hora fora do horário de fechamentoreturnfalse;
}
Pessoal, estou usando o CalendarValueHistory, para o robo não operar quando há noticias relevantes (impacto alto). Mas estou
identificando um problema.
Por exemplo hoje (02/08/19), tem as 9:30 o Payroll não agricola
no MT5 logado no Forex, na aba calendário, apresenta como horário das 15:30 (no metatrader logado para o indice aparece 9:30),
porém a função me retorno as 12:30 e com isso ele filtra o horário errado. A função identifica certinho o indicador, porém com alguma
questão de fuso.
não vi na função algo que indique o fuso, pensei que fosse o pais, porém quando coloco
ai ele não traz nada (coloando estados unidos, europa, brasil...etc)
alguem tem essa função implementada que poderia me ajudar?
Não confunda Operação Booleana ( && and , || or ) com operação binárias ( | or , ^ xor , & and, >> desl. direita, << desl. esquerda) .
No caso você quer saber se alguma das quatro expressões é verdadeira, então tem que usar || ( or )... if ( expressao1 || expressao2 || expressao3 || expressao4) { }
O que você escreveu foi o resultado de tres operações binarias ret = ( expressao1 | expressao2 | expressao3 | expressao4) ==> if( ret ) { }
Olá,
E aí galera, como vão vcs?
Preciso converter um simples indicador MT4 para a plataforma MT5, porém estou com o seguinte entrave:
O código possui a função iBandsONArray(), de fato, no mt5 não existe função similar.
Preguiça de pensar, algúem tem algum script que converta essa funão para MT5?
Abraços.
Olá,
E aí galera, como vão vcs?
Preciso converter um simples indicador MT4 para a plataforma MT5, porém estou com o seguinte entrave:
O código possui a função iBandsONArray(), de fato, no mt5 não existe função similar.
Preguiça de pensar, algúem tem algum script que converta essa funão para MT5?
Abraços.
Olá Nelson Silva, recomendo o artigo https://www.mql5.com/pt/articles/81 que, apesar de não ser atual, tem um bom repertório de migração MQL4/MQL5 que talvez possa te ajudar nessa e em outras demandas similares.
Sds.,
Rogério Figurelli
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Opção de pausar o Robô por alguns minutos
Rogerio Figurelli, 2019.07.28 20:32
Olá Nelson Silva, complementando sua sugestão em termos de programação, recomendo também analisar o artigo https://www.mql5.com/pt/articles/599 para escolha de melhor abordagem para isso, com vários códigos já prontos para uso.
Sds.,
Rogério Figurelli
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Ordem encerrando 0.5 abaixo do Take Profit.
admlaugusto, 2019.07.30 17:38
Boa tarde amigos,
Estou com EA, que executa a ordem a mercado com SL de 4 pt e TK de 1 pt. Apesar dele posicionar corretamente os SL e TK ele tem saido no TK 0.5;
Ja li algo aqui no forum, mas não consegui entender corretamente. (deixe o link no final) .. abaixo uma parte do códico com a ação de Venda a mercado.
O problema é que ele faz a sainda meio ponto antes.. mesmo que a ordem esteja corretamente posicionada.
... Em aneo tem uma imagem de uma operação real ( a operação daria mais de 1 pt e saiu com meio)
Agradeço a atenção de todos.
Link do artigo que já li , mas nao consegui adaptar
https://www.mql5.com/pt/forum/301457
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Ordem encerrando 0.5 abaixo do Take Profit.
Rogerio Figurelli, 2019.08.01 05:41
Olá Trader_Patinhas, essa é uma ótima pergunta, pois na minha opinião isso é muito dinâmico e depende da política de risco da corretora de forma individual para cada classe de instrumentos, e suas características diversas como volatilidade, liquidez, etc. Por exemplo, quando o MT5 começou no Brasil esse preenchimento era permitido para ativos BMF e funcionava muito bem.
Dessa forma, minha recomendação para todos desenvolvedores é fazer um teste de forma programática, por exemplo através do código exemplo abaixo presente na documentação do MT5 no link https://www.mql5.com/pt/docs/constants/environment_state/marketinfoconstants#symbol_filling_mode, que já faz justamente o teste por ativo.
Dessa forma, o EA não fica dependendo da política da corretora, e pode tomar a decisão de priorizar cada tipo de ordem, além do que considero o mais relevante, que é poder tratar diretamente qualquer exceção particular para um instrumento, e com um algoritmo proprietário, que é o que eu faço em meus robôs em produção.
Sds.,
Rogério Figurelli
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Como pular 1 candle ?
Trader_Patinhas, 2019.07.31 19:56
É só criar um contador de velas puladas e retornar enquanto ele não atingir o número de velas que vc quer pular:
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Limitar robô por horário e/ou numero de operções.
Willian De Caldas Leite, 2018.12.27 00:33
Se te ajudar eu uso esse padrao nos meus EA.
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
Qual função me retorna a existência de uma ordem já enviada e que ainda não foi executada
Rogerio Giannetti Torres, 2019.08.02 01:18
Bom, isso vai te ajudar;
Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação
CalendarValueHistory problema de fuso horário
Gilberto Beltrao Dupita, 2019.08.02 13:28
Pessoal, estou usando o CalendarValueHistory, para o robo não operar quando há noticias relevantes (impacto alto). Mas estou identificando um problema.
Por exemplo hoje (02/08/19), tem as 9:30 o Payroll não agricola
no MT5 logado no Forex, na aba calendário, apresenta como horário das 15:30 (no metatrader logado para o indice aparece 9:30), porém a função me retorno as 12:30 e com isso ele filtra o horário errado. A função identifica certinho o indicador, porém com alguma questão de fuso.
if(CalendarValueHistory(values,hora1,hora2,NULL,moeda1))
Values é o array
hora1 = inicio
hora 2 = fim
pais = NULL
moeda1 =USD
não vi na função algo que indique o fuso, pensei que fosse o pais, porém quando coloco ai ele não traz nada (coloando estados unidos, europa, brasil...etc)
alguem tem essa função implementada que poderia me ajudar?
Obrigado!
if (
Boa tarde Leandro:
Não confunda Operação Booleana ( && and , || or ) com operação binárias ( | or , ^ xor , & and, >> desl. direita, << desl. esquerda) .
No caso você quer saber se alguma das quatro expressões é verdadeira, então tem que usar || ( or )... if ( expressao1 || expressao2 || expressao3 || expressao4) { }
O que você escreveu foi o resultado de tres operações binarias ret = ( expressao1 | expressao2 | expressao3 | expressao4) ==> if( ret ) { }