![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Então, quando ficar mais que X minutos sem mudar o saldo (sinal que empatou) a função CloseAllPositions() deve ser chamada.
Pelo que entendi, seu EA vai abrindo ordens: hora estão mais compradas BUY e hora estão mais vendidas SELL o que provoca mudança de saldo..
Evidente que chega o momento que tanto a quantidade de ordens BUY e SELL de suas posições se igualam travando o saldo e é aqui que vc quer intervir através de uma rotina que calcule o tempo em que esta situação esta ativa? Capiche?
Exatamente isso meu caro, do jeito mais simples possível. Não sei se medir o tempo seria a melhor opção ou se medir um contador conforme coloquei agora por último seria melhor. Se bem que o tempo é também uma contagem.
Exatamente isso meu caro, do jeito mais simples possível. Não sei se medir o tempo seria a melhor opção ou se medir um contador conforme coloquei agora por último seria melhor. Se bem que o tempo é também uma contagem.
Mas não seria pela quantidade de ordens BUY serem iguais as SELL, tipo 5 compras e 5 vendas. O saldo também para de mudar com 4 compras e 3 vendas ou vice-versa ou qualquer outras quantidades pois vai depender do preço em que cada ordem foi iniciada. Então a solução não viria de: quantidade BUY = quantidade SELL.
Mas não seria pela quantidade de ordens BUY serem iguais as SELL, tipo 5 compras e 5 vendas. O saldo também para de mudar com 4 compras e 3 vendas ou vice-versa ou qualquer outras quantidades pois vai depender do preço em que cada ordem foi iniciada. Então a solução não viria de: quantidade BUY = quantidade SELL.
Cara, acho que vc esta equivocado. Veja: digamos que temos uma posição de 4 compras a um preço médio de 110.000 e uma posição de 4 vendas a um preço médio de 110.100... Veja que temos um saldo de 100 pts positivos (110.100-110.000) não importa se a cotação esta em 100.000 ou 111.000 pois em termos práticos a posição esta zerada (4 x SELLS - 4 x BUYS) .. Se uma nova ordem de compra ou de venda é adicionada na posição, evidente que o SALDO ABERTO(não o fechado, talvez aqui a confusão) irá oscilar para cima ou para baixo. Talvez vc esteja se referindo ao saldo fechado. Seria isso?
Cara, acho que vc esta equivocado. Veja: digamos que temos uma posição de 4 compras a um preço médio de 110.000 e uma posição de 4 vendas a um preço médio de 110.100... Veja que temos um saldo de 100 pts positivos (110.100-110.000) não importa se a cotação esta em 100.000 ou 111.000 pois em termos práticos a posição esta zerada (4 x SELLS - 4 x BUYS) .. Se uma nova ordem de compra ou de venda é adicionada na posição, evidente que o SALDO ABERTO(não o fechado, talvez aqui a confusão) irá oscilar para cima ou para baixo. Talvez vc esteja se referindo ao saldo fechado. Seria isso?
É o saldo das ordens abertas que às vezes para de mudar, para de variar, pois ocorre um equilíbrio de preços entre ordens BUY e SELL. Imagina que eu tenha 3 ordens BUY com lotes 1,2,3 e 1 ordem SELL com lote 5, só quatro ordens abertas, à depender do preço que elas foram abertas pode ocorrer do saldo delas, do lucro delas, parar de mudar, parar de variar. E se nesse ponto o mercado congestionar, lateralizar, pode ser que o saldo fique constante durante muitos minutos. O foco que me fez abrir este tópico é:
Como identificar de forma fácil que o saldo parou de variar ? que o saldo de agora está igual ao saldo de por exemplo 10 segundos atrás ? Pensei em usar a própria variação de ticket do ativo. O que chamo aqui de saldo é o lucro somatório das ordens abertas.
Por eemplo: Deu 100 cotações do ativo e o saldo está igual em todos os 100 tickets ? sim ? pronto.
É o saldo das ordens abertas que às vezes para de mudar, para de variar, pois ocorre um equilíbrio de preços entre ordens BUY e SELL. Imagina que eu tenha 3 ordens BUY com lotes 1,2,3 e 1 ordem SELL com lote 5, só quatro ordens abertas, à depender do preço que elas foram abertas pode ocorrer do saldo delas, do lucro delas, parar de mudar, parar de variar. E se nesse ponto o mercado congestionar, lateralizar, pode ser que o saldo fique constante durante muitos minutos. O foco que me fez abrir este tópico é:
Como identificar de forma fácil que o saldo parou de variar ? que o saldo de agora está igual ao saldo de por exemplo 10 segundos atrás ? Pensei em usar a própria variação de ticket do ativo. O que chamo aqui de saldo é o lucro somatório das ordens abertas.
Por eemplo: Deu 100 cotações do ativo e o saldo está igual em todos os 100 tickets ? sim ? pronto.
Olha, veja se da certo desse jeito. Aqui usaremos o evento OnTimer interagindo com o evento Ontick e com unidade de tempo de "Segundo" onde o objeto seria o saldo liquido corrente. Caso necessário, coloque tudo no evento onTimer e veja o que acontece...
Não testei a fundo a rotina em demo apenas no feeling mesmo.
// Ao iniciar o EA
int OnInit()
{
EventSetTimer(1); // Setamos o timer interagindo a cada 1 segundo
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer(); // Destroi o evento Timer quando fechar o EA
}
// Iniciamos algumas variáveis fora dos eventos
int s=0,cont_saldo=0; // variaveis que controlam posições e valores de saldo
double list_saldo[60];// uma lista com ate 60 registros para guardar os registros dos saldos que ocorrera a cada 1 segundo
// No evento onTick iremos verificamos se o contador cont_saldo é maior ou igual a 10 o que indicaria que se passou 10 segundos sem alteração do saldo aberto
void OnTick()
{
if(cont_saldo>=10) // Verificamos se cont_saldo é igual ou maior que 10 o que significa que houve mais de 10 interações no evento onTimer sem mudança de saldo
{
// Aqui vc decide o que fazer
cont_saldo=0; // Zeramos cont_saldo pra uma nova interação a ser utilizada no evento onTimer
s=0; // Zeramos s pra uma nova interação a ser utilizada no evento onTimer
}
}
//+------------------------------------------------------------------+
//No evento onTimer iremos analisar a contagem de saldos repetitivos |
//+------------------------------------------------------------------+
void OnTimer()
{
cont_saldo=0; // Iremos contar quantas vezes a cada 1 segundo, o saldo se repete com os registros de list_saldo
list_saldo[s]=AccountInfoDouble(ACCOUNT_EQUITY); // Guardamos o saldo atual em list_saldo sucessivamente enquanto s for incrementando
for(int n=0;n<=s ;n++) // Iniciamos um laço a partir da posição 0 ate a posição de s em list_saldo
{
if(AccountInfoDouble(ACCOUNT_EQUITY)==list_saldo[n]) // verificamos se o saldo aberto atual são iguais aos saldos guardados em list_saldo
{
cont_saldo=cont_saldo+1;
s=s+1; // incrementamos s para evitar sobreposição em list_saldo
}
else
{
s=0;
}
}
}
// =========================================FIM=============================================================
Olha, veja se da certo desse jeito. Aqui usaremos o evento OnTimer interagindo com o evento Ontick e com unidade de tempo de "Segundo" onde o objeto seria o saldo liquido corrente. Caso necessário, coloque tudo no evento onTimer e veja o que acontece...
Não testei a fundo a rotina em demo apenas no feeling mesmo.
Cara, muito obrigado por esta ajuda. Saúde e Paz sempre. Forte abraço.
Cara, muito obrigado por esta ajuda. Saúde e Paz sempre. Forte abraço.
Mas funfou? Eu nem testei isso..
Grato..
Mas funfou? Eu nem testei isso..
Grato..
Quando tentei rodar no tester deu erro e acho que foi porque em conta demo o saldo é sempre zero, pra semana vou testar em conta demo com o mercado rolando. Volto aqui e avise se der algum erro.
O ero que deu foi: array out of range
On Timer critical error
Linha 167, que aqui no EA é:
list_saldo[s]=AccountInfoDouble(ACCOUNT_EQUITY); // Guardamos o saldo atual em list_saldo sucessivamente enquanto s for incrementando
Quando tentei rodar no tester deu erro e acho que foi porque em conta demo o saldo é sempre zero, pra semana vou testar em conta demo com o mercado rolando. Volto aqui e avise se der algum erro.
O ero que deu foi: array out of range
On Timer critical error
Linha 167, que aqui no EA é:
list_saldo[s]=AccountInfoDouble(ACCOUNT_EQUITY); // Guardamos o saldo atual em list_saldo sucessivamente enquanto s for incrementando
Dei uma pequena revisada no código .. Se deu "array out of range" é por que o array list_saldo estourou o limite de seu tamanho de 60 elementos que não deveria passar de 10 uma vez que condicionamos no evento Ontick que se a contagem de cont_saldo >=10 "s" receberia 0 novamente dando inicio a um novo ciclo de contagem..
Dei uma pequena revisada no código .. Se deu "array out of range" é por que o array list_saldo estourou o limite de seu tamanho de 60 elementos que não deveria passar de 10 uma vez que condicionamos no evento Ontick que se a contagem de cont_saldo >=10 "s" receberia 0 novamente dando inicio a um novo ciclo de contagem..
Mas será que com o mercado aberto vai dar isso ? vou testar aqui e te aviso. Conta demo, saldo começa sempre em 0