1

Тема: Вызов CreateDataSource только для изменения цены

Подскажите, я правильно понимаю, что вызвать CreateDataSource - только для получения данных при изменении цены - не получится ?

Просто есть проблемка, если я вызываю CreateDataSource и SetUpdateCallback - и если запрашиваемые данные не подгружены в quik, то прежде, чем в callback начнут приходить измененные данные, сначала этот callback вызовется пару тысяч раз для исторических свечей и как их отделять от реальной текущей цены, что то не понятно.

2

Re: Вызов CreateDataSource только для изменения цены

Можно взять текущее (или другое нужное время) и не обрабатывать свечки до этого момента внутри callback-функции.

3

Re: Вызов CreateDataSource только для изменения цены

А как взять текущее ?
Как я понял, в callback при ходит таблица сначала заполенная только исторчиескими свечами и только  после того, как callback вызовется столько раз - сколько размер у этой таблице, то только после этого в таблицу добавляются - уже измененные/текущие данные.

4 (2022-10-04 21:57:00 отредактировано swerg)

Re: Вызов CreateDataSource только для изменения цены

Serg_ пишет:

А как взять текущее ?

Понятие несколько расплывчатое что есть "текущее".
Но можно посмотреть, повыбирать

Из QUIK:
sysdate - возвращает системные дату и время
getInfoParam - позволяет получить параметры для информационного окна (Система / О программе / Информационное окно…)

Из стандарта Lua:
os.time()

5

Re: Вызов CreateDataSource только для изменения цены

Не стал создавать новую тему, т.к. лично у меня вопрос хоть и не совсем по теме, но очень близок.
Есть недопонимание работы вот этого кода:

    ds, Error = CreateDataSource (CLASS, SEC, INTERVAL_M5);                -- Куда запихнуть пока под вопросом.
    numPrice = ds:Size()                                                -- Получаем размер массива графика цены.

    Open    = ds:O(numPrice)
    High        = ds:H(numPrice)
    Low        = ds:L(numPrice)
    Close    = ds:C(numPrice)
    Volume    = ds:V(numPrice)

В принципе сам код абсолютно понятен, создаем источник данных, получаем размер таблицы и пишем в переменные текущие значения. Но есть вопросы, на которые я не нашел ответа самостоятельно.
1. Я создаю источник данных и получаю его в ds. Лично я не уверен, но насколько я понял из справки, этой строкой я запрашиваю данные у брокера, а не беру их из графика "Price"?
2. Достаточно ли один раз создать источник данных, например в OnInit(), и далее ds будет обновляться сам или надо каждый раз ds, Error = CreateDataSource (CLASS, SEC, INTERVAL_M5)?
3. Могу ли я получить только нужные мне свечи, а не сразу все 3 тысячи штук? Вопрос не в том, как выбрать из ds их, именно так я и делаю сейчас, а именно в ds получить только, например, текущую и предыдущую ей свечи? Это просто вопрос оптимизации, чтобы не забивать память компа.
4. Честно говоря еще не испытывал, но есть мысль присвоить "Price" идентификатор и работать с ним как с индикаторами, но это честно говоря такой себе вариант, который имеет право на жизнь в случае невозможности реализовать это другими способами. Т.е. такой крайний вариант.

6

Re: Вызов CreateDataSource только для изменения цены

1. Если данные в терминале уже есть (например, открыт точно такой же график) - оттуда данные и возьмутся. Если данных нет - будут запрошены с сервера брокера.
2. Да, насколько я понимаю. Так же еще см. SetUpdateCallback
3. Нет. Только все.
4. Это не понял.

7

Re: Вызов CreateDataSource только для изменения цены

2. SetUpdateCallback с этим мозг вывихнул smile Вроде и понятно, но судя по этой теме, колбэк будет вызываться 3000 раз при первом запуске скрипта, перед тем как я получу нужную мне свечу smile
4. Как пример, с индикатором RSI я работаю так

    local count = getLinesCount(Ident_RSI)
    local num   = getNumCandles(Ident_RSI)
    line_RSI, num_RSI, l_RSI = getCandlesByIndex (Ident_RSI, 0, num-2, 2) 

    if (num_RSI == 0) then
        message("Добавь индикатор RSI и присвой ему идентификатор " .. SEC .. "_RSI.",3)
    else
        RSI = line_RSI[num_RSI-1].open
    end

Т.е. первой строкой получаю количество линий на графике, но это скорее артефакт, так и не придумал где это знание задействовать smile Вобщем не использую.
Потом получаю количество свечей и исходя из этого получаю только две последние. Ну и напоминание, если индикатор не открыт, то месседж, иначе присваиваю значение для вывода в пользовательскую таблицу. Со второй свечей работаю напрямую в if then... Мне интересно, прокатит ли этот фокус с графиком цены? Это не так удобно как с CreateDataSource, но все же...

8 (2022-10-05 10:42:01 отредактировано swerg)

Re: Вызов CreateDataSource только для изменения цены

dark184 пишет:

message("Добавь индикатор RSI и присвой ему идентификатор " .. SEC .. "_RSI.",3)

message("Добавь индикатор RSI и присвой ему идентификатор " .. Ident_RSI, 3)
dark184 пишет:

Мне интересно, прокатит ли этот фокус с графиком цены? Это не так удобно как с CreateDataSource, но все же...

Не важно с какого графика получать данные, принципы работы одинаковы.

9

Re: Вызов CreateDataSource только для изменения цены

swerg пишет:
message("Добавь индикатор RSI и присвой ему идентификатор " .. Ident_RSI, 3)

Согласен, в качестве оптимизации надо принять к сведению smile А так записи идентичны, только ваша более читабельна и чуть чуть быстрее выполняется smile
Спасибо, значит будем пробовать и оптимизировать.

10

Re: Вызов CreateDataSource только для изменения цены

Дело даже не в оптимизации.
А в том, что в вашем коде есть, судя по коду, как минимум 2 разных места формирования имени индикатора. Захотите поменять - придётся править 2 места (или одно забудется). В поддержке надёжнее, в общем, такой код smile

А оптимизация - так компьютер железный, пусть работает smile

11

Re: Вызов CreateDataSource только для изменения цены

Если в процессе торговли произошел дисконект, до данные в ds поступать не будут
Нужно закрыть ds и запросить заново