Владимир написал: Вы можете здесь плакаться в жилетку сколько угодно, но это Ваши, И ТОЛЬКО ВАШИ проблемы!
Получается проблемы мы решаем только общаясь здесь между собой. А как же тогда достучаться до поддержки? Они же сайт этот сделали для чего-то? Чтобы в нём не участвовать?
nikolz написал: Посмотрите Выше мое сообщение от 29.12.2022 20:34:14 относительно Вашего теста.
Посмотрел. Я же писал, что пробовал варианты с последним параметром в SetCell и Highlight - ом экспериментировал. Толку нет. В некотрых скриптах помогает, в некоторых нет. Это первое, что я делал. Да что толку-то. Ну исправит на раз, на другой раз не поможет. Проблему надо решать на стороне квика. Как я понимаю в реализации SetCell разрабы не хотят после каждого её вызова делать апдейт всего окна, что в принципе логично. Могли бы обновлять регион окна, где ячейка, но видимо и по этому пути идти не хотят или не умеют. Как именно реализована работа SetCell у них я не знаю. Я вижу только одно, что если ты сделал вызов SetCell, то нет никакой гарантии, что вызов функции приведёт к реальному обновлению части окна, ответственного за эту ячейку, не говоря уже про всё окно. В этом случае со стороны разработчиков возможно было бы просто делать апдейт всего окна целиком по таймеру, но они и этого делать не хотят. Они тупо как-то накапливают изменения видимо не от одного SetCell - а, а от нескольких и по какому-то только им известному алгоритму в какой-то только им известный момент делают апдейт и видимо всего окна таблицы сразу. Если бы работа каждого SеCell - а приводила бы только к обновлению региона окна где ячейка, думаю всё работало бы без проблем, и не надо было бы обновлять всё окно. Но для этого нужен алгоритм, которого у них нет. Этот алгоритм у них работает по ихнему и явно не лучшим образом. Тут со стороны разработчиков требуется работать на уровне оконных API виндовс.
Афигеть просто. С 2020 года проблема признана разработчиками и до сих пор не решена! Вот это да! Супер товарищи разработчики! Просто супер! Ну что тут можно ещё сказать? Спасение утопающих - дело рук самих утопающих. Вот крутятся все, как могут. Разработчики хоть бы ответили что-нибудь, а то молчат, как партизаны.
Далее из-за того, что проблема до сих пор не решена разработчиками квика придётся(хотя не хотелось бы) писать полноценную программы с поиском нужного окна, начиная с окна самого квика, чтобы каждый раз не запускать spy++, искать хэндл, вставлять его в прогу и перекомпилировать прогу с новой константой.
Владимир написал: Alexander , Проблема В СКРИПТЕ! У всех данные прекрасно обновляются, а у Вас нет. Квик тот же, скрипты - разные. Точка.
Ещё раз! И причём для всех кто читает эту тему. Никакой проблемы в скрипте нет и быть не может! Сейчас я вам всем это покажу. Запустил скрипты. Один из скриптов перешёл в режим, когда ячейка не обновляется. Через spy++ я нашёл HWND окна таблицы. Я не поленился и только что написал программу на С++. Эта программа в цикле тупо отсылает сообщение WM_SIZE прямо в окно с найденным мной HWND c периодичностью 50 мс. И всё. Как только запускаешь программу, то таблица начинает обновляться сразу же и отображать ячейку с last синхронно с ТТТ !!!!!!!!!! Останавливаешь прогу и перестаёт обновляться! Запускаешь - начинает! Всё проблема найдена! Как я и писал выше всё дело в обновлении окна. Оно КРИВО реализовано в квике! Криво! Для обновления того, что должен делать квик мне пришлось это делать из вне. Ну не абсурд ли это? Я должен извращаться и обновлять таблицу за квик? Бред какой-то. Неужели нельзя решить этот элементарный вопрос? Вот код с программы:
При отсылке WM_PAINT не обновляется. Только WM_SIZE. Ну можно ещё от мыши воткнуть, будет наверняка работать. UpdateWindow(hWndPar) можно убрать, он WM_PAINT шлёт. Так что вот и всё. И после этого кто-то скажет, что проблема в скрипте? Надо как-то по особенному писать скрипт? Скрипт работатет как надо. Пусть разрабы решают и устраняют свой косяк.
То, что проблема не в скрипте это же вообще элементарно понятно! Скрипт работает. Я в ТТТ вижу текущее значение last. В таблице в ячейке значение не равно last, там старое какое-то значение. Я бац - ткнул мышкой в табличку и значение поменялось!!! И стало равно значению в ТТТ. Скрипт работает!!! Далее в таблице это обновлённое значение так и висит. А last опять поменялся в ТТТ, а в таблице нет. Опять щёлк в таблицу и оооо, ура!!!, опять значение поменялось и стало равно как в ТТТ. О чёт это всё говорит? Что скрипт нормально себе работает, нормально всё считывает и отправляет в ячейку. Но сама таблица не обновляется. Скрипт за обновление таблицы отвечает только на уровне SetCell, а вот за реальное обновление уже отвечает сам квик. И делает он это криво! Еще раз. Как и при каких обстоятельствах происходит обновление таблицы на уровне оконной процедуры в квике, когда мы не тыкаем таблицу и она просто на экране? Как? Когда в буферах актуальные данные от SetCell? С какой периодичностью они в WM_PAINT реально выводятся в рабочее окно таблицы?
Я ранее уже как-то писал и отправлял сообщение прямо в окно. Но я не помню, что именно. Может я слал сразу WM_PAINT или UpdateWindow делал. Тогда это не помогло и забросил это всё. Сейчас я подумал по другому, что надо слать не это, а именно то, от чего срабатывает, т.е. WM_SIZE. Просто может быть, что когда WM_SIZE, то разрабы туда воткнули обновление буферов окна из того, куда сначала SetCell шлёт, а потом уже и InvalidateRect. А когда напрямую WM_PAINT, то обновление окна идёт, но в буферах не те данные ещё. Короче был бы у меня код, что у разрабов, я бы сделал так как надо!
nikolz написал: Гадать нет смысла, а запустить у себя Ваш скрипт нет возможности.Но ,без обид,уверен, что ошибка Ваша, а не КВИКА.
Сто процентов не у меня! Какая нахрен ошибка? Один и тот же скрипт с утра и с вечера по разному заработал! В скрипте ничего не меняется. Один и тот же код, один и тот же цикл - то выводит, то не выводит. Я скажу так. В курсе вообще как и когда обновление окна происходит надеюсь. WM_PAINT это его дело! Так вот при при щелчке мышки в окне, WM_SIZE срабатывает, его разрабы написали, что он обрабатывает его, при этом все данные от SetCell попадают туда, куда надо - в буфер, а далее InvalidateRect или UpdateWindow, что вызывает WM_PAINT, где и перерисовывается таблица. Тож самое при щелчке мышкой WM_LBUTTONDOWN только срабатывает. Так вот а когда и как срабатывает WM_PAINT для окна, когда мы не щёлкаем, не меняем размер окна, когда окно просто на экране и ничего с ним не делаем? Вот это пусть разрабы и ответят. Об этом я их уже сколько прошу? Нет ответа никакого. Думаю вот если проблема не закроется - писать прогу, чтобы слала в окно сообщение WM_SIZE из вне с определённой переодичностью. Т.е. насильно извне заставить обработать WM_PAINT/ Может так и заработает, но при условии, что все данные от SetCell уже есть в нужном буфере. А если они не в буфере из которого идёт обновление таблицы, а "болтаются" неизвестно где, мало ли как у них там это реализовано?, промежуточные буфера, очереди и прочее, тогда ничего и так не получится!
Nikolay написал: Пять аргументов передается если тип колонки таблицы число.Вы я приводил простейший пример, приводящий к замедлению обновления таблицы для светлой темы терминала. На темной теме тот же скрипт работает плавно.Уже давно добавил Highlite при выводе в светлой теме, т.к. ждать решения разработчиков долго. Ну и отказался от частых обновлений таблиц. Затратное это дело в терминале.
Вот тоо, что при разных темах квика таблицы по разному обновляются вам ни о чём не говорит? При чём здесь скрипт? В том и дело, что ни причём! А вот тема причём! Какого хрена смена темы влияет на результат работы вывода скрипта? Вот сюда надо копать, а не искать проблемы в скрипте! Я и Hightlite пробовал, иногда помогает, но всё тоже самое, добавишь код или изменишь код - перестаёт. В одном скрипте Highlite поставил удачно - помогло, это в тот где много выводит и считает. Сейчас помогает через раз. Бывает в sleep() секунды ставишь и ничего не обновляет, пока не ткнёшь в таблицу. Ну и причём здесь скрипт? А отказываться от частых обновлений почему должны? Таблицы квика обновляются все как положено и даже все стаканы как угорелые меняются.
Владимир написал: Весь этот ужас вроде:SetCell(tbl.t_id, LevNum + 1, FUT, tostring(price), 1)я даже смотреть не хочу. Навскидку: вот мои пара операторов для прорисовки таблицы:SetColor(T,a[0][9],-1,k,l,-1,-1);SetCell(T,a[0][9],0,d(i));То есть у меня в SetCell четыре аргумента, а здесь их пять.
В чём ужас? В 5-м параметре? Я могу его убрать. Это ничего не меняет! Скинул то, что было на данный момент. Я и ранее и сейчас как только не пробовал. И стринг в таблице и 4 параметра и доубл таблица и 5 параметров, и стринг таблица и 5 параметром, причём 5-й тоже число, что и 4-й, и не то, и наоборот доубл таблица и 4 параметра. Всё это ничего не меняет абсолютно. То обновляет, то нет. При замене может начать обновлять или наоборот если обновляло - перестать. Иной раз скрипт работает не обновляет. добвил коду или что-то чуть изменил, запускаешь, всё начало обновлять.
Я не могу убрать цикл. При попадании в диапазон цен я вывожу текущий last для информации и показываю его напротив текущего диапазона. При этом так же при измениении last считаются и финрезультаты по диапазонам и тоже выводятся в нужные ячейки. А при выходе за границы текущего, вот тут уже начинаются действия(buy/sell - пока в тесте). Короче без цикла никак. Да и вообще весь скрипт - это сплошной цикл. Если вне всех диапазонов, то цикл while в main() и тоже вывод в ячейки, при попадании в новый диапазон - опять вызов функции и крутимся там с выводом до тех пор, пока из него не выйдем.
nikolz написал: Проблема в Вашем скрипте . Возможно у Вас внутренний цикл блокирует обновление таблицы.
Проблема не в моём скрипте абсолютно! Ничего нигде не блокируется. Тупо чтение last, тупо вывод, какое блокирование. Скажу больше. Вечером накидал простейший скрипт. В нём вообще ничего нет, кроме чтения last и вывод в ячейку. Таблицы. Всё выводит просто идеально. Даже без всяких задержек sleep(). Я пытался сделать так, чтобы он перестал выводить, но что я только не делал, и ячейки добавлял и сетколоры и циклы вставлял дополнительные, короче много чего. Мне так и не удалось сделать так, чтобы скрипт перестал обновлять ячейку. Всё работала как часы. В SetColor использовал 4 параметра, не 5, так как в в таблице стринг поля. Потом я добавил в SetCell последний числовой 5-й парметр - перестало обновляться. Сделал всё так же в своих скриптах. И у меня после этого стало всё наоборот. Тот диапазон, который не обновлялся - стал обновляться, а тот который обновлялся - перестал обновляться. Делаешь наоборот - меняется. Но даже когда начинает обновляться допустим в одном диапазоне, добавляешь код в скрипт, и даже не в цикле, и всё ломается - перестаёт обновляться. Хоть как ты SetCell используй. Ещё раз - от скрипта не зависит, зависит от времени выполнения участков кода.
nikolz написал: Выше я выкладывал скрипт, который тестировал. И все там обновляется.
С утра запущены 4 скрипта абсолютно одинаковые. Выставлены разные переменные просто. Все 4 скрипта сейчас идеально всё выводят в ячейку и показывают last синхронно с ТТТ. При этом код сейчас крутится в вышеприведённом цикле(так как last в определённом диапазоне). При выходе из этого диапазона идёт выход из цикла и из функции и попадаем в main() в цикл while(так как уже в другом диапазоне last). Там во while тоже идёт вывод в ячейку last, но только уже в другую и нихрена уже ничего не выводит! Щёлкнишь мышкой по строке - данные обновятся. Или размер окна дёрнешь - обновятся. Опять попадает last в нужный диапазон, опять вызов функции и в repeat цикл и опять всё обновляется. Вчера было всё НАОБОРОТ!!! while обновлял ячейку, repeat нет.
nikolz написал: Если желаете решение то выкладывайте пример.
Да какой пример? Пример огромный, как я его сюда весь выложу? Я же говорю, всё элементарно. Цикл. В цикле читается ТТТ, поле last выводится в одну и ту же ячейку. Один и тот же скрипт может то вывожить, то не выводить, с одной задержкой к конце цикла выводить, с другой задержкой не выводить. Вот сейчас 4 ОДИНАКОВЫХ скрипта работают, разница только а начальных переменных. И всё. Один обновляет ячейку, 3 нет. Тот, что обновляет при выводе в другую ячейку перестаёт выводит. Меняя задержки можно добиться вывода, но стоит что-то добавить или убрать(код) из цикла и опять может либо выводить, либо не выводить. Вот ниже часть, которая сейчас не выводит: repeat price = tryInt(getParamEx(ClassCode, SecCode, "LAST").param_value) OfferPrice, BidPrice = getPrice() if not OfferPrice then is_run = false return end
if OfferPrice > Max or BidPrice < Min then break end
if price ~= oprice then --- ячейку для вывода текущего значения фьючерса в диапазоне устанавливаем значением фьючерса SetCell(tbl.t_id, LevNum + 1, FUT, tostring(price), 1) local finres = getLevelsSum() + LevelsFinRes(price) + getCloseSum() if finres ~= 0 then SetCell(tbl.t_id, LevelsCount + 3, FRA, tostring(finres), 1) --- +/- финансовый результат общий end end --- sleep(1000) oprice = price until is_run == false
Этот цикл внутри функции, которая внутри while, который в main() Когда внутри этого цикла крутится - ничего сейчас не обновляется. Бывает я даже в другую часть скрипта код добавлю или убавлю и тогда начинает когда внутри этого цикла выводить или наоборот перестаёт выводить если сначала выводило. Когда из этого цикла вывожу в основной while, то там тоже вывод в ячейку, сейчас он выводит там, а бывает наоборот всё меняется местами, во while перестаёт выводить Короче это от скрипта вообще не зависит, это зависит от кода, сколько его и за сколько времени какая часть кода выполняется. Если это время как-то согласовывается со временем обновления таблицы у квика, то обновляется, если не попадает в какой-то диапазон, то всё. У меня многие таблицы есть большие, обновляются без проблем, но там много выводов и в разные ячейки и всё это в перемешку с вызовами функций.
В очередной раз поднимаю тему. Прошу ответить разработчиков почему до сих пор ничего не сделано для решения данной проблемы. Ещё раз. Есть таблица. Производим обновление ячейки или ячеек в цикле. Данные берутся с ТТТ(в данном случае цена последней сделки) и выводятся в таблицу. В ТТТ данные меняются как положено. Никакого обновления ячейки в таблице на экране монитора НЕ ПРОИСХОДИТ!!! Бывает, когда добавишь или убавишь код в скрипт обновляться начинает. Или поставишь задержку в цикле, подобранную начиная с 10 миллисекунд и до тех пор пока не начнёт обновляться синхронно с ТТТ. Потом запускаешь скрипт повторно и уже опять ничего не обновляется. Меняешь задержки, бывает и до секунды ставишь и ничего не обновляется. А бывает вообще никаких задержек не ставишь и всё обновляется. Скрипт может быть любой, не важно какой. Везде так. Цикл. Вывод и всё. Для того, чтобы точно обновилась таблица надо либо изменить размер таблицы вручную, либо ткнуть на строку в таблице, но только на любую новую строку, а не на ту, что уже текущая. Вот и что делать предлагаете? Без конца сидеть и менять размер окна таблицы? Или без конца тыкать по строкам? Ну это же бред какой-то!!! Все таблицы квика нормально обновляются. Что там не так у вас работает? Или напишите хоть принцип как и когда при каких условиях у вас происходит обновление таблиц пользователя. Ну в конце-то концов проблему надо же как-то решать. Задолбало уже просто. Пишешь, пишешь и ничего не обновляется. То обновляется то нет. Проблема на стороне квика и её решить можно 100%.
БорисД написал: Я уже писал что этот сайт при отсутствии разработчиков ( а их здесь нет от слова совсем ) нужного уровня необходимо перевести на другую площадку .... ну например на phpBB а они глупцы даже этого понять не могут. ............... Таких программистов нужно увольнять пачками и не принимать на работу от слова " не при каких условиях " ..................... к сожалению они работают здесь и на этом сайте и поэтому мы получаем от них ответы типа : ............................ ну вообщем ответы мы от них уже все читали и не буду их здесь вставлять.
Тут дело скорее всего не в разработчиках программы квик. Разработчики программу написали, она используется и брокерами и клиентами. Разработчики думаю своё дело знают. А вот организационные вопросы это уже не дело программистов, а дело других людей кто за эту организацию отвечает. И вот организационная работа оставляет желать лучшего. По хорошему руководству компании надо бы всерьёз задуматься над этим вопросом. Поувольнять тех кто за это ответственен и нанять толковых людей. Ну это же не дело совсем! Программа такого уровня и так обслуживается! Поразвели одних менеджеров за столько лет, а толку полный ноль.
Вон оно как оказывается))) Оказывается всё уже обсуждалось ранее!!! И я тут пытаюсь решить тоже самое что и тогда решали. И с тех пор техподдержка ничего не сделала? Вот если бы разрабы закрыли вопрос по этой теме: https://forum.quik.ru/forum10/topic5558/, то и не пришлось бы эту тему здесь поднимать заново!!! Одни и те же вопросы поднимаются через ГОДЫ!!! Это как вообще такое, а?
Попробуем раскачать тему. Я вот как-то спрашивал брокера Открытие про всякие там ГО на разные вещи. Среди разных ответов брокера была такая фраза, что типа у опционов БГОНП будет больше чем БГОП. Ну вроде как логично. Раз непокрытая, продаём типа, значит и больше БГОНП. Но потом тогда заметил, что это не так. БГОП > БГОНП. Вот только что просмотрел ряд опционов, причём и на покупках и на продажах у них у всех БГОП > БГОНП. Тут встаёт вопрос, что считается за покрытую позицию, а что за непокрытую и когда какое ГО применяется в каких ситуациях? Толи непокрытая это чисто шорт-продажа опциона, но тогда почему у опциона, который покупаем есть поле БГОНП? Мы же не продаём, а покупаем, а поле БГОНП есть. Или покрытая это когда например продали колл и купили фьючерс? Но тогда БГОП опциона должно быть меньше БГОНП, а оно почему-то больше. Почему? Или это суммарное ГО на позицию опцион + фьючерс? И если так, то почему БГОП это поле относится к опциону раз это суммарная штука?
Я вроде бы изначально объяснил - возьмите таблицу с биржи и формируйте по ней код фьючерса Для тех, кто в танке, объясняю на пальцах: Код базисного актива (поле "C") Код базисного актива на срочном рынке Название базисного актива
GZ
GAZR
ПАО "Газпром" (о.а.)
SP
SBPR
ПАО Сбербанк (п.а.)
SR
SBRF
ПАО Сбербанк (о.а.)
Делайте , как говорю, и будет Вам счастье.
Ну ё-маё!!! Я уже сто раз написал же. Что я именно так и делаю, причём именно с самого начала. Все эти GZ, SP, SR ... и т.д. я и использую! Они у меня в качестве шаблона выступают, я же писал, вот код если сразу кто не понял о чём я: for k, v, z in string.gmatch(longStr, Str .. "(%u)(%d)") do Mass[ m ] = k .. v .. z m = m + 1 end где в Str это передаётся для формирования полного шаблона. И всё на ура ищется без всего лишнего. Str передаётся в функцию. Этот код внутри функции, которая вызывается и принимает все шаблоны поочерёдно. На выходе массив кодов фьючерсов, по ним из ТТТ вытаскивается всё остальное, что нужно.
Но меня это не устраивает, так как эти шаблоны приходится ЗАДАВАТЬ! Сегодня есть акция и на неё фьючерс есть, завтра взяли и фьючерс убрали. А после завтра вообще добавили новых, которых и в помине не было. Такое уже было. А я хотел бы написать скрипт один раз, чтобы он универсальный был и более в него не лазить, для этого и надо не привязываться к этим шаблонам, а сразу из списка выделять.
nikolz написал: покажите, где для фьючерса сбербанка и газпрома код не совпадает.Код базового актива у сбербанка SR и SP, а у газпрома GZ.У какого фьючерса этих акций иначе?
Газпром Акции GAZP, фьючерсы идут GAZR-9.23 и т.д., код базового актива в ТТТ - GAZR!!! Вот тут уже просто жесть какая то!!! Базовый актив фьючерса не GAZP, а GAZR!!! Сбербанк Акции SBER, фьючерсы идут SBRF-9.23 и т.д., код базового актива в ТТТ - SBRF!!! Вот тут уже просто жесть какая то!!! Базовый актив фьючерса не SBER, а SBRF!!! А вот если берём например Норникель, то там всё ОК, Акции NLMK и базовый актив фьючерса тоже NLMK. Так вот по большинству из списка акций, на которые есть фьючерсы все ОК и б/а фьючерсов совпадают как по логике вещей оно и должно бы быть, но такие как Сбер, Газпром, МТС и ещё чего-то там портят всё картину и усложняют элементарный алгоритм отфильтровки. Спасибо гениям с Мосбиржи за такие сюрпризы.
paluke написал: Ну почти... Посмотрите на сбербанк или газпром. Код базового актива для фьючерса может не совпадать с кодом акций.
Вот и я говорю, что такое было, что не совпадало, сейчас посмотрю, наверняка ничего не поменялось. Я помню, что давно когда писал в основном были совпадения, но какие-то коды не совпадали. Это косяк Мосбиржи, что они так криво всё делают.
Владимир написал: А вот что "скриптов много" - это плохо. Сделать-то, мож, и быстрее, а вот СОПРОВОЖДАТЬ... Лично у меня только один скрипт, и увеличение этого числа не планируется. И насчёт "кодов немного" спорный вопрос: для человека уже пара десятков тикеров почти неподъёмная задача. А в реальности их десятки тысяч.
У каждого свои задачи. У меня есть ряд скриптов по анализу много чего на рынке. Торговля торговлей, а анализ анализом. В анализе и индексы и акции и фьючерсы и опционы. Каждый сам решает, что ему нужно.
Nikolay написал: У нас так мало инструментов, что самое простое - это сделать файл с данными и просто прочитать его при старте. Лучше даже сделать его в формате таблицы, чтобы загружать одной командой loadfile.
Я не спорю, что это самое простое. Но меня это простое не устраивает. Задача не пользоваться заранее введёнными данными. Есть возможность получать списки фьючерсов? Есть. Всё. Далее из этой кучи нужно найти все фьючи на акции. Не сопоставляя ни с каким списком, который может взять да измениться. У меня уже так было. И список был. Прошло время, долго не пользовался скриптом. Решил использовать. Результат - часть пропала, добавились новые. Оно мне надо, каждый раз сверяться с биржей, что они там убрали, а что добавили,? Мне не надо. Должны быть чисто программные методы отфильтровывания. Этого и добиваюсь. Другое не обсуждается. Если получится - напишу.
Вадим Никитин написал: 1) Получаете список всех фьючерсов из класса SPBFUT 2) Получаете список всех акций из класса TQBR 3) Проходитесь по всем нужным фьючерсам из пункта 1 (с требуемой датой исполнения и т.п.), доставая из их спецификации код базового актива. Можно например через getSecurityInfo или из ТТТ. 4) Проверяете есть ли такой код в списке кодов акций из пункта 2. 5) Если есть, значит этот фьючерс - фьючерс на акцию. 6) Profit...
Так, вот это уже интересней подход, но я как-то смотрел и коды базового актива нифига не совпадали, сейчас гляну, может и правда такой вариант прокатит.
Владимир написал: А что, в отдельном файле этого сделать нельзя?
Можно. Где-то так и делаю. Где-то в файле всякие данные, где-то в коде. Скриптов много. Как быстрее, так и делаю. Многие скрипты просто для теста, для визуализации и анализа. Многие написаны и уже не использую. Как-то так. Для торговли я тоже меняю коды на новые после того как инструмент не торгуется. Таких кодов немного.
Владимир написал: Alexander, На кой Вам getParamEx? Список бумаг, которыми ИМЕННО Я собираюсь торговать, не знает никто, кроме меня. ИМЕННО Я и определяю этот список, корректирую при необходимости. Мало ли что там мне подсунут любые утилиты! Может, мне просто не по карману торговать всем тем, что там будет получено в sec_list. Этот список меняется крайне редко, и проще всего, быстрее всего, надёжнее всего делать это "ручками", не прибегая к программированию вообще. А уж "для каждого варианта надо указать шаблон" - это вообще безумие какое-то, не говоря уже про "придётся менять код". А что, в отдельном файле этого сделать нельзя? Вот прям ща у меня там стоит AFU3, GZU3 и т.д. Придёт время - поменяю "U3" на... что там следующее идёт. Это делается за считанные секунды, и совершенно плевать, что там Мосбиржа по этому поводу думает.
Не, я не торговать ими. Будет просто таблица с данными. Просто мониториться текущее состояние по б/а и фьючерсам на них - всем какие есть. Отслеживается ситуация на предмет безубыточной стратегии: покупка базы - продажа фьючерса и наоборот, со всеми входящими - комиссии брокера, ГО, дней до экспирации и прочее. На выходе наблюдаю какой процент прибыли за сколько дней и пересчёт на процент годовых, суммы прибыли, нужное ГО суммарно и прочее. Если что нужно будет торгонуть из пары - для этого отдельный скрипт - ткнул когда увидел, что что-то устравиват и купил/продал.
nikolz написал: У Вас есть список акций, которые Вас интересуют.
1. У меня нет списка акций. Я его хотел получить именно из списка фьючерсов на акции, которые есть на Мосбирже. Зная список акций я без проблем получаю нужный мне список фьючерсов на акции.
Цитата
nikolz написал: Из таблицы Кодирование базового актива находим код базового актива на срочном рынке
Из таблицы я как раз беру код для шаблона и по нему без проблем нахожу сразу все фьючерсы на данную акцию. Мне не надо их разделять, мне просто нужны все, я получаю массив фьючерсов с их кодами, полное имя если надо - без проблем по коду тоже получаю.
Цитата
nikolz написал: В итоге получите список фьючерсов для акций.
Я его и так получаю, только намного быстрее и полный список.
Цитата
nikolz написал: Если используете колбек onParam, то те коды фьючерсов на которые вы не подписаны никогда не получите.В результате у вас будут коды фьючерсов на акции, на которые вы подписались
Это я не использую, но возможно буду что-то выдёргивать из ТТТ по коду фьючерса, тут может и надо или чтобы в ТТТ фьючерс ужк был или придётся подписываться через ... не помню.. но есть какая-то там функция для подписки.
да точно также из общей кучи нахожу сразу все опционы по шаблону из 2-х букв в начале и шаблонов на цифры и буквы в конце.
Задача моя была найти все фьючерсы на акции их коды и коды соответствующие им базовых активов - т.е. коды акций для этих фьючерсов. Описал просто вначале только первую часть ,так как вторая получается из первой. Найти надо было из списка фьючерсов, никоим образом не ссылаясь на коды акций, на часть кода фьючерса по акции. Просто дано: список фьючерсов. Всё. Более ничего не дано. Надо найти все фьючерсы на акции. Без дополнительных параметров входных. Это так не решается. Об этом написал. Если бы были подкоды как писал выше, то из общей кучи выдёргтвалось бы всё на раз-два. А все эти переборы и сопоставления и так делаются, без этого никак, вот о чём написал.
nikolz написал: Сейчас уже точно не помню, но вроде бы делал какой-то листинг и по нему формировал фьючерсы . При этом учитываешь какой квартал, так как для разных кварталов разные правила. Все делается автоматом.
У меня есть строка, полученная так: sec_list = getClassSecurities("SPBFUT") и впринципе её раскидать на фьючерсы разные проблем нет никаких, хоть по кварталам используя "Спецификации коротких кодов фьючерсных и опционных контрактов на срочном рынке" c Мосбиржи: https://www.moex.com/s205 Но в любом случае для отсева из всей этой общей кучи, чтобы отделить только фьючерсы на акции, придётся задавать что-то, связанное с акциями. Я для этого использую шаблон на каждую акцию и ищу через string.gmatch(longStr, Str .. "(%u)(%d)"), где longStr = sec_list, Str = шаблон((AF) например для Аэрофлота). Но вот сформировать тоже самое не задавая шаблон(не привязываясь к акции) никак не получится, нет такой возможности.
Alexander написал: Подскажите кто знает если. С помощью getParamEx есть ли параметры в ТТТ такие, чтобы отсортировать фьючерсы на акции от остальных фьючерсов. В квике по названию вроде ничего не подходит. Или как-то такое сделать по другому. Т.е. я получаю: sec_list = getClassSecurities("SPBFUT") и потом мне из всей этой кучи надо выделить только фьючерсы на акции. По класскоду у всех "SPBFUT", что у индексных, что у товарных, что у акционных. Пока вижу только вариант через string.gmatch и шаблон, но тогда для каждого варианта(смотрим на мосбирже все фьючи на акции) надо указать шаблон. Так пока делаю, но это длинно, для каждой акции свой шаблон. И спиок на бирже могут поменять и придётся менять код. Типа бы какого-нибудь не только класскоде, а ещё бы и подкласса иметь на фьючерсы на акции.
Когда-то давно делал так. На бирже находим правила формирования названия фьючерса. Далее по имени нужных нам акций формируем имена фьючерсов. При этом еще учитываем правило формирования даты фьючерса. Все вроде бы работало правильно.
Ну я типа так и делаю. Только даже проще. Мне так же приходиться как и у Вас написано "по имени нужных нам акций" определять шаблон и по нему мне из всей кучи находит СРАЗУ ВСЕ доступные на данный момент фьючерсы на эти акции, без всякого " правило формирования даты фьючерса". Думал может можно как-то упростить, так как на каждую акцию приходится задавать свой шаблон(Аэрофлот - AF, Газпром - GZ, и т.д).Но список может меняться и приходится постоянно следить и корректировать код, а этого хотелось бы избежать. Это можно было бы легко делать если бы например Мосбиржа помимо кода на фьючерсы "SBPFUT", например ввела бы подкоды. Для фьючерсов на акции свой подкод, для валюты свой, для товаров свой, для процентных свой и для индексных свой. Но такого видимо нет.
Подскажите кто знает если. С помощью getParamEx есть ли параметры в ТТТ такие, чтобы отсортировать фьючерсы на акции от остальных фьючерсов. В квике по названию вроде ничего не подходит. Или как-то такое сделать по другому. Т.е. я получаю: sec_list = getClassSecurities("SPBFUT") и потом мне из всей этой кучи надо выделить только фьючерсы на акции. По класскоду у всех "SPBFUT", что у индексных, что у товарных, что у акционных. Пока вижу только вариант через string.gmatch и шаблон, но тогда для каждого варианта(смотрим на мосбирже все фьючи на акции) надо указать шаблон. Так пока делаю, но это длинно, для каждой акции свой шаблон. И спиок на бирже могут поменять и придётся менять код. Типа бы какого-нибудь не только класскоде, а ещё бы и подкласса иметь на фьючерсы на акции.
Владимир написал: Alexander, FAR и как оболочка куда удобнее Total Commander, хотя идеология обоих передрана у дяди Нортона, но редактор FAR - это просто НЕЧТО! Макросы через Ctrl+"." настолько дико расширяют возможности, что ничего другого я и видеть не хочу, не то что искать. А что такое "приличный форматтер именно под Lua"? Я отлаженные блоки и функции просто схлопываю в одну строчку, чтобы не мельтещили перед глазами, с оставшимся работаю. Очень удобно, а полностью отлаженный скрипт состоит из одной строки.
О, да, как только вышел Нортон - это было нечто! Сразу жизнь веселей пошла. А, так то и в Totale много всего, использую только то, что надо. И идея конечно же Нортоновская у них.
Это не плохо, может оно кому такое и нужно. Очереди, списки хорошо если нужно такое в реализации алгоритма, а так обмен данными между скриптами, и даже работающими в разных квиках от разных брокеров просто без очередей и списков организовать можно разными способами и это не сложно. Но на заметку взял, может пригодится.
Я вот бегло посмотрел это. Там пишете, что: "Мне всегда хотелось иметь под рукой консольный аналог lua.exe прямо в папке с QUIK, да еще такой, чтобы можно было выполнять непосредственно скрипты, предназначенные для QUIK, т.е. с возможностью вызова функций QLua." Но я что-то не понял, а откуда там такая функциональность? Я там увидел вроде как Lua интерпретатор Lua скрипта из файла. Вижу, что файл открывается, далее в цикле читаются аргументы переданные вместе с именем файла и пишутся в созданную в стеке таблицу и далее создаётся глобальная переменная и ей присваивается эта таблица(qlua_exe.cpp). В qlua_functions.cpp вы создаёте набор своих функций, наподобие квиковских(message, print, sleep, getWorkingFolder) и регистрируете их в RegisterQLuaFunctions(L).Так же там написали функцию const char *luaL_tolstring(lua_State *L, int idx, size_t *len), зачем? Она же уже есть в Lua. Вобщем я не понял, как Вы собираетесь вызывать функции QLua для работы с таблицами, например. Всё, что я понял, вы ввели свои функции (message, print, sleep, getWorkingFolder) и предлагаете их использовать в запускаемом скрипте, так? Но как таковой возможности вызвать сами функции Qlua нет.
Владимир, поскольку выяснилось, что перезагружать скрипт не надо в квике,это многое меняет дело. Пишу себе в VSC, сохраняю когда нужно, переключаюсь на квик и просто запускаю. Не так это сложно, хотя запуск скрипта из самой студии конечно было бы ещё проще и быстрее, ну да ладно. По поводу редактора FAR Manager ничего не скажу, FAR - ом как-то давно-давно пользовался совсем ещё с времён перехода с DOS на Windows, сейчас у меня Total Commander, а вот VSC, там нашёл приличный форматтер именно под Lua, от Tencent китайской, он форматирует хорошо и на лету и файл целиком, а мне это и надо было, чтобы можно было форматировать файлы целиком, ранее писанные в блокноте. Может и другие есть редакторы, которые хорошо формитируют именно Lua, но меня этот вполне себе устроил, и плагин этот настраивать можно при желании - настроек куча.
Владимир написал: Кстати, вовсе не обязательно "руками постоянно сохранять скрипт, в квике удалять старый скрипт, загружать новый, опять его запускать"
и
Цитата
Игорь М написал: Зачем вы удаляете в Квике старый скрипт и загружаете новый?
Да, действительно не надо его постоянно удалять и заново загружать. А я вот так тупил всё это время. Я просто начинал с QPILE и там постоянно надо было скрипт загружать локально. Вот я привык к этому. Думал, что и Lua скрипты квик по аналогии требует заново загрузить после сохранения изменений. Думал, по аналогии, квик раз загрузил его первый раз когда я его выбрал из папки, то он его хранит открытым и для замены надо его удалить и заново загрузить новый, квик откроет файл и будет держать открытым. И вот даже не удосужился проверить на практике, а надо ли действительно загружать новую версию. После ваших удивлений проверил - действительно не надо, достаточно просто сохранить изменения и всё, ну и имя я естественно не меняю и файл у меня место хранения не меняет. Так что в этом плане спасибо, а то так и тупил бы с этим дальше.
Владимир написал: Alexander, Вот скажите: зачем Вам всё это надо? Зачем связываться с библиотеками, что-то компилить, что-то собирать, разбираться с тем, как работает Квик, перелопачивать это всё с выходом очередной версии? КАКАЯ РАЗНИЦА, как работает Квик? Обилие глюков и обилие версий позволяет уверенно предположить, что работает всё это ПЛОХО. С другой стороны, это всё же РАБОТАЕТ, более-менее надёжно - система достаточно популярная, и искать что-либо иное просто не имеет смысла: как бы ни был убог Lua, он всё же обеспечивает возможность организации торговли на бирже, а больше от него ничего и не требуется. Юзеру от скрипта тоже почти ничего не нужно - запустил и забыл. И программисту тоже - написал и забыл. Я уже несколько месяцев вообще не прикасаюсь к коду, да и до этого полгода-год рихтовал лишь СВОИ алгоритмы торговли, "техника" уж тыщу лет работает безукоризненно: нужно было лишь сообразить, что не надо заниматься разной фигнёй с потоками, и всё, что можно, делать в потоке main - и всё, глюки закончились. И теперь мне плевать, что там за версия Квика, что за версия языка, что там за библиотеки водятся и на всё остальное. Зачем искать на свою задницу приключений?
Всё верно Вы пишите. Но у меня тоже всё просто. Всё, что я хотел, я описал уже выше. Повторю. Я хочу писать код Lua в нормальном редакторе(подсветка, форматирование). А именно в Visual Studio Code. Хочу из среды сразу запускать на выполнение скрипт и смотреть как он работает - вывод во встроенный терминал среды VSC. Всё. Более мне ничего и не надо. Чтобы такое сделать, VSC поддерживает плагины для запуска редактируемого кода, но это делается естественно через запуск внешней программы, которой в качестве параметра передаётся наш код. Поэтому мне нужен функционал от квика, чтобы он мог выполнить мой скрипт из командной строки. Не знаю может такое квик или нет, но сделать это возможным не представляется сложным для разработчиков квика. А так как сейчас, так мне надо мой код сохранить, потом загрузить его в самом квике и запустить, и результаты работы я вынужден смотреть в стороннем отладчике, который должен каждый раз запускать, да ещё и каждый раз настроить фильтр в нём, чтобы он не принимал чужие отладочные выводы. Я хочу более простого подхода. Зачем мне все эти лишние телодвижения? Я и так уже написал программу на C++, которая сам запускает квик, ждёт появление окна логина, вводит логин и пароль, запускает программу DebugView, получает ID процесса квика, настраивает фильтр в DebugView по этому ID, сама отвечает на вопрос диалогового окна не обновлять инструменты и нажимает в окне на OK. Всё это упрощает мои действия, которые мне приходилось бы делать руками. Вот и тут я не хочу руками постоянно сохранять скрипт, в квике удалять старый скрипт, загружать новый, опять его запускать, иногда можно запариться и не удалить старый и запустить, или внести изменения в скрипт и забыть по запарке сохранить и в квике загрузить тот же самый предыдущий скрипт. Конечно это уже делается на автомате и практически без таких ошибок, но иногда по запарке можно и накосячить на голом месте. А зачем всё это надо? Есть же нормальные простые решения для этого. Нужно только разработчикам обратить на это внимание и упростить жизнь программистам. А раз этого нет из коробки, вот и начинаем думать, а можно ли как то это в принципе обойти. И ещё. Я сейчас пишу даже не какой-то то там алгоритм для торговли. Я всего лишь получаю информацию с таблиц и передаю её в dll, а dll мне открывает потоки и окна, в которых онлайн рисуются позиции по выбранным опционам и базовым активам. И для этого мне по сути вообще и не нужен был бы никакой там их QLua если бы они мне расшарили свой API из qlua.dll и я бы вообще не запаривался бы с изучение этого Lua, а просто вызывал бы те же самы функции, что сейчас вызываю из скрипта на Lua, сразу из C++ программы.
nikolz написал: VMLua - это программа и она запускается вызовом lua_pcall, в которой вызываетсясобственно VMLua - эта функция Вот ее тест из sorce code Lua 5.4
Ну тут всё правильно написали про VMLua, что она именно ЗАПУСКАЕТСЯ, а ранее писали, что VMLua РАБОТАЕТ как самостоятельная единица.
Любая программа сначала запускается, а потом работает как самостоятельная единица. Поэтому я и написал - запускается и работает.
Отсюда все и недопонимания возникли. Программа конечно, чтобы начать работать должна быть сначала быть загружена в память, а потом ей должно быть передано управление(call, jmp, return с адресом в стеке, int, может и ещё что есть). Так вот в моём понимании VMLua сначала просто загружена в качестве библиотеки lua53dll и НЕ работает, а работать начинает только тогда, когда нужные функции из неё для компиляции, интерпретации начинают ВЫЗЫВАТЬСЯ, ну или начинает вызываться специальная функция, которая начинает интерпретировать весь скрипт тем же самым образом, но в любом случае библиотека есть и она НЕ работает пока её функции не начнут вызывать. Поэтому Вы всё объединили в кучу - загрузка и передача управления в функцию одной фразой - VMLua уже работает.
nikolz написал: Разработчики уже объясняли, что они не дадут SDK (software development kit на С) для разработки пользовательских dll для QUIK. Взамен этого они слепили QLua.dll и внедрили в терминал VMLua.
Ну я вот только от Вас сейчас это услышал. Сами то разработчики вообще самоустранились и не отвечают здесь от слова совсем.
nikolz написал: Заголовки к функциям из dll, если их нет, то делаются самостоятельно на основе dll и документации. Для этого Вам надо изучить технологию разработки программ на СИ.
Какую конкретно технологию? Можно ссылку? Или имелось в виду структура dll, формат ?
nikolz написал: Я же Вам написал что так и делаю много много раз, как Вы хотите.---------------------Даже на форуме выкладывал пример , в котором запускал скрипт, загружал dll и обменивался данными с QUIK
Я про это Вас и спросил. Можете по пунктам расписать алгоритм, что конкретно вы делаете? Подробно, чтобы было понятно. Или ссылку на всё это и пример. А то на словах много чего, а толком не понятна реализация что к чему.
nikolz написал: Т е Вы хотите к этой куче догрузить свою dll. Ну и что Вы этим проверите? Лишь есть или нет у Вас в dll ошибки.Но так делается при разработке любых приложений на любых языках . Ни луа ни квик ни причем.
Я вообще изначально хотел просто выполнить свой скрипт не прямо в квике, а извне. Я хотел писать в VSC и запускать его прямо из среды на выполнение. Но для этого нужно, чтобы разработчики квика предоставили функционал типа например такого: info.exe -e myscrypt.lua. Вот и всё. Сделать они это могут элементарно при работающем квике, подключенном к серверу квика. У них же есть функция запуска нашего скрипта? Есть. Но они грузят наш скрипт и потом его передают в качестве аргумента своей функции запуска. Так кто мешает сделать то же самое, только не из графического интерфейса квика, а из командной строки? Почему бы и нет? Зато я могу писать удобно в удобной среде и сразу запускать написанное и смотреть результат. И результаты работы выводить в окно терминала, а не через PrintDbgStr() в сторонний отладчик. Можно и отдельный файл .exe для запуска наших скриптов из вне написать, а не напрягать этим info.exe.
nikolz написал: Более того, перед запуском VMLua в память грузится куча функций на СИ, которые позволяют в скрипте обращаться к строкам, таблицам, математическим функциям. Все они написаны на СИ и находятся в Lua53.dll
Это тоже всё так. Но механизм скорее всего как раз тот, что описал выше. Мы же вызываем функции qlua.dll не просто так. Любая функция qlua это же по сути _G.имя функции. А значит квик интерпретирует либо свой скрипт, где инициализирует _G, либо просто своими вызовами функций из lua53.dll делает то же самое, как конкретно делается знают только разработчики, но по сути можно и так и так. "Свой" скрипт легко "держать" в памяти и выполнять и не светить в отдельном файле если надо.
nikolz написал: Вы ошибаетесь.QLua - это не скрипт, а dll - написана на СИ или С++. Т е скрипт на луа вызывает из нее функции. Lua53.exe - это приложение и внутри него запускается VMLua так же как и в терминале QUIK.
Я с этим согласен. Я вчера быстро и много писал по ходу мыслей. Сейчас с утра переосмыслил написанное. Я думаю, что квик работает так: он прогоняет наш скрипт сначала интерпретируя всё, что не main(), при этом он использует библиотеку lua53.dll для компиляции и выполнения скрипта, так же он видит есть ли колбэк функции, сохраняет их адреса, чтобы потом вызывать их из своего основного потока, дале как Вы и писали он запускает отдельный поток-интерпретатор для обеспечения работы main() скрипта. При этом на первом этапе он выполняет и что-то типа своего скрипта на Lua, где подключает свою qlua.dll и инициализирует _G таблицу, чтобы мы могли вызывать их функции из своего скрипта. Как то так.
Тут вот, что хотелось попробовать. Запускаем скрипт QLUA из вне через lua53.exe. В скрипте подключаем qlua.dll. При работающем скрипте она может быть уже загружена и поток квика её использует. Да, пространства потоков разные у lua53.exe и у квика будут. Но функции qlua будут иметь доступ ко всем данным(таблицы например) потока квика если их умудриться вызвать. Чтобы их вызывать например из exe, dll, нам нужны заголовки с объявлениями. Можно ли их получить? А чтобы их вызывать из скрипта, нужно перменным скрипта задать адреса этих функций, как окружение, которое строит квик в виде _G. ... Как организовать то или другое? Или при загрузке qlua.dll уже будет окружение _G? И достаточно просто extern тип _G? Но опять же нужен заголовок с описание типа того же _G. Попробую потом посмотреть qlua.dll на предмет экспорта, и что там с символами. У квика вообще код закрытый? Они предоставляют lib файлы? Заголовки?
nikolz написал: и еще... скрипт исполняется в VMLua ,которую запускает КВИК, потом в отдельном потоке запускает в дочерняя VMLua и в ней Ваша функцию main в которой крутится бесконечный цикл. Вот этот цикл бесконечно и исполняет приведенная выше функция VMLua. терминал никак не контролирует эту функции. В потоке терминала сделана синхронизация обращения к глобальному стеку VMLua Вы в своем main скрипте в вызываете функции из QLUA для обмена данными с основным потоком QUIK. Так все и работает.
Тут согласен. Вот и хотелось от разработчиков услышать нечто подобное. Может есть нюансы. Хотя в принципе как-то так это и должно быть. Но разрабы упорно молчат.