Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д. - страница 10

 
fxsaber:

Глупость.

+1
 
fxsaber:

Глупость.

До тех пор, покуда "внезапно"(с) не встает вопрос ограниченной производительности системы(не принципиально какой). 

 

Эти дни присматривался к работает OnCalculate и обработке тиковых данных. Ранее писалось, что все делается для избежания "заморозки" криво написанных индикаторов, но если и в самом деле нужно обрабатывать весь поток тиковых данных с момента предыдущего вызова OnCalculate, то при стремительном движении(и откате) цены мы должны получить достаточно "глубокий" массив, есть ли ограничения на глубину тикового массива?

Не хотелось бы услышать ответ, типа "в OnCalculate при такой ситуации, будет получен аккумулирующий тик(и)..., для оптимизации ...". 

Кто уже занимается анализом тиковых данных, если ли основания для подобных опасений?

 
Farkhat Guzairov:

Эти дни присматривался к работает OnCalculate и обработке тиковых данных. Ранее писалось, что все делается для избежания "заморозки" криво написанных индикаторов, но если и в самом деле нужно обрабатывать весь поток тиковых данных с момента предыдущего вызова OnCalculate, то при стремительном движении(и откате) цены мы должны получить достаточно "глубокий" массив, есть ли ограничения на глубину тикового массива?

Не хотелось бы услышать ответ, типа "в OnCalculate при такой ситуации, будет получен аккумулирующий тик(и)..., для оптимизации ...". 

Кто уже занимается анализом тиковых данных, если ли основания для подобных опасений?

В 2008-2009 Ренат както написал, что в тиках счастья нет, приводил пример эксперта. Тики и так пропускаются. Если надо, то на каждом вызове  получайте https://www.mql5.com/ru/docs/series/copyticks , но желаемую для входа вершину/впадину 50/50 все равно  пропустите.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
[in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики...
 

Я здесь пожалуй для массовки отмечусь. Уже месяц пытаюсь понять, почему перестало работать вот это:

long lastbardaytime=0;

int OnInit(){ 
}

bool isNewBar(string symbol_,ENUM_TIMEFRAMES period_){
    long curbar = SeriesInfoInteger(symbol_,period_,SERIES_LASTBAR_DATE)%86400;
    if(lastbardaytime == 0){
        lastbardaytime = curbar;
    }
    if(lastbardaytime != curbar){
        lastbardaytime = curbar;
        return(true);
    }
    return(false);
}


void OnTick(){
    if(isNewBar(MIX-12.18,PERIOD_M1)){ 
        Print("New bar");
///....
    }
} 


Ждем новый релиз на Открытии.

 

Возобновляю вопросы связанные с оптимизацией и загрузкой исторических данных.

1. Проблема корректной работы функций из набора iClose/iOpen, а данном случае iTime существует и думаю ожидать, что будет все идеально наверное нету смысла. Тогда может их просто убрать из MQL5, чтобы мы лишний раз не наступали на одни и те же грабли? (есть проблема но описывать нету времени, так как нашел решение , очередной "выверташь")

2. Быть может есть какое-то решение, но хотелось бы чтобы оно было документированным, а не очередной выверташь сообщества MQL5. Речь идет о том, как нам быть с асинхронными запросами, которые в свою очередь синхронизируют локальные БД  к примеру:

В индикаторах функция CopyTicks() возвращает результат немедленно: При вызове из индикатора CopyTick() сразу же вернёт доступные по символу тики, а также запустит синхронизацию базы тиков, если данных не хватило. Все индикаторы на одном символе работают в одном общем потоке, поэтому  индикатор не имеет права ждать завершения синхронизации. После окончания синхронизации при последующем вызове CopyTicks() вернёт все запрашиваемые тики. Функция OnCalculate() в индикаторах вызывается после поступления каждого тика.


Ключевая фраза "После окончания синхронизации при последующем вызове CopyTicks() вернёт все запрашиваемые тики.", господа как узнать об окончании синхронизации??? Написано так, будто до окончании синхронизации CopyTicks() возвращает к примеру -1, но это не так. Как результат после нескольких перезагрузок индикатора БД синхронизируется и мы действительно получаем весь набор данных, но если я не буду индикатор передергивать то и не получу этот набор, так как я не знаю результата завершения этой чертовой синхронизации.

Ярким примером стали прошедшие стуки, по EURUSD было резкое движение, хоть индикатор и был все это время включен и как бы нормально отрисовал этот период, но после того как его перезагрузил(изменил входные параметры), индикатор стал отражать информацию не корректно, соответственно начались поиски ошибок в индикаторе(несколько раз перекомпилил и перегрузил) но ничего не помогало, а потом произошло то самое "чудо", "При вызове из индикатора CopyTick() сразу же вернёт доступные по символу тики, а также запустит синхронизацию базы тиков", быть может все таки стоит создать(или есть) функция которая может нам подсказать, что в текущий момент синхронизация локальной БД не завершена, эта функция облегчила бы нам задачу и свою очередь позволила бы писать более качественный коненчный продукт для Маркета.

P.S.: Функция SymbolInfoTick к сожалению не обладает таким функционалом.

 

К сожалению, данный пример не всегда работает:

//--- запросим тиковую историю с момента 1970.01.01 00:00.001 (параметр from=1 ms) 
      int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks); 
      if(received!=-1) 
        { 
         //--- выведем информацию о количестве тиков и затраченном времени времени 
         PrintFormat("%s: received %d ticks in %d ms",_Symbol,received,GetTickCount()-start); 
         //--- если тиковая история синхронизирована, то код ошибки равен нулю 
         if(GetLastError()==0) 
           { 
            success=true; 
            break; 
           } 
         else 
            PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", 
            _Symbol,received,GetTickCount()-start,_LastError); 
        } 

А точнее работает 1-2 раза из 10 случаев.

Но в выше описанной ситуации не сработал ни разу.

 

Опять же вопрос, БД обновляется в реалтайме?

Как писал выше, весь период что был проблемным, индикатор работал, т.е. вызов функции CopyTicks() осуществлялся регулярно, но как выясняется это никак не влияло на локальную БД.... Это странно....

 
Unicornis:

В 2008-2009 Ренат както написал, что в тиках счастья нет, приводил пример эксперта. Тики и так пропускаются. Если надо, то на каждом вызове  получайте https://www.mql5.com/ru/docs/series/copyticks , но желаемую для входа вершину/впадину 50/50 все равно  пропустите.

Кому нет, а кому архиважно :) иметь актуальные данные в частности тиковые .
 
Farkhat Guzairov:

Возобновляю вопросы связанные с оптимизацией и загрузкой исторических данных.

1. Проблема корректной работы функций из набора iClose/iOpen, а данном случае iTime существует и думаю ожидать, что будет все идеально наверное нету смысла. Тогда может их просто убрать из MQL5, чтобы мы лишний раз не наступали на одни и те же грабли? (есть проблема но описывать нету времени, так как нашел решение , очередной "выверташь")

2. Быть может есть какое-то решение, но хотелось бы чтобы оно было документированным, а не очередной выверташь сообщества MQL5. Речь идет о том, как нам быть с асинхронными запросами, которые в свою очередь синхронизируют локальные БД  к примеру:

В индикаторах функция CopyTicks() возвращает результат немедленно: При вызове из индикатора CopyTick() сразу же вернёт доступные по символу тики, а также запустит синхронизацию базы тиков, если данных не хватило. Все индикаторы на одном символе работают в одном общем потоке, поэтому  индикатор не имеет права ждать завершения синхронизации. После окончания синхронизации при последующем вызове CopyTicks() вернёт все запрашиваемые тики. Функция OnCalculate() в индикаторах вызывается после поступления каждого тика.


Ключевая фраза "После окончания синхронизации при последующем вызове CopyTicks() вернёт все запрашиваемые тики.", господа как узнать об окончании синхронизации??? Написано так, будто до окончании синхронизации CopyTicks() возвращает к примеру -1, но это не так. Как результат после нескольких перезагрузок индикатора БД синхронизируется и мы действительно получаем весь набор данных, но если я не буду индикатор передергивать то и не получу этот набор, так как я не знаю результата завершения этой чертовой синхронизации.

Ярким примером стали прошедшие стуки, по EURUSD было резкое движение, хоть индикатор и был все это время включен и как бы нормально отрисовал этот период, но после того как его перезагрузил(изменил входные параметры), индикатор стал отражать информацию не корректно, соответственно начались поиски ошибок в индикаторе(несколько раз перекомпилил и перегрузил) но ничего не помогало, а потом произошло то самое "чудо", "При вызове из индикатора CopyTick() сразу же вернёт доступные по символу тики, а также запустит синхронизацию базы тиков", быть может все таки стоит создать(или есть) функция которая может нам подсказать, что в текущий момент синхронизация локальной БД не завершена, эта функция облегчила бы нам задачу и свою очередь позволила бы писать более качественный коненчный продукт для Маркета.

P.S.: Функция SymbolInfoTick к сожалению не обладает таким функционалом.

Что возвращает SERIES_SYNCHRONIZED в таких случаях?