Tudo sobre Programação, com código fonte exemplo - página 11

 

   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.

 
Nelson Silva:

   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

Migrando do MQL4 para o MQL5
Migrando do MQL4 para o MQL5
  • www.mql5.com
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...
 

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.

void VendaAMercado()
  {
   MqlTradeRequest   requisicao;    // requisição
   MqlTradeResult    resposta;      // resposta
   
   ZeroMemory(requisicao);
   ZeroMemory(resposta);
   
   //--- Cacacterísticas da ordem de Venda
   requisicao.action       = TRADE_ACTION_DEAL;                            // Executa ordem a mercado
   requisicao.magic        = magic_number;                                 // Nº mágico da ordem
   requisicao.symbol       = _Symbol;                                      // Simbolo do ativo
   requisicao.volume       = num_lots;                                     // Nº de Lotes
   requisicao.price        = NormalizeDouble(tick.bid,_Digits);            // Preço para Venda
   requisicao.sl           = tick.bid + StopLoss;// Preço Stop Loss
   requisicao.tp           = tick.bid - TakeProfit;// Alvo de Ganho - Take Profit
   requisicao.deviation    = 0;                                            // Desvio Permitido do preço
   requisicao.type         = ORDER_TYPE_SELL;                              // Tipo da Ordem
   requisicao.type_filling = ORDER_FILLING_FOK;                            // Tipo deo Preenchimento da ordem
   //---
   OrderSend(requisicao,resposta);
   //---
     if(resposta.retcode == 10008 || resposta.retcode == 10009)
       {
        Print("Ordem de Venda executada com sucesso!");
       }
     else
       {
        Print("Erro ao enviar Ordem Venda. Erro = ", GetLastError());
        ResetLastError();
       } 
 }

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.

//+------------------------------------------------------------------+ 
//| 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
 


 

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:

// 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 puladas

   static int SkippedCandles = 0;

   // trecho original que vc postou:

   static datetime 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 retorna

   if ( SkippedCandles < NUMBER_OF_CANDLES_TO_BE_SKIPPED )
   {
      SkippedCandles++;
      return;
   }

   // se não retornou, reinicia o contador com zero

   SkippedCandles = 0;


 

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.


input string inicio="10:30"; //Horario de inicio(entradas);
input string termino="17:30"; //Horario de termino(entradas);
input string fechamento="17:45"; //Horario de fechamento(entradas);

MqlDateTime horario_inicio,horario_termino,horario_fechamento,horario_atual; 

int OnInit()
  {
//---
   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;
      }



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í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()
     {
      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;
}



 

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;


bool DoExisteOrdem()
  {
   bool ret=false;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(OrderGetTicket(i)))
         if(OrderGetString(ORDER_SYMBOL)==_Symbol
            && OrderGetInteger(ORDER_MAGIC)==MagicNumber)
           {
            Ticket=OrderGetInteger(ORDER_TICKET);
            ret=true;
            break;
           }
     }
   return(ret);
  }

 

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!


 
Leandro Borges:

        if (

        ((buffer[1].high * (1.0 - extFilPARange)) < buffer[0].close < (buffer[1].high * (1.0 + extFilPARange))) |
        ((buffer[1].low * (1.0 - extFilPARange)) < buffer[0].close < (buffer[1].low * (1.0 + extFilPARange))) |
        ((buffer[2].high * (1.0 - extFilPARange)) < buffer[0].close < (buffer[2].high * (1.0 + extFilPARange))) |
        ((buffer[2].low * (1.0 - extFilPARange)) < buffer[0].close < (buffer[2].low * (1.0 + extFilPARange))) |
        )

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 ) { }