Errores y sugerencias para mejorar CopyTicks() y CopyTicksRange() después de la compilación 1485. - página 4

 
Yury Kirillov:
Intente utilizar en su Asesor Experto todas las formas posibles de recibir ticks y OnTick y CopyTicks, y luego compare los resultados y utilice la más adecuada.
¿Y qué tiene que ver OnTick() con esto? No está pensado para recibir todos los ticks, sino para procesar el hecho de la recepción de ticks. Ni siquiera es necesario comparar nada aquí, OnTick() no será llamado en cada tick y no permitirá recibir todos los datos de la estructura MqlTick.
 
El Servicio de Atención al Cliente se ofreció a probarlo en la nueva construcción, la 1545. Pero el resultado no ha cambiado, ya que antes, al solicitar los ticks de las 10 a las 11 de la mañana para algunos papeles, devuelve cero arrays, y luego los datos empiezan a llegar a partir de las 11.00 por alguna razón. Tal vez después de eso los ticks ya son "normales" al consultar, pero no hay relevancia.
 
Ese es prácticamente el único mensaje que envían. Desde hace tiempo, el servicio de atención al cliente no responde. ¿Es normal que ignore mis mensajes?
 
antru:
Ese es prácticamente el único mensaje que envían. Desde hace tiempo, el servicio de atención al cliente no responde. ¿Es normal que ignore mis mensajes?
En cuanto a lo de ignorar tus mensajes, te has equivocado de rama. Hay un hilo separado sobre SD. De hecho, recuérdelo escribiendo un comentario en la solicitud. ¿Ha adjuntado el código y otras pruebas al BOD?
 
Alexey Kozitsyn:
Sobre lo de ignorar tus mensajes - te has equivocado de hilo. Hay un hilo separado sobre SD. De hecho, recuérdelo escribiendo un comentario en la solicitud. ¿Adjuntaste el código y otras pruebas al BOD?

Sí, por supuesto, incluso explicó el código... el silencio... Gracias por el consejo, lo pondré en un hilo aparte
 

Hecho código de depuración para comprobar CopyTicksRange. Mientras el servicio de atención al cliente está permanentemente en silencio, me pregunto si hay un error en el código. Mis ojos deben haber sido vidriosos... Por favor, míralo con ojos nuevos.

A continuación se muestra el código, adjuntando los resultados. Primer zip - inicio de Metatrader antes de operar, el segundo zip - inicio a las 10:30 pm EST (el tiempo en los archivos de depuración fue de 3 horas menos).

No entiendo por qué en la primera cremallera no salieron garrapatas en ningún papel.

En absoluto. Amigos, ¿cómo se consigue la cinta en tiempo real? Tal vez estoy reinventando la rueda y haciendo algo mal, ¿puedes darme un código de ejemplo sobre cómo obtener ticks en los papeles en tiempo 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);
      }
   }
}

Archivos adjuntos:
backup.01.zip  292 kb
backup.02.zip  271 kb
 
antru:

Amigos, ¿cómo se consigue la alimentación en tiempo real?

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Misterioso indicador de valores

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 alguna razón, los ticks del día actual ya no se muestran en absoluto, tanto según el antiguo algoritmo como el nuevo... e independientemente de si la cinta está activada en la ventana o no...

aquí está el código donde inserté su función...

//+------------------------------------------------------------------+
//|                                                     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, lo ejecuté en dos papeles, ALRS y AFLT. Las garrapatas sólo volvieron a aparecer los días anteriores. Ninguno por hoy. ¿Qué puede ser?

Archivos adjuntos:
Files.zip  843 kb
 
antru:

Por alguna razón, los ticks del día actual ya no se muestran en absoluto, tanto según el antiguo algoritmo como el nuevo... e independientemente de si la cinta está activada en la ventana o no...

aquí está el código donde inserté su función...

Como resultado, lo ejecuté en dos papeles, ALRS y AFLT. Las garrapatas sólo volvieron a aparecer los días anteriores. Ninguno por hoy. ¿Qué puede ser?

Hay ticks en las ventanas de la cinta, guardo 100000 últimos ticks - no hay ticks para hoy

Archivos adjuntos:
Documents.zip  812 kb
 
Pero ahora han aparecido los tics. ¿Qué puede ser? ¿De quién es la culpa? ¿El corredor? ¿Metatrader?