Bugs et suggestions pour améliorer CopyTicks() et CopyTicksRange() après la build 1485. - page 4

 
Yury Kirillov:
Essayez d'utiliser dans votre conseiller expert toutes les manières possibles de recevoir les ticks, OnTick et CopyTicks, puis comparez les résultats et utilisez la plus adéquate.
Et qu'est-ce que OnTick() a à voir avec ça ? Il n'est pas destiné à recevoir tous les ticks, mais à traiter le fait de la réception des ticks. Vous n'avez même pas besoin de comparer quoi que ce soit ici, OnTick() ne sera pas appelé à chaque tick et il ne permettra pas de recevoir toutes les données de la structure MqlTick.
 
Le service d'assistance a proposé de l'essayer sur la nouvelle construction, 1545. Mais le résultat n'a pas changé, comme avant, demander des ticks de 10h à 11h pour certains papiers renvoie des tableaux nuls, et ensuite les données commencent à arriver à partir de 11h pour une raison quelconque. Peut-être qu'après cela, les tics sont déjà "normaux" lors de l'interrogation, mais il n'y a pas de pertinence.
 
C'est à peu près le seul message qu'ils envoient. Cela fait maintenant un certain temps que le service d'assistance ne répond pas. Est-ce normal d'ignorer mes messages ?
 
antru:
C'est à peu près le seul message qu'ils envoient. Cela fait maintenant un certain temps que le service d'assistance ne répond pas. Est-ce normal d'ignorer mes messages ?
Pour ce qui est d'ignorer vos messages - vous avez la mauvaise branche. Il y a un fil de discussion séparé sur SD. En général, rappelez-leur en écrivant un commentaire sur l'application. Avez-vous joint le code et d'autres preuves au BOD ?
 
Alexey Kozitsyn:
Pour ce qui est d'ignorer vos messages, vous vous êtes trompé de fil. Il y a un fil de discussion séparé sur SD. En fait, rappelez-leur en écrivant un commentaire sur l'application. Avez-vous joint le code et d'autres preuves au BOD ?

Oui, bien sûr, j'ai même expliqué le code... le silence... Merci pour le conseil, je vais le mettre dans un fil séparé.
 

Ajout d'un code de débogage pour vérifier CopyTicksRange. Alors que le service d'assistance est en permanence silencieux, je me suis demandé s'il n'y avait pas une erreur dans le code. Je dois avoir les yeux vitreux... S'il vous plaît, regardez-le avec des yeux neufs.

Ci-dessous le code, joindre les résultats. Premier zip - démarrage de Metatrader avant le trading, le second zip - démarrage à 10h30 heure de Moscou (3 heures de moins dans les fichiers de débogage).

Je ne comprends pas pourquoi dans le premier zip aucune tique n'est revenue sur aucun papier.

Pas du tout. Les amis, comment obtenir la bande en temps réel ? Peut-être que je réinvente la roue et que je fais quelque chose de mal, pouvez-vous me donner un exemple de code sur la façon d'obtenir des ticks sur des papiers en temps réel ?

//+------------------------------------------------------------------+
//|                                                     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);
      }
   }
}

Dossiers :
backup.01.zip  292 kb
backup.02.zip  271 kb
 
antru:

Les amis, comment obtenir le flux en temps réel ?

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Indicateur boursier mystérieux

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:

Pour une raison quelconque, les ticks de la journée en cours ne sont plus du tout affichés, que ce soit selon l'ancien ou le nouvel algorithme... et que le ruban soit activé ou non dans la fenêtre...

voici le code où j'ai inséré votre fonction...

//+------------------------------------------------------------------+
//|                                                     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;                                   
      }
   }
}

En conséquence, je l'ai exécuté sur deux papiers, ALRS et AFLT. Les tiques ne sont revenues que pour les jours précédents. Aucun pour aujourd'hui. Qu'est-ce que ça peut être ?

Dossiers :
Files.zip  843 kb
 
antru:

Pour une raison quelconque, les ticks de la journée en cours ne sont plus du tout affichés, que ce soit selon l'ancien ou le nouvel algorithme... et que le ruban soit activé ou non dans la fenêtre...

voici le code où j'ai inséré votre fonction...

En conséquence, je l'ai exécuté sur deux papiers, ALRS et AFLT. Les tiques ne sont revenues que pour les jours précédents. Aucun pour aujourd'hui. Qu'est-ce que ça peut être ?

Il y a des ticks dans les fenêtres du ruban, je sauvegarde 100000 derniers ticks - pas de ticks pour aujourd'hui

Dossiers :
Documents.zip  812 kb
 
Mais maintenant les tics sont apparus. Qu'est-ce que ça peut être ? A qui la faute ? Le courtier ? Metatrader ?
Raison: