Bugs und Vorschläge zur Verbesserung von CopyTicks() und CopyTicksRange() nach Build 1485. - Seite 4

 
Yury Kirillov:
Versuchen Sie, in Ihrem Expert Advisor alle möglichen Arten des Empfangs von Ticks und OnTick und CopyTicks zu verwenden, und vergleichen Sie dann die Ergebnisse und verwenden Sie die am besten geeignete Methode.
Und was hat OnTick() damit zu tun? Es ist nicht dazu gedacht, alle Zecken zu empfangen, sondern um die Tatsache des Zeckenempfangs zu verarbeiten. Sie brauchen hier nicht einmal etwas zu vergleichen, da OnTick() nicht bei jedem Tick aufgerufen wird und nicht alle Daten der MqlTick-Struktur empfangen kann.
 
Der Servicedesk bot an, es mit dem neuen Build 1545 zu versuchen. Aber das Ergebnis hat sich nicht geändert, wie zuvor, die Abfrage von Ticks von 10 Uhr bis 11 Uhr für einige Papiere liefert Null Arrays, und dann die Daten beginnen, aus irgendeinem Grund aus 11.00 kommen. Vielleicht sind die Häkchen danach schon "normal" bei der Abfrage, aber das ist nicht relevant.
 
Das ist so ziemlich die einzige Botschaft, die sie vermitteln. Es ist nun schon eine ganze Weile her, dass der Service Desk nicht mehr reagiert hat. Ist es normal, meine Nachrichten zu ignorieren?
 
antru:
Das ist so ziemlich die einzige Botschaft, die sie vermitteln. Es ist jetzt schon eine ganze Weile her, dass der Service Desk nicht mehr reagiert hat. Ist es normal, meine Nachrichten zu ignorieren?
Was das Ignorieren Ihrer Nachrichten betrifft, so haben Sie den falschen Zweig. Es gibt einen separaten Thread über SD. Erinnern Sie sie daran, indem Sie einen Kommentar zur Bewerbung schreiben. Haben Sie den Code und andere Beweise dem BSB beigefügt?
 
Alexey Kozitsyn:
Was das Ignorieren Ihrer Beiträge betrifft, so sind Sie im falschen Thema. Es gibt einen separaten Thread über SD. Erinnern Sie sie daran, indem Sie einen Kommentar auf die Bewerbung schreiben. Haben Sie dem BSB den Code und andere Beweise vorgelegt?

Ja, natürlich, sogar den Code erklärt... Schweigen... Danke für den Tipp, ich werde ihn in einem separaten Thread veröffentlichen.
 

Debugging-Code zur Überprüfung von CopyTicksRange erstellt. Da die Servicestelle ständig schweigt, habe ich mich gefragt, ob es einen Fehler im Code gibt. Meine Augen müssen glasig geworden sein... Bitte betrachten Sie sie mit neuen Augen.

Im Folgenden finden Sie den Code und im Anhang die Ergebnisse. Erste Zip - Start von Metatrader vor dem Handel, die zweite Zip - Start um 10:30 Uhr EST (Zeit in Debug-Dateien war 3 Stunden weniger).

Ich verstehe nicht, warum beim ersten Reißverschluss keine Zecken auf irgendeinem Papier zurückkamen.

Überhaupt nicht. Leute, wie bekommt man das Band in Echtzeit? Vielleicht erfinde ich das Rad neu und mache etwas falsch, können Sie mir einen Beispielcode geben, wie man Zecken auf Papieren in Echtzeit erhält?

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

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

Leute, wie bekommt man den Feed in Echtzeit?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Mysteriöser Aktienindikator

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:

Aus irgendeinem Grund werden die Ticks für den aktuellen Tag überhaupt nicht mehr angezeigt, sowohl nach dem alten als auch nach dem neuen Algorithmus... und unabhängig davon, ob das Menüband im Fenster eingeschaltet ist oder nicht...

Hier ist der Code, in den ich Ihre Funktion eingefügt habe...

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

Daraufhin habe ich es mit zwei Papieren, ALRS und AFLT, durchgeführt. Die Zecken kamen erst in den letzten Tagen zurück. Für heute keine. Was könnte das sein?

Dateien:
Files.zip  843 kb
 
antru:

Aus irgendeinem Grund werden die Ticks für den aktuellen Tag überhaupt nicht mehr angezeigt, sowohl nach dem alten als auch nach dem neuen Algorithmus... und unabhängig davon, ob das Ribbon im Fenster eingeschaltet ist oder nicht...

Hier ist der Code, in den ich Ihre Funktion eingefügt habe...

Daraufhin habe ich es mit zwei Papieren, ALRS und AFLT, durchgeführt. Die Zecken kamen erst in den letzten Tagen zurück. Für heute keine. Was könnte das sein?

In den Fenstern in der Multifunktionsleiste gibt es Häkchen, ich habe 100000 letzte Häkchen gespeichert - keine Häkchen für heute

Dateien:
Documents.zip  812 kb
 
Aber jetzt sind die Ticks aufgetreten. Was könnte das sein? Wessen Schuld ist das? Der Makler? Metatrader?
Grund der Beschwerde: