Видимо можно, через CreateDataSource(Class_Code, Sec_Code, INTERVAL_M1) , но я так понял, что это можно сделать только, когда quik подключен к бирже в ее рабочее время, то есть оффлайн данная функция что то не работает.
Схематично 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), ...
Спасибо! Подскажите пожалуйста еще, я правильно понимаю, что, если я при отключенном подключении захочу получить данные:
ds:Size(), а потом и значение самой произвольной свечи:
ds:C(i-1)
То Quik ничего не выдаст, так как эти запросы обращены к серверу, а значит сам терминал Quik должен быть подключен к серверу и в оффлайне это не работает ?
Optimus1 Optimus1 написал: Спасибо! Подскажите пожалуйста еще, я правильно понимаю, что, если я при отключенном подключении захочу получить данные:
ds:Size(), а потом и значение самой произвольной свечи:
ds:C(i-1)
То Quik ничего не выдаст, так как эти запросы обращены к серверу, а значит сам терминал Quik должен быть подключен к серверу и в оффлайне это не работает ?
все зависит от той истории, которая скачана с сервера в терминал на требуемом таймфрейме.
возможно, часть истории уже терминал когда-то получил и вы получите историю, которая не будет актуальной. А можете ничего не получить, если по этому инструменту и этому таймфрейме терминал ничего не получал.
в момент когда вы присоединитесь к серверу, история котировок по заказанному таймфрейму начнет закачиваться и через какое-то неопределенное время она станет доступной полностью.
поэтлму в оффлайне вы получите , что что когда-то было сохранено в базе и что покажет ds;c(-1) - неведомо. Вернее ведомо, но это точно не будет предпоследняя свеча торгов
Выдаст в рамках доступной в терминале истории, если Вы ранее поработали с требуемым инструментом на требуемом ТФ. Например, мне сейчас, даже без попытки установить соединение (воскресенье все-таки), терминал дал доступ к 7032 свечкам RIZ7 на M1. Дал бы и более длинную историю, но мне даже этого много, периодически обрезаю (online) через перезаказ данных.
Запустил в Квике вот этот скрипт для проверки, как работает 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 будучи подключенным к серверу ?
Хотя нет, сейчас запустил скрипт по инструменту (при разорванном соединении), по которому график в Квике открыт не был, но скрипт все равно вывел правильно значение.
Optimus1 Optimus1, Да, но только в случае если график по параметру таблицы текущих торгов. Если параметр не указан, то график строится по таблице обезличенных сделок. Т.е. надо проверить есть ли данные по инструменту в этой таблице.
Данные по инструменту в таблице"текущие торги" есть. Там по сути, как я понял вообще все данные по всем инструментам у меня были в этой таблице. То есть по сути, если эта таблица открыта со всеми инструментами, то есть CreateDataSource будет обращаться при любом инструменте к этой таблице ?
Optimus1 Optimus1, CreateDataSource не производит повторный заказ информации если она уже заказана с сервера. Если информация есть в кэше терминала, то CreateDataSource ее покажет.
А вот еще что то не понятное мне, опять запускаю вышеприведенный скрипт, с уже подключенным соединением, на тот инструмент, который есть в "таблице торгов", но по которому не открыт график. Если в скрипте указываю дневной интервал, то скрипт показывает значение, если указываю минутный интервал, скрипт показывает значение "0", но после того, как я открыл график по данному инструменту и открыл на нем минутный интервал, то после запуска скрипта, показывается правильно значение.
Так работает. Это что то на подобии задержки, чтобы данные успели погрузится ? Если да, то как быть точно уверенным, что это задержи хватило, а если таких запросов будет больше одного, то необходимо после каждого запроса задержку делать ?
Optimus1 Optimus1 написал: Это что то на подобии задержки, чтобы данные успели погрузится ?
да верно
Цитата
Optimus1 Optimus1 написал: Если да, то как быть точно уверенным, что это задержи хватило, а если таких запросов будет больше одного, то необходимо после каждого запроса задержку делать ?
боюсь что заранее нет способа узнать, сколько потребуется времени на закачку данных. Но можно написать бесконечный цикл ожидания, в который будет проверять Size
Вариант был бы идеальным, но к сожалению не по всем инструментам кол-во свечей по факту на данный момент имеется - 3001, то есть если скрипт попадет на такой инструмент, то он зависнет на проверке полноты 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(), и ели номер меньше, то просто игнорировать.