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

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

Страницы: Пред. 1 ... 25 26 27 28 29 30 31 32 33 34 35 ... 78 След.
Cteatedatasource
 
Цитата
s_mike@rambler.ru написал:
так задача всегда решается или опять будут подводные камни?
По сути, Вы описали тоже самое что было предложено.
Cteatedatasource
 
s_mike@rambler.ru,
Решение не в том чтобы останавливать скрипт, а в том чтобы добавить цикл ожидания появления нужного инструмента.
Хотите не останавливать скрипт - пожалуйста, это Ваше право.
Cteatedatasource
 
s_mike@rambler.ru,
Михаил,
Надежного способа нет т.к. технически нет никакой возможности его реализовать.
Если Вы уверены в брокере, описанное решение можно назвать надежным.
Cteatedatasource
 
s_mike@rambler.ru,
Ну если Вы предложите способ передать в Lua информацию о том что брокер вдруг решил не запустить шлюз, или уронил чашку кофе на сервер, то можно подумать над надежным решением.
Cteatedatasource
 
s_mike@rambler.ru,
Михаил,
Надежного способа нет, т.к. брокер может вообще не запустить шлюз, например в случае аварии.
надо ждать некоторое время (которое Вы сами укажите) и если за это время инструмент не появился то выдавать ошибку и останавливать скрипт.
И именно об этом была речь выше.
Потоковая безопасность в QLua - документация и реальность
 
kroki,
Из поста совершенно не понятно чего Вы от нас хотите.
Вы делаете какие-то выводы, ради бога, это Ваше право.
Вы спрашиваете зачем нужна функция, Вам был дан ответ и если не хотите ее использовать, Ваше право.
В свое время мы сделали функции по запросу пользователей, для их конкретных задач.
Ровно как сделали темную тему в терминале по просьбе пользователей, не хотите использовать темную тему никто не заставляет.
Да LUA не наш продукт, мы только встроили уже готовое в терминал и мы не можем знать всех нюансов которые в него заложили его авторы, а только то что есть в открытых источниках, ровно также как и Вы.
Если есть конкретные вопросы готовы ответить, пока их в Вашем посте не видно, а только какие-то рассуждения и умозаключения.
Cteatedatasource
 
s_mike@rambler.ru,
Михаил,
Предлагаю создать цикл while который будет вызывать CreateDataSource пока он возвращает nil, как только не nil выходим из цикла и работаем дальше.
цикл делать в main(), в котором через функцию isConnected или флаг в событии OnConnected ждать появления связи, после чего запускать процесс.
+ к этому добавить проверку на количество попыток, скажем если после 5 попыток запустить CreateDataSource все еще возвращается nil, то выдавать ошибку и завершать скрипт.
интервал ожидания между попытками на Ваше усмотрение, например sleep(1000)
Помогите подобрать примерный алгоритм для счетчика сделок
 
Артем,
на сколько становится понятно, вопрос сводится к тому что нужно определить появление новой свечки?
Если так, что таким сигналом может быть номер свечки.
Если номер изменился, значит это новая свечка.
Через CreateDataSource подписаться на нужный график.
Установить колбек через SetUpdateCallback.
В колбеке ловить все свечки.
Можно создать таблицу t={}
И записывать в эту таблицу свечки по номеру
t.[index]=..

Если свечка изменилась то t.[index] обновится
Если случилась новая свечка, то в таблице t появится новая запись
если index не равен предыдущему значению, значит случилась новая свечка.

Тут следует заметить что могут быть нюансы при первичном запуске, когда прокачивается старая информация.
Следует предусмотреть логику проверки, старая это свечка или новая. например проверять время свечки.
Cteatedatasource
 
Цитата
s_mike@rambler.ru написал:
В этoм случае createdatasrc вернет oшибку, вернo?
функция вернет nil

Цитата
s_mike@rambler.ru написал:
Значит, лoмoвoе решение сoстoит в тoм, чтoбы делать перезаказ пo каждoму  onconnected и пo каждoму   oncleanup.

Это не ломовое решение.
Если сработал onconnected, значит терминал подключился к серверу, а вдруг он подключился до запуска шлюза который нужен?
Если сработал oncleanup, значит сессия на сервере сменилась (или другой сервер) это не значит что нужный шлюз подключился, вдруг брокер его подключит с опозданием?

И потом, как уже говорилось, даже если на сервере всё уже есть, на загрузку данных после подключения к серверу (onconnected или oncleanup неважно) требуется время, даже с учетом того что таблица securities грузится первой, все равно оно требуется.
Срабатывание oncleanup и onconnected не означает что информация получена.
Cteatedatasource
 
Цитата
Sergey Gorokhov написал:
s_mike@rambler.ru  ,
Строго говоря отписку делать не обязательно, но в остальном можно рекомендовать вызов CreateDataSource всегда после успешного подключения к серверу.
Но и тут есть нюанс.
Дело в том что на первичную прокачку данных, в частности на получение списка инструментов, может потребоваться некоторое время.
Если вызов функции CreateDataSource произойдет до получения описания инструмента, то заказа не произойдет т.к. будет считаться что такого инструмента нет.
Забегая вперед, достоверно узнать когда появится инструмент и появится ли он вообще - нельзя.
Можно добавить проверку, например на наличие инструмента в таблице securities, но и это не надежно, т.к. инструмент может пропасть (например случилась экспирация) или переехать в другой класс.

плюс к сказанному, еще может быть ситуация когда терминал подключился до запуска шлюза.
Cteatedatasource
 
s_mike@rambler.ru,
Строго говоря отписку делать не обязательно, но в остальном можно рекомендовать вызов CreateDataSource всегда после успешного подключения к серверу.
Но и тут есть нюанс.
Дело в том что на первичную прокачку данных, в частности на получение списка инструментов, может потребоваться некоторое время.
Если вызов функции CreateDataSource произойдет до получения описания инструмента, то заказа не произойдет т.к. будет считаться что такого инструмента нет.
Забегая вперед, достоверно узнать когда появится инструмент и появится ли он вообще - нельзя.
Можно добавить проверку, например на наличие инструмента в таблице securities, но и это не надежно, т.к. инструмент может пропасть (например случилась экспирация) или переехать в другой класс.
Потоковая безопасность в QLua - документация и реальность
 
Цитата
kroki написал:
По-моему в ваших словах противоречие:
По моему это Ваш код противоречит Вашим словам.
Еще раз, согласно Вашему коду никакого одновременного присвоения нет. А значит вопрос совершенно никак не связан с цитатой из документации.
Либо Ваш пример кода не соответствует вопросу, либо вопрос поставлен некорректно

Цитата
kroki написал:
Попробую угадать:
Не надо искать скрытый смысл там где его просто нет.
Фраза "блокирует выполнение кода в другом потоке" означает ровно то что означает без скрытого смысла.
И тут нет никакого сокрального знания.

Цитата
kroki написал:
Вопрос 3: какой смысл в потокобезопасной сортировке, если ее результат (то есть упорядоченный массив) увидеть (то есть получить к нему доступ) никак нельзя?  Если увидеть можно, то, пожалуйста, приведите пример кода.  Я утверждаю, что после выхода из table.ssort() и перед любым другим действием другой поток может что-то вставить в массив с помощью table.sinsert(), и, таким образом, нарушить его упорядоченность - а тогда зачем было вообще упорядочивать?
Цель функции ssort выполнить сортировку таблицы не боясь что во время сортировки в таблице изменятся данные.
Ровно это функция и делает. Если не видите смысла использовать эту функцию то просто не используйте и все.
Никто не заставляет.
Если нужно заблокировать остальные потоки во время вывода таблицы, то при чем тут функция ssort?
Цитата
kroki написал:
Если GC запускаются в каждом потоке свой, то как они не "наступают друг другу на пятки", и не конфликтуют с выполнением другого потока?
В этом вопросе лучше и правильней обратиться к истокам. garbage collector не является нашей разработкой.

Цитата
kroki написал:
Вопрос 6: как исключается ситуация коллизии между GC в разных потоках, запущенными одновременно?  Не могут два разных GC одновременно начать удалять один и тот же объект?
В нашем ПО, это никак не исключается. Все работает так как это реализовали авторы Lua.
Можете проверить поведение функции поставив ряд экспериментов.
Cteatedatasource
 
Цитата
s_mike@rambler.ru написал:
1. Что происходит, если в момент обращения к функции нет соединения с сервером?
CreateDataSource вернет то что есть в терминале. Если в терминале ничего не нет то ничего не вернет.

Цитата
s_mike@rambler.ru написал:
2. Будут ли запрашиваться данные с сервера после установления связи в пункте 1?
Просто так нет. Но если после установления связи повторно вызвать CreateDataSource, то да.

Цитата
s_mike@rambler.ru написал:
3. Что происходит с подпиской после смены сессии?
С подпиской ничего не происходит. Но данные перезакажутся.

Цитата
s_mike@rambler.ru написал:
4. Что происходит с подпиской после выключения и включения терминала с работающим скриптом?
С подпиской ничего не происходит. Но данные не перезакажутся, в случае если соединение с тем же сервером.
Потоковая безопасность в QLua - документация и реальность
 
Цитата
kroki написал:
Вопрос 1: приводит ли присвоение nil глобальным переменным из функции main() (то есть не главного потока) к неопределенным ситуациям?
А как связано простое присвоение nil с одновременной работой из функций обратного вызова скрипта и функции main()?
Вы обыгрываете совершенно разные сценарии, при этом считаете что это одно и тоже.
Вот если бы Вы из разных потоков одновременно присваивали nil, тогда да, согласно документации это может привести к неопределенным последствиям.
Для избежания такой неопределенности, придуманы функции из главы руководства "Потокобезопасные функции для работы с таблицами Lua"

Цитата
kroki написал:
Читаем документацию дальше:ЦитатаВыполнение потокобезопасной функции блокирует выполнение кода в другом потоке до окончания работы функции.
Вопрос 2: имеется ввиду, что другие потоки блокируются при попытке вызвать (ту же или какую-то другую) потокобезопасную функцию (классическая critical section)?  Или же вообще все потоки волшебным образом останавливаются, ну, так, "на всякий случай"? :)
на наш взгляд фраза "блокирует выполнение кода в другом потоке" вполне понятна и не требует уточнений.

Цитата
kroki написал:
Как только table.ssort() закончит работу другой поток может добавить новые данные - и у нас опять потенциально не упорядоченная таблица, которую мы и напечатаем.
Вопрос 3: как вообще тогда использовать table.ssort()?

А чего Вы ожидали? что оно само будет где-то параллельно сортироваться после окончания ssort? Нет такого не будет.
Цитата
kroki написал:
Вопрос 4: в примере выше, что произойдет, если один поток изменит таблицу потокобезопасной функцией как раз в то время, когда другой поток находится где-то в дебрях интерпретатора Lua (внутри ipairs(), t[key], или еще где)? Что именно сделано, чтобы все не "взорвалось"? Или "так делать нельзя"?
Вы же сами выше процетировали:
Цитата
kroki написал:
Выполнение потокобезопасной функции блокирует выполнение кода в другом потоке до окончания работы функции.

Цитата
kroki написал:
Вопрос 5: а какие "сообщения" можно посылать таким образом?  Абсолютно любые "типы" Lua, или есть ограничения?  Этот вопрос связан со следующим:
Если вопрос в том, что можно вставить в таблицу, то это совсем никак не связано с вопросом из п.6.

Цитата
kroki написал:
Вопрос 6: а как потоки дружат со сборщиком мусора (garbage collector)?  Он один на все потоки, или по одному на каждый?  Если один, то в каком потоке выполняется, и что именно сделано, чтобы GC в одном потоке не "взорвал" другой работающий поток, и не "взорвался" сам, считая свободной память, которую другой поток как раз начинает использовать)?  Если же GC у каждого потока свой, то в случае message passing как в примере выше как именно передается ownership (то есть чей GC отвечает за рекламацию сообщения)?
Все LUA функции выполняются в том потоке в котором вызваны и не важно garbage collector это или любая другая функция.
Потокобезопасные функции отличаются только тем что блокируют другой поток пока сами выполняются и опять же в том потоке где запущены. И garbage collector к ним не относится.
Size()
 
s_mike@rambler.ru,
надежного способа нет.
Size()
 
s_mike@rambler.ru,
Михаил,
Должно показать бОльшее значение, на столько сколько добавилось свечек после добавления индикатора.
И это правильно.
Size()
 
s_mike@rambler.ru,
не понятно что именно не так со срабатыванием OnCalculate при index = size()
Size()
 
Цитата
s_mike@rambler.ru написал:
о первой свече

Цитата
s_mike@rambler.ru написал:
о самой правой

Поясните
Size()
 
s_mike@rambler.ru,
Михаил, кажется мы это уже обсуждали.
https://forum.quik.ru/messages/forum10/message23759/topic2658/#message23759

Узнать что обрабатывается первая свечка можно проверяя существование свечек начиная с 1 до первой найденной.
Но если говорить не о первой свечке, а о первом расчете индикатора на первой свечке, то в условиях когда на графике всего одна свеча, надежного способа нет.
Экспорт всех сделок по DDE, DDE
 
Петр,

Формат файла жестко прописан в документации, он не меняется от того какие колонки есть в Ваше таблице.
Формат всегда один и тот же.
Экспорт всех сделок по DDE, DDE
 
Цитата
Петр написал:
но ваш текстовый файл не сохраняет наименование  столбцов таблицы..

читаем выше
Цитата
Sergey Gorokhov написал:
Формат файла описан в документации на терминал QUIK (клавиша F1)
-Раздел 10. Форматы сохранения таблиц в текстовый файл
--Таблица сделок
Экспорт всех сделок по DDE, DDE
 
Петр,
В MS Excel есть функционал который позволяет открывать текстовые файлы с произвольным разделителем.
Скорей всего в LibreOffice тоже есть аналогичный функционал, рекомендуем ознакомиться с его документацией.

Формат файла описан в документации на терминал QUIK (клавиша F1)
-Раздел 10. Форматы сохранения таблиц в текстовый файл
--Таблица сделок
Экспорт всех сделок по DDE, DDE
 
Петр,
Если просто сохранить, это можно сделать через контекстное меню таблицы, пункт "Сохранить в файл..."
Экспорт всех сделок по DDE, DDE
 
Петр,

здравствуйте,
QUIK умеет экспортировать по DDE в любое приложение поддерживающее технологию экспорта по DDE.
Клиенты даже пишут свои собственные DDE серверы и успешно ими пользуются.
Вопрос, есть ли такая технология в LibreOffice?
Аналог функции eval для lua, Аналог функции eval для lua
 
Здравствуйте,
Можно попробовать через loadstring
Код
function calculateString(str)
   return assert(loadstring("return "..str))()
end
Отметки на графике QUIK средствами QLUA
 
Владимир Павлов,
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.

Цитата
Владимир Павлов написал:
А ка долго вы реализуете такие пожелания??
Рекомендуем ознакомиться с регламентом
https://forum.quik.ru/forum8/topic13/
Отметки на графике QUIK средствами QLUA
 
Владимир Павлов,
В QPILE тоже нет таких функций.
Можем предложить зарегистрировать от Вас пожелание на доработку.
Отметки на графике QUIK средствами QLUA
 
Цитата
Владимир Павлов написал:
Как поставить скриптом трендовую линию??     у нее больше параметров чем у простой метки.

Через SetLabelParams можно устанавливать на график произвольную bmp картинку, через параметр IMAGE_PATH
Ничего не мешает в bmp файле нарисовать нужную линию.

Цитата
Владимир Павлов написал:
В Квике есть еще много других графических объектов, а как их устанавливать? В описании я не нашел на это ответа.
В описании нет ответа т.к. в текущей реализации через QLUA нет такой возможности
Цитата
Владимир Павлов написал:
Как получить список вкладок и всех графиков на вкладке?? Видимо там и будет хранится тег графика, к которому привязывается метка

Тег графика Вы указываете самостоятельно вручную, в поле Идентификатор, в свойствах графика на вкладке Дополнительно
Очистка таблиц Quikа по OnCleanUp может вырубить скрипт. Как уберечься?
 
Вы говорите про разные потоки, которые между собой не синхронизируются.
Если в одном потоке случилась ошибка, то второй поток как минимум закончит обработку прежде чем случится выход, либо будет завершен принудительно через 5 сек.
Цена свечи без тега графика
 
Optimus1 Optimus1,

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

Можно сравнить номер свечки с ds:Size(), и ели номер меньше, то просто игнорировать.
Вывести котировка
 
Здравствуйте,
Примеры есть по ссылке

По проблеме:
1) Для того чтобы CreateDataSource вернула результат, необходимо открыть нужный график в терминале QUIK
2) Вы показываете данные в message после того как ds закрывается. Нужно либо выводить message до закрытия ds, либо выводить значение нужной переменной, например у Вас в коде есть переменная O.
3) для вывода в message надо преобразовать цифры в строку, это делается функцией tostring
message(tostring(O));
Цена свечи без тега графика
 
Optimus1 Optimus1,
Частично не загружается.
Цена свечи без тега графика
 
Optimus1 Optimus1,
попробуйте так:
  while ds:Size() == 0 do
     sleep(5)
  end
Очистка таблиц Quikа по OnCleanUp может вырубить скрипт. Как уберечься?
 
Алексей,

Если данные уже попали в Вашу таблицу, то терминал ее уже не сможет затереть, пока колбек не завершится.
куда бОльшие сомнения вызывает переменная TEname, что это такое?
Было бы удобней увидеть полный код целиком, а не только часть.
Цена свечи без тега графика
 
Цитата
Optimus1 Optimus1 написал:
Это что то на подобии задержки, чтобы данные успели погрузится ?
да верно

Цитата
Optimus1 Optimus1 написал:
Если да, то как быть точно уверенным, что это задержи хватило, а если таких запросов будет больше одного, то необходимо после каждого запроса задержку делать ?
боюсь что заранее нет способа узнать, сколько потребуется времени на закачку данных.
Но можно написать бесконечный цикл ожидания, в который будет проверять Size
Цена свечи без тега графика
 
Optimus1 Optimus1,
Добавьте sleep(1000) сразу после CreateDataSource
Цена свечи без тега графика
 
Optimus1 Optimus1,
CreateDataSource не производит повторный заказ информации если она уже заказана с сервера.
Если информация есть в кэше терминала, то CreateDataSource ее покажет.
Цена свечи без тега графика
 
Optimus1 Optimus1,
Да, но только в случае если график по параметру таблицы текущих торгов.
Если параметр не указан, то график строится по таблице обезличенных сделок. Т.е. надо проверить есть ли данные по инструменту в этой таблице.
Цена свечи без тега графика
 
Optimus1 Optimus1,
Если график был заказан с сервера через интерфейс, то CreateDataSource его покажет.
Подскажите правильный алгоритм, сброс параметров при количестве позиций = 0
 
Цитата
sav 312 написал:
Я приводил два примера обнуления позиций в 15:47 и в 13.00.
Да, и на это уже был ответ:

Цитата
Sergey Gorokhov написал:
Другой вопрос в том почему 21го числа клиринг был в 15:00, а 22го уже в 13:00 и на этот вопрос у нас к сожалению нет ответа.
Видимо это какая-то особенность игрового контура биржи.
Цитата
Sergey Gorokhov написал:
поправка, 21го клиринг был в 15:45

Цитата
sav 312 написал:
Может ли на боевом счёте происходить кратковременное обнуление позиций в течение торговой сессии, т.е. не во время клиринга?
нет
Цена свечи без тега графика
 
Optimus1 Optimus1,

попробуйте так:
message(tostring(ds1:Size()));
Кросс платформенность и стандартизация в QUIK API
 
Цитата
rinat написал:
1. при кросс-компиляции над нестандартными типами приходится дополнительно работать. это вполне конкретный issue для будущего кросс-платформинга. абсолютно просто и очевидно.

Нужна конкретика. Где именно Вы увидели "нестандартные" типы?

Цитата
rinat написал:
2. очевидно, что раз вопрос поставлен не только об исполнительной части, то trans2quik недостаточно, если конечно туда вдруг уже не добавили API для маркетдаты - было бы неплохо. пока же ответ однозначен

Давайте еще раз, Вы говорите про возможность использовать QUIK API на linux/macos.
Если речь про API без терминала, то это Fix Client Connector. Да он не работает на linux и iOs. Но ничего не мешает расположить его на компьютере с Windows и подключаться к нему по сети с Вашего приложения на  linux или iOs.
Если речь про разработку именно терминала QUIK под linux и iOs и к нему разработать аналог trans2quik, то на этот счет у нас есть однозначная позиция
Кросс платформенность и стандартизация в QUIK API
 
rinat,
Просто так "сделайте как там" мы делать не будем (см регламент)
Менять что-либо кардинально в имеющемся ПО тоже, т.к. этим ПО пользуется очень большое количество людей.
Кроме того, Вы так и не уточнили о каком именно ПО идет речь.
Если у Вас есть конкретные предложения, по конкретному ПО, то готовы передать тему разработчикам через стандартную процедуру регистрации пожелания.
Иначе просто не понятно какому именно разработчику адресовать это пожелание.
Кросс платформенность и стандартизация в QUIK API
 
rinat,

1. Приведите конкретику, что именно Вы хотите изменить в используемых типах данных.
2. ответ не понятен.
QUIK API напрямую к серверу.
 
rinat,
Кажется это Вы не поняли/читали ответ. Такое API уже есть.
Если вопрос в стоимости, то увы.
Подскажите правильный алгоритм, сброс параметров при количестве позиций = 0
 
Цитата
sav 312 написал:
А как быть с обнулением во время торговой сессии?

О каком обнулении во время сессии идет речь?
Подскажите правильный алгоритм, сброс параметров при количестве позиций = 0
 
sav 312,
На боевом будет тоже самое, только там клиринг всегда в одно время.
Подскажите правильный алгоритм, сброс параметров при количестве позиций = 0
 
Цитата
Sergey Gorokhov написал:
почему 21го числа клиринг был в 15:00
поправка, 21го клиринг был в 15:45
Подскажите правильный алгоритм, сброс параметров при количестве позиций = 0
 
sav 312,
Расследование показало, что обнуление происходит в момент клиринга и это нормально т.к. происходит перерасчет данных.
Другой вопрос в том почему 21го числа клиринг был в 15:00, а 22го уже в 13:00 и на этот вопрос у нас к сожалению нет ответа.
Видимо это какая-то особенность игрового контура биржи.
Подскажите правильный алгоритм, сброс параметров при количестве позиций = 0
 
sav 312,

В процессе, к сожалению это не мгновенно и потребуется некоторое время.
Страницы: Пред. 1 ... 25 26 27 28 29 30 31 32 33 34 35 ... 78 След.
Наверх