Tiki em tempo real - página 3

 
Aleksey Mavrin:

Eu honestamente não entendi o que você queria que eu lesse neste link sobre ECN, especialmente algo que não era conhecido antes)

Eu fiz? Era você quem queria algo. )))

Você não entende a diferença entre o mercado Forex e o câmbio, então eu lhe dei o link.

Por favor, não jogue a seção de troca com forex.

 
Sergey Chalyshev:

Será que eu queria? Você era quem queria algo. )))

Você não entende a diferença entre forex e câmbio, então eu lhe dei o link.

Por favor, não jogue a seção de troca com forex.

Sim, eu realmente gostaria que as pessoas pudessem se comunicar claramente, mas é inalcançável, por isso temos que nos contentar com o que temos.

E você também pode não entender algo, já pensou? Veja, por exemplo, por que você postou o link)

E mais uma coisa - não fui eu quem mencionou o Forex em primeiro lugar, estou entrando em uma discussão que já começou. Antes de mais nada.

B 2 - Alguém proibiu uma discussão na seção de bolsa para comparar diferentes mercados com a bolsa de valores?

E 3 - Vamos parar de pontuar ala esquiadores vs snowboarders, ou você é contra isso?

 

Um pequeno resumo com experimentos sobre a análise de tique.

1. o manipulador OnTick pula um número significativo de carrapatos.
Portanto, se você quiser analisar uma faixa de comércio através de um tique de entrada, não faz sentido.
Com esta abordagem, os resultados do algoritmo no testador e os resultados comerciais reais serão diferentes.

Como alternativa, você pode analisar a faixa de ofertas por um período selecionado ou uma certa quantidade de últimas ofertas obtendo os ticks do histórico usando as funções CopyTicks() ou CopyTicksRange().
Neste caso, os resultados dos testes do algoritmo no testador e os resultados reais do comércio são os mesmos.
As desvantagens são um desempenho inferior do algoritmo.

2. O número de eventos no OnBookEvent é muito maior do que o número de carrapatos históricos, o que é compreensível, pois além de carrapatos este evento processa a mudança de carrapatos.
Portanto, pode parecer que todos os carrapatos recebidos podem ser analisados utilizando este evento.
No entanto, não é este o caso, nem todos os ofícios passam pelos carrapatos.
As ordens do mercado podem não passar pelo controle deslizante, mas se refletirão na alimentação dos negócios.
A razão para isto é que o deslizador de mercado é de fato um livro de ordens, que estão esperando para serem executadas se as condições exigidas forem atendidas.

Exemplo - Um comércio não passou pelo manipulador do OnEventBook (que chega a 5 ticks).

MT5

Novamente a solução, como na primeira variante, é a análise de carrapatos históricos.
Menos esta solução é a impossibilidade de testes no testador. Os eventos de mudança do tick no testador não são gerados.

3. Os 8 bits não documentados na bandeira do carrapato nunca foram respondidos. Eu fiz a mesma pergunta em outro tópico do fórum.

Já decidi a forma de analisar a alimentação dos ofícios - através da história, embora com produtividade reduzida.
Isto me permite obter resultados confiáveis ao testar o algoritmo no testador.

Obrigado a todos vocês pelas idéias e discussões.

 
Vladimir Mikhailov:

Um pequeno resumo com experimentos sobre a análise de tique.

1. o manipulador OnTick pula um número significativo de carrapatos.
Portanto, se você quiser analisar uma faixa de comércio através de um tique de entrada, não faz sentido.
Com esta abordagem, os resultados do algoritmo no testador e os resultados comerciais reais serão diferentes.

Como alternativa, você pode analisar a faixa de ofertas por um período selecionado ou uma certa quantidade de últimas ofertas obtendo os ticks do histórico usando as funções CopyTicks() ou CopyTicksRange().
Neste caso, os resultados dos testes do algoritmo no testador e os resultados reais do comércio são os mesmos.
As desvantagens são um desempenho inferior do algoritmo.

2. Os eventos do OnBookEvent são significativos.....
Mas isto não é verdade, nem todos os acordos passam pelo livro.

Exemplo - Um comércio não passou pelo manipulador do OnEventBook (e chegam a 5 ticks).

3. Os 8 bits não documentados na bandeira do carrapato nunca foram respondidos. Eu fiz a mesma pergunta em outro tópico do fórum.


2. Por favor, afixe seu código de construtor de carrapatos (tenho certeza de que você está fazendo algo errado).

3. Na impressora, faça o EnumToString(bandeiras)

 
prostotrader:

2. Coloque seu código de construtor de carrapatos (tenho certeza que você está fazendo algo errado)

3. Na impressora do EnumToString(bandeiras)

O código é o habitual, mínimo. O OnBookEvent recebe o último tique conhecido e imprime-o.

//+------------------------------------------------------------------+
//|                                               TicksCollector.mq5 |
//|                               Copyright 2020, Vladimir Mikhailov |
//|                                                mikh.vl@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Vladimir Mikhailov"
#property link      "mikh.vl@gmail.com"
#property version   "1.00"
MqlTick tick[1];
int counter=0;
string type;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MarketBookAdd(_Symbol);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   MarketBookRelease(_Symbol);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnBookEvent(const string&  symbol)
  {
   CopyTicks(_Symbol,tick,COPY_TICKS_ALL,0,1);
   counter++;
   if((tick[0].flags&TICK_FLAG_BID)==TICK_FLAG_BID || (tick[0].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK)
      {
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Ask: %s; Bid: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, DoubleToString(tick[0].ask,_Digits), DoubleToString(tick[0].bid,_Digits));
      }
   else if((tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY || (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL)
      {
       type=(tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY? "Buy": (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL? "Sell": "";
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Volume: %.0f; Type: %s; Last: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, tick[0].volume_real, type, DoubleToString(tick[0].last,_Digits));
      }  
  }
//+------------------------------------------------------------------+

Sobre o terceiro ponto - as bandeiras de seleção não são uma enumeração, portanto a função EnumToString não é aplicável a elas.

 
Vladimir Mikhailov:

O código é o habitual, mínimo. O evento OnBookEvent recebe o último tique conhecido e o imprime.

Sobre o terceiro ponto - as bandeiras de seleção não são uma enumeração, portanto a função EnumToString não é aplicável a elas.

Você copia 1 carrapato e não quer ter pulos:)

OnBookEvent() é acionado por qualquer mudança no tick, mas em um determinado momento

pode haver vários carrapatos. O terminal recebe não um carrapato, mas um EMBALAGEM de carrapatos.

O indicador que recomendei (fita adesiva de todos os negócios) tem uma descrição

em russo. Não seja preguiçoso, leia-o.

 
prostotrader:

Você copia 1 carrapato e não quer pular:)

OnBookEvent() é acionado por qualquer mudança no copo, mas em um determinado momento

pode haver vários carrapatos. O terminal recebe não um carrapato, mas um EMBALAGEM de carrapatos.

O indicador que recomendei (fita adesiva de todos os negócios) tem uma descrição

em russo. Não seja preguiçoso para lê-lo.

Assistir a mais de um tick é uma inversão da história.

 
Vladimir Mikhailov:

Observar mais de um tique é um apelo à história.

Você não entende nada de como funciona o terminal.

Leia os comentários no indicador!!!

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
    }  
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
       int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
       if(result > 0)
       {
         for(int i= 0; i<result; i++)
         {
           if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
           if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
           if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
           if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
           if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
           if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
           Print("Unknown flag is ", ticks[i].flags);
         }
         last_time = ticks[0].time_msc + 1;
       }
     
    }
   
  }
//+------------------------------------------------------------------+
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.121 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.194 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:50.903 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.235 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.399 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:05.174 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST
2020.01.29 10:52:28.027 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST

Adicionado

No exemplo acima, nem todos os carrapatos são "pegos" como o pacote de carrapatos recém-chegado

pode conter carrapatos com um tempo anterior.

Estudar cuidadosamente o código "Fita de todos os ofícios" (está com comentários).

 

Se você achar difícil (ou preguiçoso) entender o código indicador, então

ver o código mais simples de um coletor adequado em tempo real de todos os carrapatos

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time, mem_time;
bool is_first;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_first = false;
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
      is_first = true;
    }
    else
    {
      Alert("No start time!");
      return(INIT_FAILED);
    }   
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
      int result;
      if(is_first == true)
      {
        Print("First packet of ticks:");
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
       {
         for(int i= 0; i<result; i++)
         {
           if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
           if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
           if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
           if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
           if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
           if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
           Print("Unknown flag is ", ticks[i].flags);
         }
         is_first = false;
         mem_time = last_time;
         last_time = ticks[0].time_msc + 1;
       } 
      }
      else
      {
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, mem_time, 0);
        if(result > 0)
        {
          for(int i= 0; i<result; i++)
          {
            if(ticks[i].time_msc == mem_time)
            {
              Print("Tick with old time:");
              if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
              if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
              if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
              if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
              if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
              if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
              Print("Unknown flag is ", ticks[i].flags);
            }
          }
        }
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
        {
          Print("Ticks with new time:");
          for(int i= 0; i<result; i++)
          {
            if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
            if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
            if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
            if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
            if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
            if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
            Print("Unknown flag is ", ticks[i].flags);
          }
          mem_time = last_time;
          last_time = ticks[0].time_msc + 1;
        }
      }
    }
 }
//+------------------------------------------------------------------+
 
prostotrader:

ver código mais simples para um coletor adequado em tempo real de todos os carrapatos

Por que coletá-los "em tempo real" se o CopyTicks é usado de qualquer maneira?

Você pode copiar os carrapatos com a profundidade correta a qualquer momento que quiser.

Razão: