Nikolay (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 След.
Получать объемы сделок
 
Да вроде таких примеров на просторах достаточно. Собственно просто читать поток сделок и что-то с ним делать.

Вот, для примера https://github.com/nick-nh/qlua/tree/master/quantScript
Уточнение принципа работы OnParam, RequestParams и GetParamEx2
 
Я бы уточнила так:

Хотелось бы иметь возможность осуществлять подписку на колбек по изменению одного (или списка параметров) из ТТТ. Возможно для этого лучше сделать отдельный метод, чтобы не менять существующую функциональность.
По приходу колбека иметь в качестве одного аргументов имя параметра, изменение которого вызвало колбек.

Впрочем, такие пожелания уже были.
На демо счете прошла кросс заявка.
 
Демо счет, Quik 8.13.0.106

Установлен лимитный ордер. Совершена ручная сделка, исполнившая этот ордер. В таблице сделок номер сделки задублирован.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Владимир, не забывайте, что данный форум это не просто общение, но и какое-никакое средство коммуникации с разработчиками терминала.
Задаешь вопрос, ожидаешь получить ответ от них, а не комментарии, что это никому не надо.

На форуме есть ветка https://forum.quik.ru/forum17/ для произвольного общения.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Владимир, проблема не в том как Вы пишите, а в том что пишите. Я в сети тоже с 94 года. Всегда были разговоры по существу или общий балаган. Выражайте свое мнение, на здоровье. Но не надо его навязывать. Для простых разговоров есть другие форумы.
Вы пишите какое-то решение для себя. Но есть другие люди, которые имеют свое мнение на то, что им надо. Не про то как это написать, а именно что надо.
Вам не надо, другим надо. Они просят, значит надо сделать. Поэтому и возникаю проблемы при решении таких задач. Просто Вы с ними пока еще не столкнулись. Но это не значит, что их нет.
Событие получения данных всех таблиц и графиков после подключения к серверу
 
Цитата
Я ведь всё описал по вашему алгоритму? ничего не упустил?
Почти. Этот маркер будет всего лишь триггером на запуск, инициализацию алгоритма. До него считаем, что данные некорректные и смысла на запуск нет вовсе.

При этом остаток данных будет получен уже по факту.

А вот если нет никаких ориентиров, то по той же логике запускаем скрипт, ориентируясь на данные в кеше. Запускаем и... На основании чего будем заявки отправлять: на вчера 23:00, позавчера, сегодня час назад.

Собственно сейчас и приходится формировать алгоритм ожидания для получения потока CreateDataSource, ожидая когда время последнего бара с учетом периода будет больше времени последней сделки. Иначе данные не доехали.

При этом потоки данных, имеющие время в своем составе хоть как-то позволяют организовать оценочное ожидание и проверку (скажем заказ обезличенных сделок так долго поступает, что без ожидания можно подумать, что и потока нет), а вот данные не имеющие его уже никак. А то ведь бывает уже торговая сессия идет, а открытые позиции терминал еще не получил https://forum.quik.ru/messages/forum10/message49888/topic5698/#message49888 И думай - может сделки прошли и позиция закрылась. Но сделок нет. А может они тоже еще не загрузились.
QUIK не отправляет заявку, в которой цена представлена переменной
 
А причем здесь сервер? Сервер дает что попросили.
getParamEx из кеша теримнала данные вернет, если они есть. А если их заказали с сервера, то они будут обновляться в кеш.

А что программа должна делать, если с сервера не получен ответ. Она просто возвращает в поле result возвращаемой таблицы = "0", что условно и соответствует ошибке получения данных. Это он как раз и говорит - ничего нет.
А message - это средство оповещения.

Дебаг - это либо вывод в лог отладочной информации с level = debug. Либо использовать PrintDbgStr. При этом код должен содержать ассерты на входящие данные, чтобы сразу и понять где ошибка.
QUIK не отправляет заявку, в которой цена представлена переменной
 
Питон тоже самое, только тяжелее, медленнее и со своими проблемами.

Что касается клиент серверного взаимодействия, то вне зависимости от языка, прежде чем проводить операции с данными, полученными с сервера, из принято проверять.
Они могут быть не получены, они могут быть некорректными. В вашем примере Вы сразу пытаетесь привести значение к числу, не убедившись, что они есть.
Если вернется что-то не то, tonumber вернет nil. А далее Вы с этим будете арифметические действия выполнять.
Событие получения данных всех таблиц и графиков после подключения к серверу
 
Первичные данные всегда актуальны на какой-то конкретный момент времени в  прошлом и очень редко актуальны в течение какого-либо длительного  периода.

Да, актуальность потока данных не контролируется. Но вот на момент заказа вполне (это ведь точная отметка по оси времени). Сколько данных - столько, давай их все и все что будет еще. По приходу данных на момент запроса  - сигнал (для каждого момента до точки заказа колбек мне не нужен),  а далее включай колбек для новых (после точки заказа). Т.е. пошли уже данные потоком. А вот  если мне сыпать колбеки на каждый момент в прошлом (до точки заказа), то, конечно, смысла  нет. Если только не будет отдельного сигнала о достижении данных на момент заказа.

Также вполне может быть сценарий получения данных просто до момента заказа. Скажем - дай, что есть сейчас, на момент прихода заказа. Будущее не интересно. Чем не актуальные данные. Захочу новые - закажу еще.
Событие получения данных всех таблиц и графиков после подключения к серверу
 
Цитата
Артем написал:
Nikolay,это уже реализовано - OnParam и т.п. При ответе сервера приходит колбек. Нет ответа - нет и колбека.
А я разве сказал, что нет. Вопрос получения данных и их актуальности на этом форуме уже много лет обсуждается. OnParam - это всего лишь какая-то реализация, предложенная разработчиками.
Событие получения данных всех таблиц и графиков после подключения к серверу
 
Цитата
"Всё" никогда не бывает загружено.
Конечно. Но если говорить о пакетах данных - заказал пакет: получен, не получен.

Даже бесконечный поток реального времени, если разделить на дискретные пакеты, уже позволяет контролировать загрузки пакетов. Иначе один пакет сбойный - толку от такого потока, если это критически важный поток данных.
Событие получения данных всех таблиц и графиков после подключения к серверу
 
Владимир, при клиент-серверном взаимодействии таймерное ожидание никаких гарантий не дает. Необходимо либо иметь метод в API дающий ответ, что все загружено, либо колбек по факту события загрузки.
Событие получения данных всех таблиц и графиков после подключения к серверу
 
Владимир, предлагаю Вам присоединиться к форуму mfd.ru или smart-lab.ru. Думаю там Вы найдете благодарную публику. На первом форуме очень любят "Гуру".
Здесь, все же, хотелось бы видеть комментарии по существу, без литературных вставок.


Вы написали СЕБЕ скрипт - и ладно. Поучать других малополезное занятие. Когда решите написать скрипт кому-то еще (вдруг случится такое чудо), то, вполне возможно, столкнетесь с тем, что очень у многих пользователей терминал настроен не так как у Вас, брокер другой и он работает не так как ваш. А Ваш скрипт не учитывает это.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Лично у меня нет слов в нормативной лексике!  
Продолжайте в том же духе оформлять свой код - не то еще будет.

Никаких проблем с подачей транзакции и поиском ответов, если он пришел, нет. А то что Вы не знаете что такое счет депо только подтверждает, что предметная область Вами не усвоена.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Велосипеды уже давно написаны, языку уже 27 лет. Не стесняетесь пользоваться http://lua-users.org/wiki/SampleCode, раздел Serialization.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Покажите пример. Можете распечатать контекст Lua: dump_tbl (_G, " ", 0)
Снимаю замечание. Не увидел изначально переменную seen. Обычно этот вариант не содержит ее.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Функция dump_tbl   рекурсивная и в ней раскручиваются все ссылки.
В этом проблема. Кеширования ссылок нет.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
В диалоге OS_Quesha, в процессе ее работы, функцию dump_str можно вызвать в любой момент для любой глобальной переменной скрипта с тем,  чтобы распечатать ее с выдачей в журнал отладки.
Это довольно распространенный вариант на просторах. Вы попробуйте им вывести Класс или таблицы с перекрестными ссылками.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Незнайка написал:
Цитата
BlaZed написал:
Расчет на 10 одновременно работающих роботов, у каждого робота свой robot_id от 0 до 9
Есть идеи, как сделать уникальный trans_id в разных роботах без необходимости задавать свой диапазон (robot_id) внутри каждого робота (или их копий)?
Вместо trans_id_count можно использовать миллисекунды из os.sysdate(). Но
Цитата
Nikolay написал:
вероятность отправки транзакции двумя скриптами одновременно есть.
Вопрос уникальности транзакции обычно возникает в свете поиска ответа на транзакцию и установленного ордера по ней, сделок.
Обычно делают номер как unix_time + mcs*1000. Также скрипт пишет в поле brokerref свой уникальный комментарий. Или, как выше написали, есть некая добавка от номера скрипта.
Я предпочитаю brokerref, т.к. он идет сквозным образом от транзакции в ордер и сделки.

Вместе это дает уникальность при дальнейшем использовании номера и brokerref.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Если id  транзакции предполагается в дальнейшем использовать как ключ, то необходимо обеспечить его уникальность. Хоть рандомизация и повышает вероятность уникальности, но не обеспечивает ее в полной мере.
Чаще всего используют производные от unix-time как ключ транзакции. Но при этом надо еще подумать об уникальности между скриптами, т.к. вероятность отправки транзакции двумя скриптами одновременно есть.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
qlua.dll - это библиотека, неотъемлемая от терминала. Так что ее можно считать частью среды исполнения.
Я же говорю о библиотеках реализующие часть функциональности, которую можно реализовать самому. Предпочтение будет всегда тем, которые имеют открытый код.

Владимир, как угодно. Можете доверять чужим рукам.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
С точки зрения ГК коммерческая деятельность - это деятельность предприятия (организации, юридического образования) направленную на рыночную деятельность, имеющую своей целью получение прибыли или рыночного дохода.

Так что это не о том.

А по существу уже все обсудили. Я слабо себе могу представить разработчика, использующего библиотеки без исходных кодов.
Индикатор торговой сессии
 
Цитата
Владимир написал:
Игорь М, Непохоже. Там у меня вообще стоит 10 секунд, а данные обновляются НАМНОГО чаще!
Эти секунды берутся, если установлен флаг "Запрашивать данные раз в".
Если не установлен, то происходит постоянное получение данных, с учетом минимальной допустимой дискретности.
агрегировать значения из таблицы сделок по временному условию
 
Время лучше всегда и сравнивать в секундах, переведя его в unix-time, используя os.time.
Надо определить переменную, определяющую время 12:00 текущего дня и сравнивать ее с временем таблицы.
Условно:
os.time(trade.datetime) > time_12
агрегировать значения из таблицы сделок по временному условию
 
Владимир, неужели Вы думаете, что если бы такое было, то за все время существования языка (с 1993 года) это никто не заметил бы? Такого рода проблема (самопроизвольное магическим образом изменение значения переменной) - это просто крест на языке.
агрегировать значения из таблицы сделок по временному условию
 
Цитата
Владимир написал:
Старатель, Да приводил уже, Господи! Почти сразу после моего появления здесь! Когда элемент брался по двойной индексации a=b[i[j]] тип был один, а если заменить на k=i[j];a=b[k] - другой.  
Не бывает такого поведения.
Если Вы между индексациями таблицы изменение значение переменной к, то язык здесь не виноват. В случае же первого варианта у Вас нет переменной и нет проблемы.
Часто такое наблюдается при использовании глобальных переменных, когда к, объявленная в одном месте, перезаписывется в другом.
Индикатор торговой сессии
 
Свечи могут не поступать. Есть такая ошибка (особенность) у серверной части брокера - последняя цена обновляется, а свечи нет. При этом торговая сессия идет. Смотришь на график, не двигается, а цена последней сделки меняется.

Данные стакана, тоже могут не поступать. При этом еще есть планка, когда нет заявок. Есть предторговый аукцион, когда стакан заполнен, а сессия не идет.
Для срочного рынка есть клиринг, когда сессия не идет, а заявки какое-то время еще есть в стакане.
агрегировать значения из таблицы сделок по временному условию
 
Владимир, я не очень понимаю в чем у Вас проблема с типами. Ее нет. Если Вы записываете в переменную значение другого типа, то это чья проблема?
В других языках получите ошибку компиляции, здесь просто следите за руками.
агрегировать значения из таблицы сделок по временному условию
 
Цитата
Игорь М написал:
Да, 2-ой. И у меня 2-ой. Можно с префиксом "0x" поставить для наглядности: bit.band(trade.flags, 0x4). И bit.band в отличие от bit.test число возвращает. Почему bit.test лучше, чем bit.band - готов узнать.
Кроме быстродействия и наглядности никаких.
агрегировать значения из таблицы сделок по временному условию
 
То что получение данных таблицы сделано разово - это хорошо, т.к. это затратная по памяти функция.
А вот то, что функция аггрегирования вызывается несколько раз - это не очень.

Почему не произвести расчет разово, перебрав сделки в одном цикле.

Что касается направления сделки, то если это обычная таблица trades (а не обезличенные сделки), то направление это 2-ой бит флага.
И проверять его лучше логически через функцию bit.test, а не сравнивать с десятичным числом.


if bit.test(trade.flag, 2) then
...
Отправка транзакции в сегменте фондового рынка (акции) - брокеры Финам / Сбербанк, какой формат и где брать код клиента?
 
Никаких проблем с брокером Сбербанк не наблюдается.
Формат отправки client_code..'/'..comment
Данный инструмент запрещен для операции шорт
 
Владимир, разработчики терминала Вам в этом вопросе не помогут.

Перед подачей транзакции Вы можете проверить какое количество доступно для заявки данного направления. Данная ошибка возникает по причине проверки параметров заявки на сервере Брокера.
В  периоды высокой нагрузки на сервере брокера Вы еще и не такие ошибки  будете получать. Допустим, транзакция прошла, Вы видите сделки в таблице  сделок, а баланс до сих пор показывает, что бумаги у Вас есть или их  нет. Потом и баланс обновится, но задержка может быть существенной.
Индекс формирующегося бара.
 
Для проигрывания звуковых файлов Вы можете воспользоваться библиотекой w32:
https://quik2dde.ru/viewtopic.php?id=78
Индекс формирующегося бара.
 
В данном контексте у нас последний бар = Size. Можно порассуждать о теоретических ситуациях, но зачем.

Я такие задачи предпочитаю решать через замыкание. Но можно, конечно, и переменные создать.
Код
--Общая сумма
local sum  = 0
--Сумма текущего бара
local ind_sum = 0
--Последний рассчитанный индекс
local last_index = 0
function OnCalculate(index)

    --Рассчет необходимо произвести один раз при появлении нового бара, рассчитав только что завершившийся.
    --Если этот код вызывать на каждой сделке, то sum не будет равен сумме объемов баров
    if index ~= last_index then
        sum = sum + ind_sum
    end

    if not C(index) then return sum end

    ind_sum = 0

    if T(index).hour == 9 then
        ind_sum = 0
    end
    if O(index) ~= C(index) then --исключаем пред и пост торговые бары, а также бары без движения.
        if O(index) < C(index) then
            ind_sum = V(index)
        else
            ind_sum = -V(index)
        end
    end
    last_index = index
    return sum + ind_sum
end
Индекс формирующегося бара.
 
Так я Вам уже написал:

Так расчет будет только для исторических баров при старте. Текущий бар всегда равен Size, а значит и расчета нет.
Когда появится новый бар, он опять равен Size.

Если Вы хотите при поступлении нового бара произвести расчет прошлого бара, то необходимо обеспечить хранение последнего рассчитанного бара он будет равен Size()-1, а при поступлении нового увеличить индекс рассчитанного бара и произвести расчет. Т.о. Вы будете производить расчет последнего закрытого бара.
Индекс формирующегося бара.
 
Так расчет будет только для исторических баров при старте. Текущий бар всегда равен Size, а значит и расчета нет.
Когда появится новый бар, он опять равен Size.
Также Вы переменную sum инициализировали где-то? Иначе будет арифметика с nil.
Индекс формирующегося бара.
 
В Квик нумерация баров идет от 1, в отличии от MT.

Поэтому последний бар равен результату выполнения функции Size(). Она возвращает текущее число баров. Если индекс равен ему, то он последний существующий бар.
Нулевые значения PRICEMIN и PRICEMAX
 
За это время брокер уже восстановил данные в потоке данных. При этом в какие-то дни наблюдались частично корректные данные.
В частности для класcа FQBR (иностранные акции) данные были всегда корректны. Для TQBR данные были заполнены по нескольким инструментам, остальные были пустые.
С чем связана такая избирательности не очень понятно.
Странная дата сервера
 
Цитата
Старатель написал:
На рабочем месте, не на сервере.
Не уверен. Разные клиенты.
Странная дата сервера
 
Опять Финам.




Клиент не хочет отправлять архив рабочего места. Может все же понять, что происходит на сервере брокера.
Определить выбранный язык QUIK из LUA
 
В голову приходит одно: взять w32 и поискать главное окно. Если найдено  на английском, то english. Правда, если несколько терминалов, то уже  может быть не вариант.
Нулевые значения PRICEMIN и PRICEMAX
 
При постановке Лимитной заявки необходимо не выходить за допустимый диапазон цен. Тыкать палочкой (отправить заявку и прочитать ответ) - не вариант, т.к. никто штрафы за превышение числа транзакций не отменял. Поэтому эти параметры критически важны.

Кстати, забыл уточнить, на срочной секции все корректно, параметры заполнены.
Определить выбранный язык QUIK из LUA
 
Владимир, вот зачем в каждой ветке писать свое мнение...
К сведению, от выбора языка интерфейса терминала можно и нужно выводить сообщения, комментарии на разных языках, что вполне естественно.
Нулевые значения PRICEMIN и PRICEMAX
 
С начала этой недели у брокера Сбербанк данные PRICEMIN, PRICEMAX нулевые. Сам брокер ничего внятного сказать не может.
Определить выбранный язык QUIK из LUA
 
Если имеется ввиду версия lua, то есть предопределенная глобальная константа _VERSION.
Эвента на изменение таблицы "Клиентский портфель"
 
Если есть интерфейс у скрипта, ставить задержку меньше 50млс не рекомендуется.
А если поставить 0, то по идее влиять не должно, раз у нас много ядер, но Квик все же "висит". Поэтому хоть что-то да лучше поставить.
Эвента на изменение таблицы "Клиентский портфель"
 
Единый счет - это конструкция, когда данные собираются из разных мест. Вы бы сказали хоть какие изменения должны вызывать событие.
Если деньги - это одно. Если позиции по бумагам - это другое. Портфель - слишком общее понятие.
Эвента на изменение таблицы "Клиентский портфель"
 
Если говорить о доступных call back, то их список описан в документации.
Не очень ясно, что требуется. Но можно предположить, что если речь про денежные средства, а не позиции, может подойти: OnMoneyLimit.

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

Можно ли утверждать, что время в параметре 'TIME', полученное в колбеке OnParam через getParamEx(class_code,  sec_code, 'TIME')  не может быть больше  чем время последней записи getInfoParam('LASTRECORDTIME')?
Страницы: 1 2 3 4 5 6 7 8 След.
Наверх