Когда кончатся эти мучения с подкачкой данных? - страница 4

 
Mak
Можно попробовать вот что:
1. Хранить где-то в файле для каждой пары high watermark - до какого бара подкачана история.
2. Написать обертку (wrapper) вокруг ArrayCopySeries, которая делает вот так:
2.1. Если запрашиваемые номера баров все меньше watermark, то вызывать ArrayCopySeries и вернуть результат от ее вызова.
2.2. Если есть бары, номера которых больше watermark, то в цикле делать вот что - вызывать ArrayCopySeries() с паузами в 30 секунд, пока она не вернет результата, соответствующего запросу (проверять либо результат функции, который вроде выдает число скопированных элементов, либо что массив с результатом текущего вызова совпадает с массивом, полученном на прошлом вызове, и при этом не одни нули в результате (массив надо будет наверное заранее обнулить)).
2.3. Номер последнего бара записать как новый watermark.
 
вызывает. но подкачка данных происходит асинхронно. напишите функцию, которая после первого вызова необходимых ArrayCopySeries делает 20-30 секундную задержку и Ваши проблемы с нехваткой данных будут решены

Пробовал, пока не получилось.
Ставил многократный вызов ArrayCopySeries в цикл с задержкой в несколько секунд.
Код возврата от ArrayCopySeries всегда получал одинаковый.
Если тикера в кеше нет, всегда -1.
Если есть, всегда число баров в кеше.

Есть конечно способ для решения этой задачки - использовать какой нибудь Automate, который будет вместо меня сам нажимать на кнопочки терминала, но вы сами понимаете какое это извращение ...
 
Не может ли быть, что если докачать не успеет к моменту следующего вызова, то старый запрос отбрасывается, и генерируется новый?
 
Sfen, есть такая вероятность.
Попробую поставить побольше (пробовал 5 раз по 20 сек).

Но авторам наверное уже должно быть понятно, что это не работа получается,
а борьба с их софтом с попытками заставить его выполнить элементарные действия.
У юзеров вообще-то и без этого проблем хватит ...
 
Вот пример скрипта.
В нем делается 5 попыток загрузить историю с помощью ArrayCopySeries.
После вызова ArrayCopySeries делается пауза в 60 сек.
(проверяю на ADSL 8Mbit)

Результата нет.
Может что в скрипте не так?
//+------------------------------------------------------------------+
//|                                                     DownLoad.mq4 |
//|                                  Copyright © 2005, Yuri Makarov. |
//|                                       http://mak.tradersmind.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Yuri Makarov."
#property link      "http://mak.tradersmind.com"
 
string Sym[] = {"EURUSD","USDCHF","GBPUSD","USDJPY","AUDUSD","USDCAD"};

double Data1[];
double R;
int K;
 
int LoadData(string Symb)
{
   int K = 0;
   int i = 0;
   while(K < Bars && i < 5)
   {
      i++;
      K = ArrayCopySeries(Data1, MODE_CLOSE, Symb);
      if (K < Bars) 
      for (int j = 0; j < 60; j++)
      {
         Comment("Load "+Symb+"["+K+"] ("+i+") - "+j);
         Sleep(1000);
      }
   }
   return(K);
}
 
int start()
{
   for (int j = 0; j < ArraySize(Sym); j++)
   {
      LoadData(Sym[j]);
   }
   Alert("DownLoad Finished ..");
   Comment("Finish ...");
}
 
Mak, авторам страшно тяжело на самом деле. Проект, кажется, несколько перерос группу, которая его разрабатывала. Теперь надо ждать, пока вакансии заполнятся, и через год после этого можно ждать терпимой устойчивости и терпимой документации. Я там видел как раз вакансию на главного тестера и на технического писателя.
Хотя, кажется, не хватает еще и специалиста по архитектуре - я тут попробовал написать спецификацию под эту функцию (какой она должна быть), и понял, что с имеющимися параметрами ничего хорошего ждать не приходится - ее надо или синхронной делать, или лишние параметры вводить. Например, ввести коды ошибок, чтобы можно было отличить ситуацию "нет данных в локальном кэше и при этом нет связи" от "нет данных вообще, ни в кэше, ни на сервере". В принципе с этим тестеры должны столкнуться довольно быстро, но велика опасность, что им просто рот заткнут и скажут каноническое "это не бага, это фича".
 
Mak: мне казалось, что мы про ArrayCopyRates() говорим, а не про ArrayCopySeries(), не?
Да блин. Покурил руководство, но так и не понял, зачем было вводить две функции вместо одной. Они небось еще и по разному работают - одна синхронная, вторая нет :)
 
Mak: мне казалось, что мы про ArrayCopyRates() говорим, а не про ArrayCopySeries(), не?
Да блин. Покурил руководство, но так и не понял, зачем было вводить две функции вместо одной. Они небось еще и по разному работают - одна синхронная, вторая нет :)

эти функции работают одинаково.
функция ArrayCopyRates реализована специально для любителей собственных dll. для того, чтобы можно было одним махом передать во внешнюю функцию все исторические данные и не плодить для этого несколько массивов. у нас даже пример соответствующий есть.
 
Понимаю, что им тяжело.
Поэтому лучший выход (имхо) не вводить в систему новые фичи (типа разных кнопочек), а доводить то что есть до ума.

Уж если ввели работу с сериями и разными символами и таймфреймами, то по крайней мере нужно обеспечить возможность работы с ними (имхо опять же), иначе это почти ненужный баласт получается. ArrayCopySeries так же работает не так, как пишут разработчики, либо только они знают как ее заставить работать правильно (и никому не рассказывают :)).

Насчет докачки.
Наиболее простой (и эффективный, имхо опять же) вариант я уже описывал - синхронный режим при обращении типа Close[1000]. При этом поддерживаемую длину истории можно и ограничить теми же 4096 барами. Думаю это всем юзерам будет понятно и никто возражать не станет. Для этого все в МТ уже есть. Нагрузка на Дата центр от этого не возрастет (имхо). Нужно просто желание разработчиков сделать это.

Коды ошибок там ввести можно (коды возврата ArrayCopySeries < 0), но ассинхронный режим сложно программировать для юзеров, да и не нужен он, ведь подкачка нужна 1 раз при первом запуске скрипта, если этой истории нехватает.
 
Mak, я так и не понял, какое именно место в этом скрипте определяет - сколько мы хотим получить элементов?

Массив double Data1[] - он без определенного числа элементов. До всех вызовов я поставил Print(ArraySize(Data1)) - получается 1 (как это так кстати - в пустом массиве 1 элемент?)

Никаких других чисел, явно указывающих на количество запрашиваемых элементов, я не нашел.
Причина обращения: