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

 
helciobtc:
Oi bom dia
Tem alguém online? Queria saber como faço pra mandar os sinais do meu Indicador para um canal Telegram, alguem pode ajudar? 😁

Olá  helciobtc, recomendo o artigo https://www.mql5.com/pt/articles/2355
Sds.,
Rogério Figurelli

Como criar bots para Telegram em MQL5
Como criar bots para Telegram em MQL5
  • www.mql5.com
Durante a conferência F8, realizada em San Francisco em 12 de abril de 2016, o Facebook anunciou a integração da API para bots dentro do Messenger. No mesmo dia, uma grande atualização foi realizada na plataforma Bot do Telegram. A versão 2.0 foi uma surpresa agradável com a sua funcionalidade. Parece que os bots que costumavam ser populares na...
 
Rogerio Figurelli:

Olá  helciobtc, recomendo o artigo https://www.mql5.com/pt/articles/2355
Sds.,
Rogério Figurelli


Oi tentei seguir esse tutorial mas não entendi muito bem...


Precisava usar a terceira versão que Ele mostra porem no lugar do mACD queria usar meu próprio indicador

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Identificando um Stop Loss

Kl_ Urt, 2019.09.27 02:12

Prezados,


Desenvolvi uma solução pessoal para a questão. Peço desculpas caso contenha algum erro (sou novato em programação), mas até então para mim tem funcionado perfeitamente para capturar transações de Compra, Venda, SL na Compra, SL na Venda, TP na Compra ou TP na Venda....


void OnTradeTransaction(const MqlTradeTransaction & trans,
                        const MqlTradeRequest & request,
                        const MqlTradeResult & result)
   {
      if (HistoryDealSelect(trans.deal))
      {
         ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY) HistoryDealGetInteger(trans.deal, DEAL_ENTRY);
         ENUM_DEAL_REASON deal_reason = (ENUM_DEAL_REASON) HistoryDealGetInteger(trans.deal, DEAL_REASON);
         if(EnumToString(deal_entry) == "DEAL_ENTRY_IN")
            {
               if(EnumToString(deal_reason) == "DEAL_REASON_EXPERT" && EnumToString(trans.deal_type) == "DEAL_TYPE_BUY")
                  {
                     Alert("Buy");
                  }
               else if(EnumToString(deal_reason) == "DEAL_REASON_EXPERT" && EnumToString(trans.deal_type) == "DEAL_TYPE_SELL")
                  {
                     Alert("Sell");
                  }
            }
         else if(EnumToString(deal_entry) == "DEAL_ENTRY_OUT")
            {
               if(EnumToString(deal_reason) == "DEAL_REASON_SL" && EnumToString(trans.deal_type) == "DEAL_TYPE_BUY")
                  {
                     Alert("Sell SL");
                  }
               else if(EnumToString(deal_reason) == "DEAL_REASON_SL" && EnumToString(trans.deal_type) == "DEAL_TYPE_SELL")
                  {
                     Alert("Buy SL");
                  }
               else if(EnumToString(deal_reason) == "DEAL_REASON_TP" && EnumToString(trans.deal_type) == "DEAL_TYPE_BUY")
                  {
                     Alert("Sell TP");
                  }
               else if(EnumToString(deal_reason) == "DEAL_REASON_TP" && EnumToString(trans.deal_type) == "DEAL_TYPE_SELL")
                  {
                     Alert("Buy TP");
                  }               
          } 
      }      
}

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Como protejo meu indicador?

LeandroCLL Camargo, 2019.09.28 03:35

Muito Obrigado Thiago! Vou testar aqui se consigo proteger o indicador!

Estou conhecendo MQL agora, então tenho que aprender muita coisa ainda! rsrsr

Mais uma vez obrigado e tenha um ótimo final de semana!

Abraço!


PS. Thiago, tentei aqui e nao consegui ainda! rsrs

Mas, onde eu coloco esse código? Fiz aqui mas nao deu certo! Desculpe destas perguntas bobas, mas estou começado agora e descobrindo as coisas ainda!


//+------------------------------------------------------------------+
//|                                                        Sinal.mq5 |
//|                                                  Leandro Camargo |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Leandro Camargo"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot Venda
#property indicator_label1  "Venda"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Compra
#property indicator_label2  "Compra"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrGreen
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot Sinal
#property indicator_label3  "Sinal"
#property indicator_type3   DRAW_NONE
#property indicator_color3  clrWhiteSmoke
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- input parameters
input int      periodos=14;
//--- indicator buffers
double         VendaBuffer[];
double         CompraBuffer[];
double         SinalBuffer[];

