Владимир написал: Завязывайте вы с этим кретинизмом, господа, и считайте свечи сами - это в миллион раз проще, быстрее, надёжнее, чем ковыряться "в этом во всём". Я это сделал почти сразу после первого же знакомства с Квиком, и ни разу об этом не пожалел.
Вопрос был про исторические данные, на которых ваша методика уже не работает, т.к. никаких LAST нет год назад. Отдельный вопрос целесообразности этого, но он не имеет отношения к техническому решению.
Судя по всему Вы в алгоритме используете индекс, как факт прихода нового бара. А он увеличивается не по времени, а при совершении первой сделки в новом временном интервале. Поэтому новый бар может появится когда угодно, может даже не прийти вовсе, если сделок не будет.
Закрытие же бара - это цена последней сделки в временном интервале бара из таблицы обезличенных сделок. Можете отслеживать время сделки из ТОС, можете просто, при факте наступления нового интервала, принимать, что бар закрылся. Т.е. надо переходить на контроль времени, а не появления нового индекса бара.
Я не использую данные с графиков, только потоки данных и расчет на них. Да и спрятать можно все, написав свой итератор. Тогда вызов станет универсальным, простым в конечной точке вызова.
Алгоритм синхронизация разных ТФ достаточно прост. Синхронизация идет по времени бара, т.к. время это общее что связывает ТФ. Надо определить наименьший ТФ. Далее есть точка отсчета как отметка времени. Необходимо установить младший ТФ и все старшие на эту начальную точку, т.е. найти тот индекс в каждом ТФ, который соответствует этой отметке.
Теперь необходим итератор по индексам младшего ТФ, от начальной точки.
Переходим на следующий индекс. Проверяем старшие ТФ: новая отметка времени требует увеличения индекса старшего ТФ? Если да, то увеличить.
Таким образом, на каждой итерации текущий индекс каждого ТФ будет соответствовать текущему времени итерирования.
Для примера ТФ 1 мин, 5 минут.
Стартуем от 10:00.
Увеличиваем индекс ТФ1 на 1. Это будет 10:01. Для ТФ 5 минут все еще длится бар 10:00. Значит по нему увеличения индекса нет. Так доходим до 10:05. В этот момент для ТФ 5 минут выполнится условие нового бара. Значит по нему увеличиваем индекс на 1.
Игорь М написал: Причем здесь какой-то мой алгоритм? Подняли тему и я написал,что TRADINGSTATUS криво работал раньше, написал что проверю снова. Вот проверил, ничего не поменялось. Написал сюда, чтобы люди, которые будут потом читать, не тестировали заново. Резюмируя: TRADINGSTATUS - бесполезная мура, 10-15 секунд это перебор для любых систем. За эксклюзивную информацию о том, что "система торговли Квик - это не тот инструмент, что стоит использовать" для "мгновенной реакции", низкий поклон, конечно. ::
Вы же говорите, что задержка в 15 секунд для Вас критическая. Я пока не видел с этим проблем, для любых торговых систем. Совершенно разные мнения.
Игорь М написал: Для информации: проверил снова за эти два дня, как были раньше неадекватные задержки, так и остались. Значения писались в лог при их изменении (SiU3): 140514.690: status: 1
Вчера статус на 11-ой секунде после возобновления торгов поменялся, а сегодня на 15-й.
Если Ваш алгоритм требует мгновенной реакции, то, видимо, стоит задуматься, что система торговли Квик - это не тот инструмент, что стоит использовать. Хотя, конечно, можно дополнить получение статуса косвенными методами. Получите статус по тому, какой сработает быстрее.
nikolz написал: Определяете, что торги идут в принципе (был такой магазин ) Потом проверяете объем торгов по данному инструменту. Если ноль, то не торгуется. Можете еще проверять наличие предложений. Если инструмент не торгуется то и предложений нет
Все косвенные методы не отвечают на вопрос о статусе торгов конкретного инструмента. То что торгуется Сбербанк, не значит что торгуется фьючерс. То что торгуется один инструмент, не значит, что по другому нет стоп торгов. А по третьему планка и остановка торгов. Так что если вопрос: узнать состояние торговой сессии по конкретному инструменту, то этот статус транслируется. Все остальные методы косвенные, и не факт, что задержка будет не больше.
Игорь М написал: По поводу TRADINGSTATUS: Я когда-то тестировал его и, если не ошибаюсь, он криво работал. Он в 14:05:10 показывал 0, хотя торги уже 10 секунд шли, и лишь на 11-ой секунде он стал 1. Такая же история и с вечерней сессией. Надо в понедельник проверить снова.
Возможно. Но другого способа достоверно узнать, что сессия открыта, нет. Хотя, конечно, можно использовать косвенные способы, например - отправить транзакцию и посмотреть ответ. Но это просто пример экстремального способа. Что касается изменения цены, то это, конечно, не даст ответ о состоянии сессии по инструменту, а просто покажет активность участников.
18.08.2032 торги на срочном рынке FORTS после проведения дневной клиринговой сессии возобновились в 14:27:00.
Известен ли кому-нибудь способ получать информацию о "необычных" временах начала/возобновления торгов? Насколько я понял, доступа к таблице системных сообщений нет. Здесь предлагают использовать поле TRADINGSTATUS ответа getParamEx, но, судя по обсуждению, не до конца ясно, можно ли на него полагаться.
Есть ли другие варианты, в т.ч. костыльные?
Благодарю за ваши предложения.
Да, именно этот параметр даст состояние сессии. И он вполне корректно отработал в этот день, как в другие дни, когда статус торговой сессии по там или иным причинам по инструменту изменяется.
Сергей С. написал: Да, это реальный торговый счет. Сначала этот вопрос я адресовал брокеру. На что он сказал, что это проблемы на стороне клиента Квик. Брокер ФИНАМ. У других брокеров есть такая особенность первой сделки?
Клиент Квик не может приводить к задержкам, т.к. он клиент. Его задача просто получать данные с сервера брокера. Правда проверьте, что у Вас просто не установлен период получения данных. Иногда ставят период 10 секунд который задан по умолчанию, что и приведет к таким задержкам.
Проверить же можете просто. Пишите скрипт, фиксирующий в логе, сообщениях (не важно) время отправки транзакции, время прихода колбека о ордере, сделках и, главное, время прихода колбеков OnDepoLimit или OnFuturesClientHolding. Сразу будет видно как сколько времени тратится на полный цикл.
Свою позицию Вы знаете. Размер лота и цену последней сделки получите из потока данных (условно Таблицы текущих торгов) через метод getParamEx. В документации все методы qlua описаны.
VPM написал: Что то я совсем не могу понять, что средствами qlua нельзя получить стоимость контракта на fut?
Вы про какую стоимость спрашиваете? Про размер ГО, уплаченный по сделке или стоимость в в валюте цены? Если про ГО, то это величина, рассчитываемая по формуле, зависящей от многих параметрах, спецификации контракта. На этом форуме уже обсуждалось и приводился пример такого метода.
Это Вы про реальный торговый счет спрашиваете? На демо счете ARQA это такая особенность. На реальных счетах разных брокеров особой задержки не наблюдал. Впрочем, от брокера зависит, конечно.
Этот код - это просто демонстрация работы с ордерами как объектами через колбеки и обработка их через корутины. Также есть получение данных ТТТ и данных с графиков. Все. Сказать что это код для работы можно с очень большой натяжкой. Элементарно - выключил скрипт, все данные потерял. Надо дописывать хранение данных между запусками. Также пропустил колбек - ордер не будет в актуальном состоянии. Ну и другие вещи - обрывы связи, ожидание получения данных, смена торговой сессии, суток, ошибки чтения данных с графиков и т.д.
Так что как модель, пример - ок. Но оставлять его без присмотра - это надо быть смелым.
У нас так мало инструментов, что самое простое - это сделать файл с данными и просто прочитать его при старте. Лучше даже сделать его в формате таблицы, чтобы загружать одной командой loadfile.
Хоть разработчики и декларируют, что доступно описание полей на русском, но все же стоит описывать транзакцию через поля, описанные в документации в английской нотации. И только те поля, что не имеют английской нотации на русском, полученные через сохранение формата транзакций из кармана транзакций. Правда придется такой квест проделать, чтобы выявить такие поля.
Впрочем, видимо, не нравится поле Класс. В пишется код класса, а не имя.
А чем же разработка Дениса Колодина плоха, можно смотреть можно запускать запускайте. Я доделал версию с ним пока простенькую, хочу погонять, версию поднял до 5.4. На мой взгляд если глюки серьезные не вылезут Вооооще шик!
Кто-то говорит о качестве разработки. Я ее видел уже не помню когда, лет 7 назад, наверно, если не больше. Хотите обсудить технические решения, ограничения, недостатки этого кода - это одно, но Вы же обсуждаете совсем другое.
VPM написал: Ну смотрите 3 кода предлагал обсудить, и где кто?
Обсуждать что? Идеи торговли - не интересно. Алгоритмические проблемы, решение проблем разработки - да. А обсуждать "на скамейке" проблемы марсиан, не видя их ни разу - такое...
Наверно, имеет смысл перенести обсуждение на другую площадку - Smart-Lab, MFD. Вы там найдете много участников по столь животрепещущей теме. Здесь, все же, форум по разработке, коду. Поиск Граалей - это о другом.
Советую Вам придерживаться правила, что если пытаетесь думать как крупный игрок, то им и надо быть. Иначе все это - "если бы я был, то". Проблема в том, что когда ты являешься, а не если, то с удивлением обнаруживается, что задачи совсем разные. И чтобы понять, надо быть или хотя бы поработать год в подразделении инвестиционного учреждения (не в отделе охраны). Можете просто даже воспользоваться поиском по научным работам в области финтеха. Правда здесь сразу надо оговориться, что искать надо не в российской части сети. Интересно видеть, как то, чем занимались в мире финансов с 00-х, когда мощности уже позволяли, постепенно приходит в обыденную жизнь.
Впрочем, это правило применимо и для любой области знаний. Хотя теперь у нас все сами себе режиссеры.
Просто к слову: у рынка нет таких свойств как перекупленность и перепроданность. Ну и волатильность - это более сложное понятие.
VPM написал: Господа, ругается VM Lua ошибка следующая ACCESS_VIOLATION Чем может быть вызвана, я полагаю нужно sleep увеличить?
Возможно lua 5.3. На версиях терминала 8.*, под lua5.3 вылетала часто. Хотя это может быть и ошибка работы с объектами, нарушения синхронизации доступа в потоках.
Снимают перед большой игрой! Увеличивая тем самым ликвидность рынка + доп. импульс. Здесь не нужны мнения Гуру достаточно рынок почитать.
Да, у них работа такая - снимать стопы. Это просто движение цены, как нестационарный стохастический временной ряд. То что в какой-то момент времени волатильность отклонилась от исторической, как бы не хотели этого "инвесторы", не означает что это злой умысел. Это всего лишь такова реальность в тот момент времени.
А пример с нефтью теперь приводят на каждом углу. На да, биржа нарушила спецификацию контракта, и что. Не она же сделала цены отрицательными. Хотя любой, кто собирается торговать товарные рынки должен понимать, что иногда товар может стать не активом, а пассивом.
Если бы такие временные ряды было легко спрогнозировать, то, наверно, это уже давно бы сделали. Но нет, упорно натягиваем простейшие фильтры на ряд и "видим" будущее. И, возможно, ближайшее и можно увидеть, особенно на истории. Хотя есть текущий момент времени, есть участники, их желания и совершенные действия сейчас, не вчера. Вчера они продавали, сегодня покупают. Вот так сложилось. А RSI все это подтвердит - работает же...
VPM написал: Ну это тоже из области сказочки! :: Как он может быть случайным если управляется Маркетмейкерами которые держат позиции с двух сторон и видят на доске ордера всех участников. Тому хороший пример недавними события с нефтью нужно было у ти от убытков загнали цену в минус.
Советую избавиться от иллюзий и мифов по ММ, Кукл и др. персонажам. Впрочем, это, видимо, будет вечно. Это же так удобно, когда есть всемогущие персонажи. Виноваты же они, а не система. Стопы они снимают, защиты нет. Уже давно были проведены количественные эксперименты по случайным методикам входа в позицию. Элементарно монеткой, кубиком. Все сводится к управлению рисками. Впрочем, тем, кто не гадает, а изучает компании в которые собирается инвестировать, монетка не нужна, как и скользящие средние и т.д.
x={one=4, next="a"} y="" for key in paris(x) do y=y.." " end message(y)
Если задача склеить их в строку и если их очень много, то лучше это делать через промежуточную таблицу, записав в нее ключи. А потом вызвать table.concat
По смыслу - простая система. По реализации - очень сложная. Лучше всего торговать сеткой инструменты или синтетические конструкции, которые находятся в "вечном" боковике - спреды. Есть даже готовый инструмент на бирже - календарный спред.
Да я с этим замучился, в программировании у меня базовые знания инженера мой первый персональный "ЕС 1841" сов. разработка. и работы я свои не пишу, а скорее собираю как "конструктор" находя интересные вещи в том числе и Ваши. Но если движок худой то остальным и заниматься бессмысленно. Вот и вспомнил старые работы.
Ну мой первый терминал 1842... У меня выложено много, т.к. я тоже знакомился с qlua в терминале. И когда я начинал было мало информации. Т.к. особой ценности все это не несет, то и скрывать нечего. Много кривого кода - тоже думал "все просто же". А потом разные брокеры заставили усвоить, что все не так очевидно. И первое что было "выкинуто" - это колбеки.
А этот пакет я, конечно, видел. Но с ним можно сделать достаточно небольшое число алгоритмов. Если не считать того, что он берет данные с графиков, что тоже надо сразу переделывать. Также он совсем не учитывает торговое время, обрывы связи, долгие ожидания ответов на запросы к серверу и т.д. Т.е. это просто некий пример-модель работы.
Согласен полно, но если он позволит мне заниматься торговлей а не шарить по движкам получая очередные оплеухи, я ему все прощу.
Здесь проблема в том, что достаточно одного сбоя, чтобы привести к существенным потерям, многократно перекрывающим все прошлые успехи. Собственно все это обсуждение об этом, на самом деле. Я придерживаюсь принципа, что если есть шанс получить критическую проблему даже 0.1%, то значит этим надо заниматься. Это как в авионике, софте медицинского оборудования - нет места для проблем. Поэтому и выбираются подходы, может не самые красивые, удобные, модные, но снижающие риски.
Вы можете его использовать как пример, правда если понимаете используемые концепции. Сказать, что его можно отпускать в работу на реальном счете - наверно нет. Слишком много нюансов при реальной работе через брокера.
Так Вы его исключили, у вас или или это. Если его нет то идет конструкция or (arg[0]:gsub('[^\\/]*$', '', 1):gsub('\\', '/'))) or '' еще в глобальное поле занесли.
Потому что одни и те же скрипты могут запускаться не только в терминале Квике. Поэтому если нет в глобальном контексте метода getScriptPath, то значит вызов из командной строки, а значит надо разбирать аргументы, коих в терминале нет.
Кстати по по поводу пути. У меня путь определяется так: local path = (_G.getScriptPath and _G.getScriptPath() or (arg[0]:gsub('[^\\/]*$', '', 1):gsub('\\', '/'))) or '' if path == '' then path = './' end
И это не в какой-то функции, а в самом начале скрипта. И как-то не вижу я проблем, чтобы getScriptPath не работал. Так что да, особого смысла в OnInit не вижу. Хотя, когда разбирался с окружением qlua, тоже использовал.
Вы уверены в тот, что для нахождения всех колбек надо выполнить скрипт.
Lua - интерпретируемый язык, сначала он должен заполнить пространство имен (скомпилировать кусок кода), только потом что-то вызывать. Правда это не выполнение скрипта, конечно. Т.е. если сделать определение некой глобальной переменной внутри какого-то метода, то будет ошибка, да.
VPM написал: Nikolay, Подскажите пожалуйста dll служит для обмена данными?
Да, dll для обмена данных. Можно выкинуть.
Что касается чтения, то при обрыве связи не будет сначала, т.к. скрипт же продолжает работать.Он просто будет ждать пока не придет очередная порция после восстановления связи. А вот если его выключить, упадет Квик, то да, сначала. И в контексте той задачи, для которой он писался - это правильно.
И если хотите обсудить конкретное решение, то лучше для этого использовать ветку Discussions GitHub (правда если есть профиль).
Да хорошо ушел от колбека. Читаю таблицу можно наверное не писать а через присвоение. А что делать с индексацией? Первого нужно вести, желательно и подчистить предыдущие данные.
Ну собственно мысль я Вашу уловил. Буду пробовать.
Очередь возникнет, если надо передать сообщения между потоками, методами, межпроцессорное взаимодействие и т.д. А если я прямо сейчас, в прямом цикле читаю данных, в том порядке следования, в каком они есть, то зачем мне очередь. Есть некие служебные расчетные структуры, читаем данные и накапливаем их. Все.
Как то перебирать всю таблицу да по нескольким инструментам меня смущает?
А что смущает? При старте внутри торговой сессии уже есть накопленные данные. Их надо перебрать (если надо). Для этого будет написан код. Далее появляются новые записи. Например, через интервал 1 сек., появилось 10-100 записей. Берем и читаем их сразу за один проход, используя тот же, уже написанный, код И это без всяких колбеков.
Также стоит учитывать особенность колбеков qlua - при заказе данных, приедут все записи и на каждую запись будет колбек. Если читать колбеком, то придется обрабатывать построчно - это плохо и медленно. Проще это сделать за раз. Пришли 50 тыс. записей - прочитать их разом, потратив на это 1 сек., если не меньше.
Здесь вопрос зачем эта конструкция используется. Если задача - просто собрать данные в таблице всех сделок, то да, конечно, можно это делать через колбек. Но зачем? Есть таблица. У нее есть размер. Изменился размер - значит там появились новые записи. Пройдись по ним и обработай. И так порциями обрабатывать. По крайней мере я так привык делать, когда надо в реальном времени опрашивать данные с портов. Да, колбек - это красиво, модно и т.д. Но если речь про деньги или про критически важный параметр с датчика, то не ленись, опрашивай его. Надежность решения важнее красоты.
Поэтому - читаете таблицу, хоть всю подряд (но это в момент расход памяти), либо через специальную функцию SearchItems интерфейса qlua. И делайте это в потоке main, тогда это не будет нагружать поток терминала.Например, простой скрипт записи всех сделок в файл, читая первоначальную порцию накопленных данных, делает это очень быстро: 100 тыс. записей пишется за секунду - две.
Если в самой функции коллбэка используется нечто не объявленное ранее, и он сработает, возникнет ошибка. Поэтому это "нечто" нужно объявить до запуска main.
Я не буду ничего говорить по поводу данной возможности, кроме того, что если так делается, то это очень плохой стиль. Я такое могу представить только через глобальные переменные. В колбеке идет обращение к ним, а сама переменная объявляется где-то. И это плохо. Не считая самих глобальных переменных, коих у меня нет вовсе. Каждый блок когда должен оперировать своей областью видимости, объявленной ранее. Да, глобальный контекст есть. Но использовать его как единственно доступный - это пут в ад, где происходят магические преобразования, по причине случайных коллизий в именовании переменных.
Ziveleos написал: Владимир, переменные окружения показывают разницу между body и OnInit. Получается, если до зарезу необходимо сделать что-то до начала работы коллбэков, и в этом "что-то" используются функции объявляемые позже, то без OnInit не обойтись. В остальном он на фиг не нужен.
Body скрипта выполняется в потоке терминала. Так что служебные переменные вполне себе инициализируются там.
Читаем документацию:
Цитата
Как и в предыдущей структуре скрипта Lua, после его запуска первоначально выполняются сценарии, описанные в <BODY>, если они присутствуют. Далее происходит вызов обработчика с именем OnInit(), если он присутствует. В обработчике OnInit() пользователь имеет возможность инициализировать все необходимые переменные и библиотеки перед запуском отдельного потока. После завершения функции OnInit() происходит создание отдельного потока РМ QUIK, и в этом потоке начинает выполнение функция main(), которая обязательно должна присутствовать в скрипте.
Так что тело скрипта вполне себе достаточно. OnInit вполне можно использовать для каких-то действий после выполнения служебных процедур, например проверить, что запуск возможен. А если нет - отказ. Но все это можно делать так или иначе.
Речь же про колбеки звучит странно, т.к. я слабо себе представляю использование колбеков в алгоритме, если они не обработаны все. Например, запуск в середине торгового дня. Половина колбеков уже прошла, надо читать прошедшие события из таблиц, и здесь уже не важно как инициализировать. Поэтому колбеки - это вспомогательный инструмент, не более. "Прибивать гвоздями" их к логике - не самая лучшая затея. Он может и не прийти, в конечном итоге. Гарантированной доставки в документации не декларируется.
Kolossi написал: Если я правильно понимаю, свечи формируются из тиковой базы сделок. Так в чем проблема передавать в свечи не только те кастрированные параметры которые придумали японцы сто лет назад? Там ведь добавить всего ничего.
Ну, у окна доступные скрипты до сих пор нельзя изменить размер, древнейшая кодировка ANSI - и это не критически важная часть, явно только клиент. А Вы на святое замахнулись, сервер.
В описании доступных методов нет такой возможности. Так что нет. Впрочем, я не увидел очень уж существенной нагрузки при чтении ленты сделок. Ожидание заказанных данных долгое - это да, но когда они пришли и прочитан первый большой блок, дальше уже все терпимо. Правда за памятью надо следить.