saldo de agressão acumulado - delta

 

olá,

estou tentando fazer um indicador de saldo de agressão acumulado durante o pregão mas por algum motivo que nao consigo descobrir, se jogar o indicador depois das 9:00 ele traz um valor muito estranho para o acumulado de agressão das 9:00 até o ultimo minuto.


#property copyright   "2021 igor nunes"
#property description "Delta"
//--- indicator settings
#property indicator_separate_window
#property indicator_level1 0
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDarkOrange
//--- input parameters
//input string codigo="WIN$"; // codigo do ativo
input bool usarTickVolume=false; // usar tick volume quuando nao tem volume real
//--- indicator buffers
double    DeltaBuffer[];
double saldo = 0;
MqlTick       ultimoTick;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
   saldo = carregaSaldoAgressao();
   Print("saldo " + saldo);
//--- indicator buffers mapping
   SetIndexBuffer(0,DeltaBuffer,INDICATOR_DATA);
   ArraySetAsSeries(DeltaBuffer,true);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//--- sets first bar from what index will be drawn
   //PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodRSI);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Delta "+_Symbol);
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]){
   //saldo = DeltaBuffer[1];             
   MqlTick ticks[];
   int received1=CopyTicks(_Symbol,ticks,COPY_TICKS_TRADE,0,1); 
   ArraySetAsSeries(ticks,true);
   //Print("ticks do " + _Symbol + received1);
   if(received1!=-1){
      int count = 0;
      for(int i = 0; i < ArraySize(ticks); i++){
         if (ultimoTick.time_msc != ticks[i].time_msc && ultimoTick.flags != ticks[i].flags){
            ultimoTick = ticks[i];
            //if(!SymbolInfoTick(_Symbol,ultimoTick)) {
            //   Alert("Erro ao obter informações de Preços: ", GetLastError());
            //   return(0);
            //}
            double aux1,aux2 = 0.0; 
            if((ultimoTick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY && (ultimoTick.flags&TICK_FLAG_SELL)!=TICK_FLAG_SELL){
               if(usarTickVolume){
                  aux1 = ultimoTick.volume;
               } else{
                  aux1 = ultimoTick.volume_real;
               }
            } 
            if((ultimoTick.flags&TICK_FLAG_BUY)!=TICK_FLAG_BUY && (ultimoTick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL){
               if(usarTickVolume){
                  aux2 = ultimoTick.volume;
               } else{
                  aux2 = ultimoTick.volume_real;
               }
            } 
            saldo = saldo + aux1;
            saldo = saldo - aux2;
            DeltaBuffer[0] = saldo;
         }
      }
      ZeroMemory(ticks);
   }
   return(rates_total);
}

double carregaSaldoAgressao(){
   double saldoAgressaoMini = 0.0;
   MqlTick tickMini[];
   string inicio = TimeToString(TimeCurrent(),TIME_DATE);
   datetime ini = StringToTime(inicio + " 09:00");
   string agora = TimeToString(TimeCurrent(),TIME_MINUTES);
   datetime fim = StringToTime( inicio + " " + agora);
   int received1=CopyTicksRange(_Symbol,tickMini,COPY_TICKS_TRADE,ini*1000,fim*1000); 
   ArraySetAsSeries(tickMini,true);
   //Print("ticks do " + _Symbol + received1);
   if(received1!=-1){
      for(int i = 0; i < ArraySize(tickMini); i++){
         if (ultimoTick.time_msc != tickMini[i].time_msc && ultimoTick.flags != tickMini[i].flags){
            ultimoTick = tickMini[i];
            double aux1 = 0.0;
            double aux2 = 0.0;
            if((ultimoTick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY && (ultimoTick.flags&TICK_FLAG_SELL)!=TICK_FLAG_SELL){
               if(usarTickVolume){
                  aux1 = ultimoTick.volume;
               } else{
                  aux1 = ultimoTick.volume_real;
               }
            } 
            if((ultimoTick.flags&TICK_FLAG_BUY)!=TICK_FLAG_BUY && (ultimoTick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL){
               if(usarTickVolume){
                  aux2 = ultimoTick.volume;
               } else{
                  aux2 = ultimoTick.volume_real;
               }
            } 
            saldoAgressaoMini = saldoAgressaoMini + aux1;
            saldoAgressaoMini = saldoAgressaoMini - aux2;
          }
          //ultimoTick = tickMini[i];
      }
      ZeroMemory(tickMini);
   }
   //DeltaBuffer[0] = saldoAgressaoMini;
   return saldoAgressaoMini;
}
 
Igor Marcio Nunes Da Silva:

olá,

estou tentando fazer um indicador de saldo de agressão acumulado durante o pregão mas por algum motivo que nao consigo descobrir, se jogar o indicador depois das 9:00 ele traz um valor muito estranho para o acumulado de agressão das 9:00 até o ultimo minuto.


Olá, não sei se ajuda. Mas talvez como um plano B possa acumular os valores desse indicador que fiz. 


https://www.mql5.com/pt/code/32914

Salvar Agressões em CSV
Salvar Agressões em CSV
  • www.mql5.com
Captura de dados de agressão, salva em csv, e plota em forma de histograma.
 

muito obrigado @Sidnei Da Silva Santos Junior .

O seu calculo é quase identico ao meu, eu to usando linha mas gostei do histograma que voce usou.

O meu problema ta no metodo carregaSaldoAgressão() que até busca os ticks de 9:00 até o minuto que estamos mas parece que vem alguma coisa na informacao dos ticks que nao bate pq o numero é sempre maior que o de outras plataformas.

 
Igor Marcio Nunes Da Silva:

muito obrigado @Sidnei Da Silva Santos Junior .

O seu calculo é quase identico ao meu, eu to usando linha mas gostei do histograma que voce usou.

O meu problema ta no metodo carregaSaldoAgressão() que até busca os ticks de 9:00 até o minuto que estamos mas parece que vem alguma coisa na informacao dos ticks que nao bate pq o numero é sempre maior que o de outras plataformas.

Então eu notei também a diferença na escala dos numeros, mas reparei visualmente que a proporção entre compra:venda é semelhante sabe?

 

consegui arrumar a forma de calcular.

tem 2 problemas, quando busca o historico do dia, as vezes não consegue recuperar, ai tem que remover o indicador e colocar novamente.

a divergencia que achei foi do dolar cheio. para dolar mini indice cheio e indice mini, os numeros estao proximos do tryd (usando somente negocios não diretos).

segue a versão atual;

#property copyright   "2021 igor nunes"
#property description "Delta"
//--- indicator settings
#property indicator_separate_window
#property indicator_level1 0
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDarkOrange
#property indicator_width1  2

//--- indicator buffers
double    DeltaBuffer[];
double saldo, compra, venda;
MqlTick    ticks[],tickAnterior;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
   saldo = 0;
   compra = 0;
   venda = 0;
//--- indicator buffers mapping
   SetIndexBuffer(0,DeltaBuffer,INDICATOR_DATA);
   ArrayInitialize(DeltaBuffer,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//--- sets first bar from what index will be drawn
   //PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodRSI);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Delta "+_Symbol);

  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]){  
                
   if(prev_calculated==0){
      saldo = carregaSaldoAgressao();
   } else {                            
      int received1=CopyTicks(_Symbol,ticks,COPY_TICKS_TRADE,0,50); 
      ArraySetAsSeries(ticks,true);
      if(received1>0){
         for(int i = 0; i < ArraySize(ticks); i++){
            MqlTick tick=ticks[i];
            if(tick.time_msc > tickAnterior.time_msc){
               //Print("#########");
               //Print("=> flag:"+tick.flags+" bid:"+tick.bid+" ask:"+tick.ask+" last:"+tick.last);
               //Print("=> vol:"+tick.volume+" real:"+tick.volume_real+" time:"+tick.time+" msc:"+tick.time_msc);
               if(tick.flags==56)
                    compra += tick.volume;
               if(tick.flags==88)
                     venda += tick.volume;
                tickAnterior = tick;
             }
         }
         saldo = compra - venda;
         ZeroMemory(ticks);
         
      }
   }
   DeltaBuffer[rates_total-1] = saldo;
   return(rates_total);
}

double carregaSaldoAgressao(){
   double saldoInicial = 0.0;
   MqlTick tickMini[];
   string inicio = TimeToString(TimeCurrent(),TIME_DATE);
   datetime ini = StringToTime(inicio + " 09:00");
   string agora = TimeToString(TimeCurrent(),TIME_MINUTES);
   datetime fim = StringToTime( inicio + " " + agora);
   int received1=CopyTicksRange(_Symbol,tickMini,COPY_TICKS_TRADE,ini*1000,fim*1000); 
   ArraySetAsSeries(tickMini,true);
   if(received1>0){
      for(int i = 0; i < ArraySize(tickMini); i++){
         MqlTick tick=tickMini[i];
         if(tick.flags==56)
            compra += tick.volume;
         if(tick.flags==88)
            venda += tick.volume;
          saldo = compra - venda;
      }
      ZeroMemory(tickMini);
   }
   Print("saldo inicial: " + saldo);
   return saldoInicial;
}
 
Igor Marcio Nunes Da Silva:

consegui arrumar a forma de calcular.

tem 2 problemas, quando busca o historico do dia, as vezes não consegue recuperar, ai tem que remover o indicador e colocar novamente.

a divergencia que achei foi do dolar cheio. para dolar mini indice cheio e indice mini, os numeros estao proximos do tryd (usando somente negocios não diretos).

segue a versão atual;

Boa tarde meu amigo, parabéns pelo seu indicador, ficou muito bom.

Percebi um erro na função carregaSaldoAgressao 

você declarou a variável "saldoInicial" mas dentro do "for" você está utilizando a variável global "saldo" para fazer a soma.

Razão: