Bugs e sugestões para melhorar CopyTicks() e CopyTicksRange() após a construção de 1485. - página 4

 
Yury Kirillov:
Tente usar em seu Expert Advisor todas as formas possíveis de receber ticks e OnTick e CopyTicks, e depois compare os resultados e use o mais adequado.
E o que a OnTick() tem a ver com isso? Não se destina a receber todas as carrapatas, mas sim ao processamento do recebimento das mesmas. Você não precisa nem comparar nada aqui, OnTick() não será chamado a cada tick e não permitirá receber todos os dados da estrutura MqlTick.
 
O Service Desk ofereceu-se para experimentá-lo na nova construção, 1545. Mas o resultado não mudou, como antes, solicitando carrapatos das 10h às 11h para alguns papéis devolve zero arrays, e então os dados começam a vir das 11h por algum motivo. Talvez depois disso, os carrapatos já estejam "normais" quando se pergunta, mas não há relevância.
 
Essa é praticamente a única mensagem que eles enviam. Já faz um bom tempo, a central de serviço não responde. Ignorar minhas mensagens é normal?
 
antru:
Essa é praticamente a única mensagem que eles enviam. Já faz um bom tempo, a central de serviço não responde. Ignorar minhas mensagens é normal?
Sobre ignorar suas mensagens - você tem o ramo errado. Há uma linha separada sobre SD. Em geral, lembre-os, escrevendo um comentário sobre o pedido. Você anexou o código e outras evidências à DBO?
 
Alexey Kozitsyn:
Sobre ignorar seus postos - você tem o tópico errado. Há uma linha separada sobre SD. Na verdade, lembre-os escrevendo um comentário sobre o pedido. Você anexou o código e outras evidências à DBO?

Sim, é claro, até explicou o código... silêncio... Obrigado pela dica, vou colocá-la em uma linha separada
 

Feito código de depuração para verificar o CopyTicksRange. Enquanto a mesa de serviço está permanentemente em silêncio, eu me perguntava se existe um erro no código. Meus olhos devem ter vidrado... Por favor, olhe com olhos frescos.

Abaixo está o código, anexe os resultados. Primeiro zip - início do Metatrader antes da negociação, o segundo zip - início às 22h30 EST (o tempo em arquivos de depuração foi 3 horas a menos).

Não entendo por que no primeiro zeep nenhum carrapato voltou em nenhum papel.

De modo algum. Pessoal, como obter a fita em tempo real? Talvez eu esteja reinventando a roda e fazendo algo errado, você pode me dar um código de exemplo sobre como obter carrapatos em papéis em tempo real?

//+------------------------------------------------------------------+
//|                                                     Smelchak.mq5 |
//|                                                      Pavel&Antru |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Pavel&Antru"
#property link      ""
#property version   "1.00"

bool g_bEnterInfoSent = false;

datetime g_dEndOfTheDay;
datetime g_dDayBegin;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(3);
   
   MqlDateTime startTime;
   TimeGMT(startTime);
   startTime.hour = 7;
   startTime.min = 0;
   startTime.sec = 0;
   g_dDayBegin = StructToTime(startTime);
   
   startTime.hour = 17;
   startTime.min = 0;
   startTime.sec = 0;
   g_dEndOfTheDay = StructToTime(startTime);
   
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
}
//+------------------------------------------------------------------+

void OnTimer()
{
   MqlDateTime mdt;
   datetime dCurrent = TimeCurrent(mdt);
   
   if (!g_bEnterInfoSent && mdt.hour + 3 == 9)
   {
      MqlDateTime startTime;
      TimeGMT(startTime);
      startTime.hour = 7;
      startTime.min = 0;
      startTime.sec = 0;
      g_dDayBegin = StructToTime(startTime);
      
      startTime.hour = 17;
      startTime.min = 0;
      startTime.sec = 0;
      g_dEndOfTheDay = StructToTime(startTime);
      
      g_bEnterInfoSent = true;
   }
   
   if (g_bEnterInfoSent && mdt.hour + 3 == 22)
   {
      g_bEnterInfoSent = false;
   }
   
   datetime lastTime = TimeCurrent();
   
   MqlDateTime dayBegin;
   TimeToStruct(g_dDayBegin, dayBegin);

   MqlDateTime dayEnd;
   TimeToStruct(g_dEndOfTheDay, dayEnd);
   
   MqlDateTime curTime;
   TimeToStruct(lastTime, curTime);
   
   if (true) //(lastTime >= g_dDayBegin && lastTime < g_dEndOfTheDay)
   {
      MqlTick tick[];
      int nResult = CopyTicksRange(Symbol(), tick, COPY_TICKS_ALL, (ulong)g_dDayBegin*1000, (ulong)g_dEndOfTheDay*1000);
      int nLastError = GetLastError();
      
      string sDebugFileName = StringFormat("%s.debug.%.04d.%.02d.%.02d.csv", Symbol(), dayBegin.year, dayBegin.mon, dayBegin.day);
   
      int nDebugOutputFile = FileOpen(sDebugFileName, FILE_READ | FILE_WRITE | FILE_CSV, ',');
      if (nDebugOutputFile == INVALID_HANDLE) nDebugOutputFile = FileOpen(sDebugFileName, FILE_WRITE | FILE_CSV, ',');
      
      if (nDebugOutputFile != INVALID_HANDLE)
      {
         FileSeek(nDebugOutputFile, 0, SEEK_END);

         MqlDateTime tickTime;
         
         if (ArraySize(tick))
         {
            TimeToStruct(tick[0].time, tickTime);
            
            FileWrite(nDebugOutputFile, StringFormat("%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000", dayBegin.year, dayBegin.mon, dayBegin.day,
                                                                                                dayBegin.hour, dayBegin.min, dayBegin.sec),
                                        StringFormat("%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000", dayEnd.year, dayEnd.mon, dayEnd.day,
                                                                                                dayEnd.hour, dayEnd.min, dayEnd.sec),                                                        
                                        StringFormat("%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000", curTime.year, curTime.mon, curTime.day,
                                                                                                curTime.hour, curTime.min, curTime.sec),
                                        StringFormat("%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000", tickTime.year, tickTime.mon, tickTime.day,
                                                                                                tickTime.hour, tickTime.min, tickTime.sec),
                                        ArraySize(tick),
                                        nResult,
                                        nLastError);
                                        
            /////////////////////////////////////////////////////////
            string sTicksFileName = StringFormat("%s.ticks.%.04d.%.02d.%.02d.csv", Symbol(), dayBegin.year, dayBegin.mon, dayBegin.day);
         
            int nTicksOutputFile = FileOpen(sTicksFileName, FILE_READ | FILE_WRITE | FILE_CSV, ',');
            if (nTicksOutputFile == INVALID_HANDLE) nTicksOutputFile = FileOpen(sTicksFileName, FILE_WRITE | FILE_CSV, ',');
            
            if (nTicksOutputFile != INVALID_HANDLE)
            {
               FileSeek(nDebugOutputFile, 0, SEEK_END);
      
               MqlDateTime tickTime;
            
               for (int i = 0; i<ArraySize(tick); i++)
               {
                  TimeToStruct(tick[i].time, tickTime);
                  
                  FileWrite(nTicksOutputFile, StringFormat("%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000", tickTime.year, tickTime.mon, tickTime.day,
                                                                                                      tickTime.hour, tickTime.min, tickTime.sec),
                                              tick[i].bid,
                                              tick[i].ask,
                                              tick[i].last,
                                              tick[i].volume,
                                              ((tick[i].flags & TICK_FLAG_BUY) ? "Buy" : "") + 
                                              ((tick[i].flags & TICK_FLAG_SELL) ? "Sell" : ""));
               }
               
               FileClose(nTicksOutputFile);
            }
            /////////////////////////////////////////////////////////                                        
                                        
            g_dDayBegin = dCurrent;                                   
         }
         else
         {
            FileWrite(nDebugOutputFile, StringFormat("%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000", dayBegin.year, dayBegin.mon, dayBegin.day,
                                                                                                dayBegin.hour, dayBegin.min, dayBegin.sec),
                                        StringFormat("%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000", dayEnd.year, dayEnd.mon, dayEnd.day,
                                                                                                dayEnd.hour, dayEnd.min, dayEnd.sec),
                                        StringFormat("%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000", curTime.year, curTime.mon, curTime.day,
                                                                                                curTime.hour, curTime.min, curTime.sec),
                                        "No ticks",
                                        ArraySize(tick),
                                        nResult,
                                        nLastError);
               
         }
         FileClose(nDebugOutputFile);
      }
   }
}

Arquivos anexados:
backup.01.zip  292 kb
backup.02.zip  271 kb
 
antru:

Pessoal, como se obtém a ração em tempo real?

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

Indicador de estoque misterioso

fxsaber, 2016.10.04 11:28

long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из истории
int Count = 0;     // Количество тиков в последенем запросе, у которых time_msc == LastTime

// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_TRADE, const uint count = 100000 )
{
  int Res = 0;

  MqlTick NewTicks[];
  const int NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);

  if ((NewAmount > 0) && (Count < NewAmount))
  {
    Res = ArrayCopy(Ticks, NewTicks, 0, Count);

    // Взяли крайнее время из текущей истории
    LastTime = NewTicks[NewAmount - 1].time_msc;
    Count = 1;

    // Находим (Count) в текущей истории количество тиков со временем LastTime
    for (int i = NewAmount - 2; i >= 0; i--)
    {
      if (NewTicks[i].time_msc < LastTime)
        break;

      Count++;
    }
  }

  return(Res);
}
 
fxsaber:

Por alguma razão, os carrapatos do dia atual não são mais exibidos, tanto de acordo com o antigo algoritmo como com o novo... e independentemente de a fita estar ou não habilitada na janela...

aqui está o código onde inseri sua função...

//+------------------------------------------------------------------+
//|                                                     Smelchak.mq5 |
//|                                                      Pavel&Antru |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Pavel&Antru"
#property link      ""
#property version   "1.00"

bool g_bEnterInfoSent = false;

datetime g_dEndOfTheDay;
datetime g_dDayBegin;

long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из истории
int Count = 0;     // Количество тиков в последенем запросе, у которых time_msc == LastTime

// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_TRADE, const uint count = 100000 )
{
  int Res = 0;

  MqlTick NewTicks[];
  const int NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);

  if ((NewAmount > 0) && (Count < NewAmount))
  {
    Res = ArrayCopy(Ticks, NewTicks, 0, Count);

    // Взяли крайнее время из текущей истории
    LastTime = NewTicks[NewAmount - 1].time_msc;
    Count = 1;

    // Находим (Count) в текущей истории количество тиков со временем LastTime
    for (int i = NewAmount - 2; i >= 0; i--)
    {
      if (NewTicks[i].time_msc < LastTime)
        break;

      Count++;
    }
  }

  return(Res);
}
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(3);
   
   MqlDateTime startTime;
   TimeGMT(startTime);
   startTime.hour = 7;
   startTime.min = 0;
   startTime.sec = 0;
   g_dDayBegin = StructToTime(startTime);
   
   startTime.hour = 17;
   startTime.min = 0;
   startTime.sec = 0;
   g_dEndOfTheDay = StructToTime(startTime);
   
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
}
//+------------------------------------------------------------------+

void OnTimer()
{
   MqlDateTime mdt;
   datetime dCurrent = TimeCurrent(mdt);
   
   if (!g_bEnterInfoSent && mdt.hour + 3 == 9)
   {
      MqlDateTime startTime;
      TimeGMT(startTime);
      startTime.hour = 7;
      startTime.min = 0;
      startTime.sec = 0;
      g_dDayBegin = StructToTime(startTime);
      
      startTime.hour = 17;
      startTime.min = 0;
      startTime.sec = 0;
      g_dEndOfTheDay = StructToTime(startTime);

      g_bEnterInfoSent = true;
   }
   
   if (g_bEnterInfoSent && mdt.hour + 3 == 22)
   {
      g_bEnterInfoSent = false;
   }
   
   datetime lastTime = TimeCurrent();
   
   if (true)
   {
      MqlTick tick[];
      int nResult = GetFreshTicks(tick);
      
      MqlDateTime tickTime;
      
      if (ArraySize(tick))
      {
         TimeToStruct(tick[0].time, tickTime);
         
         string sTicksFileName = StringFormat("%s.ticks.%.04d.%.02d.%.02d.csv", Symbol(), tickTime.year, tickTime.mon, tickTime.day);
      
         int nTicksOutputFile = FileOpen(sTicksFileName, FILE_READ | FILE_WRITE | FILE_CSV, ',');
         if (nTicksOutputFile == INVALID_HANDLE) nTicksOutputFile = FileOpen(sTicksFileName, FILE_WRITE | FILE_CSV, ',');
         
         if (nTicksOutputFile != INVALID_HANDLE)
         {
            FileSeek(nTicksOutputFile, 0, SEEK_END);
   
            MqlDateTime tickTime;
         
            for (int i = 0; i<ArraySize(tick); i++)
            {
               TimeToStruct(tick[i].time, tickTime);
               
               FileWrite(nTicksOutputFile, StringFormat("%.04d.%.02d.%.02d %.02d:%.02d:%.02d.000", tickTime.year, tickTime.mon, tickTime.day,
                                                                                                   tickTime.hour, tickTime.min, tickTime.sec),
                                           tick[i].bid,
                                           tick[i].ask,
                                           tick[i].last,
                                           tick[i].volume,
                                           ((tick[i].flags & TICK_FLAG_BUY) ? "Buy" : "") + 
                                           ((tick[i].flags & TICK_FLAG_SELL) ? "Sell" : ""));
            }
            
            FileClose(nTicksOutputFile);
         }
                                     
         g_dDayBegin = dCurrent;                                   
      }
   }
}

Como resultado, eu o executei em dois papéis, ALRS e AFLT. Os carrapatos só voltaram para os dias anteriores. Nenhum por hoje. Qual poderia ser o problema?

Arquivos anexados:
Files.zip  843 kb
 
antru:

Por alguma razão, os carrapatos do dia atual não são mais exibidos, tanto de acordo com o antigo algoritmo quanto com o novo... e independentemente de a fita estar ou não ligada na janela...

aqui está o código onde inseri sua função...

Como resultado, eu o executei em dois papéis, ALRS e AFLT. Os carrapatos só voltaram para os dias anteriores. Nenhum por hoje. O que poderia ser?

Há carrapatos nas janelas na fita, guardo 100.000 últimos carrapatos - sem carrapatos para hoje

Arquivos anexados:
Documents.zip  812 kb
 
Mas agora os tiques apareceram. O que poderia ser? De quem é a culpa? O corretor? Metatrader?