Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1266

 

Bons tempos para todos vós!

Tenho uma pergunta sobre a função ResultDeal() na classe CTrade.

O problema é que no Testador de Estratégia esta função devolve o bilhete de troca sem qualquer problema, mas quando se atira a EA no gráfico ela devolve sempre "zero", apesar de a função ResultRetcode() devolver sempre "TRADE_RETCODE_DONE".

Exemplo de código:

/////////////////////////////////////////////////////////////////////
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
/////////////////////////////////////////////////////////////////////
CTrade Trade;
CSymbolInfo SymbolInfo;

uint Retcode;
ulong TicketDeal;
bool first_calc;
bool second_calc;
bool third_calc;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   TicketDeal = 9999999;
   
   first_calc = true;
   second_calc = false;
   third_calc = false;   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   if(first_calc)
   {
      first_calc = false;
      second_calc = true;
      
      SymbolInfo.Name(Symbol());
      SymbolInfo.RefreshRates();
      Trade.Buy(1.0, Symbol(), SymbolInfo.Ask(), 0.0, 0.0, "BUY");
//---
      Retcode = Trade.ResultRetcode();
      if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
      
      Print("first_calc ////////////////////////////////////");
      Print("PositionsTotal(): ", PositionsTotal());
      Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
   }
   else
   {
      if(second_calc)
      {
         second_calc = false;
         third_calc = true;
//---
         Retcode = Trade.ResultRetcode();
         if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
         
         Print("second_calc ////////////////////////////////////");
         Print("PositionsTotal(): ", PositionsTotal());
         Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
      }
      else
      {
         if(third_calc)
         {
            third_calc = false;
//---
            Retcode = Trade.ResultRetcode();
            if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
            
            Print("third_calc ////////////////////////////////////");
            Print("PositionsTotal(): ", PositionsTotal());
            Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
         }
         else
         {
            //Print("TicketDeal: ", Trade.ResultDeal());
         }
      }
   }   
}
//+------------------------------------------------------------------+

Diário de execução no Testador:

2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   first_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   second_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   third_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   Retcode: 10009; TicketDeal: 2

Diário de execução na Carta:

2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) first_calc ////////////////////////////////////
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) PositionsTotal(): 0
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.026 _TestSelect (EURUSD,M1) second_calc ////////////////////////////////////
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) third_calc ////////////////////////////////////
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0


O que é que estou a fazer mal? Como posso obter um bilhete de troca em tempo real?

E a segunda questão (de menor importância), porquê imediatamente após uma execução comercial a função PositionsTotal() retorna "zero"? E mostra dados fiáveis com o próximo tick. É possível obter esta informação de uma só vez?


Arquivos anexados:
 
ZAKST:

Bons tempos para todos vós!

Tenho uma pergunta sobre a função ResultDeal() na classe CTrade.

O problema é que no Testador de Estratégia esta função devolve o bilhete de troca sem qualquer problema, mas quando se atira a EA no gráfico ela devolve sempre "zero", apesar de a função ResultRetcode() devolver sempre "TRADE_RETCODE_DONE".

Exemplo de código:

Diário de execução no Testador:

Diário de execução na Carta:


O que é que estou a fazer mal? Como posso obter um bilhete de troca em tempo real?

E a segunda questão (de menor importância), porquê imediatamente após uma execução comercial a função PositionsTotal() retorna "zero"? E mostra dados fiáveis com o próximo tick. É possível obter esta informação de uma só vez?


Hmm... De repente os dados de que preciso em tempo real são devolvidos pela função ResultOrder() da mesma classeCTrade, embora eu não tenha usado ordens pendentes...

A minha pergunta é a mesma: O que estou eu a fazer mal?

 

Há uma macro como esta.

#define  Warning if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

Utilizo-a assim.

Warning"Warnig  сработал. ");

Pergunta: O que precisa de ser corrigido na definição macro para poder utilizá-la desta forma ?

Warning("Warnig  сработал. ");

ou seja, com um parêntese entre "Warning" e "Warnig" funcionou. "Tentou usar um parêntesis na definição macro

#define  Warning( if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

mas o compilador não me deixa usar um parêntese.

 
ZAKST:

Hmm... De repente, a função ResultOrder() da mesma classeCTrade devolve os dados de que preciso em tempo real, embora eu não tenha usado ordens pendentes...

A questão é a mesma: O que estou eu a fazer mal?

Basta compreender o sistema de ordem do MT5, ordem - comércio - posição.

ResultOrder é a ordem de abertura. A posição será com POSITION_IDENTIFIER igual ao bilhete desta encomenda.

Todos os acordos podem ser encontrados na história através do identificador de posição. Não confundir com o bilhete da posição, este pode mudar, e o identificador é constante.

s.s. O testador é diferente na medida em que não há atraso na execução da ordem e o negócio é criado imediatamente. Na vida real, o tempo passa e na altura da criação bem sucedida de uma ordem ainda não há acordo, tem de ser apanhado nos eventos OnTrade
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
pivomoe:

Há uma macro como esta.

Utilizo-a assim.

Pergunta: O que precisa de ser corrigido na definição macro para poder utilizá-la desta forma ?

ou seja, com um parêntese entre "Warning" e "Warnig" funcionou. "Tentou usar um parêntesis na definição macro

mas o compilador não o deixa usar um parêntese.

quer usar um formulário paramétrico, mas especificou um formulário não paramétrico. deve ser assim

#define  Warning(CUSTOM) (if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+"",string(CUSTOM)))


Warning("Warnig  сработал. ");
 

Não o expliquei bem. Comecemos desde o início. Agora estou a usar a macro desta forma:

Warning,"Warnig  сработал. i=",i);

Aqui está a macro em si:

#define  Warning if(LogWarnig)MoiLoggerWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')

Na macro chamada entre "Aviso" e ");" Um número arbitrário de parâmetros de tipos arbitrários. Tudo isto é conseguido através da recarga repetida da funçãoWrite.

Pergunta. O que devo corrigir no macro para lhe poder chamar assim:

Warning("Warnig  сработал. i=",i);
 
pivomoe:

Não o expliquei bem. Comecemos desde o início. Agora estou a usar a macro desta forma:

Aqui está a macro em si:

Na macro chamada entre "Aviso," e ");" Um número arbitrário de parâmetros de tipos arbitrários. Tudo isto é conseguido através da recarga repetida da funçãoWrite.

Pergunta. O que deve ser corrigido no macro para permitir a sua chamada desta forma:

Resposta: também recarregar a macro várias vezes)

Mas é melhor usar o operador + para cordas e converter tudo em cordas, então não precisa de uma versão da função (e macro) com muitos parâmetros

 
Aleksey Mavrin:

Basta compreender o sistema de ordem do MT5, ordem - comércio - posição.

ResultOrder é a ordem de abertura. A posição será com POSITION_IDENTIFIER igual ao bilhete desta encomenda.

Todos os acordos podem ser encontrados na história através do identificador de posição. Não confundir com o bilhete da posição, este pode mudar, e o identificador é constante.

s.s. O testador é diferente na medida em que não há atraso na execução da ordem e imediatamente nasce um acordo. No comércio real, o tempo passa e no momento da criação bem sucedida da ordem ainda não há acordo, tem de ser apanhado nos eventos OnTrade.
Obrigado pela sua resposta. Eu vou lidar com isso))
 
Olá! Como posso aceder às propriedades de um indicador a partir de um EA? Por exemplo, quero mudar a cor de uma linha de um EA conhecendo o manípulo indicador. Procurei na ajuda, não consegui encontrar nada, talvez não esteja a procurar o suficiente?
 
Tango_X:
Olá! Como posso aceder às propriedades indicadoras de um EA? Por exemplo, quero mudar a cor da linha de um EA se souber o manípulo indicador. Procurei-o, não consegui encontrá-lo, talvez esteja a procurar demasiado?

Um indicador para isto deve ter um parâmetro de cor de entrada. Ou seja, deve ser um indicador personalizado.