Tabela de todos os ofícios. Acesso via MQL5

 

Como posso obter uma tabela de ofícios? Até o momento, não importa o indicador ou o Expert Advisor. Se periodicamente (em OnTimer() ou em OnTick()) recebermos o histórico de ticks através de CopyTicks - eles serão adicionados à matrizMqlTick.

Mas uma simples análise desta matriz não dará uma resposta - se houver novos negócios ou não, porque a comparação de tempos de carrapato nem sempre é correta, porque pode haver vários negócios em um milissegundo:

Tiki

 
Karputov Vladimir:

Como posso obter uma tabela de ofícios? Até o momento, não importa o indicador ou o Expert Advisor. Se periodicamente (em OnTimer() ou em OnTick()) recebermos o histórico de ticks através de CopyTicks - eles serão adicionados à matrizMqlTick.

Mas uma simples análise desta matriz não dará uma resposta - se houver novos negócios ou não, porque a comparação de tempos de carrapato nem sempre é correta, porque pode haver vários negócios em um milissegundo:

Utilização do evento onBookEvent() - ele é acionado para cada mudança do mercado.

 
Karputov Vladimir:

Como posso obter uma tabela de ofícios? Até o momento, não importa o indicador ou o Expert Advisor. Se periodicamente (em OnTimer() ou em OnTick()) recebermos o histórico de ticks através de CopyTicks - eles serão adicionados à matrizMqlTick.

Mas uma simples análise desta matriz não dará uma resposta - se houver novos negócios ou não, porque a comparação de tempos de carrapato nem sempre é correta, porque pode haver vários negócios em um milissegundo:

Usar segundos cortes. Por exemplo, no MqlTick ou mesmo no OnEvent, copie os novos tiquetaques que chegaram no último segundo para a matriz. A diferença entre o valor anterior e o tamanho atual da matriz indicará o número de novos tiquetaques.
 
prostotrader:

Use o evento onBookEvent(), ele será acionado em cada mudança da taxa.

A taça é, grosso modo, um "tick chart twitch" - não é necessariamente uma mudança na tabela de todos os ofícios.

Vasiliy Sokolov:
Use os segundos cortes. Por exemplo, no MqlTick ou mesmo no OnEvent, copie os novos ticks recebidos durante o último segundo na matriz. A diferença entre o valor anterior e o tamanho atual da matriz indicará o número de novas carrapatas.
Faça algo como uma máscara: 0-1-0-1, e se a máscara for estável em cerca de cinco e dez linhas, é uma combinação garantida?
 
Karputov Vladimir:

Uma aposta é, para dizer de forma grosseira, um "tremor no gráfico de carrapato" - não é necessariamente uma mudança na tabela de todas as profissões.


Se você pensar um pouco sobre isso, é certo que haverá todos os ofícios.

Aqui está um exemplo simples do indicador All Trades Tape

//+------------------------------------------------------------------+
//|                                                    DealsLent.mq5 |
//|                                     Copyright 2016, prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
input int  Ticks     = 100; //Тики 

#property indicator_separate_window

#property indicator_buffers 2
#property indicator_plots   2

//--- plot Label1
#property  indicator_label1  "Sell"
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  clrRed
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  1
//--- plot Label1
#property  indicator_label2  "Buy"
#property  indicator_type2   DRAW_LINE
#property  indicator_color2  clrBlue
#property  indicator_style2  STYLE_SOLID
#property  indicator_width2  1
//--- indicator buffers
double SellBuffer[];
double BuyBuffer[];
double sell_deals;
double buy_deals;
long curr_time;
int event_cnt;
bool on_call;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   curr_time=0;
   if(!MarketBookAdd(Symbol()))
     {
      Print(__FUNCTION__,": Стакан символа "+Symbol()+" не добавден!");
      return( INIT_FAILED );
     }
//--- Period 
   if(Period()!=PERIOD_M1)
     {
      Print("Ошибка! Период графика должен быть 'M1'");
      return( INIT_FAILED );
     }
//---  
   IndicatorSetInteger(INDICATOR_DIGITS,0);
   IndicatorSetString(INDICATOR_SHORTNAME,"DealsLent");
//---  
   SetIndexBuffer(0,SellBuffer,INDICATOR_DATA);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(SellBuffer,true);
//---
   SetIndexBuffer(1,BuyBuffer,INDICATOR_DATA);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(BuyBuffer,true);
//--- 
   event_cnt=0;
   on_call=false;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+  
void OnDeinit(const int reason)
  {
   MarketBookRelease(Symbol());
   if(reason==REASON_INITFAILED)
     {
      int window=ChartWindowFind(ChartID(),"DealsLent");
      ChartIndicatorDelete(ChartID(),window,"DealsLent");
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator On book event function                          |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   MqlTick ticks[];
   if(symbol==Symbol())
     {
      if(curr_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1)
           {
            curr_time=ticks[0].time_msc;
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,Ticks)==Ticks)
           {
            for(int i=0; i<Ticks; i++)
              {
               if(ticks[i].time_msc!=curr_time)
                 {
                  if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                    {
                     buy_deals++;
                    }
                  else
                  if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                    {
                     sell_deals++;
                    }
                 }
              }
           }
         curr_time=ticks[0].time_msc;
         double price[];
         on_call=true;
         OnCalculate(event_cnt,event_cnt,0,price);
        }
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   if(prev_calculated==0)
     {
      ArrayInitialize(SellBuffer,EMPTY_VALUE);
      ArrayInitialize(BuyBuffer,EMPTY_VALUE);
     }
   else
     {
      if(rates_total==event_cnt)
        {
         if(on_call)
           {
            on_call=false;
            //---        
            for(int i=rates_total-1; i>0; i--)
              {
               SellBuffer[i]= SellBuffer[i-1];
               BuyBuffer[i] = BuyBuffer[i-1];
              }
            SellBuffer[0]= double(sell_deals);
            BuyBuffer[0] = double(buy_deals);
           }
        }
      else
        {
         if(on_call)
           {
            on_call=false;
            SellBuffer[0]= double(sell_deals);
            BuyBuffer[0] = double(buy_deals);
           }
         else
           {
            SellBuffer[0]= SellBuffer[1];
            BuyBuffer[0] = BuyBuffer[1];
           }
        }
     }
   event_cnt=rates_total;
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


 
prostotrader:

Se você pensar um pouco sobre isso, é provável que haja todos os ofícios.

Aqui está um exemplo simples do indicador All Trades Ribbon


Falha na corrida:

2016.08.24 15:54:41.700 DealsLent (RTS-12.16,M1)        array out of range in 'DealsLent.mq5' (118,25)

Erro

 
Karputov Vladimir:

Falha no início:

void OnBookEvent(const string &symbol)
  {
   MqlTick ticks[];
   if(symbol==Symbol())
     {
      if(curr_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1)
           {
            curr_time=ticks[0].time_msc;
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,Ticks)==Ticks)
           {
            for(int i=0; i<Ticks; i++)
              {
               if(ticks[i].time_msc!=curr_time)
                 {
                  if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                    {
                     buy_deals++;
                    }
                  else
                  if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                    {
                     sell_deals++;
                    }
                 }
              }
             curr_time=ticks[0].time_msc; 
             double price[];
             on_call=true;
             OnCalculate(event_cnt,event_cnt,0,price);
           }
        }
     }
  }
 
Karputov Vladimir:

Uma aposta é, para colocar de forma grosseira, um 'tiquetaque no gráfico' - não é necessariamente uma mudança na tabela de todos os ofícios.

Faça algo como uma máscara fazer: 0-1-0-1, e se a máscara for estável com cerca de cinco e dez linhas - isso significa uma combinação garantida?
Sim.
 

Karputov Vladimir

Um indicador completo de "All Trades Feed".

//+------------------------------------------------------------------+
//|                                                    DealsLent.mq5 |
//|                                     Copyright 2016, prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property  indicator_label1  "Sell"
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  clrRed
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  1
//--- plot Label1
#property  indicator_label2  "Buy"
#property  indicator_type2   DRAW_LINE
#property  indicator_color2  clrBlue
#property  indicator_style2  STYLE_SOLID
#property  indicator_width2  1
//--- indicator buffers
double SellBuffer[];
double BuyBuffer[];
double sell_deals;
double buy_deals;
ulong start_time;
int event_cnt;
bool on_call;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   start_time=0;
   if(!MarketBookAdd(Symbol()))
     {
      Print(__FUNCTION__,": Стакан символа "+Symbol()+" не добавден!");
      return( INIT_FAILED );
     }
//--- Bars
  int bars=Bars(Symbol(),PERIOD_CURRENT);
  if (bars<3)
  {
    Print(__FUNCTION__,": Не достаточно баров на текущем таймфрейме!");
    return( INIT_FAILED );
  }     
//---  
   IndicatorSetInteger(INDICATOR_DIGITS,0);
   IndicatorSetString(INDICATOR_SHORTNAME,"DealsLent");
//---  
   SetIndexBuffer(0,SellBuffer,INDICATOR_DATA);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(SellBuffer,true);
//---
   SetIndexBuffer(1,BuyBuffer,INDICATOR_DATA);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(BuyBuffer,true);
//--- 
   event_cnt=0;
   on_call=false;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+  
void OnDeinit(const int reason)
  {
   MarketBookRelease(Symbol());
   if(reason==REASON_INITFAILED)
     {
      int window=ChartWindowFind(ChartID(),"DealsLent");
      ChartIndicatorDelete(ChartID(),window,"DealsLent");
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator On book event function                          |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   MqlTick ticks[];
   if(symbol==Symbol())
     {
      if(start_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1)
           {
            start_time=ulong(ticks[0].time_msc);
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         int copied= CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,start_time,0);
         if(copied>0)
           {
            for(int i=0; i<copied; i++)
              {
               if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                 {
                  buy_deals++;
                 }
               else
               if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                 {
                  sell_deals++;
                 }
              }
            start_time=ulong(ticks[copied - 1].time_msc);
            double price[];
            on_call=true;
            OnCalculate(event_cnt,event_cnt,0,price);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   if(prev_calculated==0)
     {
      ArrayInitialize(SellBuffer,EMPTY_VALUE);
      ArrayInitialize(BuyBuffer,EMPTY_VALUE);
     }
   else
     {
      if(rates_total==event_cnt)
        {
         if(on_call)
           {
            on_call=false;
            //---        
            for(int i=rates_total-1; i>0; i--)
              {
               SellBuffer[i]= SellBuffer[i-1];
               BuyBuffer[i] = BuyBuffer[i-1];
              }
            SellBuffer[0]= double(sell_deals);
            BuyBuffer[0] = double(buy_deals);
           }
        }
      else
        {
         if(on_call)
           {
            on_call=false;
            SellBuffer[0]= double(sell_deals);
            BuyBuffer[0] = double(buy_deals);
           }
         else
           {
            SellBuffer[0]= SellBuffer[1];
            BuyBuffer[0] = BuyBuffer[1];
           }
        }
     }
   event_cnt=rates_total;
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
prostotrader:

Karputov Vladimir

Um indicador completo de "All Trades Feed".

Muito obrigado! Eu tive uma idéia sobre isso no outro dia
 
Encontrou o erro e otimizou a operação.
Arquivos anexados:
DealsLent.mq5  6 kb
Razão: