Saldo agressor por candle

 

Boa Noite, gostaria de saber como faço para capturar o saldo agressor por candle.

Tenho visto alguns posts no forum, porem não consegui rodar o script, não retorna o valor e também gostaria de saber como capturar o valor do saldo por candle.

Preciso do saldo em um número, positivo comprador, negativo vendedor, para ser uma base para meu EA.

Segue script:


//--- requesting ticks (Agressão)

   MqlTick tick_array[];

   int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_TRADE,0,_INPticks);

   ArraySetAsSeries(tick_array,true);


//--- Faz 3 tentativas de receber ticks

   while(attempts<3) 

      {

         if (received > 0)

            {

               if(GetLastError()==0) 

                 { 

                    success=true; 

                    break; 

                 } 

            }

         else 

            PrintFormat("%s: Ticks ainda não estão sincronizados, %d ticks recebidos por %d ms. Error=%d", 

            _Symbol,received,GetTickCount(),_LastError); 

            

         //--- Contagem de tentativas 

         attempts++; 

         //--- Uma pausa de um segundo para aguardar o fim da sincronização da base de dados de ticks 

         Sleep(1000); 

      } 

   //--- A recepção de ticks solicitados no início do histórico de ticks falhou em três tentativas 

   if(!success) 

     { 

      PrintFormat("Error! Falha em receber %d ticks do %s em três tentativas",_Symbol); 

      return; 

     } 

   else

     {

         int ticks=ArraySize(tick_array);       

         MqlTick tick=tick_array[ticks];

         buy    = tick.flags == 24 && tick.last >= tick.ask;

         sell   = tick.flags == 24 && tick.last <= tick.bid;

     }


Muito Obrigado.

 
Maximiliano Salvatti:

Boa Noite, gostaria de saber como faço para capturar o saldo agressor por candle.

Tenho visto alguns posts no forum, porem não consegui rodar o script, não retorna o valor e também gostaria de saber como capturar o valor do saldo por candle.

Preciso do saldo em um número, positivo comprador, negativo vendedor, para ser uma base para meu EA.

Segue script:


//--- requesting ticks (Agressão)

   MqlTick tick_array[];

   int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_TRADE,0,_INPticks);

   ArraySetAsSeries(tick_array,true);


//--- Faz 3 tentativas de receber ticks

   while(attempts<3) 

      {

         if (received > 0)

            {

               if(GetLastError()==0) 

                 { 

                    success=true; 

                    break; 

                 } 

            }

         else 

            PrintFormat("%s: Ticks ainda não estão sincronizados, %d ticks recebidos por %d ms. Error=%d", 

            _Symbol,received,GetTickCount(),_LastError); 

            

         //--- Contagem de tentativas 

         attempts++; 

         //--- Uma pausa de um segundo para aguardar o fim da sincronização da base de dados de ticks 

         Sleep(1000); 

      } 

   //--- A recepção de ticks solicitados no início do histórico de ticks falhou em três tentativas 

   if(!success) 

     { 

      PrintFormat("Error! Falha em receber %d ticks do %s em três tentativas",_Symbol); 

      return; 

     } 

   else

     {

         int ticks=ArraySize(tick_array);       

         MqlTick tick=tick_array[ticks];

         buy    = tick.flags == 24 && tick.last >= tick.ask;

         sell   = tick.flags == 24 && tick.last <= tick.bid;

     }


Muito Obrigado.

... if (tick_array[i].flags == 56) é compra. Veja o volume em tick_array[i].volume... if (tick_array[i].flags == 88) é venda. Depois você calcula a diferença.

Abraços

 

O problema é que não consigo retorno dos valores, testei na corretora XP e Modal.

Nessa linha:

int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_TRADE,0,_INPticks);


O received me retorna 0 nas 3 tentativas do codigo acima, e com isso não consigo os dados.

Tem algum erro na linha? Pq não me retorna os valores?


Obrigado.

 
Drmqlbrazil5:

... if (tick_array[i].flags == 56) é compra. Veja o volume em tick_array[i].volume... if (tick_array[i].flags == 88) é venda. Depois você calcula a diferença.

Abraços

O que preciso é calcular o saldo agressor em tempo real no mesmo candle, para que assim o EA tome uma decisão.

Fiz uma alteração no código, porem só me retorna o flags 30 e o volume 3, mesmo alterando o registro de tick.

void OnTick()

  {

   MqlDateTime today; 

   datetime current_time=TimeCurrent();                          

   TimeToStruct(current_time,today);                             

   datetime startday=StructToTime(today); 

   datetime endday=startday+(_Period*60);

   MqlTick tick_array[];

   int received=CopyTicksRange(_Symbol,tick_array,COPY_TICKS_TRADE,startday*1000,endday*1000);

   ArraySetAsSeries(tick_array,true);


         int ticks=ArraySize(tick_array);       

         for(int i=0;i<ticks;i++) 

           { 

               Print(tick_array[ticks-1].flags, " ",ticks, " - volume: ", tick_array[ticks-1].volume);

            }

  }


Podem me ajudar como opter o salgo agressor assim em tempo real, calculando sem prejudicar o processameno do EA, tipo, da forma que esta, ele calcula todos os ticks a cada OnTick e gostaria que somente que já tivesse o valor do saldo e fosse somando ou subtraindo.



 
Maximiliano Salvatti:

O que preciso é calcular o saldo agressor em tempo real no mesmo candle, para que assim o EA tome uma decisão.

Fiz uma alteração no código, porem só me retorna o flags 30 e o volume 3, mesmo alterando o registro de tick.

void OnTick()

  {

   MqlDateTime today; 

   datetime current_time=TimeCurrent();                          

   TimeToStruct(current_time,today);                             

   datetime startday=StructToTime(today); 

   datetime endday=startday+(_Period*60);

   MqlTick tick_array[];

   int received=CopyTicksRange(_Symbol,tick_array,COPY_TICKS_TRADE,startday*1000,endday*1000);

   ArraySetAsSeries(tick_array,true);


         int ticks=ArraySize(tick_array);       

         for(int i=0;i<ticks;i++) 

           { 

               Print(tick_array[ticks-1].flags, " ",ticks, " - volume: ", tick_array[ticks-1].volume);

            }

  }


Podem me ajudar como opter o salgo agressor assim em tempo real, calculando sem prejudicar o processameno do EA, tipo, da forma que esta, ele calcula todos os ticks a cada OnTick e gostaria que somente que já tivesse o valor do saldo e fosse somando ou subtraindo.



... salve o tempo após cada chamada, exemplo, "hora1". Utilize agora a função CopyTicks(_Symbol, tick_array, COPY_TICKS_TRADE, hora1, )
 
Drmqlbrazil5:
... salve o tempo após cada chamada, exemplo, "hora1". Utilize agora a função CopyTicks(_Symbol, tick_array, COPY_TICKS_TRADE, hora1, )

Alterei o codigo com um timer, cada 10s ele busca os ultimos 100 registros, porem o retorno sempre é o mesmo, 92 registros, flags:30, volume:2.

Código:

int OnInit()

  {

   EventSetTimer(10);


   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

      EventKillTimer();

  }


void OnTimer()

  {

   

   datetime current_time=TimeCurrent();                          

   MqlTick tick_array[];

   int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_TRADE,current_time,100);

   ArraySetAsSeries(tick_array,true);


         int ticks=ArraySize(tick_array);       

         for(int i=0;i<ticks;i++) 

           { 

               Print("flags: ",tick_array[ticks-1].flags, " Ticks: ",ticks, " Volume: ", tick_array[ticks-1].volume, " Time: ",current_time);

            }

  }


resultado:

2018.03.05 20:48:05.354 2018.03.01 09:09:30   flags: 30 Ticks: 92 Volume: 2 Time: 2018.03.01 09:09:29

