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

 

Weiterer Kampf für Verbesserungen: Zecken, Zugang zu Zecken und Synchronisierung von Zecken. @Slawa, @Renat Fatkhullin und die für Zecken zuständigen Personen, bitte beteiligen Sie sich an der Diskussion. Ich denke, wir werden mehr als einen Fehler finden. Ich denke auch, dass es für @fxsaber, @coderex und andere Zeckenbenutzer interessant sein wird.

Fangen wir an:

1. In der Dokumentation von ME Build 1486 findet sich kein Wort über die neue Funktion CopyTicksRange(). Die Website ist nicht sehr nützlich. Fügen Sie dies bitte in die Dokumentation des Herausgebers ein;

2. Beim Versuch, Ticks über CopyTicksRange() anzufordern:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000 );

Wir erhalten ständig -1 und den Fehler #4401 "angeforderter Verlauf nicht gefunden". Und so sollte es auch sein:

Если параметр to_msc не указан, то отдаются все тики до конца истории.

Der Code steht vollständig unten:

//+------------------------------------------------------------------+
//|                                          test_CopyTicksRange.mq5 |
//|                                                         Tapochun |
//|                           https://www.mql5.com/ru/users/tapochun |
//+------------------------------------------------------------------+
#property copyright "Tapochun"
#property link      "https://www.mql5.com/ru/users/tapochun"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//---
#include <errordescription.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input datetime inpStartTime=__DATE__;   // Время начала загрузки истории
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

   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[])
  {
   if(prev_calculated<=0)
     {
      //---
      UseCopyTicksRange();
      //---
      UseCopyTicks();
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void UseCopyTicksRange()
  {
   MqlTick ticks[];
//--- Замеряем время старта перед получением тиков
   ulong start=GetMicrosecondCount();
//--- Запрашиваем тиковую историю
   int copied=CopyTicksRange(_Symbol,ticks,COPY_TICKS_TRADE,inpStartTime*1000);
//--- Рассчитаем, за сколько мс получена история
   ulong msc=GetMicrosecondCount()-start;
//--- Проверяем количество скопированных тиков
   if(copied>0) // Если история получена
     {
      //--- Выведем информацию о количестве тиков и затраченном времени
      Print(__FUNCTION__,": Получено ",copied," тиков за ",msc," мкс");
      //--- Проверка синхронизации тиковой истории
      if(GetLastError()==0) // Если история синхронизирована
        {
         //--- Выходим
         return;
        }
      else                                     // Если история рассинхронизирована - сообщение
        {
         Print(__FUNCTION__,": Получено ",copied," тиков за ",msc," мкс. Тики еще не синхронизированы!");
         return;
        }
     }
   else if(copied==0) // Если получено 0 тиков - сообщение
      Print(__FUNCTION__,": ВНИМАНИЕ! Получено 0 тиков. Возможно установлен некорректный параметр from ("+
            TimeToString(inpStartTime,TIME_DATE|TIME_SECONDS)+".",inpStartTime*1000%1000,"). Текущее время "+TimeToString(TimeCurrent()));
   else                                        // Если тики не получены - ошибка
   Print(__FUNCTION__,": ОШИБКА #",GetLastError()," ("+ErrorDescription(_LastError)+"). Тики не получены!");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void UseCopyTicks()
  {
   MqlTick ticks[];
//--- Замеряем время старта перед получением тиков
   ulong start=GetMicrosecondCount();
//--- Запрашиваем тиковую историю
   int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_TRADE,inpStartTime*1000,10000000);
//--- Рассчитаем, за сколько мс получена история
   ulong msc=GetMicrosecondCount()-start;
//--- Проверяем количество скопированных тиков
   if(copied>0) // Если история получена
     {
      //--- Выведем информацию о количестве тиков и затраченном времени
      Print(__FUNCTION__,": Получено ",copied," тиков за ",msc," мкс");
      //--- Проверка синхронизации тиковой истории
      if(GetLastError()==0) // Если история синхронизирована
        {
         //--- Выходим
         return;
        }
      else                                     // Если история рассинхронизирована - сообщение
        {
         Print(__FUNCTION__,": Получено ",copied," тиков за ",msc," мкс. Тики еще не синхронизированы!");
         return;
        }
     }
   else if(copied==0) // Если получено 0 тиков - сообщение
      Print(__FUNCTION__,": ВНИМАНИЕ! Получено 0 тиков. Возможно установлен некорректный параметр from ("+
            TimeToString(inpStartTime,TIME_DATE|TIME_SECONDS)+".",inpStartTime*1000%1000,"). Текущее время "+TimeToString(TimeCurrent()));
   else                                        // Если тики не получены - ошибка
   Print(__FUNCTION__,": ОШИБКА #",GetLastError()," ("+ErrorDescription(_LastError)+"). Тики не получены!");
  }
//+------------------------------------------------------------------+

CopyTicks() liefert das richtige Ergebnis.

Dateien:
 

Es gibt überhaupt keine Möglichkeit, die Geschichte zu erfahren. Ich habe das ausprobiert:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE );

Ich habe das ausprobiert:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, 0, inpStartTime*1000 );

Ich habe es versucht:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000 );

Ich habe es versucht:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000, (inpStartTime+72000)*1000 );

Die Antwort ist immer die gleiche:

2016.11.30 21:36:45.872 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:45.965 UseCopyTicks: Получено 288181 тиков за 93009 мкс
2016.11.30 21:36:47.908 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:48.011 UseCopyTicks: Получено 288186 тиков за 102971 мкс
2016.11.30 21:36:49.992 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:50.090 UseCopyTicks: Получено 288189 тиков за 98423 мкс

Ausprobiert mit VTBR-12.16, BR-12.16, RTS-12.16-Futures und mit COPY_TICKS_ALL-Ticks - gleiches Ergebnis. Liebe Entwickler, wollt ihr die Benutzer verarschen? Oder sind Sie es einfach leid, Ihre Entwicklungen vor der Veröffentlichung zu testen?

 
Wenn Sie den Indikator bei jedem Tick ausführen, erhalten Sie dasselbe Ergebnis. Es wird keine Geschichte empfangen.
 
Ich habe das Ticken des Symbols gedrosselt - es hat nicht geholfen.
 
Alexey Kozitsyn:

Es gibt überhaupt keine Möglichkeit, die Geschichte zu erfahren. Ich habe dies versucht:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE );

Ich habe dies versucht:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, 0, inpStartTime*1000 );

Ich habe es versucht:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000 );

Ich habe es versucht:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000, (inpStartTime+72000)*1000 );

Die Antwort ist immer die gleiche:

2016.11.30 21:36:45.872 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:45.965 UseCopyTicks: Получено 288181 тиков за 93009 мкс
2016.11.30 21:36:47.908 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:48.011 UseCopyTicks: Получено 288186 тиков за 102971 мкс
2016.11.30 21:36:49.992 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:50.090 UseCopyTicks: Получено 288189 тиков за 98423 мкс

Ausprobiert mit VTBR-12.16, BR-12.16, RTS-12.16-Futures und mit COPY_TICKS_ALL-Ticks - gleiches Ergebnis. Liebe Entwickler, wollt ihr die Benutzer verarschen? Oder sind Sie es einfach leid, Ihre Entwicklungen vor der Veröffentlichung zu testen?

 

Demotivator Es ist die 100. Änderung und es funktioniert immer noch nicht...

http://demotivatorium.ru/sstorage/3/2012/03/2703120956251657.jpg
 
Alexey Kozitsyn:

Es gibt überhaupt keine Möglichkeit, die Geschichte zu erfahren. Ich habe dies versucht:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE );

Ich habe dies versucht:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, 0, inpStartTime*1000 );

Ich habe es versucht:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000 );

Ich habe es versucht:

//--- Запрашиваем тиковую историю
int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_TRADE, inpStartTime*1000, (inpStartTime+72000)*1000 );

Die Antwort ist immer die gleiche:

2016.11.30 21:36:45.872 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:45.965 UseCopyTicks: Получено 288181 тиков за 93009 мкс
2016.11.30 21:36:47.908 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:48.011 UseCopyTicks: Получено 288186 тиков за 102971 мкс
2016.11.30 21:36:49.992 UseCopyTicksRange: ОШИБКА #4401 (Запрашиваемая история не найдена). Тики не получены!
2016.11.30 21:36:50.090 UseCopyTicks: Получено 288189 тиков за 98423 мкс

Ausprobiert mit VTBR-12.16, BR-12.16, RTS-12.16-Futures und mit COPY_TICKS_ALL-Ticks - gleiches Ergebnis. Liebe Entwickler, wollt ihr die Benutzer verarschen? Oder sind Sie es einfach leid, Ihre Entwicklungen vor der Veröffentlichung zu testen?

 

Wer nicht arbeitet, isst Student

https://www.youtube.com/watch?v=yMit_zQnqlo

 

Ich glaube, es ist nur ein Fehler in der Web-Dokumentation, in ME ist es wirklich noch leer. Oder die Funktion ist noch in der Entwicklung. Zweitens: Sie fordern Daten von irgendwoher aus dem Jahr 1970 an und wundern sich, dass die Zecken aus dem letzten Jahrhundert nicht zurückkommen ))!!! Was rauchen Sie da?

So funktioniert es.

void OnStart()
{
    datetime dt1 = D'2016.11.28 00:00:00', dt2 = D'2016.11.30 00:00:00';
    MqlTick ticks[];
    ulong start, msc;
    //--- Замеряем время старта перед получением тиков
    start=GetMicrosecondCount();
    int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_ALL, dt1*1000, dt2*1000);
//--- Рассчитаем, за сколько мс получена история
    msc=GetMicrosecondCount()-start;
    Print("copied=", copied, "   msc=", msc);
    return;
}

// вывод
2016.12.01 04:52:08.134 TestCopyTicks (EURUSD.m,M15)    copied=333081   msc=1294871
2016.12.01 04:52:16.877 TestCopyTicks (EURUSD.m,M15)    copied=333081   msc=318596

***

 
Alexey Volchanskiy:

Ich glaube, es ist nur ein Fehler in der Web-Dokumentation, es ist wirklich noch nicht in ME. Oder die Funktion ist noch in der Entwicklung. Zweitens: Sie fordern Daten von irgendwoher aus dem Jahr 1970 an und wundern sich, dass die Zecken aus dem letzten Jahrhundert nicht zurückkommen ))!!! Was rauchen Sie da?

So funktioniert es.

void OnStart()
{
    datetime dt1 = D'2016.11.28 00:00:00', dt2 = D'2016.11.30 00:00:00';
    MqlTick ticks[];
    ulong start, msc;
    //--- Замеряем время старта перед получением тиков
    start=GetMicrosecondCount();
    int copied = CopyTicksRange( _Symbol, ticks, COPY_TICKS_ALL, dt1*1000, dt2*1000);
//--- Рассчитаем, за сколько мс получена история
    msc=GetMicrosecondCount()-start;
    Print("copied=", copied, "   msc=", msc);
    return;
}

// вывод
2016.12.01 04:52:08.134 TestCopyTicks (EURUSD.m,M15)    copied=333081   msc=1294871
2016.12.01 04:52:16.877 TestCopyTicks (EURUSD.m,M15)    copied=333081   msc=318596

***

Alexey, danke, dass du dich an den Tests beteiligt hast. Wie Sie sehen können, habe ich es sowohl von einem bestimmten Datum als auch bis zu einem bestimmten Datum und ohne Datum versucht. Aber der Punkt ist: 1. ich habe __DATE__ verwendet und es scheint Probleme mit Makro-Substitutionen zu geben; 2. ich habe mit Futures getestet; Ja, wenn man sich die Dokumentation ansieht - es sollte zumindest mit dem Laden von Ticks begonnen haben. Aber es passiert nichts.

Haben Sie versucht, meinen Indikator in Ihrer Umgebung auszuführen?