Цена свечи без тега графика

Страницы: 1
RSS
Цена свечи без тега графика
 
Здравствуйте,

Подскажите пожалуйста можно ли получить цену свечи (с выбором интервала) без использования тега графика, а только по classcode`у и seccode`у ?
 
Видимо можно, через CreateDataSource(Class_Code, Sec_Code, INTERVAL_M1) , но я так понял, что это можно сделать только, когда quik подключен к бирже в ее рабочее время, то есть оффлайн данная функция что то не работает.
 
А как получить данные через CreateDataSourse - n-ой свечи ?
 
Схематично
     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) - неведомо. Вернее ведомо, но это точно не будет предпоследняя свеча торгов
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Да и вообще.  

ds:C(-1) это в qlua всегда ошибочно. Такое возможно только в расширениях (типа алертера или подобных скриптов).

в чистом qlua нужно брать размер выборки и адресоваться к предпоследней свече
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Выдаст в рамках доступной в терминале истории, если Вы ранее поработали с требуемым инструментом на требуемом ТФ.
Например, мне сейчас, даже без попытки установить соединение (воскресенье все-таки), терминал дал доступ к 7032 свечкам RIZ7 на M1.
Дал бы и более длинную историю, но мне даже этого много, периодически обрезаю (online) через перезаказ данных.  
 
Спасибо за развернутые ответы!
Завтра проверю, как раз :)
 
Еще только не понятно одно, закачка идет именно с сервера брокера ?
 
Цитата
Optimus1 Optimus1 написал:
Еще только не понятно одно, закачка идет именно с сервера брокера ?
абсолюьно точно.

ав подключается к серверу, поэтому с компьютера негритянки, которая работает мойщицей посуды в новом орлеане вы точно ничего не скачаете.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Запустил в Квике вот этот скрипт для проверки, как работает 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()) не появляется.
 
Optimus1 Optimus1,

попробуйте так:
message(tostring(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 будет обращаться при любом инструменте к этой таблице ?
 
Optimus1 Optimus1,
CreateDataSource не производит повторный заказ информации если она уже заказана с сервера.
Если информация есть в кэше терминала, то CreateDataSource ее покажет.
 
А вот еще что то не понятное мне, опять запускаю вышеприведенный скрипт, с уже подключенным соединением, на тот инструмент, который есть в "таблице торгов", но по которому не открыт график.
Если в скрипте указываю дневной интервал, то скрипт показывает значение, если указываю минутный интервал, скрипт показывает значение "0", но после того, как я открыл график по данному инструменту и открыл на нем минутный интервал, то после запуска скрипта, показывается правильно значение.
 
Поправка, если график не открыт, то и по дневному интервалу значение "0" выдается. Непонятно, идет ли все таки загрузка с сервера или нет.
 
Optimus1 Optimus1,
Добавьте sleep(1000) сразу после CreateDataSource
 
Так работает.
Это что то на подобии задержки, чтобы данные успели погрузится ?
Если да, то как быть точно уверенным, что это задержи хватило, а если таких запросов будет больше одного, то необходимо после каждого запроса задержку делать ?
 
Цитата
Optimus1 Optimus1 написал:
Это что то на подобии задержки, чтобы данные успели погрузится ?
да верно

Цитата
Optimus1 Optimus1 написал:
Если да, то как быть точно уверенным, что это задержи хватило, а если таких запросов будет больше одного, то необходимо после каждого запроса задержку делать ?
боюсь что заранее нет способа узнать, сколько потребуется времени на закачку данных.
Но можно написать бесконечный цикл ожидания, в который будет проверять Size
 
Вариант был бы идеальным, но к сожалению не по всем инструментам кол-во свечей по факту на данный момент имеется - 3001, то есть если скрипт попадет на такой инструмент, то он зависнет на проверке полноты Size`а.
 
Optimus1 Optimus1,
попробуйте так:
  while ds:Size() == 0 do
     sleep(5)
  end
 
По идее - это не совсем корректно, потому что, как только подгрузится только одна свеча, то цикл сразу выйдет из своей работы.

По идее корректнее вот так:
Код
While ds:Size() < 3001 do 
      sleep(5) 
   end
 
Или же ds:Size() подгружается либо целиком, либо не подгружается вообще ? То есть частично ds:Size() не загружается ?
 
Optimus1 Optimus1,
Частично не загружается.
 
Подскажите пожалуйста, вот скрипт, который выводит фактическое значение цены свечи, в тот момент, когда происходит изменение цены:
Код
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 до последней, почему так происходит ?
Причем, если скрипт запустить во время уже устанновленного подключения, вывода всех свечей не происходит, а выдается только последняя цена.
 
Optimus1 Optimus1,

Колбек SetUpdateCallback срабатывает при каждом получении свечки терминалом.
Когда Вы переподключаетесь, терминал перезаказывает данные, и получает все свечки, и в QLUA соответственно попадают все свечки.

Можно сравнить номер свечки с ds:Size(), и ели номер меньше, то просто игнорировать.
Страницы: 1
Читают тему
Наверх