Mesmo alterando o horario de busca, mudando candle, o valor é sempre o mesmo do retorno.

Sabe pq?


 
Maximiliano Salvatti:

Alterei o codigo com um timer, cada 10s ele busca os ultimos 100 registros, porem o retorno sempre é o mesmo, 92 registros, flags:30, volume:2.

Código:

int OnInit()

  {

   EventSetTimer(10);


   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

      EventKillTimer();

  }


void OnTimer()

  {

   

   datetime current_time=TimeCurrent();                          

   MqlTick tick_array[];

   int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_TRADE,current_time,100);

   ArraySetAsSeries(tick_array,true);


         int ticks=ArraySize(tick_array);       

         for(int i=0;i<ticks;i++) 

           { 

               Print("flags: ",tick_array[ticks-1].flags, " Ticks: ",ticks, " Volume: ", tick_array[ticks-1].volume, " Time: ",current_time);

            }

  }


resultado:

2018.03.05 20:48:05.354 2018.03.01 09:09:30   flags: 30 Ticks: 92 Volume: 2 Time: 2018.03.01 09:09:29

Mesmo alterando o horario de busca, mudando candle, o valor é sempre o mesmo do retorno.

Sabe pq?


Alterei a linha para me mostrar os valores, estava sempre com o mesmo valor, porem o resultado não alterou.


               Print("flags: ",tick_array[i].flags, " Posição: ",i, " Volume: ", tick_array[i].volume, " Time: ",current_time);

Agora mostra cada item do array, porem sempre com os mesmos dados.

2018.03.05 20:54:03.912 2018.03.01 09:04:30   flags: 30 Posição: 0 Volume: 2 Time: 2018.03.01 09:04:30

2018.03.05 20:54:03.912 2018.03.01 09:04:30   flags: 30 Posição: 1 Volume: 2 Time: 2018.03.01 09:04:30
......


 

Pessoal consegui recuperar os dados, agora o problema é que flags sempre me retorna 30 e as vezes 24, porem muito raro, mesmo alterando os outros dados do tick.

Código:

void OnTick()

  {

   // Flags 24 Compra

   // Flags 30 Venda

   

   MqlTick last_tick[];

   int received=CopyTicks(_Symbol,last_tick,COPY_TICKS_TRADE,0,1);

   

         int ticks=ArraySize(last_tick);       

         for(int i=0;i<ticks;i++) 

           { 

             //MqlTick last_tick;

             //if (SymbolInfoTick(_Symbol,last_tick))

             //{

               

               bool buy_tick = (last_tick[i].flags == 24);

               bool sell_tick = (last_tick[i].flags == 30);


               //bool buy_tick = (last_tick.last == last_tick.ask);

               //bool sell_tick = (last_tick.last == last_tick.bid);


               //bool buy_tick = (last_tick[i].flags == TICK_FLAG_BUY);

               //bool sell_tick = (last_tick[i].flags == TICK_FLAG_SELL);

 

               //bool buy_tick=((last_tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); 

               //bool sell_tick=((last_tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); 

               

               if (buy_tick) //(tick_array[i].flags == 24) 

                  {  

                     AgressaoCompra = AgressaoCompra + last_tick[i].volume;

                  }

               else if (sell_tick)

                  {  

                     AgressaoVenda = AgressaoVenda + last_tick[i].volume;

                  }

               

               //else

               //   {

               //      Print(last_tick.flags, " : Volume: " ,last_tick.volume); 

               //   }


               Print(" Time: ",last_tick[i].time," Flags: ",last_tick[i].flags, " : Volume: " ,last_tick[i].volume, " : Last: " ,last_tick[i].last, " : Ask: " ,last_tick[i].ask, " : Bid: " ,last_tick[i].bid); 

                  

            }


            Agressao = (AgressaoCompra - AgressaoVenda);

            

            Comment("Agressão Compradora: ", AgressaoCompra," : Agressão Vendedora: ", AgressaoVenda, " : Saldo: ", Agressao);

            if (isNewBar())

               {

                  Agressao = 0;

                  AgressaoCompra = 0;

                  AgressaoVenda = 0;

               }

  }


Tentei varias combinações de condição, porem sem sucesso, somente comparando com 30 e 24 que funciona, mas testei em vários dias e sempre vem muitos 30, mesmo o preço subindo ou descendo.

Alguem sabe o que pode ser?


Obrigado.

 

Galera consegui resolver o problema.

No simulador o retorno dos dados não continham as agressões, mas usando com o mercado aberto, mesmo na conta demo, funcionou, tanto xp, modal e rico.

Ficou assim o código.

      //---Verifica agressão

      MqlTick last_tick[];

      int received=CopyTicks(_Symbol,last_tick,COPY_TICKS_TRADE,0,1);

   

      int ticks=ArraySize(last_tick);       

      for(int i=0;i<ticks;i++) 

        { 

            bool buy_tick=((last_tick[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY);

            bool sell_tick=((last_tick[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL);

            

            if (buy_tick) 

               {  

                  AgressaoCompra = AgressaoCompra + last_tick[i].volume;

               }

            else if (sell_tick)

               {  

                  AgressaoVenda = AgressaoVenda + last_tick[i].volume;

               }

         }


 

Olá,


Estou tentando fazer esse Saldo Agressor do Candle, já li vários posts, porém, não estou conseguindo fazer o negócio funcionar. No código abaixo estou tentando fazer a separação entre agressão de compra e de venda, para posteriormente calcular o saldo, mas não estou conseguindo fazer o MT5 plotar essas informações. Há algo de errado? É necessário fazer algo mais? Estou usando o MT5 da Modal. Obrigado.


#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_label1  "Buy"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  C'17,134,225'
#property indicator_style1  STYLE_SOLID
#property indicator_width1  5
#property indicator_label2  "Sell"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  C'234,55,0'
#property indicator_style2  STYLE_SOLID
#property indicator_width2  5

double         BuyBuffer[];
double         SellBuffer[];

int OnInit()
  {   
   SetIndexBuffer(0,BuyBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,SellBuffer,INDICATOR_DATA);   
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
  
   MqlTick last_tick[]; 
   int received=CopyTicks(_Symbol,last_tick,COPY_TICKS_TRADE,0,1);
   int ticks=ArraySize(last_tick);   

   for(int i=0;i<ticks;i++)
     {
      bool buy_tick=((last_tick[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY);             
      bool sell_tick=((last_tick[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL);            

      if(buy_tick)
        {
         BuyBuffer[i]=BuyBuffer[i]+last_tick[i].volume;                
        }
      else if(sell_tick)
        {
         SellBuffer[i]=SellBuffer[i]+last_tick[i].volume;               
        }
     }       

   return(rates_total);  
   
  }
 
marcusmota:

Olá,


Estou tentando fazer esse Saldo Agressor do Candle, já li vários posts, porém, não estou conseguindo fazer o negócio funcionar. No código abaixo estou tentando fazer a separação entre agressão de compra e de venda, para posteriormente calcular o saldo, mas não estou conseguindo fazer o MT5 plotar essas informações. Há algo de errado? É necessário fazer algo mais? Estou usando o MT5 da Modal. Obrigado.


Olá, tem um monte de problema nesse código aí:

1º - você está plotando apenas 1 buffer: #property indicator_plots   1

deveriam ser 2, ou então você cria um 3º Buffer que armazene a diferença entre os dois.

2º Melhor escolher uma cor padrão, também pode dar algum problema. ClrRed x ClrBlue por exemplo.

3º Seu Buffer indexado em i recebe o volume em i, porém no momento i o Buffer não tem valor algum, você pode usar uma variável estática e zerar ela a cada novo candle.


Sugiro copiar o código do amigo acima e fazer as alterações que quiser. O seu tá meio estranho

Razão: