CreateDataSource только из main?

Страницы: 1
RSS
CreateDataSource только из main?, а вне main можно корректно подписаться?
 
Добрый день.
Захотелось вдруг подписаться на данные, раз уж есть такая возможность. ) И уже сутки борюсь с CreateDataSource будь он (или всё-таки я ?) не ладен! )))
Научите пожалуйста пользоваться CreateDataSource. Проблема:
- вот так, из main, запускается подписка
Код
class = "SPBFUT"
sec = "SiM7"

function Run()
message("размер "..ds:Size())
end

is_run=true;

function main()
ds, Error = CreateDataSource(class, sec, INTERVAL_H1) 
ds:SetEmptyCallback()
sleep(100)
message(type(ds).."  "..(Error or "успешно"))

   while is_run do
      sleep(50)
   end
end

а вот так, вне main - нет...
Код
class = "SPBFUT"
sec = "SiM7"

function Run()
    message("размер "..ds:Size())
end

is_run=true;

function main()
    while is_run do
        sleep(50)
    end
end

ds, Error = CreateDataSource(class, sec, INTERVAL_H1) 
ds:SetEmptyCallback()
sleep(100)
message(type(ds).."  "..(Error or "успешно"))

почему?
Собственно задача - подписаться на данные, запустить колбэк на изменения, но в дальнейшем на лету менять интервал графика, инструмент подписки в ту же переменную ds. Можно конечно городить переключатель флагами в main. А вне main никак не подписаться, чтобы упаковать подписку в отдельную функцию с вызовом не из main?
Спасибо.
 
В строке создания колбэка описка, вместо
Код
ds:SetEmptyCallback()
следует читать    
Код
ds:SetUpdateCallback(Run)
но вопросы в силе.
 
И второй вопрос, попроще. Для подписки (с целью затем запустить колбэк на изменения) на котировки инструмента по классу и коду есть функция CreateDataSource.
А можно создать колбэк на изменение индикатора, например EMA, наложенного на тот же график?
Понятно, что выход есть - подписываемся на свечки, и по колбэку считываем EMA. А вот колбэк на непосредственно EMA возможен? Ведь он будет срабатывать гораздо реже, только раз в таймфрейм графика, если например EMA по Open.
 
Цитата
green_X5 написал:
А вне main никак не подписаться, чтобы упаковать подписку в отдельную функцию с вызовом не из main?

Проблема изучается. Постараемся в ближайшее время дать ответ.
Цитата
green_X5 написал:
И второй вопрос, попроще. Для подписки (с целью затем запустить колбэк на изменения) на котировки инструмента по классу и коду есть функция  CreateDataSource.
А можно создать колбэк на изменение индикатора, например EMA, наложенного на тот же график?
Понятно, что выход есть - подписываемся на свечки, и по колбэку считываем EMA. А вот колбэк на непосредственно EMA возможен? Ведь он будет срабатывать гораздо реже, только раз в таймфрейм графика, если например EMA по Open.

Для решения задачи, Вы можете добавить функцию расчета EMA на данных из CreateDataSource.
Будет тоже самое.
Функции уже выкладывались тут
https://forum.quik.ru/forum17/topic1157/
 
Цитата
Для решения задачи, Вы можете добавить функцию расчета EMA на данных из CreateDataSource.
Будет тоже самое.
Функции уже выкладывались тут
https://forum.quik.ru/forum17/topic1157/

Ок, EMA я рассчитаю в своем скрипте, значения упакую в переменную-таблицу скажем за последние 50 свечек, а как её потом визуально выложить на график?
 
green_X5,

Зачем это делать из обычного скрипта? Для этого существуют скрипты Lua индикаторов.
В обычном скрипте, единственное что можно рисовать на графиках, это метки.
 
Сергей,

чтобы синхронизировать изменения параметров МА - на графике и в скрипте.
Тут вариантов мне видится три:
1. Накладываем на график индикатор из папки LuaIndicators, подписываемся на свечки этого графика, и создаем в своем скрипте колбэк на изменение свечек, по колбэку читаем значение наложенного MA  .
Код
t, n, l = getCandlesByIndex (tagMA, 0, q-1, 1);
lastMA = t[0].close
  Это я пробовал, работает. Но есть проблема, при старте скрипта указанная выше строчка не срабатывает, а вот на последующих вызовах колбэка уже нормально.

2. то же что п.1, но создаем колбэк на изменения непосредственно MA. Собственно о возможной реализации этого я и спросил, но ведь здесь нужно подписываться по тегу? Не нашел такой функции.

3. Ваш вариант - подписаться на свечки, по колбэку их читать, рассчитывать по ним МА. Но мне нужна визуализация индикатора на графике, чтобы когда я изменю параметры МА в скрипте, тут же увидел измененную МА на графике. Как я понял, это невозможно?

Прошу дать вариант решения задачи. Спасибо.
 
Цитата
green_X5 написал:
Прошу дать вариант решения задачи. Спасибо.

Какой задачи? Вы пишите только свои действия, а зачем это все не пишите.
Все выше сказанное не несет смысла. Зачем делать в обычном скрипте то, что с легкостью делается в индикаторах?
О какой синхронизации "МА - на графике и в скрипте" идет речь?
Зачем Вам вообще понадобился getCandlesByIndex, если в индикаторах есть OnCalculate?
Вы в индикаторе получили изменения цены, посчитали индикатор, все. Дальше делайте с этими цифрами что угодно.
 
Сергей,
попробую проще изложить задачу.
Нужно в скрипте работать с МА фьючерса и видеть её (МА) на графике.
Меняем значение МА - видим эти изменения на графике и теперь скрипт работает с МА с новыми настройками.
Где менять параметры МА - в скрипте или в наложенном индикаторе на график - мне всё равно, будет одинаково удобно.
 
Цитата
green_X5 написал:
Сергей,
попробую проще изложить задачу.
 Нужно в скрипте работать с МА фьючерса и видеть её (МА) на графике.  
Меняем значение МА - видим эти изменения на графике и теперь скрипт работает с МА с новыми настройками.
Где менять параметры МА - в скрипте или в наложенном индикаторе на график - мне всё равно, будет одинаково удобно.
С этого и нужно было начинать.
Тогда правильный вариант 1:
Цитата
green_X5 написал:
1. Накладываем на график индикатор из папки LuaIndicators, подписываемся на свечки этого графика, и создаем в своем скрипте колбэк на изменение свечек, по колбэку читаем значение наложенного MA  .

Но Вы говорите что есть проблема:
Цитата
green_X5 написал:
Это я пробовал, работает. Но есть проблема, при старте скрипта указанная выше строчка не срабатывает, а вот на последующих вызовах колбэка уже нормально.
Надо разбираться почему не работает и что именно не работает.
Приведите пример кода и последовательность действий.

К слову, есть еще один вариант - вообще всю логику перенести в скрипт индикатора, если это допустимо.
 
Цитата
Надо разбираться почему не работает и что именно не работает.
Приведите пример кода и последовательность действий.

Сергей, спасибо за желание помочь, готовлю код
Цитата
К слову, есть еще один вариант - вообще всю логику перенести в скрипт индикатора, если это допустимо.
А вот это интересно. Вчера попробовал в свой код добавил необходимы атрибуты индикатора, запустил его из папки LuaIndicators, терминал упал ). Я сделал вывод что так не можно. )
Прошу Вас вкратце описать как терминал опрашивает файл индикатора.
Вот сейчас накладываю MA на минутный график, в коде индикатора добавляю message, жду минут 5 (5 новых свечей), а скрипт код судя по всему исполнен терминалом только один раз?



 
green_X5,
В индикаторах расчеты происходят в функции OnCalculate.
А Вы пишите message вообще не там.
 
Цитата
Sergey Gorokhov написал:
green_X5  ,
В индикаторах расчеты происходят в функции OnCalculate.
А Вы пишите message вообще не там.
Да, согласен, промахнулся. )
Сергей, я вот попробовал в скрипт индикатора добавить это.
Код
function OnParam( c, s )
   message("Ok")
end

is_run=true;

function main()
   while is_run do
      sleep(1000)
      message("main")
   end
end

Добавляю индикатор на график - ни одного месседжа нет (
 
Цитата
green_X5 написал:
Добавляю индикатор на график - ни одного месседжа нет (
Прошу прощения, но кажется Вы вообще не понимаете что пишите.
Давайте еще раз
Цитата
Sergey Gorokhov написал:
В индикаторах расчеты происходят в функции OnCalculate.


Из этого как бы следует что message надо писать в функции OnCalculate
 
Цитата
Sergey Gorokhov написал:
Цитата
green_X5   написал:
Добавляю индикатор на график - ни одного месседжа нет (
Прошу прощения, но кажется Вы вообще не понимаете что пишите.
Давайте еще раз
Цитата
Sergey Gorokhov   написал:
В индикаторах расчеты происходят в функции  OnCalculate .

Из этого как бы следует что  message  надо писать в функции  OnCalculate
Всё, теперь понял. )
 
И понял то, что основной скрипт запускать из папки индикаторов вообще не вариант, иначе останешься только с одним рабочим колбэком - OnCalculate, который ещё и строчит как пулемет по поводу и без повода.
Плохая идея.
 
Цитата
Sergey Gorokhov написал:

Надо разбираться почему не работает и что именно не работает.
Приведите пример кода и последовательность действий.
Вот так подписываюсь на индикатор.
Код
is_run=true;
class, sec = "SPBFUT", "SiM7"
tagMA = "futRTSI" --идентификатор наложенного MA
tf = 30 --таймфрейм графика

function main()
    Start()
    while is_run do
        sleep(50)
    end
end

function Start()
    step = 0 + (getParamEx(class, sec,"SEC_PRICE_STEP").param_value or 0)
    if step == 0 then message("Инструмент не найден") return end
        ds, Error = CreateDataSource(class, sec, tf) 
        sleep(100)
        if ds then 
            while (Error == "" or Error == nil) and ds:Size() == 0 
                do sleep(1) 
            end        
            ds:SetUpdateCallback(Run)
            if tonumber(ds:Size() or 0) > 0 and not Error 
                then Run()
                else message("Не подключились к данным, "..(Error or "нет ошибки")) 
            end
        else message("Подписка не удалась") 
        end
end

function Run()
    if  not ds or not is_run then return end
    local q = getNumCandles(tagMA)    
    if not q then ms("Индикатор не считан") return end
    local t, n, l = getCandlesByIndex (tagMA, 0, q-1, 1);
    if type(t) ~= "table" then message("Средняя не считана") return end
    local mov = t[0].close
    mov = math.ceil(mov/step + 0.5) * step
    if not mov then message("Средняя не рассчитана") return else message("MA "..tostring(mov)) end
end

Оно работает. Но первый вызов Run() из Start() может не считать  
 
green_X5,

Судя по коду, Вы ожидаете что в функции Run появятся все свечи с первой по последнюю. Однако туда попадают только свежие обновления.
Так и должно быть, т.к. график по заказанному параметру у Вас открыт и информация не будет заказываться повторно.
В связи с чем и пропущенные свечки в колбек не придут.

Если нужны пропущенные свечки, пройдитесь циклом от 1 до ds:Size()
 
Цитата
Sergey Gorokhov написал:

Если нужны пропущенные свечки, пройдитесь циклом от 1 до ds:Size()

Сергей, я сегодня туго соображаю ), подскажите пожалуйста куда этот цикл пристроить и нужно ли что-то исполнять в его итерациях?
Если Вам не сложно, напишите этот кусок кода и куда его вставить.
 
green_X5,

Добавить флаг на первый запуск функции Run. Перед вызовом SetUpdateCallback делаем его true, а в конце функции Run делаем false.
В функции Run проверяем, если флаг true, значит это первое срабатывание.
Если срабатывание первое, и пришедший индекс не первый, то делаем getCandlesByIndex от 1 до getNumCandles свечей.
Полученные свечки обрабатываем в цикле.
Таким образом, если первой пришла не первая свечка, то случится обработка пропущенных свечек.
 
Сергей, спасибо, идею понял, сегодня в вечернюю сессию, когда код споткнется об нулевое значение МА, прогоню вот эту простую конструкцию. Без подписки, т.к. график открыт.
Код
tagMA = "111" --идентификатор наложенного MA

q = getNumCandles(tagMA)
t, n, l = getCandlesByIndex(tagMA, 0, 0, q);
mov = t[q-1].close

for i = 0, q-1, 1 do
   local temp = t[i].close
   if temp and temp ~= 0 then last = temp end
end

message("свечек="..q.."  в таблице="..#t.."  MA="..mov.."  last="..last)
 
А можно попросить зарегистрировать пожелание?
В возвращаемую таблицу t функции
TABLE t, NUMBER n, STRING l getCandlesByIndex (STRING tag, NUMBER line, NUMBER first_candle, NUMBER count)
добавить возвращаемые данные - тайфрейм графика (индикатора). Должен приходить в синтаксисе как interval CreateDataSource, в виде зарегистрированных имен (INTERVAL_H1) или их значений (60).
Ещё было бы неплохо возвращать ещё одни данные - класс и секцию бумаги этих данных. Правда я не знаю что может вернуться при запросе индикатора.
Спасибо.
 
green_X5,
Судя по вашим вопросам, Вы не очень понимаете назначение скриптов и индикаторов для задач создания роботов.
попробую пояснить.
Если Вы торгуете одним инструментом, то проще всего написать робота в виде индикатора.
При этом, не надо ничего заказывать и не надо использовать колбеки.
Т е программа получается безобразно простая и соответствует на 99% запросам начинающих биржевых миллионеров.
После того, как Ваш робот заработает (либо сольет первый миллион) можно смело приступать к созданию робота на скрипте.
 
green_X5,
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
 
Николай Камынин,
если Вас устраивают "безобразно простые" скрипты работающие с одним колбэком, я не буду Вас отговаривать их писать. Мои изделия посложнее, требуют в основе классический двухпоточный скелет, подключенных визуальных и win API библиотек, соотв. с четко определенным стартом скрипта и завершением, рационально-ресурсной эксплуатацией колбэков и т.д.
Рад за Ваш клуб миллионеров, 99% торгующих индикаторами. Но лично Ваши абстрактные нравоучения в снисходительном тоне мне малоинтересны. Удачи, досвиданья.

Sergey Gorokhov,
спасибо.
 
Хотел помочь.
Все что Вы написали делается в индикаторах
Квик вообще многопоточный ( даже больше двух)
А вот надобности в  колбеках  в индикаторах вообще нет.
Но чувствую,
Вы любите создать трудности, чтобы потом их преодолевать , задавая кучу вопросов, вместо чтения документации.
Успехов в мечтаниях.
 
Николай Камынин,

Мы уже попрощались.
Кто "хочет помочь" на этом форуме, тот читает вопросы и отвечает на них, приводя если нужно необходимые отрезки кода, а не строит из себя мудрого аксакала бубня старческими губами не имеющую отношения к теме хренотень.
Попробуйте по Павлову, увидите мою тему - откройте её и тут же тресните себя ложкой по лбу. Каждый последующий раз - всё сильнее. Так рефлекторно Вы начнете обходить мои темы стороной. И я действительно буду Вам безмерно за это благодарен.
Ещё раз - ДОСВИДАНИЯ.  
 
Цитата
Sergey Gorokhov написал:
green_X5  ,

Добавить флаг на первый запуск функции Run. Перед вызовом SetUpdateCallback делаем его true, а в конце функции Run делаем false.
В функции Run проверяем, если флаг true, значит это первое срабатывание.
Если срабатывание первое, и пришедший индекс не первый, то делаем getCandlesByIndex от 1 до getNumCandles свечей.
Полученные свечки обрабатываем в цикле.
Таким образом, если первой пришла не первая свечка, то случится обработка пропущенных свечек.

Бинго, Сергей, сработал Ваш метод при пробуксовке )



Буксует на низколиквидных инструментах, на которых последние свечи или отсутствуют или там какая-н. каша с нулями в данных или ещё что-н. Но перебор свечек вытаскивает последнее корректное значение. )

Осталось заставить запускаться подписку CreateDataSource не из main.
 
Ну и собственно целостность данных индикатора по номерам последних свечек. Вероятно, там где нет торговых свечей, индикатор возвращает ноль. Это предположение.

 
Цитата
green_X5 написал:
А можно попросить зарегистрировать пожелание?
В возвращаемую таблицу t функции
TABLE t, NUMBER n, STRING l getCandlesByIndex (STRING tag, NUMBER line, NUMBER first_candle, NUMBER count)  
добавить возвращаемые данные - тайфрейм графика (индикатора). Должен приходить в синтаксисе как interval CreateDataSource, в виде зарегистрированных имен (INTERVAL_H1) или их значений (60).
Ещё было бы неплохо возвращать ещё одни данные - класс и секцию бумаги этих данных. Правда я не знаю что может вернуться при запросе индикатора.
Спасибо.
Цитата
Sergey Gorokhov написал:
green_X5  ,
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.

Сергей, дополню пожелания.
Также возвращать параметры индикатора. Например для МА это вот эти



Это может пригодиться например для уточнения цикла перебора
Код
q = getNumCandles(tagMA)
t, n, l = getCandlesByIndex(tagMA, 0, 0, q);
mov = t[q-1].close

for i = math.max(0,q-100), q-1, 1 do   --здесь вместо 100 укажем вернувшийся период MA
   temp = t[i].close
   if temp and temp ~= 0 then last = temp end
end
 
Цитата
Sergey Gorokhov написал:
...
Однако туда попадают только свежие обновления.
Так и должно быть, т.к. график по заказанному параметру у Вас открыт и информация не будет заказываться повторно.
В связи с чем и пропущенные свечки в колбек не придут.

Если нужны пропущенные свечки, пройдитесь циклом от 1 до ds:Size()
Не совсем так. И лучше быть готовым к любому развитию событий.

Простой скрипт, CreateDataSource для RIM7, для которого уже есть график на М1 и уже накопилось более 16000 свечек, устанавливается инжектор (SetUpdateCallback) - все обычно.
Загружаем QUIK (7.10), до установления соединения запускаем скрипт,  CreateDataSource успешен, ds:Size() покажет 16744 (столько сейчас есть свечек на М1) - можно выбирать самому нужные свечки. Callback молчит.

А затем устанавливаем соединение. Перезапускается скрипт, CreateDataSource успешен, ds:Size() покажет 16744. Вроде все штатно. И вдруг оживает Callback и получает все 16744 свечек. Кстати вброс такого количества свечек с простейшей обработкой происходит примерно за 1 секунду.
Для сравнения - если после этого разорвать соединение и снова установить (без перезагрузки QUIK), то развитие идет по первому варианту (Callback молчит). Могут вброситься дополнительные свечки в хвосте, если появились.

Вопрос. Есть ли в этом что-то неожиданное?

Смежный вопрос - для меня назревает некоторая проблема. Спасибо разработчикам за возможность подрастить количество свечек с 3К до 64К - будет удобно работать с историей. Специфика моих индикаторов и алгоритмов в скриптах - используется много памяти с целью повысить их быстродействие.  Такое большое количество свечек будет съедать много памяти. Уже чувствую ограничение возможностей. При том, что для реальной работы скриптам не нужно такое большое количество свечек (1000, скорее всего, хватило бы). Очевидно, что я буду обрабатывать только небольшой хвост истории. Но штатное хранение и использование большого количества свечек опасно деградацией QUIKа.

Предложение. Ввести в параметры настройки QUIK размер хранимой/усекаемой истории (типа тех 3000 свечек, что неявно были до недавнего времени).  
 
Добрый день.

Цитата
А затем устанавливаем соединение. Перезапускается скрипт, CreateDataSource успешен, ds:Size() покажет 16744. Вроде все штатно. И вдруг оживает Callback и получает все 16744 свечек. Кстати вброс такого количества свечек с простейшей обработкой происходит примерно за 1 секунду.  Для сравнения - если после этого разорвать соединение и снова установить (без перезагрузки QUIK), то развитие идет по первому варианту (Callback молчит). Могут вброситься дополнительные свечки в хвосте, если появились.   Вопрос. Есть ли в этом что-то неожиданное?  
Данный вопрос в работе.

Цитата
Предложение. Ввести в параметры настройки QUIK размер хранимой/усекаемой истории (типа тех 3000 свечек, что неявно были до недавнего времени).
В настройках диаграммы есть такая настройка:
«последние ... интервалов» – отображать на графике указанное количество  интервалов. Данные за более ранние периоды времени удаляются из области  построения. Рекомендуется для наблюдения за краткосрочной динамикой изменения  параметра;
Такой вариант подходит?
 
Цитата
Egor Zaytsev написал:

Цитата
Предложение. Ввести в параметры настройки QUIK размер хранимой/усекаемой истории (типа тех 3000 свечек, что неявно были до недавнего времени).
В настройках диаграммы есть такая настройка:
«последние ... интервалов» – отображать на графике указанное количество  интервалов. Данные за более ранние периоды времени удаляются из области  построения. Рекомендуется для наблюдения за краткосрочной динамикой изменения  параметра;
Такой вариант подходит?
Естественно - не подходит. Если я закрою глаза, то вообще не увижу ни одной свечки, но в QUIKе они же не исчезут.

Меня же беспокоят потенциально возможная перегруженность QUIK при увеличении количества обслуживаемых свечек до 64К (в 20 раз против существующего лимита). Это хорошо для обработки истории (можно даже в нерабочее время), когда время не особо критично.

Но в реальной работе на некоторых алгоритмах обсчет большого количества свечек бесполезен - очень долог для, например, ТФ М1.  И появились проблемы с памятью - запустил 3 QUIK от разных провайдеров и уже приходится закрывать другие приложения - во избежание деградации системы. Возможно, я ранее других почувствовал проблемы: Работаю на М1 (когда еще накопятся :64К свечек для высоких ТФ), подобрался к секундным ТФ, алгоритмы тяжелые (обсчет детерминированного хаоса), выжал почти все, резервов осталось мало.

В этих условиях добавление в QUIK параметра размера используемой истории представляется разумным решением.  
 
Цитата
Борис Гудылин написал:
Цитата
Egor Zaytsev   написал:
Цитата
Предложение. Ввести в параметры настройки QUIK размер хранимой/усекаемой истории (типа тех 3000 свечек, что неявно были до недавнего времени).
В настройках диаграммы есть такая настройка:
«последние ... интервалов» – отображать на графике указанное количество  интервалов. Данные за более ранние периоды времени удаляются из области  построения. Рекомендуется для наблюдения за краткосрочной динамикой изменения  параметра;
Такой вариант подходит?


В этих условиях добавление в QUIK параметра размера используемой истории представляется разумным решением.
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
 
Цитата
green_X5 написал:
А вне main никак не подписаться, чтобы упаковать подписку в отдельную функцию с вызовом не из main?

Функция CreateDataSource не предназначена для работы вне функции main или функций обратного вызова.
Мы внесем это уточнение в документации при выпуске одной из будущих версий терминала QUIK.
Приносим извинения за неудобства.
 
Борис Гудылин, Добрый день,
      Мы рассмотрели Ваше пожелание. По итогам его анализа сообщаем Вам,       что реализация пожелания признана потенциально целесообразной.       Если по результатам дальнейшего анализа, включающего юридические       аспекты, анализ на непротиворечивость с общей политикой компании,       никаких возражений не возникнет, мы постараемся включить Ваше       пожелание в план доработок при выпуске одной из следующих версий       нашего ПО.
 
green_X5, Добрый день,
      Мы рассмотрели Ваше пожелание. По итогам его анализа сообщаем Вам,       что реализация пожелания признана потенциально целесообразной.       Если по результатам дальнейшего анализа, включающего юридические       аспекты, анализ на непротиворечивость с общей политикой компании,       никаких возражений не возникнет, мы постараемся включить Ваше       пожелание в план доработок при выпуске одной из следующих версий       нашего ПО.
Страницы: 1
Читают тему
Наверх