//---------------
//Chave
//---------------
uint conta = 123456

void OnStart()
  {
    if (AccountInfoInteger(ACCOUNT_LOGIN) != conta)
      {
        Alert("Conta não cadastrada!");
        // Fecha o programa
      }
      
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,VendaBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,CompraBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,SinalBuffer,INDICATOR_DATA);

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Você tem alguma questão sobre Metatrader 5! Pergunte Aqui!

Márcio Hermes, 2019.09.27 00:38

Olá a todos.

Operando na conta real, me deparei com um "problema" que não sei mais como contornar.

Vamos a uma exemplo prático, e real:

 - no dia 25/09/2019, resolvi entrar no fechamento do mercado, após as 17horas, na compra, com 430 cotas do FII RBRR11. Foram executadas 220 cotas, e o restante (210 cotas) ficou na pedra.

 - a ordem NÃO foi cancelada pela bolsa, e o restante foi executado no dia seguinte (26/09/2019).

Alguns detalhes:

 - 1º) a ordem enviada é do tipo BUY LIMIT;

 - 2º) é uma ordem somente para o dia, ou seja, deveria ser cancelada automaticamente pela bolsa (se eu estiver equivocado nesta questão, me corrijam, por favor!). 

Segue a função que enviou a ordem:

  
bool CMyTrade::OrderSendBuyLimit(double price, double volume, string comment){
    
    //--- declare and initialize the trade request and result of trade request
    MqlTradeRequest request={0};
    MqlTradeResult  result={0};
//--- parameters of request
    request.action    = TRADE_ACTION_PENDING;        // ordem pendente
    request.symbol    = Symbol();                    // symbol (ticker)
    request.volume    = volume;                  // volume do tipo double
    request.type      = ORDER_TYPE_BUY_LIMIT;        // ordem de compra do tipo limit
    request.type_time = ORDER_TIME_DAY;              // válido para o dia
    request.price     = price;                       // price for opening
    request.magic     = MAGIC_NUMBER;
    request.type_filling=ORDER_FILLING_RETURN;
    request.comment= comment;

//--- send the request
    if(OrderSend(request,result)){
        PrintFormat("OrderSend Success! retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

        // ordem enviada
        return true;
    }else{
        PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
        ResetLastError();
        // erro no envio
        return false;
    }
    
    return true;
}  

Estou operando pela XP, e observando o HB, vi que as ordens estão sendo tratadas como "Válida até Cancelar" ou 'VAC'. Com uma data 31/12/4000, igual quando operava na MODAL.

Para deixar mais claro: o HB da XP "enxerga" as ordens enviadas pelo MT5.

A minha dúvida é se isso é padrão, ou se tem alguma configuração para que as ordens sejam "enxergadas", pela corretora, respeitando o tempo de espiração das ordens, enviado pelo MT5.

Abraço a todos.


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

CAN SOMEONE HELP ME WITH THIS CODE

Davi Silva, 2019.10.03 13:43

Olá, Marcos você está no Fórum Português, pode escrever em nosso idioma.

Por favor adiciona seu código na aba Codigo atalho (Alt+s)


Hello Marcos you are in Forum Portugues, you can write in our language.

Please add your code in the Shortcut Code tab (Alt + s)


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

PESSOAL ALGUEM PODE ME AJUDAR COM MEU CODIGO!

Nelson Silva, 2019.10.04 07:51

   Olá, meus amigos, como vão vcs?

  

   Barbaridade tchê! Vamos lá:

   

//Em cima, na boca do lobo:

datetime sLastAlert = 0;
int sBarrasDif = 6; //Diferença entre os sinais


//Vamos criar uma função com retorno do intervalo em barras:

int sDifBar(datetime previous, datetime now){
     
     double dif = 0;
     double sper = PeriodSeconds();
     int a = (int) now;
     int b = (int) previous;
     int c = a-b;
     int d = c/sper;
     
     d<0? d = d*-1: d=d;

     return(d); //Retorno com a diferença em barras
}

//Nos eventos:

   if(sDifBar(TimeCurrent(), sLastAlert) >= 6) { //Se maior que números de barras segue o samba

   string KillTheSogra = "Matei minha sogra a " + sDifBar(TimeCurrent(), sLastAlert) + "barras atrás";
   
   sLastAlert = TimeCurrent();

   }

//======================^-^==========================


    FLW!

   


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Você tem alguma questão sobre Metatrader 5! Pergunte Aqui!

Luiz_Nunes, 2019.10.16 04:27

Boa noite,

Vou tentar ajudá-lo da melhor forma possível, vamos por partes.

  • Primeiro passo: crie duas variáveis globais do tipo "double": , por exemplo: saldoDoDia=0 e metaDoDia=100 (valor a ser definido por dia, o ideal é que a metaDoDia seja um input).
  • Segundo passo: acredito que em algum lugar no evento OnTick você deve ter colocado uma verificação de horário de início das ordens, como abaixo:
if(HorarioEntrada())
{
  ... prossegue com as demais verificações do seu EA
}

Substitua por:

if(HorarioEntrada() && saldoDoDia<=metaDoDia) 
// se o horário estiver dentro do estipulado e o saldo do dia for menor ou igual ao estabelecido entra normalmente
{
  ... prossegue com as demais verificações do seu EA
}
  •  Terceiro passo: adicione a seguinte função no final do seu EA, se já não tiver feito:
    void OnTradeTransaction(const MqlTradeTransaction &trans,
                            const MqlTradeRequest &request,
                            const MqlTradeResult &result)
      {
    //--- Obtem o tipo de transação
       ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
    //--- Verificação se a transação foi adicionada no histórico
       if(type==TRADE_TRANSACTION_DEAL_ADD)
         {
          long     deal_entry        =0;
          double   deal_profit       =0.0;
          double   deal_volume       =0.0;
          string   deal_symbol       ="";
          long     deal_magic        =0;
          long     deal_reason       =-1;
          //+------------------------------------------------------------------+
          //|                                                                  |
          //+------------------------------------------------------------------+
          if(HistoryDealSelect(trans.deal))
            {
             deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);    // captura o tipo de entrada
             deal_profit =  HistoryDealGetDouble(trans.deal,DEAL_PROFIT);   // captura o lucro da transação
             deal_volume =  HistoryDealGetDouble(trans.deal,DEAL_VOLUME);   // captura o volume da transação
             deal_symbol =  HistoryDealGetString(trans.deal,DEAL_SYMBOL);   // captura o ativo da transação
             deal_magic=  HistoryDealGetInteger(trans.deal,DEAL_MAGIC);    // captura o número magic da transação (OrderMagic)
             deal_reason=  HistoryDealGetInteger(trans.deal,DEAL_REASON);  // captura a razão ou origem da transação realizada
            }
          else
             return;
          //+------------------------------------------------------------------+
          //|                                                                  |
          //+------------------------------------------------------------------+
          if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
            {
             if(trans.deal_type==DEAL_TYPE_BUY)
               {
                precoCompra=trans.price; // captura o preço no caso de compra
               }
             if(trans.deal_type==DEAL_TYPE_SELL)
               {
                precoVenda=trans.price; // captura o preço no caso de venda
               }
            }
    
          if(deal_entry==DEAL_ENTRY_OUT) // se saiu da operação
            {
             if(deal_reason==DEAL_REASON_SL) // se a operação foi fechada por StopLoss
               {
                vTipoDeOperacao="StopLoss"; // armazena na variável vTipoDeOperacao            
               }
             else
                if(deal_reason==DEAL_REASON_TP) // se a operação foi finalizada por TakeProfit
                  {
                   vTipoDeOperacao="TakeProfit";  // armazena na variável vTipoDeOperacao               
                  }
                else
                   if(deal_reason==DEAL_REASON_ROLLOVER) // se houve uma modificação da posição (tipo trailing stop)
                     {
                      vTipoDeOperacao="TrailingStop";  // armazena na variável vTipoDeOperacao                  
                     }
             
             saldoDoDia=saldoDoDia+deal_profit; //captura o saldo da operação e vai somando com o saldo anterior
             
            }
         }
      }
    Poderia obter de forma mais simples, mas assim já te dá um leque maior de opções caso haja interesse. Repare que no final, a variável SaldoDoDia, recebe o valor da operação e acresce ao saldo anterior, independente de qual tenha sido o tipo de operação.
  • Quarto passo: definir o ponto para zerar o saldo do dia e a melhor forma é quando você para de operar no dia, então assim como você deve ter uma condição para definir o inicio das entradas, deve ter também a condição para encerramento das operações, então dentro desta rotina de encerramento, no momento em que se confirma, zere a variável SaldoDoDia.
Espero ter ajudado, e aos moderadores me perdoem se tiver postado alguma coisa fora do padrão.

Abs.


 

alguem pode me ajudar a como "esconder" as configurações de um indicador pelo metaeditor?

 
Nil Willames:

alguem pode me ajudar a como "esconder" as configurações de um indicador pelo metaeditor?

   //--- Hide indicators during testing
   TesterHideIndicators(true);
Razão: