После вызова callback`а от SetUpdateCallback - я сразу отписываюсь от callback`а, но отписываюсь именно от как бы первого объекта CreateDataSource, но почему от отписка происходит от всех последующих от CreateDataSource.
Вот такой простенький код:
Код
function main()
local code_class_= "TQBR"
local code_paper_= "ZVEZ"
local interval_= INTERVAL_W1
my_table_, error_desc = CreateDataSource(code_class_, code_paper_, interval_)
------------------------Проверка на ошибки:-------------------
if error_desc ~= nil then
message(error_desc)
end
--------------------------------------------------------------
my_table_:SetUpdateCallback(function(idx)my_callback_CreateDataSource_HISTORY(my_table_, code_class_, code_paper_, intervakla_) end)
code_class_= "TQBR"
code_paper_= "ZVEZ"
interval_= INTERVAL_M15
local my_table_1, error_desc_1 = CreateDataSource(code_class_, code_paper_, interval_)
------------------------Проверка на ошибки:-------------------
if error_desc_1 ~= nil then
message(error_desc_1)
end
--------------------------------------------------------------
my_table_1:SetUpdateCallback(function(idx)my_callback_CreateDataSource_HISTORY(my_table_1, code_class_, code_paper_, intervakla_) end)
-------------------------
while not stopped do
sleep(1)
end
-------------------------
end -- end main()
То есть я вызываю CreateDataSource для двух значений, которые точно нужно заказывать на сервере.
На два значений вешаю callback`и.
Вызывается первый callback для my_table_ и сразу же отписываюсь от callback`а - НО отписка осуществляется и для таблицы my_table_1, то есть отписка осуществляется для всех ранее заказанных callback`ов для разных парамтеров.
Quikos написал: После вызова callback`а от SetUpdateCallback - я сразу отписываюсь от callback`а, но отписываюсь именно от как бы первого объекта CreateDataSource, но почему от отписка происходит от всех последующих от CreateDataSource. Вот такой простенький код:
Код
function main ()
local code_class_ = "TQBR"
local code_paper_ = "ZVEZ"
local interval_ = INTERVAL_W1
my_table_, error_desc = CreateDataSource (code_class_, code_paper_, interval_)
------------------------Проверка на ошибки:-------------------
if error_desc ~ = nil then
message (error_desc)
end
--------------------------------------------------------------
my_table_: SetUpdateCallback ( function (idx)my_callback_ CreateDataSource _HISTORY(my_table_, code_class_, code_paper_, intervakla_) end )
code_class_ = "TQBR"
code_paper_ = "ZVEZ"
interval_ = INTERVAL_M15
local my_table_1, error_desc_1 = CreateDataSource (code_class_, code_paper_, interval_)
------------------------Проверка на ошибки:-------------------
if error_desc_1 ~ = nil then
message (error_desc_1)
end
--------------------------------------------------------------
my_table_1: SetUpdateCallback ( function (idx)my_callback_ CreateDataSource _HISTORY(my_table_1, code_class_, code_paper_, intervakla_) end )
-------------------------
while not stopped do
sleep ( 1 )
end
-------------------------
end -- end main()
То есть я вызываю CreateDataSource для двух значений, которые точно нужно заказывать на сервере. На два значений вешаю callback`и. Вызывается первый callback для my_table_ и сразу же отписываюсь от callback`а - НО отписка осуществляется и для таблицы my_table_1, то есть отписка осуществляется для всех ранее заказанных callback`ов для разных парамтеров. Так и должно быть ?
Дело в том, что Вы не учитываете очень много моментов. когда Вы первый раз подписываетесь то на сервер уходит Ваша заявка. Не факт, что к моменту вашей отписке сервер исполнит вашу подписку, так как там есть очередь и транзакции идут пакетами и интернет имеет различные задержки для различных пакетов ну и т д. Поэтому Ваш финт не только не типичный прием, но и результат не предсказуемый может быть. При этом непонятно , что это дает и зачем так делать. А в документации QLUA нет указаний на подобные действия. --------------------- Поясните с какой целью Вы это делаете.
Дело в том, что Вы не учитываете очень много моментов. когда Вы первый раз подписываетесь то на сервер уходит Ваша заявка. Не факт, что к моменту вашей отписке сервер исполнит вашу подписку, так как там есть очередь и транзакции идут пакетами и интернет имеет различные задержки для различных пакетов ну и т д. Поэтому Ваш финт не только не типичный прием, но и результат не предсказуемый может быть. При этом непонятно , что это дает и зачем так делать. А в документации QLUA нет указаний на подобные действия. --------------------- Поясните с какой целью Вы это делаете.
1)Цель получить исторические данные. А описываюсь я СРАЗУ после получения данных, потому что к примеру - я заказал данные по Газпрому к примеру - вызвался callback и в таблице возвращенной ранее от CreateDataSource - уже есть ВСЕ исторические свечи, НО callback от SetUpdateCallback- будет вызыватся каким то чертом ровно то кол-во раз, сколько есть свечей в таблице. В таблице которая уже заполнена ВСЕМИ историческими данными - поэтому я при первом получении callback`а и хочу отписаться, так как все данные уже есть и еще условно 3000 раз я не хочу чтобы callback вызывался.
2)И второй момент - я исхожу или исходил из того, что когда я отписываюсь от подписки, то я отписываюсь именно от заказа по конкретному интрументу-акции, а получается, что я отписываюсь вообще от всех заказаов на условно все акции на которые я подписался. Если это так, то это как то глупо, собственно глупо точно так же как и в п.1.
Чтобы получить исторические данные, да и текущие, не обязательно подписываться на колбек. Просто заказали данные, установив пустой колбек через SetEmptyCallback, дождались получения баров с сервера и можете делать с ними все что хотите. Пройтись итератором по ним, совершив действия хоть на каждом баре. А новый бар можно получить просто проверив, что размер Size() стал больше.
Колбек же нужен если надо обрабатывать каждую сделку (точнее каждый вызов, сделок больше может быть) и попутно еще получать данные бара. Но в большинстве случаев это не надо. Да и сделки лучше отслеживать по обезличенным сделкам, а не по колбеку источника баров.
Nikolay написал: Чтобы получить исторические данные, да и текущие, не обязательно подписываться на колбек. Просто заказали данные, установив пустой колбек через SetEmptyCallback, дождались получения баров с сервера и можете делать с ними все что хотите. Пройтись итератором по ним, совершив действия хоть на каждом баре. А новый бар можно получить просто проверив, что размер Size() стал больше.
Колбек же нужен если надо обрабатывать каждую сделку (точнее каждый вызов, сделок больше может быть) и попутно еще получать данные бара. Но в большинстве случаев это не надо. Да и сделки лучше отслеживать по обезличенным сделкам, а не по колбеку источника баров.
Она синхронная ? То есть функция не вернет true - пока данные не будут загружены в таблицу ?? Если да, то проход по всем акциям займет немалое время вероятно.
В общем случае колбек - это функция, которая вызывается при наступлении события. Таким образом реализуется механизм асинхронного приема без ожидания. --------------- Следовательно, если Вам не надо обрабатывать каждое значение в момент его прихода с сервера в терминал, то и колбек вам не нужен. Более того, вы можете просто подписаться один раз через меню терминала и не заниматься этим в скрипте.
В общем случае колбек - это функция, которая вызывается при наступлении события. Таким образом реализуется механизм асинхронного приема без ожидания. --------------- Следовательно, если Вам не надо обрабатывать каждое значение в момент его прихода с сервера в терминал, то и колбек вам не нужен. Более того, вы можете просто подписаться один раз через меню терминала и не заниматься этим в скрипте.
Я не хочу иметь дело с терминалом, кроме одного единственного действия - запуска скрипта. Колбек на то и колбек, что вызывается, когда готовы данные, как без него я узнаю, когда проверять данные ?
Владимир написал: Quikos, Это в теории. В реальности же на момент вызова данные готовы не всегда, а иногда и ни в одном из трёх вызовов на одно событие.
Вы можете подтвердить, что на момент вызова callback`а - пришла пуста таблица ?
А глюки меня настолько достали, что у меня в OnTrade(n) первым делом стоит: if n==nil or n.trans_id==nil or n.order_num==nil or n.trade_num==nil or n.sec_code==nil or n.flags==nil or n.qty==nil or n.price==nil then ...
Quikos написал:крипте. Я не хочу иметь дело с терминалом, кроме одного единственного действия - запуска скрипта. Колбек на то и колбек, что вызывается, когда готовы данные, как без него я узнаю, когда проверять данные ?
вы что-то путаете. ----------------------- Терминал - это приложение QUIK, которое вы запускаете на компе. Без него вы не установите обмен данными с сервером. Поэтому и скрипт Вы запускаете в терминале и работает скрипт в терминале и данные вы получаете в терминале. ---------------------- Колбек вызывается не когда готовы данные, а когда наступило событие связанное с данным колбеком. Колбек источника данных вызывается на каждое новое значение. ------------------- Если в пришедшем блоке будет 100 значений, то колбек будет вызван 100 раз. ------------------------- Если ваш робот торгует в реальном времени, то получение последней сделки и будет сигналом, что все данные приняты. ------------------- Кроме этого, вы можете узнать о приходе всех данных прочитав время и дату последней свечи. ------------------ Но Вы конечно можете делать как желаете.
nikolz, Лапуль, шевельните извилиной. Колбек МНОГОКРАТНО вызывается когда наступило событие связанное с данным колбеком, и это УЖЕ приговор софту. При этом данные, приходящие в прерывании, не так уж редко действительно бывают не готовы, и это уже ВТОРОЙ приговор софту. Так что получение последней сделки НЕ "будет сигналом, что все данные приняты". Про говно по кличке "свечи" я просто молчу - если с первым говном ещё как-то можно работать, то с этим могут работать только камикадзе.
Владимир написал: Колбек МНОГОКРАТНО вызывается когда наступило событие связанное с данным колбеком
Это не так. Если бы это был колбек по получению нового бара, то да. Но этот колбек по событию: изменение текущего бара. А изменится он может при изменении любого из значений, в том числе и закрытия бара, что происходит при новой сделке. Также и время, что происходит при приходе нового бара. Можно сказать, что нехватает колбека именно на новый бар, да. Но текущий колбек о другом. И по хорошему, я лучше сам проверю Size() чем буду доверять колбеку.
Quikos написал:крипте. Я не хочу иметь дело с терминалом, кроме одного единственного действия - запуска скрипта. Колбек на то и колбек, что вызывается, когда готовы данные, как без него я узнаю, когда проверять данные ?
вы что-то путаете. ----------------------- Терминал - это приложение QUIK, которое вы запускаете на компе. Без него вы не установите обмен данными с сервером. Поэтому и скрипт Вы запускаете в терминале и работает скрипт в терминале и данные вы получаете в терминале. ----------------------
Что ж именно я напутал ? )))) Я прямым текстом так и написал - "Я не хочу иметь дело с терминалом, кроме одного единственного действия - запуска скрипта.".
Quikos написал:крипте. Я не хочу иметь дело с терминалом, кроме одного единственного действия - запуска скрипта. Колбек на то и колбек, что вызывается, когда готовы данные, как без него я узнаю, когда проверять данные ?
Кроме этого, вы можете узнать о приходе всех данных прочитав время и дату последней свечи.
Колбек на то и колбек, что вызывается, когда готовы данные, как без него я узнаю, когда проверять данные последней свечи ?
Колбек вызывается по событию и это не значит, что уже загружены все бары. Как минимум мы не знаем как организован вызов колбека в терминале. Может при получении очередного пакета данных, он разбирается и вызывается колбек на данные в нем. Т.е. вызвали для первого пакета, а когда придет условно последний - неизвестно. Понятие "последние данные" очень условно в ситуации непрерывного потока информации. На этом форуме уже много раз спорили, обсуждали эту тему. С тем же успехом можете просто смотреть на n = Size(), и если он отличен от 0, то проверит время бара с этим n. Если время "устраивает" - данные есть.
Nikolay, Это ТАК! По крайней мере, в единственном колбеке, которым я пользуюсь OnTrade это именно так. Мне даже когда-то техподдержка отвечала, что при этом якобы изменяются какие-то недоступные пользователю (!!!) поля, на что я возмущался: так не давайте, блин, этому самому пользователю прерывание, пока не подготовите все данные, которые требуются ему! А на все эти бары мне вообще плевать.
Quikos написал: Что ж именно я напутал ? )))) Я прямым текстом так и написал - "Я не хочу иметь дело с терминалом, кроме одного единственного действия - запуска скрипта.".
Дело в том, что скрипт запускается в виртуальной машине луа (VM Lua) , она работает внутри терминала, а скрипт получает все данные через терминал. поэтому вне вашего желания, если используете скрипт, то значит имеете дело с терминалом .
nikolz, это скрипт имеет дело с терминалом, а Quikos, как и я, имеем с ним дело только при нажатии кнопок "Запустить" или "Остановить". Вот сегодня утром я запустил скрипт на двух Квиках, вечером выключу, и больше я никакого дело с терминалом не имею.
Quikos написал: Что ж именно я напутал ? )))) Я прямым текстом так и написал - "Я не хочу иметь дело с терминалом, кроме одного единственного действия - запуска скрипта.".
Дело в том, что скрипт запускается в виртуальной машине луа (VM Lua) , она работает внутри терминала, а скрипт получает все данные через терминал. поэтому вне вашего желания, если используете скрипт, то значит имеете дело с терминалом .
Владимир написал: nikolz, это скрипт имеет дело с терминалом, а Quikos, как и я, имеем с ним дело только при нажатии кнопок "Запустить" или "Остановить". Вот сегодня утром я запустил скрипт на двух Квиках, вечером выключу, и больше я никакого дело с терминалом не имею.
Да, я это и имел ввиду :) Непонятно в чем nikolz нашел противоречие.
Владимир написал: nikolz , это скрипт имеет дело с терминалом, а Quikos , как и я, имеем с ним дело только при нажатии кнопок "Запустить" или "Остановить". Вот сегодня утром я запустил скрипт на двух Квиках, вечером выключу, и больше я никакого дело с терминалом не имею.
Да, я это и имел ввиду :) Непонятно в чем nikolz нашел противоречие.
— Запомни мои слова: когда что тебе захочется — скажи только:
Владимир написал: nikolz , это скрипт имеет дело с терминалом, а Quikos , как и я, имеем с ним дело только при нажатии кнопок "Запустить" или "Остановить". Вот сегодня утром я запустил скрипт на двух Квиках, вечером выключу, и больше я никакого дело с терминалом не имею.
Да, я это и имел ввиду :) Непонятно в чем nikolz нашел противоречие.
— Запомни мои слова: когда что тебе захочется — скажи только: «По щучьему веленью, по моему хотенью».
Странный какой. Наверное только это и запомнил ? :)
Владимир написал: nikolz , это скрипт имеет дело с терминалом, а Quikos , как и я, имеем с ним дело только при нажатии кнопок "Запустить" или "Остановить". Вот сегодня утром я запустил скрипт на двух Квиках, вечером выключу, и больше я никакого дело с терминалом не имею.
Да, я это и имел ввиду :) Непонятно в чем nikolz нашел противоречие.
— Запомни мои слова: когда что тебе захочется — скажи только: «По щучьему веленью, по моему хотенью».
Странный какой. Наверное только это и запомнил ? :)
Ваше желание не новое на рынке, это желание всех буратин. Если нет желание иметь дело с терминалом то есть несколько способов это сделать. Все кроме одного требуют затрат либо времени либо денег. Вы сами определите, чего у Вас много. Но халявы на рынке нет.
nikolz, Лапуль, судя по всему, Ваша квалификация не только в программировании, но и в торговле близка к абсолютному нулю. Никто и не говорит, что на рынке есть халява. Мой скрипт, например, работает в поте лица, но это ОН работает, а не я. Вчера, например, он нарастил мой портфель на два процента, сегодня с утра тоже было более процента, но потом рынок качнулся вниз, и сейчас у него чуть меньше полпроцента прибыли. На фьючерсах тоже с утра небольшая прибыль имеется, за сегодня он совершил на этих двух рынках порядка сотни сделок. А я его только включил, и забыл. Ой, извиняюсь - на одном из Квиков связь разорвалась, так я его перезапускал. И четыре новых фьючерса добавил. Так что сегодня я всё-таки с терминалом дело имел, Ваша правда. Только вот не требует мой способ затрат ни времени, ни денег: время исчисляется минутами в сутки, а денег я ему уж и не помню когда последний раз давал.
Так возвращаюсь к вопросу - это так и должно быть, что вызов одного метода Сlose у Одного объекта CreateDataSource - отписывает все callback`и SetUpdateCallbackcallback- у ВСЕХ объектов CreateDataSource ?
Quikos, Да плюньте Вы на этот CreateDataSource, это источник глюков и ничего более. Какая разница, что там происходит, если пользоваться этим всё равно невозможно?
Владимир написал: Quikos, Да плюньте Вы на этот CreateDataSource, это источник глюков и ничего более. Какая разница, что там происходит, если пользоваться этим всё равно невозможно?
А как тогда можно получить данные изменено свечи другим способом, когда цена инструмента меняется ?
Владимир написал: Quikos, Я сам считаю свечи. От десятисекундных до часовых.
Так, а как узнать, что к примеру по Газпрому - изменилась цена акции ? Мне же нужно это событие как то отлавливать, плюс вместе с этим событием должно еще и приходить хотя бы время сделки.
Quikos, А зачем? Мне на это событие совершенно наплевать, как и на время сделки. Зачем вообще нужны свечи? Это основа для принятия решений - правильно? А все решения по определению вероятностные. Следовательно, особая точность при их определении не нужна. А раз так - я раз в секунду опрашиваю LAST из ТТТ и считаю свечу как среднее арифметическое за период (кстати, я даже округляю это значение с точностью до шага). В этом случае, если сделок не было, то свеча и будет тем самым LAST. То же самое будет, если между измерениями цена изменилась, но потом вернулась на место (не поймали этих сделок - да и хрен бы с ними). Раньше я опрашивал раз в полсекунды, но результат был почти идентичен, так что зачем попусту грузить процессор? Не говоря уже про то, чтобы считать свечи по таблице обезличенных сделок или по прерываниям. Эта же информация используется для определения текущей ликвидности тикера (по количеству пойманных сделок), а также для того, чтобы узнать, что тикер в данный момент не торгуется (например, в перерывах между сессиями все тикеры не торгуются, и программа это прекрасно видит). Загрузка процессора при этом никакая - до тысячи тикеров держит без проблем, надёжность очень высокая - вообще не припомню, чтобы какие-то глюки проявлялись, так нафига нам эта дурацкая CreateDataSource, глючная и тормознутая, которая в принципе не способна отслеживать хоть сколько-нибудь заметное количество тикеров?
Quikos, Да я тыщу раз говорил, что классические мат. ожидание и дисперсия в миллион раз информативнее этой японской гадости. Но при желании можно посчитать и их: первый замер после отсечки очередной свечи - начало, последний - конец, минимум и максимум считаем обычным образом. Но лично меня интересует только ОДНО значение - то самое среднее арифметическое. Дисперсию когда-то собирался посчитать, но оказалось, что она тоже нафиг не нужна.
Владимир написал: Quikos, Да я тыщу раз говорил, что классические мат. ожидание и дисперсия в миллион раз информативнее этой японской гадости. Но при желании можно посчитать и их: первый замер после отсечки очередной свечи - начало, последний - конец, минимум и максимум считаем обычным образом. Но лично меня интересует только ОДНО значение - то самое среднее арифметическое. Дисперсию когда-то собирался посчитать, но оказалось, что она тоже нафиг не нужна.
Может хватит бред нести в массы буратин? все мозги засрали Quikos. ------------------- Вы хотя бы в учебник по стат анализу заглянули. Мат ожидание и дисперсия и индикатор свечи - это две большие разницы. Специально для Вас и других буратин поясняю. -------------- мат ожидание и дисперсия - это точечные средние оценки первого и второго момента закона распределения функции случайной величины на интервале наблюдения. а свечи - это точечные мгновенные оценки четырех функций случайной величины на интервале тайма. ----------------- Владимир, Так как Вы очевидно дальше чем нормальный закон распределения и два его момента ничего больше не усвоили, то и свечи и другие индикаторы для Вас как очки для мартышки. ----------------
nikolz, Согласен, лапуль - засрать мозги Quikos я, возможно, и могу, а вот Вам - никогда. По причине полного их отсутствия. А учебники я давно уже не читаю - я их пишу.
Лапуль, я же тыщу раз здесь говорил, что эти дурацкие "японские" свечи есть полное дерьмо, придуманное неучами, слабо знакомыми с математикой. Свеча есть среднее значение курса за интервал. Точка. Именно так я это дело понимаю, именно так мой скрипт это использует при торговле. А свои бредни про "нормальный закон распределения" вместе со всей этой японской гадостью можете смело засунуть себе в задницу.
Вообще говоря, модель случайных процессов не подходит к поведению фондового рынка. Это вам не безликие физические процессы. Здесь бы больше подошла модель толпы, жаждущей получить прибыль (рождение и падения фондовых рекурсивных, неустойчивых «пирамид»). Но сносной модели такой толпы пока не построено и, скорее всего, построено не будет. Поэтому (на без рыбье и рак рыба) участники фондового рынка вынуждены использовать стохастику на различных индикаторах, добавляя поиски корреляции с экономическими, политическими событиями, и, почти единственный, но расплывчатый закон: если есть большой рост (какой??), то можно ожидать падение, а если падение (какое??), то есть шансы на рост. Причем, поведение рынков со временем меняется, так как меняется среда, в которой они существуют (в том числе меняются и ее участники). Какие индикаторы рынка лучше, спор бессмысленный вне контекста их использования в торговых стратегиях. А единственным критерием качества торговой стратегии (возможно меняющейся со временем) и полезности ее индикаторов является реальная прибыль автора стратегии. В том, что можно «выжать» из истории цен торгов, скорее всего, существует некий предел полезной информации, который невозможно преодолеть никакими вычислительными мощностями и который наступает достаточно быстро.
TGB, А что за зверь "модель случайных процессов"? И уж совершенно точно, что никакая "модель толпы" нафиг не нужна - как известно, "любая толпа - это толпа баранов". Да, "единственным критерием качества торговой стратегии является реальная прибыль автора стратегии", так что я давно перестал путаться под ногами у своего скрипта: в 9 случаях из 10 его решения лучше, чем мои.