Подскажите пожалуйста можно ли получить цену свечи (с выбором интервала) без использования тега графика, а только по classcode`у и seccode`у ?
Пользователь
Сообщений: Регистрация: 23.03.2015
25.11.2017 17:42:02
Видимо можно, через CreateDataSource(Class_Code, Sec_Code, INTERVAL_M1) , но я так понял, что это можно сделать только, когда quik подключен к бирже в ее рабочее время, то есть оффлайн данная функция что то не работает.
Пользователь
Сообщений: Регистрация: 23.03.2015
26.11.2017 17:22:03
А как получить данные через CreateDataSourse - n-ой свечи ?
Пользователь
Сообщений: Регистрация: 27.03.2016
26.11.2017 19:32:50
Схематично ds1,error_desc = CreateDataSource(p_classcode, p_seccode, INTERVAL_M1) ... проверки-ожидание доступности (типа if ds1 == nil then ...и if ds1:Size()==0 then ...) ... Далее обычные обращения ds1:H(n), ds1:L(n), ...
Пользователь
Сообщений: Регистрация: 23.03.2015
26.11.2017 20:40:40
Спасибо! Подскажите пожалуйста еще, я правильно понимаю, что, если я при отключенном подключении захочу получить данные:
ds:Size(), а потом и значение самой произвольной свечи:
ds:C(i-1)
То Quik ничего не выдаст, так как эти запросы обращены к серверу, а значит сам терминал Quik должен быть подключен к серверу и в оффлайне это не работает ?
Пользователь
Сообщений: Регистрация: 30.01.2015
26.11.2017 21:33:25
Цитата
Optimus1 Optimus1 написал: Спасибо! Подскажите пожалуйста еще, я правильно понимаю, что, если я при отключенном подключении захочу получить данные:
ds:Size(), а потом и значение самой произвольной свечи:
ds:C(i-1)
То Quik ничего не выдаст, так как эти запросы обращены к серверу, а значит сам терминал Quik должен быть подключен к серверу и в оффлайне это не работает ?
все зависит от той истории, которая скачана с сервера в терминал на требуемом таймфрейме.
возможно, часть истории уже терминал когда-то получил и вы получите историю, которая не будет актуальной. А можете ничего не получить, если по этому инструменту и этому таймфрейме терминал ничего не получал.
в момент когда вы присоединитесь к серверу, история котировок по заказанному таймфрейму начнет закачиваться и через какое-то неопределенное время она станет доступной полностью.
поэтлму в оффлайне вы получите , что что когда-то было сохранено в базе и что покажет ds;c(-1) - неведомо. Вернее ведомо, но это точно не будет предпоследняя свеча торгов
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 30.01.2015
26.11.2017 21:36:40
Да и вообще.
ds:C(-1) это в qlua всегда ошибочно. Такое возможно только в расширениях (типа алертера или подобных скриптов).
в чистом qlua нужно брать размер выборки и адресоваться к предпоследней свече
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 27.03.2016
26.11.2017 21:36:43
Выдаст в рамках доступной в терминале истории, если Вы ранее поработали с требуемым инструментом на требуемом ТФ. Например, мне сейчас, даже без попытки установить соединение (воскресенье все-таки), терминал дал доступ к 7032 свечкам RIZ7 на M1. Дал бы и более длинную историю, но мне даже этого много, периодически обрезаю (online) через перезаказ данных.
Пользователь
Сообщений: Регистрация: 23.03.2015
26.11.2017 22:04:49
Спасибо за развернутые ответы! Завтра проверю, как раз :)
Пользователь
Сообщений: Регистрация: 23.03.2015
26.11.2017 22:06:02
Еще только не понятно одно, закачка идет именно с сервера брокера ?
Пользователь
Сообщений: Регистрация: 30.01.2015
27.11.2017 00:55:52
Цитата
Optimus1 Optimus1 написал: Еще только не понятно одно, закачка идет именно с сервера брокера ?
абсолюьно точно.
ав подключается к серверу, поэтому с компьютера негритянки, которая работает мойщицей посуды в новом орлеане вы точно ничего не скачаете.
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 23.03.2015
27.11.2017 18:12:25
Запустил в Квике вот этот скрипт для проверки, как работает CreateDataSource:
Код
p_classcode_1="TQBR"
p_seccode_1="GAZP"
is_run=true
------------------------------------------------------------
function main()
ds1, err = CreateDataSource("TQBR", "GAZP", INTERVAL_M1, "last");
message(err);
ds1:SetEmptyCallback();
message(ds1:Size());
while is_run do
sleep(1000)
end
end
Но что то ничего не происходит, никаких message(ds1:Size()) не появляется.
Так и не понял все таки откуда и как подгружаются данные при вызове этой функции:
Код
is_run=true
------------------------------------------------------------
function main()
ds1, err = CreateDataSource("TQBR", "GAZP", INTERVAL_D1);
Kol_vo_svechey=ds1:Size()
Price_close = ds1:C(Kol_vo_svechey)
message(tostring(Price_close))
while is_run do
sleep(1000)
end
end
После выполнения этого скрипта, вывелось значения цены закрытия последней свечи по выбранному инструменту. После этого, я закрыл Квик, а потом его открыл, но без подключения и заменил в скрипте инструмент с GAZP на SBER, запустил и скрипт показал правильно значение. Так откуда скрипт взял эти данные, если я не запускал данный скрипт по инструменту SBER будучи подключенным к серверу ?
Пользователь
Сообщений: Регистрация: 23.03.2015
27.11.2017 19:21:20
Понял, если график открыт, то данные берутся с графика.
Пользователь
Сообщений: Регистрация: 23.01.2015
27.11.2017 19:23:13
Optimus1 Optimus1, Если график был заказан с сервера через интерфейс, то CreateDataSource его покажет.
Пользователь
Сообщений: Регистрация: 23.03.2015
27.11.2017 19:31:35
Хотя нет, сейчас запустил скрипт по инструменту (при разорванном соединении), по которому график в Квике открыт не был, но скрипт все равно вывел правильно значение.
Пользователь
Сообщений: Регистрация: 23.03.2015
27.11.2017 19:32:56
Открытая таблица "текущие торги" влияет на это ?
Пользователь
Сообщений: Регистрация: 23.01.2015
27.11.2017 19:39:24
Optimus1 Optimus1, Да, но только в случае если график по параметру таблицы текущих торгов. Если параметр не указан, то график строится по таблице обезличенных сделок. Т.е. надо проверить есть ли данные по инструменту в этой таблице.
Пользователь
Сообщений: Регистрация: 23.03.2015
27.11.2017 20:29:38
Данные по инструменту в таблице"текущие торги" есть. Там по сути, как я понял вообще все данные по всем инструментам у меня были в этой таблице. То есть по сути, если эта таблица открыта со всеми инструментами, то есть CreateDataSource будет обращаться при любом инструменте к этой таблице ?
Пользователь
Сообщений: Регистрация: 23.01.2015
27.11.2017 20:35:28
Optimus1 Optimus1, CreateDataSource не производит повторный заказ информации если она уже заказана с сервера. Если информация есть в кэше терминала, то CreateDataSource ее покажет.
Пользователь
Сообщений: Регистрация: 23.03.2015
27.11.2017 20:49:37
А вот еще что то не понятное мне, опять запускаю вышеприведенный скрипт, с уже подключенным соединением, на тот инструмент, который есть в "таблице торгов", но по которому не открыт график. Если в скрипте указываю дневной интервал, то скрипт показывает значение, если указываю минутный интервал, скрипт показывает значение "0", но после того, как я открыл график по данному инструменту и открыл на нем минутный интервал, то после запуска скрипта, показывается правильно значение.
Пользователь
Сообщений: Регистрация: 23.03.2015
27.11.2017 20:55:21
Поправка, если график не открыт, то и по дневному интервалу значение "0" выдается. Непонятно, идет ли все таки загрузка с сервера или нет.
Пользователь
Сообщений: Регистрация: 23.01.2015
27.11.2017 20:55:34
Optimus1 Optimus1, Добавьте sleep(1000) сразу после CreateDataSource
Пользователь
Сообщений: Регистрация: 23.03.2015
27.11.2017 21:02:11
Так работает. Это что то на подобии задержки, чтобы данные успели погрузится ? Если да, то как быть точно уверенным, что это задержи хватило, а если таких запросов будет больше одного, то необходимо после каждого запроса задержку делать ?
Пользователь
Сообщений: Регистрация: 23.01.2015
27.11.2017 21:08:28
Цитата
Optimus1 Optimus1 написал: Это что то на подобии задержки, чтобы данные успели погрузится ?
да верно
Цитата
Optimus1 Optimus1 написал: Если да, то как быть точно уверенным, что это задержи хватило, а если таких запросов будет больше одного, то необходимо после каждого запроса задержку делать ?
боюсь что заранее нет способа узнать, сколько потребуется времени на закачку данных. Но можно написать бесконечный цикл ожидания, в который будет проверять Size
Пользователь
Сообщений: Регистрация: 23.03.2015
27.11.2017 22:39:38
Вариант был бы идеальным, но к сожалению не по всем инструментам кол-во свечей по факту на данный момент имеется - 3001, то есть если скрипт попадет на такой инструмент, то он зависнет на проверке полноты Size`а.
Пользователь
Сообщений: Регистрация: 23.01.2015
27.11.2017 22:50:22
Optimus1 Optimus1, попробуйте так: while ds:Size() == 0 do sleep(5) end
Пользователь
Сообщений: Регистрация: 23.03.2015
28.11.2017 10:38:26
По идее - это не совсем корректно, потому что, как только подгрузится только одна свеча, то цикл сразу выйдет из своей работы.
По идее корректнее вот так:
Код
While ds:Size() < 3001 do
sleep(5)
end
Пользователь
Сообщений: Регистрация: 23.03.2015
28.11.2017 18:06:50
Или же ds:Size() подгружается либо целиком, либо не подгружается вообще ? То есть частично ds:Size() не загружается ?
Подскажите пожалуйста, вот скрипт, который выводит фактическое значение цены свечи, в тот момент, когда происходит изменение цены:
Код
p_classcode_1="TQBR"
p_seccode_1="GAZP"
is_run = true
function cb(index)
Price_close1 = ds:C(Kol_vo_svechey)
local t1 = ds:T(Kol_vo_svechey)
message("Цена:"..tostring(Price_close1));
end
------------------------------------------------------------------
function main()
ds=CreateDataSource(p_classcode_1, p_seccode_1, INTERVAL_D1)
--------------
while ds:Size() == 0 do
sleep(5)
end
--------------
Kol_vo_svechey=ds:Size()
ds:SetUpdateCallback(cb)
while is_run do
sleep(100)
end
end
Но, если в момент работы скрипта происходит разрыв связи и обратное ее восставновление, после подключение скрипт выводит значения всех свечей по выбранному интервалу от 1 до последней, почему так происходит ? Причем, если скрипт запустить во время уже устанновленного подключения, вывода всех свечей не происходит, а выдается только последняя цена.
Колбек SetUpdateCallback срабатывает при каждом получении свечки терминалом. Когда Вы переподключаетесь, терминал перезаказывает данные, и получает все свечки, и в QLUA соответственно попадают все свечки.
Можно сравнить номер свечки с ds:Size(), и ели номер меньше, то просто игнорировать.