- www.mql5.com
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:
- www.mql5.com
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:
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");
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");
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);
}
- 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
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 ??