Serviços , nova funcionalidade no arquiteto do MT5, o funeral do MT4 está prestes a ser inaugurado. - página 8

 

do Eng.

dados

feed

datafeed -- fonte de dados (embora a palavra "fonte" não esteja muito correta)


alimentador -- alimentador, alimentador, alimentador

 

О датафидах. Сколько встречал этот термин, сложилось ощущение, что этим словом обозначают источник данных (котировок). Буквально "заполнитель данных". Когда речь идет о собственных инструментах, понимаю так, что мы сможем вычислять котировки, например, никем не котируемого MXNRUB по известным курсам MXNUSD и USDRUB, выгруженным из терминала в .csv формат, и легализовать для терминала новые котировки, указав файл .csv как новый датафид. Возможно, будет реализовано и более изящное решение, без выгрузки в файлы, путем онлайновых операций */ над тиками (MXNRUB =  MXNUSD * USDRUB). И это будет новый датафид.

Eles já importaram cotações .csv em carrapatos para o MT5????
 
Andrey Khatimlianskii:

Não resta nenhum link para uma discussão, relatório de bug ou algo parecido? Ou apenas um sentimento de que havia um, mas ainda não o verificou agora?

Até onde me lembro, os carrapatos coletados na OnCalculate correspondiam aos solicitados via CopyTix.

Agora, como eu suspeitava, foi verificado de propósito... mas não aquele que eu esperava :)

2017.05.22 12:47:10.591 (RTS-6.17,M1)   OnCalculate: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.591 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.599 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.605 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.617 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.637 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.649 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.683 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.765 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.771 (RTS-6.17,M1)   OnCalculate: 2017.05.22 10:47:11.193 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88
2017.05.22 12:47:10.781 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.193 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88
2017.05.22 12:47:10.843 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.244 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 0
2017.05.22 12:47:10.843 (RTS-6.17,M1)   OnBookEvent: Время последнего OnCalculate = 2017.05.22 10:47:11.193 ms (88), время последнего OnBookEvent = 2017.05.22 10:47:11.244 ms (0)
2017.05.22 12:47:10.859 (RTS-6.17,M1)   OnCalculate: 2017.05.22 10:47:11.282 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88
2017.05.22 12:47:10.863 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.282 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88

OnBookEvent() captura carrapatos com bandeira 0...

 

E isto é o que eu esperava ver:

2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: Время последнего STick = 2017.05.22 11:24:38.704 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05.22 11:24:38.697 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME )
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: Время последнего STick = 2017.05.22 11:24:38.704 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05.22 11:24:38.697 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME )
2017.05.22 13:24:38.254 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.255 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.255 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.255 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.261 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.261 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.261 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.262 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.262 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.270 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.280 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.730 ms v = 2, bid = 108550, ask = 108560, last = 108560, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.280 (RTS-6.17,M1)   OnCalculate: Время последнего STick = 2017.05.22 11:24:38.730 ms (TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05.22 11:24:38.719 ms (TICK_FLAG_BID )
2017.05.22 13:24:38.282 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 11:24:38.730 ms v = 2, bid = 108550, ask = 108560, last = 108560, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.283 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.730 ms v = 2, bid = 108550, ask = 108560, last = 108560, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
Como você pode ver, ao solicitar o último tique em cada chamada para OnCalculate() com SymbolInfoTick() - há um pulo em alguns dos tiquetaques que CopyTicks() retorna.
 

Código a ser verificado:

#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlTick _tick;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Подписываемся на стакан
   MarketBookAdd(_Symbol);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ResetLastError();
//--- Проверяем получение параметров тика
   if(!SymbolInfoTick(_Symbol,_tick))
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": параметры тика не получены!");
   else
      Print(__FUNCTION__,": "+GetMsToStringTime(_tick.time_msc)+" v = ",_tick.volume,", bid = "+DoubleToString(_tick.bid,_Digits)+
            ", ask = "+DoubleToString(_tick.ask,_Digits)+", last = "+DoubleToString(_tick.last,_Digits)+", flags = '"+GetStrFlags(_tick.flags)+"'");
//---
   ResetLastError();
//---
   MqlTick t[1];
   if(CopyTicks(_Symbol,t,COPY_TICKS_ALL,0,1)!=1)
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": Последний тик не получен!");
   else
     {
      if(t[0].time_msc!=_tick.time_msc)
        {
         Print(__FUNCTION__,": Время последнего STick = "+GetMsToStringTime(_tick.time_msc)+" ("+GetStrFlags(_tick.flags)+")"+
               ", время последнего CopyTicks = "+GetMsToStringTime(t[0].time_msc)+" ("+GetStrFlags(t[0].flags)+")");
        }
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
//---
   if(symbol!=_Symbol)
      return;
//--- Структура - приемник последнего тика
   MqlTick tick;
//---
   ResetLastError();
//--- Проверяем получение параметров тика
   if(!SymbolInfoTick(_Symbol,tick))
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": параметры тика не получены!");
   else
      Print(__FUNCTION__,": "+GetMsToStringTime(tick.time_msc)+" v = ",tick.volume,", bid = "+DoubleToString(tick.bid,_Digits)+
            ", ask = "+DoubleToString(tick.ask,_Digits)+", last = "+DoubleToString(tick.last,_Digits)+", flags = '"+GetStrFlags(tick.flags)+"'");
//--- Сравниваем последний тик OnCalculate с последним тиком OnBookEvent
   if(tick.time_msc!=_tick.time_msc)
     {
      Print( __FUNCTION__,": Время последнего OnCalculate = "+GetMsToStringTime( _tick.time_msc )+" ("+GetStrFlags( _tick.flags )+")"+
            ", время последнего OnBookEvent = "+GetMsToStringTime( tick.time_msc )+" ("+GetStrFlags( tick.flags )+")" );
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Отписываемся от стакана
   MarketBookRelease(_Symbol);
  }
//+------------------------------------------------------------------+
//| Получаем строку времени из миллисекунд                                                                      |
//+------------------------------------------------------------------+
string GetMsToStringTime(const ulong ms)
  {
   const int MS_KOEF=1000;               // Коэффициент перевода секунд в миллисекунды
   return( TimeToString( ms/MS_KOEF, TIME_DATE|TIME_SECONDS )+"."+string( ms%MS_KOEF )+" ms" );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string GetStrFlags(const uint flags)
  {
   string s="";
//---
   if(( flags&TICK_FLAG_ASK)==TICK_FLAG_ASK)
      s+="TICK_FLAG_ASK ";
   if(( flags&TICK_FLAG_BID)==TICK_FLAG_BID)
      s+="TICK_FLAG_BID ";
   if(( flags&TICK_FLAG_BUY)==TICK_FLAG_BUY)
      s+="TICK_FLAG_BUY ";
   if(( flags&TICK_FLAG_SELL)==TICK_FLAG_SELL)
      s+="TICK_FLAG_SELL ";
   if(( flags&TICK_FLAG_LAST)==TICK_FLAG_LAST)
      s+="TICK_FLAG_LAST ";
   if(( flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME)
      s+="TICK_FLAG_VOLUME ";
//---
   return( s );
  }
//+------------------------------------------------------------------+
 
Alexey Kozitsyn:

Código a ser testado:

Eu deixaria apenas carrapatos para registrar quando a OnCalculate for chamada, para ter certeza (não para testar OnBookEvent e CopyTicks, masOnCalculate, como pretendido).

E então por roteiro teria gerado o mesmo arquivo, obtendo os carrapatos através de CopyTicks. A diferença seria mais óbvia, e indicaria ou carrapatos perdidos na OnCalculate ou trabalho incorreto do CopyTicks.

 
Andrey Khatimlianskii:

Para ter certeza (não para testar OnBookEvent e CopyTicks, mas OnCalculate, como pretendido), eu deixaria apenas carrapatos escritos para o arquivo quando OnCalculate for chamado.

E então por script teria gerado o mesmo arquivo, obtendo os carrapatos através de CopyTicks. A diferença seria mais clara e indicaria ou pulo de carrapatos no OnCalculate ou trabalho incorreto do CopyTicks.

Com um cálculo tão simples, não vejo a utilidade de se preocupar. Há uma comparação específica de duas chamadas: SymbolInfoTick() e CopyTicks(). E todas as chamadas do SymbolInfoTick() são claramente mostradas. E pode ser visto claramente que o CopyTicks() devolveu o tick, que não foi recebido em SymbolInfoTick() chamada da OnCalculate(). E pode haver duas razões para o erro aqui: 1. Ou OnCalculate() perde um carrapato, ou 2. SymbolInfoTick() devolve a coisa errada em algum lugar.

Sim, isto faz parte do tronco, que está sendo construído há cerca de 30 segundos. então imagine o número de carrapatos que faltam.

 
Alexey Kozitsyn:

Nosso diálogo com a central de serviço:

Marque pular na OnCalculate
Aberto, Iniciado em: 2017.05.22 14:52, #1751442

Procure não se perder:https://www.mql5.com/ru/forum/190129/page8#comment_5081300 e os próximos 2 postos.

CopyTicks do indicador dá um sinal de que o indicador não entra no OnCalculate (nem antes nem depois).

Equipe de apoio2017.05.23 09:44
Status:Não processadoAberto
Sua solicitação foi aceita para revisão.
Equipe de apoio2017.05.23 09:46

OnCalculate é chamado a cada tique.

Os bilhetes são adicionados ao banco de dados em uma linha separada. Ou seja, de forma assíncrona. Não é um fato que com CopyTicks você terá o mesmo carrapato que chamou OnCalculate.

Andrey Khatimlianskii 2017.05.23 14:08

Não se trata disso.

Com CopyTicks é possível obter um carrapato, que não estava na OnCalculate (aprendemos sobre isso na OnCalculate em um carrapato, que é mais longo do que o tempo perdido).

Dê uma olhada nos troncos.

Equipe de apoio2017.05.23 14:13

É exatamente disto que estamos falando.

Chegou um lote de carrapatos. Dois fios começam a processar este pacote - um fio no laço executa o OnCalculate em cada carrapato do pacote; outro fio coloca o pacote inteiro em um banco de dados de carrapatos. Estes dois fios não estão sincronizados entre eles de forma alguma e não se sabe qual fio processará um pacote de carrapatos mais rapidamente

Andrey Khatimlianskii 2017.05.23 14:26

Mas cada carrapato da embalagem deve ser processado pela OnCalculate. E isto não está acontecendo.

Não há nenhum tiquetaque com esse tempo. Há um tique com menos tempo, e um tique com mais tempo. E não há nenhuma chamada OnCalculate no meio.

Equipe de apoio2017.05.23 14:33

komposter

Mas cada carrapato da embalagem tem que ser tratado pela OnCalculate. E isto não está acontecendo.

Não há nenhum tiquetaque com esse tempo. Há um tique com menos tempo, e um tique com mais tempo. E não há nenhuma chamada de OnCalculate entre eles.

Cada carrapato da embalagem é processado na OnCalculate. Lá não há saltos. É assim que o laço é escrito.

Para descobrir qual carrapato é processado na OnCalculate, useSymbolInfoTick- tudo está claro aqui. O tick é aplicado às informações do símbolo e então todos os indicadores deste símbolo são chamados, todos em um único fio

Andrey Khatimlianskii 2017.05.23 14:36

Por favor, dê uma olhada no log no link.

O SymbolInfoTick da OnCalculate não vê o tick, que pode ser obtido no CopyTicks.

É por isso que eu escrevi

Equipe de apoio2017.05.23 14:40

Precisamos fazer exatamente como você sugeriu emhttps://www.mql5.com/ru/forum/190129/page8#comment_5082755

Eu, para ter certeza (para testar OnCalculate ao invés de OnBookEvent e CopyTicks, como pretendido), deixaria apenas a escrita de carrapatos para o arquivo quando OnCalculate for chamado.

E então por script teria gerado o mesmo arquivo, obtendo os carrapatos através de CopyTicks. A diferença seria muito mais clara e indicaria ou pular carrapatos no OnCalculate ou um trabalho incorreto do CopyTicks.

E nós verificamos exatamente desta forma, de uma só vez, a exatidão do CopyTicks. Os roteiros de teste e os indicadores são deixados, vamos verificá-los novamente.

 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Bichos, insetos, perguntas

fxsaber, 2017.02.07 13:41

SymbolInfoTick em indicadores funciona de forma bem diferente do que em EAs.

Em um indicador ele sempre retorna o tique que foi o iniciador da chamada OnCalculate. E estes carrapatos iniciadores no indicador não devem ser pulados - esta é a ideologia dos desenvolvedores. O problema está na formação da fila desses carrapatos.

No Expert Advisor, o SymbolInfoTick no OnTick não retorna o tick que iniciou a chamada do OnTick, mas faz um pedido completo para o estado atual.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Características da linguagem mql5, sutilezas e truques

fxsaber, 2017.03.29 22:32

O evento de cálculo é gerado em TODOS os tick. Portanto, há uma fila de carrapatos para os indicadores. Se atingir um certo número, há um aviso no registro de que o indicador é muito lento.

As próprias barras são indicadores por natureza e são geradas por eventos de cálculo. Portanto, se TF M1 e são 10:15:00.020 e chega um pacote de 50ms, o primeiro tick ainda tem tempo 10:14:59.970. E todos os indicadores são chamados primeiro sobre este evento Calcular - primeiro o indicador de série temporal e depois indicadores personalizados com estas séries temporais. Ou seja, neste layout a barra 10:15 ainda não está formada como a barra zero. E a barra zero é 10:14.


Então, quando o pacote começar a se desenrolar via Calcular eventos, a barra 10:15 também aparecerá. Acho que já o descrevi em detalhes.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Características da linguagem mql5, sutilezas e truques

fxsaber, 2017.03.29 22:41

Como conseqüência, é bastante normal que uma EA receba um carrapato de uma barra que ainda não se formou. Mas este é um ponto tão sutil que é preciso esforço até mesmo para reproduzir de propósito. Em geral, é mais teórico do que prático.


Se formos paranóicos quanto à velocidade, o uso de indicadores (e barras, é claro) não é uma opção. Tudo está na EA.

 
Andrey Khatimlianskii:

Nosso diálogo com o Service Desk:

O Service Desk está, infelizmente, em seu repertório. Eles não precisam lançar um link quando se trata de discussão. Mas para dar um exemplo concreto, em seus dedos. Não é sobre isso que eles estão falando. Nomeadamente, eles dizem, que SymbolInfoTick() retorna o tick atual para ser verificado, e como OnCalculate() lida com cada tick - afinal, essa saída deve ser de cada tick. E CopyTicks() nos diz o contrário. Bem... E eles dizem, não olhe para CopyTicks() :). Sobre dois fios eles me explicaram também, quando estavam consertando CopyTicks() no final do ano. Só que não é a questão aqui (embora, talvez também nela, eu não saiba).

Não lhes perguntou sobre carrapatos com bandeira 0 quando recebidos da OnBookEvent()?

Razão: