//+------------------------------------------------------------------+ //| CBarTick.mqh| //| Copyright 2020,oficina de software.| //| http://www.metaquotes.net/marcoc.| //+------------------------------------------------------------------+ #property copyright "2020, Oficina de Software." #property link "http://www.os.net" //--- #include struct OsRateTick{ MqlRates rate ; double vol_buy ; double vol_sel ; ulong first_time_msc; // timestamp do primeiro tick da barra ulong last_time_msc ; // timestamp do ultimo tick da barra double ret ; // retorno = closeAnt - close; double lret ; // log retorno = log(closeAnt) - log(close); int pup ; // 1 se preco subiu x ticks en relacao ao fechamento da barra anterior int pdw ; // 1 se preco desceu x ticks en relacao ao fechamento da barra anterior double vel_vol_buy ; // velocidade do volume de compras double vel_vol_sel ; // velocidade do volume de vendas double vel_vol_liq ; // velocidade do volume liquido double ace_vol_buy ; // aceleracao da velocidade do volume de compra double ace_vol_sel ; // aceleracao da velocidade do volume de vendas double ace_vol_liq ; // aceleracao do volume liquido }; // CBarTick representa uma barra formada por ticks. // // Como se usa: // Para formar a barra: // 1. inicialize a classe executando o metodo initialize onde se informe o timeframe // da barra em segundos e o tamanho do tick em pontos. // // 2. obtenha uma fonte de ticks sequenciais e adicioneos a barra usando o medoto add. A cada adicao serah retornado: // 0: nao eh um tick de trade (nao eh adicionado) // -1: time anterior ao do primeiro tick da barra (nao eh adicionado) // 2: time posterior ao do periodo da barra (nao eh adicionado) // (a barra estah concluida e jah pode ser obtida com metodo getRateTick) // 1: tick adicionado a barra com sucesso // // 3. quando receber 2 no retorno de add, obtenha a barra formada. Para isso use o metodo getRateTick, que retornarah // um objeto do tipo OsRateTick por referência. Use o objeto OsRateTick e inicialize a CBarTick para comecar nova // acumulacao. // // Veja exemplo de uso feito na classe CExport que leh fluxo de ticks e grava barras de ticks em arquivo // // for(int i=0; i= m_rate.rate.time+m_time_frame ){ m_close_ant = m_rate.rate.close; return 2;}; // 4. adicionar o primeiro tick a barra. if( m_rate.rate.open == 0 ){ // campos originais da barra MqlRates... m_rate.rate.open = tick.last; m_rate.rate.high = tick.last; m_rate.rate.low = tick.last; m_rate.rate.close = tick.last; m_rate.rate.spread = (int)((tick.ask-tick.bid)/m_tick_size); m_rate.rate.time = calcTimeBar(tick); m_rate.rate.tick_volume = (long)tick.volume; m_rate.rate.real_volume = (long)tick.volume_real; // Campos exclusivos, presentes somente na barra de ticks... m_rate.first_time_msc = tick.time_msc; // timestamp do primeiro tick da barra m_rate.last_time_msc = tick.time_msc; // timestamp do ultimo tick da barra if( isTkBuy( tick ) ) m_rate.vol_buy = tick.volume_real; if( isTkSel( tick ) ) m_rate.vol_sel = tick.volume_real; m_rate.ret = m_close_ant==0?0:(log(tick.last)-log(m_close_ant)); m_rate.ret = m_close_ant==0?0:( tick.last - m_close_ant ); // marca se, durante a formacao desta barra, o preco subiu e/ou desceu em relacao ao fechamento da barra anterior. if( m_rate.ret> +10 ) m_rate.pup =1; if( m_rate.ret< -10 ) m_rate.pdw =1; return 1; } // 4. adicionar demais ticks a barra. if( m_rate.last_time_msc > (ulong)tick.time_msc ) return -1; // tick com timestamp menor que o ultimo adicionado... m_rate .last_time_msc = tick.time_msc; if( tick.last > m_rate.rate.high ) m_rate.rate.high = tick.last; if( tick.last < m_rate.rate.low ) m_rate.rate.low = tick.last; m_rate.rate.close = tick.last; m_rate.rate.spread = (int )((tick.ask-tick.bid)/m_tick_size); m_rate.rate.tick_volume += (long) tick.volume; m_rate.rate.real_volume += (long) tick.volume_real; if( isTkBuy( tick ) ) m_rate .vol_buy += tick.volume_real; if( isTkSel( tick ) ) m_rate .vol_sel += tick.volume_real; m_rate.lret = m_close_ant==0?0:(log(tick.last)-log(m_close_ant)); m_rate. ret = m_close_ant==0?0:( tick.last - m_close_ant ); // marca se, durante a formacao desta barra, o preco subiu e/ou desceu em relacao ao fechamento da barra anterior. if( m_rate.ret> +10 ) m_rate.pup =1; if( m_rate.ret< -10 ) m_rate.pdw =1; return 1; }