Como detectar saldo quando ele para de mudar ? - página 2

 
josue moraes #:

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.

 
sergio.fg #:

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. 

 
sergio.fg #:

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?

 
josue moraes #:

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.  

 
sergio.fg #:

É 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=============================================================

 
josue moraes #:

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.

 
sergio.fg #:

Cara, muito obrigado por esta ajuda. Saúde e Paz sempre. Forte abraço.

Mas funfou? Eu nem testei isso..

Grato..

 
josue moraes #:

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

 
sergio.fg #:


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..

 
josue moraes #:


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