AccountInfoDouble(ACCOUNT_BALANCE) numa data do passado

 

Meu EA armazena o saldo da conta obtido de AccountInfoDouble(ACCOUNT_BALANCE) numa variavel para calcular o lucro ou prejuizo e realizar a saida da operação.

Esta funcionando perfeitamente, porém se por algum motivo o MT5 for desligado/reiniciado (travamento, queda de energia, etc...) a variavel perde seu valor armazenado e a operação 

em andamento fica sem referencia de saida pois a variavel foi reiniciada, para contornar o problema seto a variavel com o saldo na hora que o EA inicia, porem o ideal seria eu conseguir 

saber o saldo da conta na hora que a operalão iniciou, é possivel obeter o valor de AccountInfoDouble(ACCOUNT_BALANCE) numa data e hora no passado ??

 
Use as variáveis globais isso pode resolver o seu problema.

Documentação sobre MQL5: Variáveis Globais do Terminal / GlobalVariableGet
Documentação sobre MQL5: Variáveis Globais do Terminal / GlobalVariableGet
  • www.mql5.com
GlobalVariableGet - Variáveis Globais do Terminal - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Andre Carioca:

Meu EA armazena o saldo da conta obtido de AccountInfoDouble(ACCOUNT_BALANCE) numa variavel para calcular o lucro ou prejuizo e realizar a saida da operação.

Esta funcionando perfeitamente, porém se por algum motivo o MT5 for desligado/reiniciado (travamento, queda de energia, etc...) a variavel perde seu valor armazenado e a operação 

em andamento fica sem referencia de saida pois a variavel foi reiniciada, para contornar o problema seto a variavel com o saldo na hora que o EA inicia, porem o ideal seria eu conseguir 

saber o saldo da conta na hora que a operalão iniciou, é possivel obeter o valor de AccountInfoDouble(ACCOUNT_BALANCE) numa data e hora no passado ??

Uhm. Acho que não tem como não.

A ideia é como o colega disse, salva a informação em algum lugar e resgata depois.

Vc poderia ler as operações abertas e calcular o balance antes delas abrirem também...

Ah, e para salvar você pode usar variável global ou um arquivo de texto também.

Na documentação de ambos tem exemplos de uso:


https://www.mql5.com/pt/docs/globals

https://www.mql5.com/pt/docs/files

Documentação sobre MQL5: Variáveis Globais do Terminal
Documentação sobre MQL5: Variáveis Globais do Terminal
  • www.mql5.com
Variáveis Globais do Terminal - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Jose Sandro Oliveira #:
Use as variáveis globais isso pode resolver o seu problema.

Sim a variavel é global, e mesmo assim perde seu valor ao reiniciar o terminal...
 
Ricardo Branco #:

Uhm. Acho que não tem como não.

A ideia é como o colega disse, salva a informação em algum lugar e resgata depois.

Vc poderia ler as operações abertas e calcular o balance antes delas abrirem também...

Ah, e para salvar você pode usar variável global ou um arquivo de texto também.

Na documentação de ambos tem exemplos de uso:


https://www.mql5.com/pt/docs/globals

https://www.mql5.com/pt/docs/files

Bem interessante, embora confuso essa opção de guardar a valor em local externo. Porem estive testando outro EA na mesma conta e percebi que, por meu EA avaliar o ACCOUNT_BALANCE para sair da operação, a conta vai ter que rodar apenas meu EA pois se o outro EA ganhar ou perder vai interferir na operação em aberto no meu EA pois vai mudar o ACCOUNT_BALANCE. A solução ideal vai ser criar uma função para varrer o histórico desde a data e hora que o meu EA abriu a operação, calcular o lucro/prejuizo de cada operação já finalizada e calcular  o lucro/prejuizo das posições em aberto, e então avaliar se atingiu o TP ou SL da estratégia que é um dual grid autorenovavel. Aberto para sugestões...
 
Andre Carioca #:
Sim a variavel é global, e mesmo assim perde seu valor ao reiniciar o terminal...

Nesse artigo que eu te  mandei mostra como guardar uma variável dentro do Terminal como um banco de dados, vamos supor que vc quer armazenar o Balanço da conta  logo após abrir uma ordem vc armazena  o valor do balanço nessa variável global:

double Balance = AccountInfoDouble(ACCOUNT_BALANCE);



if(Ordersend)

{

GlobalVariableSet("NOME DA VARIAVEL",Balance);

Print("Sucesso ao enviar Ordem");

}


Depois disso caso o Terminal caia basta você recuperar esse valor no OnInit dessa forma:

Balance = GlobalVariableSet("NOME DA VARIAVEL");

 
Jose Sandro Oliveira #:

Nesse artigo que eu te  mandei mostra como guardar uma variável dentro do Terminal como um banco de dados, vamos supor que vc quer armazenar o Balanço da conta  logo após abrir uma ordem vc armazena  o valor do balanço nessa variável global:

double Balance = AccountInfoDouble(ACCOUNT_BALANCE);



if(Ordersend)

{

GlobalVariableSet("NOME DA VARIAVEL",Balance);

Print("Sucesso ao enviar Ordem");

}


Depois disso caso o Terminal caia basta você recuperar esse valor no OnInit dessa forma:

Balance = GlobalVariableSet("NOME DA VARIAVEL");

Corrigindo para recuperar o correto é:


Balance = GlobalVariableGet("NOME DA VARIAVEL");

 
Salva dentro de um TXT ou banco de dados no exemplo do mt5 já tem tudo pronto
 
Andre Carioca:

Meu EA armazena o saldo da conta obtido de AccountInfoDouble(ACCOUNT_BALANCE) numa variavel para calcular o lucro ou prejuizo e realizar a saida da operação.

Esta funcionando perfeitamente, porém se por algum motivo o MT5 for desligado/reiniciado (travamento, queda de energia, etc...) a variavel perde seu valor armazenado e a operação 

em andamento fica sem referencia de saida pois a variavel foi reiniciada, para contornar o problema seto a variavel com o saldo na hora que o EA inicia, porem o ideal seria eu conseguir 

saber o saldo da conta na hora que a operalão iniciou, é possivel obeter o valor de AccountInfoDouble(ACCOUNT_BALANCE) numa data e hora no passado ??

Eu nao entendi seu problema, o AccountInfoDouble(ACCOUNT_BALANCE) veio um valor invalido digamos que voce assuma ser zero. Nao bastaria tentar carregar a sua variavel temporaria novamente em algum momento no futuro? Penso que pode ter sido algo do tipo, seu EA esta aberto no grafico e voce abriu o mt5, o OnInit foi executado antes de ser confirmado a conexao com a corretora entao seria considerado como terminal nao sincronizado/desconectado e a variavel vem zero e o valor de erro global setado conforme se espera...

Se voce salvar numa variavel global ainda assim vai ter erro que ela pode desaparecer se nao for atualizada de tempos em tempos, banco de dados seria melhor.

Sobre a outra pergunta, acredito que tem como pegar o saldo em conta em algumas corretoras brasileiras sim. Olha o historico normalmente tem umas corretoras que o que fazem pra controle de margem eh sacar todo o dinheiro no fim do dia e deposita-lo depois do calculo ter sido feito. Isso gera um lixo no historico tremendo que pra ti poderia ser bom pra fazer esse rastreio.

 

Obrigado a todos pelos comentários, conforme disse o ideal seria calcular o lucro/prejuízo de cada operação já finalizada e calcular  o lucro/prejuízo das posições em aberto, para que a conta não precise ficar exclusiva para o EA . Então fui tentar fazer a função, percebi que eu já tinha tudo pronto em 2 funções separadas que estavam sem uso no momento, bastava eu juntar as 2 em uma função que pede um  datetime como parâmetro, para eu obter o saldo da ultima operação passando sua hora de abertura. Segue abaixo o código caso alguém necessite futuramente. Tópico resolvido.

//+------------------------------------------------------------------+
//|               Resultado Financeiro da operação                 |
//+------------------------------------------------------------------+
double saldoOp(datetime h_abert_oper )
  {
   datetime end = TimeCurrent();

   HistorySelect(h_abert_oper, end);
   int h_deals = HistoryDealsTotal();
   int p_deals = PositionsTotal();

   double profit_aberto = 0;
   double profit_realizado = 0;

   for(int i=0 ; i < h_deals; i++)
     {
      ulong _ticket = HistoryDealGetTicket(i);
      string _symbol = HistoryDealGetString(_ticket, DEAL_SYMBOL);
      ulong _magic = HistoryDealGetInteger(_ticket,DEAL_MAGIC);

      if(_ticket == 0)
         continue;

      if(_magic != in_magic)
         continue;

      if(_symbol != _Symbol)
         continue;

      profit_realizado += (HistoryDealGetDouble(_ticket,DEAL_SWAP) + HistoryDealGetDouble(_ticket, DEAL_PROFIT));
     }

   for(int i=0; i<p_deals; i++)
     {
      ulong ticket = PositionGetTicket(i);
            
      if(ticket == 0 || !PositionSelectByTicket(ticket))
         continue;

      if(PositionGetInteger(POSITION_MAGIC) != in_magic)
         continue;

      if(PositionGetString(POSITION_SYMBOL) != _Symbol)
         continue;

      profit_aberto += NormalizeDouble(PositionGetDouble(POSITION_SWAP)+ PositionGetDouble(POSITION_PROFIT),2);
     }  

   return NormalizeDouble((profit_aberto+profit_realizado),2);
  }
Razão: