Como detectar saldo quando ele para de mudar ?

 

Colegas, estou testando um robô em conta demo tipo hedge. Ele abre compras e vendas, num determinado momento ocorre um equilíbrio e é comum eu ver 1 compra e 1 venda aberta simultaneamente, ou 3 compras + 2 vendas, etc, e o saldo não mudar mais. Saldo que eu digo é ali onde mostra o resultado das operações em aberto em tempo real. Como é que eu posso criar um if que eu detecte que o saldo fica X minutos igual. Um trecho de código que me dê um norte, algo assim:


if (saldo == saldo-1) {

count++;

 if(count>5000) {

  CloseAllPositions();

  count = 0;

 }

}

 

count seria um simples contador. Como faço isso ? ...Grato  

 
sergio.fg:

Colegas, estou testando um robô em conta demo tipo hedge. Ele abre compras e vendas, num determinado momento ocorre um equilíbrio e é comum eu ver 1 compra e 1 venda aberta simultaneamente, ou 3 compras + 2 vendas, etc, e o saldo não mudar mais. Saldo que eu digo é ali onde mostra o resultado das operações em aberto em tempo real. Como é que eu posso criar um if que eu detecte que o saldo fica X minutos igual. Um trecho de código que me dê um norte, algo assim:


if (saldo == saldo-1) {

count++;

 if(count>5000) {

  CloseAllPositions();

  count = 0;

 }

}

 

count seria um simples contador. Como faço isso ? ...Grato  

Essa vissao por tempo eh possivel, mas tu pode fazer tambem eh o seguinte, ao percorrer a lista de posicoes e ver que tem posicoes opostas, tu guarda elas e reordena elas do jeito a voce ter o maior lucro, dai tu ve se o preco do ativo esta fora do intervalo de duas posicoes. Se estiver o saldo ira permanecer o mesmo porque ele so vai mudar quando o preco voltar para dentro do intervalo, dai quando estiver fora desse intervalo tu manda um closeby passando as duas posicoes...

 

Legal também, mas como teria que ficar este código que eu postei para dar certo usando o counter++ ?

 
sergio.fg #:

Legal também, mas como teria que ficar este código que eu postei para dar certo usando o counter++ ?

Voce que fez o codigo inicial?
 
Ricardo Rodrigues Lucca #:
Voce que fez o codigo inicial

Não. É um EA gratuito da lista da biblioteca. 

Eu queria só um 'norte' de como seria um bloco tipo IF conforme eu postei para que daí em diante que tente conseguir fazer por conta própria.

Seria uma lógica + ou - assim: Se o saldo parou de variar inicia um contador counter++, este começa a contar na velocidade de uns 500 ms (meio segundo), se passar mais do que X segundos aciona a função CloseAllPositivons() que já existe no EA para fechar todas as ordens. Este EA quado não tem ordens ele recomeça abrindo novas ordens.


 
sergio.fg #:

Não. É um EA gratuito da lista da biblioteca. 

Eu queria só um 'norte' de como seria um bloco tipo IF conforme eu postei para que daí em diante que tente conseguir fazer por conta própria.

Seria uma lógica + ou - assim: Se o saldo parou de variar inicia um contador counter++, este começa a contar na velocidade de uns 500 ms (meio segundo), se passar mais do que X segundos aciona a função CloseAllPositivons() que já existe no EA para fechar todas as ordens. Este EA quado não tem ordens ele recomeça abrindo novas ordens.


Sim, pode ser assim como voce disse so tem que colocar no OnTimer e setar a chamada para ocorrer nesses 500 ms que deveria dar certo. Entretanto, eu separia essa checagem da parte que abre posicoes, a que abre posicoes parece so ter que saber que algo esta aberto.
 
sergio.fg:

Olá Sérgio,

fiz um script para você se basear.


//+------------------------------------------------------------------+
//|                                                 Forum_387542.mq5 |
//|                         Copyright 2021, Rogério Giannetti Torres |
//|                               mailto:giannetti.rogerio@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Rogério Giannetti Torres"
#property link      "mailto:giannetti.rogerio@gmail.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
double   saldo = 0;
int      timeSaldoZero = INT_MAX;
int      minutos = 1;
void OnStart()
  {
   do
     {
      if(calculaSaldo() == 0)
        {
         if(timeSaldoZero == INT_MAX)
           {
            timeSaldoZero = (int) TimeTradeServer();  // Instante em que o saldo zerou
           }
         if(TimeTradeServer() >= timeSaldoZero + minutos * PeriodSeconds(PERIOD_M1))
           {
            Print(" O saldo ficou zerado de  ", (datetime) timeSaldoZero, " até as: ", TimeTradeServer());
            break;
           }
        }
      else
         timeSaldoZero = INT_MAX;
     }
   while(true);
  }
//+------------------------------------------------------------------+
double calculaSaldo()
  {
   saldo = 0;
   return(saldo);
  }
//+------------------------------------------------------------------+
 

Sou sempre grato aos comentários que tentam me orientar. Principalmente os que vem com códigos. Mas preciso dizer que não é quando o saldo fica igual a zero, é quando ele para de mudar de valor. Por exemplo, tenho 2 ordens SELL e 2 ordens BUY, e o saldo está parado em R$ 120,00 ou - R$ 330,00 ou qualquer outro valor. O preço do ativo continua variando conforme o book (tô falando do mini índice), porém o tanto que ele sobe gera prejuízo nas ordens abertas SELL porém gera o mesmo lucro nas ordens abertas BUY, e por isso, o saldo não muda de valor. Fica empatado. É esse empate que eu quero intervir chamando a função CloseAllPositions() que já existe no EA e que fecha todas as ordens. 


Então, quando ficar mais que X minutos sem mudar o saldo (sinal que empatou) a função CloseAllPositions() deve ser chamada.

 

Acho que daria certo assim: 


int count;  // cria uma variável count

int ticket; //variável que percebe cada ticket que a cotação do ativo der

if (IsPositions())  //se tem ordem aberta, BUY ou SELL (no código já tem esta função que detecta se há ordens abertas)

count++;  //o contador vai incrementando 1 em 1

if (saldo muda a cada ticket, que é a cotação do ativo) // enquanto o saldo estiver mudando a cada cotação do ativo

count=0;  // o contador vai sendo zerado

if (count => 1000)  // Mas se este contador atingir determinado valor é porque o saldo não mudou

CloseAllPositions();  // aí fecha todas as ordens

count = 0;  // e zera o contador esperando novas ordens serem abertas e recomeçar o acompanhamento


Como fazer isso dar certo ? vou pesquisar mas se puderem me adiantar alguma coisa, agradeço.





 
sergio.fg #:

Sou sempre grato aos comentários que tentam me orientar. Principalmente os que vem com códigos. Mas preciso dizer que não é quando o saldo fica igual a zero, é quando ele para de mudar de valor. Por exemplo, tenho 2 ordens SELL e 2 ordens BUY, e o saldo está parado em R$ 120,00 ou - R$ 330,00 ou qualquer outro valor. O preço do ativo continua variando conforme o book (tô falando do mini índice), porém o tanto que ele sobe gera prejuízo nas ordens abertas SELL porém gera o mesmo lucro nas ordens abertas BUY, e por isso, o saldo não muda de valor. Fica empatado. É esse empate que eu quero intervir chamando a função CloseAllPositions() que já existe no EA e que fecha todas as ordens. 


Então, quando ficar mais que X minutos sem mudar o saldo (sinal que empatou) a função CloseAllPositions() deve ser chamada.

Olá,

o caminho das pedras está no código que te mandei, basta uma pequena alteração para fazer o que você quer. 

 
sergio.fg #:

Acho que daria certo assim: 


int count;  // cria uma variável count

int ticket; //variável que percebe cada ticket que a cotação do ativo der

if (IsPositions())  //se tem ordem aberta, BUY ou SELL (no código já tem esta função que detecta se há ordens abertas)

count++;  //o contador vai incrementando 1 em 1

if (saldo muda a cada ticket, que é a cotação do ativo) // enquanto o saldo estiver mudando a cada cotação do ativo

count=0;  // o contador vai sendo zerado

if (count => 1000)  // Mas se este contador atingir determinado valor é porque o saldo não mudou

CloseAllPositions();  // aí fecha todas as ordens

count = 0;  // e zera o contador esperando novas ordens serem abertas e recomeçar o acompanhamento


Como fazer isso dar certo ? vou pesquisar mas se puderem me adiantar alguma coisa, agradeço.





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?