Como adicionar comentários às posições abertas por EA's criados usando o assistente MQL

 

Boa tarde, amigos.

Confesso que apesar de já ter vários anos mexendo com essa linguagem de programação ainda me sinto muito verde quanto há muitos detalhes, como esse:

Depois de muito quebrar a cabeça, resolvi recorrer á este fórum para perguntar:

- Alguém sabe como adicionar comentários às posições abertas por EA's criados usando o assistente MQL5, sem precisar modificar as bibliotecas mqh?

Já tentei de todas as formas usando as variáveis e funções públicas disponíveis nas bibliotecas mqh anexas, direta ou indertamente ao EA, mas até agora, a unica solução que vislubro é modificando a bibioteca Expert.mqh...

Busco uma solução que não precise modificar nenhuma biblioteca, usando apenas as variáveis e funções disponíveis.

De antemão, agradeço quaquer ajuda.

 
O seu tópico foi movido para a secção: Expert Advisors e Negociação Automatizada.
Por favor ter em conta a secção adequada quando criar tópicos — https://www.mql5.com/pt/forum/421109/page6#comment_49385139
 
Francisco Carlos Sobral Ribeiro: Confesso que apesar de já ter vários anos mexendo com essa linguagem de programação ainda me sinto muito verde quanto há muitos detalhes, como esse: Depois de muito quebrar a cabeça, resolvi recorrer á este fórum para perguntar: - Alguém sabe como adicionar comentários às posições abertas por EA's criados usando o assistente MQL5, sem precisar modificar as bibliotecas mqh? Já tentei de todas as formas usando as variáveis e funções públicas disponíveis nas bibliotecas mqh anexas, direta ou indertamente ao EA, mas até agora, a unica solução que vislubro é modificando a bibioteca Expert.mqh... Busco uma solução que não precise modificar nenhuma biblioteca, usando apenas as variáveis e funções disponíveis.

O comentário terá de ser aplicado quando a ordem é colocada.

Se estiver a usar a função OrderSend, então deve usar o campo "comment" da estrutura MqlTradeRequest.

Se estiver a usar a class CTrade, e o método PositionOpen, ou Buy, ou Sell, deverá usar o parâmetro "comment".

Atenção, que não é possível aplicar ou alterar o comentário depois de colocação.

 
Se você quer mudar um comentário DEPOIS da ordem aberta, esquece, não é possível via MQL ou mesmo manualmente.
 
Francisco Carlos Sobral Ribeiro:

Boa tarde, amigos.

Confesso que apesar de já ter vários anos mexendo com essa linguagem de programação ainda me sinto muito verde quanto há muitos detalhes, como esse:

Depois de muito quebrar a cabeça, resolvi recorrer á este fórum para perguntar:

- Alguém sabe como adicionar comentários às posições abertas por EA's criados usando o assistente MQL5, sem precisar modificar as bibliotecas mqh?

Já tentei de todas as formas usando as variáveis e funções públicas disponíveis nas bibliotecas mqh anexas, direta ou indertamente ao EA, mas até agora, a unica solução que vislubro é modificando a bibioteca Expert.mqh...

Busco uma solução que não precise modificar nenhuma biblioteca, usando apenas as variáveis e funções disponíveis.

De antemão, agradeço quaquer ajuda.

Acho que voce não esta explicando direito o que quer, entendo que o comentário é imutável. Mas, se estiver com uma posição aberta e quiser altera-la em conta netting voce pode alterar adicionar ou remover um lote e dai o comentario "novo" pega.

 
Ricardo Rodrigues Lucca #:

Acho que voce não esta explicando direito o que quer, entendo que o comentário é imutável. Mas, se estiver com uma posição aberta e quiser altera-la em conta netting voce pode alterar adicionar ou remover um lote e dai o comentario "novo" pega.

O que quero é adicionar um mcomentário no ato de lançamento de ordens para abrir posições, mas quero fazer isso sem precisar alterar as bibliotecas nativas usadas para criar o EA pelo assistente.

Quero fazer isso usando as variáveis públicas disponibilizadas pelas bibliotecas usadas na construção do EA. 

A estrutura de abertura de ordens, no caso do EA's criados pelo assitente mql, é interna, fica nas bibliotecas, ExpertTrade .mqh e Trade.mqh, mas não encontrei um jeito de adicionar o comentário sem ter que alterar uma dessas duas bibliotecas, adicionando uma variável pública para receber o comentário para compor a estrutura de lancamento da ordem...

Quero, se existir, uma solução que não precise alterar a biblioteca, usando uma variável ou função publica já existente nessas bibliotecas.


Se eu tiver que alterar a bilioteca, toda vez que for atualizar o terminal, essa biblioteca é substituida por uma nova verão, me obrigando a fazer backup dela ou refazer as alterações na mesma, por isso quero uma solução que não precise alterar a biblioteca.

 
Francisco Carlos Sobral Ribeiro #:

O que quero é adicionar um mcomentário no ato de lançamento de ordens para abrir posições, mas quero fazer isso sem precisar alterar as bibliotecas nativas usadas para criar o EA pelo assistente.

Quero fazer isso usando as variáveis públicas disponibilizadas pelas bibliotecas usadas na construção do EA. 

A estrutura de abertura de ordens, no caso do EA's criados pelo assitente mql, é interna, fica nas bibliotecas, ExpertTrade .mqh e Trade.mqh, mas não encontrei um jeito de adicionar o comentário sem ter que alterar uma dessas duas bibliotecas, adicionando uma variável pública para receber o comentário para compor a estrutura de lancamento da ordem...

Quero, se existir, uma solução que não precise alterar a biblioteca, usando uma variável ou função publica já existente nessas bibliotecas.


Se eu tiver que alterar a bilioteca, toda vez que for atualizar o terminal, essa biblioteca é substituida por uma nova verão, me obrigando a fazer backup dela ou refazer as alterações na mesma, por isso quero uma solução que não precise alterar a biblioteca.

Entendi, ta usando a CExpert para negociar e quer colocar comentários de alguma forma. Talvez se extender a CExpertTrade deixando os comentarios padrões como o que voce quer lá, voce pode chamar InitTrade passando o objeto dessa classe para CExpert usa-la. Note que isso não tem alteração no código original do metatrader e sim no seu código.
 
Ricardo Rodrigues Lucca #:
Entendi, ta usando a CExpert para negociar e quer colocar comentários de alguma forma. Talvez se extender a CExpertTrade deixando os comentarios padrões como o que voce quer lá, voce pode chamar InitTrade passando o objeto dessa classe para CExpert usa-la.

Tavez sirva, mas como se programa isso... meu conhecimento com classes não é essas coisas.

 
#include <Trade\Trade.mqh>
CTrade meutrade;

------

string comentario="Vou estar no comentario da ordem buyStop");
meutrade.BuyStop(Lote,preco.ask+distancia,_Symbol,preco.bid-SLparapendente,0,ORDER_TIME_GTC,0,comentario);

O que você quer é isso? na ctrade você coloca no momento de colocar a ordem.

 
Cesar Afif rezende Oaquim #:

O que você quer é isso? na ctrade você coloca no momento de colocar a ordem.

Tá, mais ai eu estaria alterando diretamente a ctrade...

E a solução que busca é inserir o comentário por meio de uma varíavel ou função já existente, como as muitas que tem lá e muitas não sei como usar...

 
Francisco Carlos Sobral Ribeiro #:

Tavez sirva, mas como se programa isso... meu conhecimento com classes não é essas coisas.

class CExpertTradeComment : public CExpertTrade
  {
protected:
   string            my_comment;
public:
                     CExpertTradeComment(string c) : CExpertTrade(), my_comment(c)
     {}

   bool              Buy(double volume,double price,double sl,double tp,const string comment="")
   {
      return CExpertTrade::Buy(volume, price, sl, tp, my_comment);
   }
   bool              Sell(double volume,double price,double sl,double tp,const string comment="")
   {
      return CExpertTrade::Sell(volume, price, sl , tp, my_comment);
   }
  };

Isso aqui seria a classe que extende a real pra incluir o comentário, dai a inicialização poderia ficar assim:

//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }
//--- Add CExpertTrade with comment to ExpExpert
   if(!ExtExpert.InitTrade(Expert_MagicNumber, new CExpertTradeComment(Inp_Expert_Title)))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }

Entretanto, eu vi aqui não da certo por conta que a CExpertTrade não tem o metodo Buy / Sell como virtuais (basta modificar o código original do metatrader prefixando com a palavra virtual). Então vamos a segunda tentativa esquecendo isso. Faremos uma extensão da própria CExpert

class CExpertCommented : public CExpert
  {
protected:
   string my_comment;
public:
   CExpertCommented(string comment)
      : CExpert(), my_comment(comment)
   {
   }

   bool OpenLong(double price,double sl,double tp)
   {
   if(price==EMPTY_VALUE)
      return(false);
//--- get lot for open
   double lot=LotOpenLong(price,sl);
//--- check lot for open
   lot=LotCheck(lot,price,ORDER_TYPE_BUY);
   if(lot==0.0)
      return(false);
//---
   return(m_trade.Buy(lot,price,sl,tp, my_comment));
   }
   
   bool OpenShort(double price,double sl,double tp)
   {
   if(price==EMPTY_VALUE)
      return(false);
//--- get lot for open
   double lot=LotOpenShort(price,sl);
//--- check lot for open
   lot=LotCheck(lot,price,ORDER_TYPE_SELL);
   if(lot==0.0)
      return(false);
//---
   return(m_trade.Sell(lot,price,sl,tp, my_comment));
   }
   
   //Precisa ser feito o mesmo que o acima...
   //bool ReverseLong(double price,double sl,double tp)
   //bool ReverseShort(double price,double sl,double tp)
   //bool CloseAll(double lot)
   //bool CloseLong(double price)
   //bool CloseShort(double price)
  };
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
//CExpert ExtExpert;
CExpertCommented ExtExpert(Inp_Expert_Title);

Isso funcionou perfeitamente com o código exemplo do expert do macd que utiliza essa forma de abrir ordens entretanto as funções de reversão e fechamento não tem comentários por que acredito que já deu pra entender a ideia. Segue abaixo o código completo como ficou.

//+------------------------------------------------------------------+
//|                                                   ExpertMACD.mq5 |
//|                             Copyright 2000-2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
#include <Expert\Signal\SignalMACD.mqh>
#include <Expert\Trailing\TrailingNone.mqh>
#include <Expert\Money\MoneyNone.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string Inp_Expert_Title            ="ExpertMACD";
int          Expert_MagicNumber          =10981;
bool         Expert_EveryTick            =false;
//--- inputs for signal
input int    Inp_Signal_MACD_PeriodFast  =12;
input int    Inp_Signal_MACD_PeriodSlow  =24;
input int    Inp_Signal_MACD_PeriodSignal=9;
input int    Inp_Signal_MACD_TakeProfit  =50;
input int    Inp_Signal_MACD_StopLoss    =20;
//+------------------------------------------------------------------+
//| CExpertTrade With Comment Support                                |
//+------------------------------------------------------------------+
/*class CExpertTradeComment : public CExpertTrade
  {
protected:
   string            my_comment;
public:
                     CExpertTradeComment(string c) : CExpertTrade(), my_comment(c)
     {}

   bool              Buy(double volume,double price,double sl,double tp,const string comment="")
   {
      return CExpertTrade::Buy(volume, price, sl, tp, my_comment);
   }
   bool              Sell(double volume,double price,double sl,double tp,const string comment="")
   {
      return CExpertTrade::Sell(volume, price, sl , tp, my_comment);
   }
  };*/
//+------------------------------------------------------------------+
//| Second try                                                       |
//+------------------------------------------------------------------+
class CExpertCommented : public CExpert
  {
protected:
   string my_comment;
public:
   CExpertCommented(string comment)
      : CExpert(), my_comment(comment)
   {
   }

   bool OpenLong(double price,double sl,double tp)
   {
   if(price==EMPTY_VALUE)
      return(false);
//--- get lot for open
   double lot=LotOpenLong(price,sl);
//--- check lot for open
   lot=LotCheck(lot,price,ORDER_TYPE_BUY);
   if(lot==0.0)
      return(false);
//---
   return(m_trade.Buy(lot,price,sl,tp, my_comment));
   }
   
   bool OpenShort(double price,double sl,double tp)
   {
   if(price==EMPTY_VALUE)
      return(false);
//--- get lot for open
   double lot=LotOpenShort(price,sl);
//--- check lot for open
   lot=LotCheck(lot,price,ORDER_TYPE_SELL);
   if(lot==0.0)
      return(false);
//---
   return(m_trade.Sell(lot,price,sl,tp, my_comment));
   }
   
   //Precisa ser feito o mesmo que o acima...
   //bool ReverseLong(double price,double sl,double tp)
   //bool ReverseShort(double price,double sl,double tp)
   //bool CloseAll(double lot)
   //bool CloseLong(double price)
   //bool CloseShort(double price)
  };
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
//CExpert ExtExpert;
CExpertCommented ExtExpert(Inp_Expert_Title);
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }
//--- Add CExpertTrade with comment to ExpExpert
   /*if(!ExtExpert.InitTrade(Expert_MagicNumber, new CExpertTradeComment(Inp_Expert_Title)))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }*/
//--- Creation of signal object
   CSignalMACD *signal=new CSignalMACD;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//--- Add signal to expert (will be deleted automatically))
   if(!ExtExpert.InitSignal(signal))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing signal");
      ExtExpert.Deinit();
      return(-3);
     }
//--- Set signal parameters
   signal.PeriodFast(Inp_Signal_MACD_PeriodFast);
   signal.PeriodSlow(Inp_Signal_MACD_PeriodSlow);
   signal.PeriodSignal(Inp_Signal_MACD_PeriodSignal);
   signal.TakeLevel(Inp_Signal_MACD_TakeProfit);
   signal.StopLevel(Inp_Signal_MACD_StopLoss);
//--- Check signal parameters
   if(!signal.ValidationSettings())
     {
      //--- failed
      printf(__FUNCTION__+": error signal parameters");
      ExtExpert.Deinit();
      return(-4);
     }
//--- Creation of trailing object
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-6);
     }
//--- Set trailing parameters
//--- Check trailing parameters
   if(!trailing.ValidationSettings())
     {
      //--- failed
      printf(__FUNCTION__+": error trailing parameters");
      ExtExpert.Deinit();
      return(-7);
     }
//--- Creation of money object
   CMoneyNone *money=new CMoneyNone;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-8);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-9);
     }
//--- Set money parameters
//--- Check money parameters
   if(!money.ValidationSettings())
     {
      //--- failed
      printf(__FUNCTION__+": error money parameters");
      ExtExpert.Deinit();
      return(-10);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-11);
     }
//--- succeed
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| Function-event handler "tick"                                    |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| Function-event handler "trade"                                   |
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| Function-event handler "timer"                                   |
//+------------------------------------------------------------------+
void OnTimer(void)
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+