Por favor ter em conta a secção adequada quando criar tópicos — https://www.mql5.com/pt/forum/421109/page6#comment_49385139
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.
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.
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.
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.
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.
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...
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(); } //+------------------------------------------------------------------+
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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.