Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Можно попробовать вот что:
1. Хранить где-то в файле для каждой пары high watermark - до какого бара подкачана история.
2. Написать обертку (wrapper) вокруг ArrayCopySeries, которая делает вот так:
2.1. Если запрашиваемые номера баров все меньше watermark, то вызывать ArrayCopySeries и вернуть результат от ее вызова.
2.2. Если есть бары, номера которых больше watermark, то в цикле делать вот что - вызывать ArrayCopySeries() с паузами в 30 секунд, пока она не вернет результата, соответствующего запросу (проверять либо результат функции, который вроде выдает число скопированных элементов, либо что массив с результатом текущего вызова совпадает с массивом, полученном на прошлом вызове, и при этом не одни нули в результате (массив надо будет наверное заранее обнулить)).
2.3. Номер последнего бара записать как новый watermark.
Пробовал, пока не получилось.
Ставил многократный вызов ArrayCopySeries в цикл с задержкой в несколько секунд.
Код возврата от ArrayCopySeries всегда получал одинаковый.
Если тикера в кеше нет, всегда -1.
Если есть, всегда число баров в кеше.
Есть конечно способ для решения этой задачки - использовать какой нибудь Automate, который будет вместо меня сам нажимать на кнопочки терминала, но вы сами понимаете какое это извращение ...
Попробую поставить побольше (пробовал 5 раз по 20 сек).
Но авторам наверное уже должно быть понятно, что это не работа получается,
а борьба с их софтом с попытками заставить его выполнить элементарные действия.
У юзеров вообще-то и без этого проблем хватит ...
В нем делается 5 попыток загрузить историю с помощью ArrayCopySeries.
После вызова ArrayCopySeries делается пауза в 60 сек.
(проверяю на ADSL 8Mbit)
Результата нет.
Может что в скрипте не так?
Хотя, кажется, не хватает еще и специалиста по архитектуре - я тут попробовал написать спецификацию под эту функцию (какой она должна быть), и понял, что с имеющимися параметрами ничего хорошего ждать не приходится - ее надо или синхронной делать, или лишние параметры вводить. Например, ввести коды ошибок, чтобы можно было отличить ситуацию "нет данных в локальном кэше и при этом нет связи" от "нет данных вообще, ни в кэше, ни на сервере". В принципе с этим тестеры должны столкнуться довольно быстро, но велика опасность, что им просто рот заткнут и скажут каноническое "это не бага, это фича".
Да блин. Покурил руководство, но так и не понял, зачем было вводить две функции вместо одной. Они небось еще и по разному работают - одна синхронная, вторая нет :)
Да блин. Покурил руководство, но так и не понял, зачем было вводить две функции вместо одной. Они небось еще и по разному работают - одна синхронная, вторая нет :)
эти функции работают одинаково.
функция ArrayCopyRates реализована специально для любителей собственных dll. для того, чтобы можно было одним махом передать во внешнюю функцию все исторические данные и не плодить для этого несколько массивов. у нас даже пример соответствующий есть.
Поэтому лучший выход (имхо) не вводить в систему новые фичи (типа разных кнопочек), а доводить то что есть до ума.
Уж если ввели работу с сериями и разными символами и таймфреймами, то по крайней мере нужно обеспечить возможность работы с ними (имхо опять же), иначе это почти ненужный баласт получается. ArrayCopySeries так же работает не так, как пишут разработчики, либо только они знают как ее заставить работать правильно (и никому не рассказывают :)).
Насчет докачки.
Наиболее простой (и эффективный, имхо опять же) вариант я уже описывал - синхронный режим при обращении типа Close[1000]. При этом поддерживаемую длину истории можно и ограничить теми же 4096 барами. Думаю это всем юзерам будет понятно и никто возражать не станет. Для этого все в МТ уже есть. Нагрузка на Дата центр от этого не возрастет (имхо). Нужно просто желание разработчиков сделать это.
Коды ошибок там ввести можно (коды возврата ArrayCopySeries < 0), но ассинхронный режим сложно программировать для юзеров, да и не нужен он, ведь подкачка нужна 1 раз при первом запуске скрипта, если этой истории нехватает.
Массив double Data1[] - он без определенного числа элементов. До всех вызовов я поставил Print(ArraySize(Data1)) - получается 1 (как это так кстати - в пустом массиве 1 элемент?)
Никаких других чисел, явно указывающих на количество запрашиваемых элементов, я не нашел.