Если текущий TimeFrame = M5, то CopyTime / CopyClose для TF = D1 всегда возвращает -1, а Bars - всегда 0 - страница 2

 

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

Поэтому, единственный железный способ инициировать загрузку истории - это программно быстро открыть и закрыть график нужной валюты, но побочный эффект в этом случае описан выше.

Это случается если вызывать функцию Load() на событии OnCalculate().

 
artemiusgreat:

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

Поэтому, единственный железный способ инициировать загрузку истории - это программно быстро открыть и закрыть график нужной валюты, но побочный эффект в этом случае описан выше.

Это случается если вызывать функцию Load() на событии OnCalculate().

Что-то Вы совсем запутались. И это неудивительно, вопрос не простой. ))

Есть все необходимые функции для запроса, проверок, загрузки, получения данных с любого таймфрейма/символа и их отображения на текущем графике. Не надо открывать график, чтобы "железно" всё получить, достаточно правильного запроса и подгрузиться столько, сколько нужно.

Пример из справки в принципе то, что нужно. Изучив его можно понять, как и что нужно делать. Нужно учитывать максимальное количество баров в настройках терминала. Анализируйте ошибки (см. их код) и сразу станет ясно почему возвращается -1 или 0

По двадцать символов пробовал выводить на график без проблем. Есть один глюк правда, но он очень редкий и пока пылится в Сервисдеске. ))

Пример:

 

 
tol64:

Что-то Вы совсем запутались. И это неудивительно, вопрос не простой. ))

Есть все необходимые функции для запроса, проверок, загрузки, получения данных с любого таймфрейма/символа и их отображения на текущем графике. Не надо открывать график, чтобы "железно" всё получить, достаточно правильного запроса и подгрузиться столько, сколько нужно.

Пример из справки в принципе то, что нужно. Изучив его можно понять, как и что нужно делать. Нужно учитывать максимальное количество баров в настройках терминала. Анализируйте ошибки (см. их код) и сразу станет ясно почему возвращается -1 или 0

По двадцать символов пробовал выводить на график без проблем. Есть один глюк правда, но он очень редкий и пока пылится в Сервисдеске. ))

Пример:

 

Если я запутался, то обьясните мне, пожалуйста, как возможна такая ситуация - с функциями из справки я в течение часа ждал загрузки нужного символа, но не дождался, зато при открытии графика загрузка истории происходит за максимум 3 секунды?

Функции CopyX() НЕ инициируют запрос на сервер или инициирует его в необязательном порядке, в какой-то непонятной очереди запросов, увы ... по-другому я обьяснить это не могу.

Почему при открытии графика синхронизация происходит мнгновенно (это уже факт, на первом же тике между прочим)? Там у каждого запроса свой приоритет? Я серьезно, есть же разница - ждать час или 3 секунды ...

Так как мне, похоже, просто не верят я тоже попытаюсь вечером еще раз перепроверить и записать видео :)

 
artemiusgreat:

Если я запутался, то обьясните мне, пожалуйста, как возможна такая ситуация - с функциями из справки я в течение часа ждал загрузки нужного символа, но не дождался, зато при открытии графика загрузка истории происходит за максимум 3 секунды?

Функции CopyX() НЕ инициируют запрос на сервер или инициирует его в необязательном порядке, в какой-то непонятной очереди запросов, увы ... по-другому я обьяснить это не могу.

Почему при открытии графика синхронизация происходит мнгновенно (это уже факт, на первом же тике между прочим)? Там у каждого запроса свой приоритет? Я серьезно, есть же разница - ждать час или 3 секунды ...

Так как мне, похоже, просто не верят я тоже попытаюсь вечером еще раз перепроверить и записать видео :)

Час ждать не нужно. Это значит что, что-то сделано неправильно. )) В справке всего лишь примеры, а дальше нужно с этим работать под свои задачи.

Делайте в цикле несколько запросов пока не получите то, что Вам нужно. Я не использую в чистом виде CheckLoadHistory(). Вместо этого разбил всё на отдельные функции, так намного проще решать проблемы, если они возникают. Вот так это примерно выглядит у меня:

      //--- Если есть невалидный хэндл, попробуем получить его снова
      ...
      //--- Проверяет количество доступных данных у всех символов
      ...
      //--- Проверяет и подкачивает данные с сервера у всех символов
      ...
      //--- Проверим синхронизированность данных по символу/периоду на данный момент
      ...
      //--- Сообщим, если данных меньше, чем период индикатора
      ...
      //--- Если данных для копирования указано больше, чем есть,
      //    будем использовать столько, сколько есть
      ...
      //--- Инициализируем буферы пустыми значениями
      ...
      //--- Определим, с какого бара начинать отрисовку для каждого символа

//---

И после этого можно спокойно работать и лепить из данных всё, что захочешь. ))

 

Возможно из-за того, что сейчас рынок очень активный зарепродюсить ситуацию с йеной не смог, пока решил реализовать таким образом (эта функция дергается каждую секунду по таймеру + по OnCalculate) :

int Load()
{
    for (int i = 0; i < Currencies.Total(); i++)
    {
        CSymbol * s = Currencies.At(i);
        
        Bars(s.Name, _Period);
        
        int countTimes = CopyTime(s.Name, _Period, 0, MaxBars, s.Time);
        int countCloses = CopyClose(s.Name, _Period, 0, MaxBars, s.Close);

        if (countTimes <= 0 || countCloses <= 0)
        {
            if (SeriesInfoInteger(s.Name, _Period, SERIES_SYNCHRONIZED))
            {
                CustomLog(StringFormat("INFO : Waiting for bars for %s", s.Name));
            }
            else
            {
                CustomLog(StringFormat("ERROR : No bars for %s", s.Name));
            }
            
            return(0);
        }
    }

    CustomLog("INFO : History loaded");

    return(1);
}
Причина обращения: