Итак. Вводные данные. Выбираем инструмент который до этого не использовали, ну я выбрал "EuM1" График инструмента не открываем, в заказе котировок указано "по выбранным классам" и данный инструмент не выбран, в папке archive файла с таким инструментам тоже нет. Другими словами, QUIK пока еще никогда не получал данный инструмент.
Пишу простенький скриптик
Код
is_run=true
function main()
ds=CreateDataSource("SPBFUT","EuM1",INTERVAL_M5)
-- ds:SetEmptyCallback()
while(ds:Size()==0) do sleep(100) end
while is_run do
message("C="..ds:C(ds:Size()))
sleep(1000)
end
end
function OnStop()
is_run=false
return 100
end
...и он работает, данные обновляются. Но почему данные обновляются? Я же закомментил ds:SetEmptyCallback()
Всегда думал, что SetEmptyCallback() нужна для того чтобы поток данных обновлялся, но оказывается что нет.
Прошу знающих объяснить, зачем все таки нужна функция SetEmptyCallback()?
Артем написал: BlaZed, при умном заказе без этой функции получение новых данных определенно не работает, только из открытого графика.
Проверил только что - работает даже при умном заказе при закрытом графике, потому и вопрос задал. Просто возникло ощущение, что SetEmptyCallback() стала не нужна.
rpns написал: Кстати, и без вызова SetEmptyCallback. Зачем он тогда?)
Он нужен для подписки на данные. Ровно эту же подписку можно выполнить через терминал, открыв нужный график. Если Вы откроете график то по сути SetEmptyCallback не нужен, данные и так будут поступать. Но не всем удобно открывать графики, по этому существует SetEmptyCallback.
Sergey Gorokhov написал: На самом деле, заказ данных после CreateDataSource происходит независимо от заданного коллбэка. Для данных на основании обезличенных сделок будут получаться все данные, Для данных ТТТ в зависимости от настроек терминала для получения ТТТ, т.е. если получение пропущенных данных выключено, то будут доступны только новые данные ТТТ.
Владимир, это вы просто не умеете их готовить ))) Я вот часовые свечки дергаю используя CreateDataSource, и никакого атавизма в этом не замечаю, все работает.
BlaZed, О! А Вы - умеете готовить? А ну, шайбу! Мне нужны свечи (хотя бы последние) от 15 минут и выше, вплоть до месячных. Мелочь я сам считаю, до часовых (0.25, 0.5, 1, 2, 4, 8, 16, 32, 64 минуты). И это примерно по полутора тысячам тикеров (чуть больше). А ну, хто здесь Великий Кулинар?
Владимир, Не ожидал Тут же даже кулинарить нечего, все и так очевидно
Создать датасурс и выдернуть из него последнюю свечу проблем нет никаких (см. пример в первом посте). А как в цикле пробежаться по заданным интервалам и инструментам думаю сами догадаетесь.
BlaZed, Нет, самому мне до такого вовек не догадаться! Так КАК ИМЕННО нужно делать? Мне вот совершенно не очевидно! Вернее, мне очевидно, что любой решение будет называться "ППЦ". А вопрос к меня именно в том: Как получить все эти свечи? Лично я решения не вижу ВААПЩЕ.
Понимаю, старость не радость, но вы там держитесь, не унывайте...
Special for you
Код
function main()
ds={}
intervals={INTERVAL_M15,INTERVAL_M30,INTERVAL_H1,INTERVAL_H2,INTERVAL_H4,INTERVAL_D1}
tikers={{"SPBFUT","SiZ1"},{"SPBFUT","SiH2"},{"SPBFUT","SiM2"},{"SPBFUT","SiU2"}}
for i=1,#intervals do
for j=1,#tikers do
ds[tikers[j][1]]=ds[tikers[j][1]] or {}
ds[tikers[j][1]][tikers[j][2]]=ds[tikers[j][1]][tikers[j][2]] or {}
ds[tikers[j][1]][tikers[j][2]][intervals[i]]=CreateDataSource(tikers[j][1],tikers[j][2],intervals[i])
while(ds[tikers[j][1]][tikers[j][2]][intervals[i]]:Size()==0) do sleep(1) end
end
end
-- Пример получения свечи
local need_ds=ds["SPBFUT"]["SiZ1"][INTERVAL_H1]
local size=need_ds:Size()
message("O="..need_ds:O(size).." H="..need_ds:H(size).." L="..need_ds:L(size).." C="..need_ds:C(size))
end
Ну, начнём с того, что тикеров у меня не 4, а на сегодняшний момент 1529, и их состав немного "плавает", и код скрипта это, разумеется, никак не затрагивает. Интервалов у меня тоже вдвое больше - мелкие свечи я считаю сам, но они ведь тоже должны где-то храниться и далее обрабатываться по общему алгоритму..
Теперь инициализация: что делает хреновина вида "ds[tikers[j][1]]=ds[tikers[j][1]] or {}" я не знаю, да и знать не хочу. Для меня не подлежит сомнению, что обращение к данным тикера должно быть по его айдишке (его порядковому номеру в таблице), а уже в полях этой таблицы должен лежать и код тикера, и код класса, его валюта, статус, количество закупленных лотов, размер лота и вся прочая хрень. В том числе, одно из этих полей должно содержать информацию о свечах по разным таймфреймам: младшую часть я инициализирую и поддерживаю в актуальном состоянии сам, а вот вторая половина должна получать её как раз через CreateDataSource. Итак, мне предлагается при старте вызвать эту конструкцию 1529*8=12232 раза, а уж опосля... впрочем, что-то мне подсказывает, что никакого "опосля" уже не будет - на этом скрипт и сдохнет.
Теперь насчёт Size: СКОЛЬКО свечей она мне даст по каждому интервалу? Повторяю: мне нужна ОДНА, последняя. Ну, для страховки, ДВЕ. А эта падла сколько их туда насуёт? И, насколько я понимаю, будет всё время дописывать? Или даже и дописывать не будет?
Нет, я не понимаю: Вы ВСЕРЬЁЗ предлагаете подобную хрень реализовать или прикалываетесь?
BlaZed написал: Владимир, Не ожидал :: Тут же даже кулинарить нечего, все и так очевидно
Создать датасурс и выдернуть из него последнюю свечу проблем нет никаких (см. пример в первом посте). А как в цикле пробежаться по заданным интервалам и инструментам думаю сами догадаетесь.
Вопрос то у вас в чем?
вообще-то Вы ошибаетесь Свеча - это четыре индикатора цены и один объема. Т е для любого интервала надо считать close,Low, High, Volume. Просто Выдернуть не получится . --------------------- Open - это первая свеча после открытия интервала High и Low - это локальные экстремумы на данном интервале Value - сумма значений на интервале Close - это последняя сделка перед закрытием интервала. ------------------- На мало ликвидном рынке надо учитывать тот факт, что на интервале может не быть сделок вообще. --------------------- А теперь все это для различных интервалов и множества инструментов. Когда писал это чудо. Попробуйте написать. ------------------------------- Полагаю, что вопрос в этом.
Ну, начнём с того, что тикеров у меня не 4, а на сегодняшний момент 1529, и их состав немного "плавает", и код скрипта это, разумеется, никак не затрагивает. Интервалов у меня тоже вдвое больше - мелкие свечи я считаю сам, но они ведь тоже должны где-то храниться и далее обрабатываться по общему алгоритму..
Теперь инициализация: что делает хреновина вида "ds[tikers[j][1]]=ds[tikers[j][1]] or {}" я не знаю, да и знать не хочу. Для меня не подлежит сомнению, что обращение к данным тикера должно быть по его айдишке (его порядковому номеру в таблице), а уже в полях этой таблицы должен лежать и код тикера, и код класса, его валюта, статус, количество закупленных лотов, размер лота и вся прочая хрень. В том числе, одно из этих полей должно содержать информацию о свечах по разным таймфреймам: младшую часть я инициализирую и поддерживаю в актуальном состоянии сам, а вот вторая половина должна получать её как раз через CreateDataSource. Итак, мне предлагается при старте вызвать эту конструкцию 1529*8=12232 раза, а уж опосля... впрочем, что-то мне подсказывает, что никакого "опосля" уже не будет - на этом скрипт и сдохнет. ::
Теперь насчёт Size: СКОЛЬКО свечей она мне даст по каждому интервалу? Повторяю: мне нужна ОДНА, последняя. Ну, для страховки, ДВЕ. А эта падла сколько их туда насуёт? И, насколько я понимаю, будет всё время дописывать? Или даже и дописывать не будет?
Нет, я не понимаю: Вы ВСЕРЬЁЗ предлагаете подобную хрень реализовать или прикалываетесь?
Реализуется это примерно так. Надо читать с сервера самый мелкий интервал. Долее на каждый тик будет примерно 10 операторов Считаем всегда последнюю. Сохраняем столько , сколько надо. Если надо одну то в архиве будет всегда одна на каждый инструмент и одна - открытая
На самом деле Вам не надо вызывать 1529*8=12232 раза так как список Ваших инструментов грузится при старте и отображается в текущей таблице. У Вас будет проблема со скоростью вашего железа. Но полагаю , если Вы торгуете по 1529 инструментам, то у вас железо должно быть очень крутое. На рынке халявы нет и на плохом железе нечего делать с таким количеством тикиров.
Владимир написал: Нет, я не понимаю: Вы ВСЕРЬЁЗ предлагаете подобную хрень реализовать или прикалываетесь?
Побойтесь бога, зачем мне вам что-то предлагать? Это была демонстрация работоспособности CreateDataSource, на основе которой можно уже реализовать что-либо интересное, но вы это не смогли понять.Или вы думали, что я вам тут полноценного робота со всеми вашими хотелками предоставлю? Ну нафиг...
Цитата
Владимир написал: что делает хреновина вида "ds[tikers[j][1]]=ds[tikers[j][1]] or {}" я не знаю, да и знать не хочу
nikolz, Лапуль, ну не путайтесь Вы под ногами, не засирайте ветку - дайте с человеком поговорить!
BlaZed, Это была демонстрация абсолютной НЕработоспособности CreateDataSource, на основе которой ВААПЩЕ НЕЛЬЗЯ "реализовать что-либо интересное", такой способ доступа к данным - это КРЕТИНИЗМ! Не говоря уже о том, что функция эта относится к разделу работы с графиками. С нею невозможно работать при ЛЮБОМ коде, даже вылизанным до последней запятой.
Цитата
Вы таки гордитесь тем что не знаете LUA?
Во-первых, Lua я знаю. Мало того: я здесь чуть ли не единственный, кто пишет на чистом Lua. Я имел в виду, что оператор этот дурацкий, я так никогда не делал, и делать не буду.
Цитата
Ну вот реально зачем считать самостоятельно свечи, если их можно брать готовыми?
Во-первых, свечи у меня начинаются с 15-секундных. Во-вторых, они считаются по-другому: я уже не раз говорил, что классические мат. ожидание и дисперсия в миллион равз информативнее всей этой "японской" дребедени. В-третьих, Вы не ответили на мой вопрос: СКОЛЬКО свечей она мне даст по каждому интервалу? И что она будет делать при появлении очередной свечи? Будет всё время дописывать? Или даже и дописывать не будет?
Владимир написал: Это была демонстрация абсолютной НЕработоспособности CreateDataSource
Неработоспособности? Может вы забыли запустить скрипт? Кто-то не умеет работать с данной функцией, кто-то умеет. А на вкус и цвет, как говорится, все фломастеры разные.
Цитата
Владимир написал: на основе которой ВААПЩЕ НЕЛЬЗЯ "реализовать что-либо интересное", такой способ доступа к данным - это КРЕТИНИЗМ!
Опять я наблюдаю столь категоричные высказывания от вас Вы хоть как-то аргументируйте свою позицию-то, а то спорить скучно.
Цитата
Владимир написал: Не говоря уже о том, что функция эта относится к разделу работы с графиками.
Тут согласен, но это уже вопрос терминологии, а не программирования.
Цитата
Владимир написал: С нею невозможно работать при ЛЮБОМ коде, даже вылизанным до последней запятой.
Як так??? Да вы ради интереса хоть попробуйте поработать что ли, а то получается классическое "не читал, но осуждаю".
Цитата
Владимир написал: Во-первых, Lua я знаю. Мало того: я здесь чуть ли не единственный, кто пишет на чистом Lua.
На чистом LUA?? Да быть такого не может! Вы LUA и QLUA не путаете случаем?
Цитата
Владимир написал: Я имел в виду, что оператор этот дурацкий, я так никогда не делал, и делать не буду.
Чем это обычный логический оператор OR то провинился? Прекрасный оператор на мой взгляд, как минимум ни чуть не хуже чем AND и NOT. Кстати, вы знали что в LUA оказывается нет оператора XOR? Мне, например, в свое время его очень не хватало для работы с битовыми флагами.
Цитата
Владимир написал: Во-первых, свечи у меня начинаются с 15-секундных.
А я это и упомянул, что самостоятельно считать свечи стоит только для нестандартных интервалов.
Цитата
Владимир написал: Во-вторых, они считаются по-другому: я уже не раз говорил, что классические мат. ожидание и дисперсия в миллион равз информативнее всей этой "японской" дребедени.
Звучит логично. Поверю на слово, мне лень проверять.
Цитата
Владимир написал: В-третьих, Вы не ответили на мой вопрос: СКОЛЬКО свечей она мне даст по каждому интервалу?
Формирует 3000 последних свечей, но может дать больше, если ранние свечи уже есть в истории терминала
Цитата
Владимир написал: И что она будет делать при появлении очередной свечи? Будет всё время дописывать? Или даже и дописывать не будет?
Создаст свечу с новым индексом и будет обновлять ее данные, пока не появится следующая свеча.
BlaZed, Да я даже пробовать не хочу - я и так уверен, что если заказать источники данных 10 тысяч раз, то Квик сдохнет. Он и не от такого падает! А функция эта дурацкая, вне зависимости от того, умеет ли кто с ней работать или нет.
ДА?! А ну, покажись кто-нибудь, кому эта функция НРАВИТСЯ? У кого там такой "вкус и цвет"? Неужели такие водятся?
Господи, да я миллион раз аргументировал свою позицию по этому вопросу, в том числе, в разговоре со службой техподдержки. Покопайтесь в моих сообщениях, если интересно. К тому же, сервис этот настолько уродливый, что тут и аргументировать-то стыдно. И спорить тут совершенно не о чем.
Ради КАКОГО, блин, "интереса"? 10 тыщ раз заказывать данные? По одному заказу на каждую сраную свечу? Проверять этот маразм - отвиснет или нет? А если даже и не отвиснет, это всё равно МАРАЗМ!
О, Господи! LUA, QLUA... Lua я использую ТОЛЬКО для программирования торговли на бирже! Иначе бы к такому дерьму на километр бы не подошёл. Так что LUA и QLUA для меня полные синонимы.
Это не "обычный логический оператор OR провинился", а использование его в операции присвоения.
Господи, да в Lua вообще ни хрена нет! Тип integer - и тот спи&дили! Какая уж тут "работа с битовыми флагами". В любом ассемблере есть, а здесь, блин, "творчески переработали". Таких разработчиков к компу вообще подпускать нельзя. Пожизненно!
Ничего подобного! Я бы для и всех интервалов сам считал, но у меня комп не висит постоянно в торгах. Самостоятельно посчитанные свечи - это кажется, единственное место в скрипте, которое, будучи раз написанным, работает как часы.
Ну вот, "формирует 3000 последних свечей", когда мне нужна ОДНА! Какие ещё нужны доказательства, что этой мерзости место только на помойке? Ах, да - эти же придурки ещё и НЕЗАКРЫТЫМИ свечами дрочат - ещё один идиотизм. Мне же нужна ОДНА ЗАКРЫТАЯ СВЕЧА на каждый таймфрейм.