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

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

Страницы: 1 2 3 4 5 6 7 След.
Виснет при соединении с сервером и сбрасывается через 5 минут
 
Вот сейчас наблюдаю опять проблемы с работой первого сервера ВТБ [91.209.122.66:15100].

В 12:10:10 остановилось получение данных в таблицах всех сделок по фьючерсам. Например по SiZ9. И графики перестали обновляться по SiZ9. Но при этом графики по USDRUB_TOM продолжают обновляться. Потом вообще стакан по SiZ9 исчез. Подождал три минуты, разорвал соединение и заново подключаюсь к серверу. Опять «висяк» на 7..10 минут. И вот, подсоединился, стакан обновился, таблицы обновились, графики обновились. И что это было только что?
Виснет при соединении с сервером и сбрасывается через 5 минут
 
Да причём тут брокер. За последние 10 лет уже и брокера сменить успел. Перечитайте ещё раз сообщение.
Виснет при соединении с сервером и сбрасывается через 5 минут
 
Всегда были проблемы с соединением. И на текущей версии (8.0.2.3) и на всех предыдущих. Наверно лет 10 наблюдаю одно и тоже.

Очень долго идёт соединение с сервером, Quik блокируется, мышка вертится значком часов. Потом Quik отпускает, и он начинает потихоньку сначала показывать графики, потом загружать все сделки в «таблицы всех сделок» за весь день и пр. Минут через 7 можно что-то делать... но иногда, совсем тяжко. Quik может повисеть и сбросить соединение. Приходится повторять попытку. Но бывают совсем плохие дни, как сегодня, когда невозможно соединиться даже с 10-ой попытки.

Уже пробовал 5 раз, графики подгрузил, часть сделок в таблицы Всех сделок тоже закачалось, но продолжает сбрасывать:
Net error: An existing connection was forcibly closed by the remote host.

Переключился на другой сервер, тоже самое.

Можно что-то сделать? Изменить сетевую часть программы, чтобы она хотя бы не блокировалась на 5-7 минут повисая намертво, а крутила какие-нибудь стрелочки как браузер, кнопочку «стоп» добавить, чтобы останавливать процесс подключения. Сделать какой-нибудь осмысленный вывод сообщений об ошибках, чтобы писало, что она не загрузила, графики, сделки, портфель или ещё что-то.

Честно слово уже достало. Такое впечатление, что сетевую часть клиента писали люди, вообще не умеющие писать такие вещи.
---
Брокер ВТБ:
Сервер1 [91.209.122.66:15100]
Сервер2 [217.14.50.201:15100]
Оповещения пользователя в Квик, Оповещения (алерты), на соблюдение заданных условий на торговых инструментах
 
Можете назвать это «Автооповещения». И добавить также, как это сделано для звуков с галочками по каждому типу событий.
Оповещения пользователя в Квик, Оповещения (алерты), на соблюдение заданных условий на торговых инструментах
 
Звуки это хорошо. Но всё же хотелось бы, чтобы окно выскакивало со стандартным оповещением. Также, как когда его вручную ставишь.
Оповещения пользователя в Квик, Оповещения (алерты), на соблюдение заданных условий на торговых инструментах
 
Можно ли сделать настройку, чтобы оповещение автоматом ставилось по любой заявке и стоп-заявке?
Недельные опционы на смену, где их найти
 
Цитата
Egor Zaytsev написал:
Если опционы вам не нужны вообще, то можно попросить брокера, чтобы он отключим Вам их трансляцию.
Давайте мы лучше исправим ошибки в программе... согласны? А не будем просить брокера что-то там отключать.
И если вы внимательно смотрели на мою картинку, то должны были заметить, что глючат не только опционы, но ещё и фьючи повторно пытаются замениться. О чём это говорит, как вы думаете?

Я могу выложить вам в облако всё что вы хотите, только вот облака у меня нет. И времени его заводить персонально для вас тоже. Если вас интересует помощь пользователей, то стоит со своей стороны помочь им в этом хоть чем-нибудь конкретным. Хотя бы дав ссылку на FTP сервер вашей тех. поддержки, куда можно будет скинуть нужные вам файлы в пару кликов.
Недельные опционы на смену, где их найти
 
 
Недельные опционы на смену, где их найти
 
Цитата
Egor Zaytsev написал:
Такая проблема действительно ранее была и была исправлена, в 8 версии ее быть не должно. Проверьте, что инструменты у Вас нигде не открыты, а ранее замененные уже были заменены. Если все так, то закройте QUIK и пришлите нам на  quiksupport@arqatech.com .
Проблема как раз и возникла при переходе на 8-ую версию. Обновился в июле в один день сначала с 7.16.2.5 до 7.27.2.1, и потом ещё раз с 7.27.2.1 до 8.0.2.3. И сразу же появилась эта проблема. Никакие опционы у меня не открыты и никогда не открывались, я их вообще не использую.

Quik стоит в %ProgramFiles(x86)%\QUIK, рабочие файл с архивами графиков лежат в %APPDATA%\QUIK. Может из-за этого?
Первая папка ~333МБ (с архивами старых версий .\backup ~263МБ). Вторая ~700МБ (из которых .\archive ~582МБ, 1286 файлов).
Я так понимаю вам нужна только вторая папка? Но всё равно многовато для почтовой пересылки.

В .\archive файлов с префиксами SPBOPT нет.
Недельные опционы на смену, где их найти
 
У меня та же самая проблема. Версия 8.0.2.3.

Нашли решение проблемы у автора темы?
Как присвоить значение бару?, Это можно реализовать в скрипте или обязательно делать через написание индикатора?
 
Цитата
sav 312 написал:
Мысль понятна. Не буду заморачиваться с удалением 1-го элемента.
Поскольку данных за торговую сессию будет немного, буду обнулять массив в начале следующего дня. Всем спасибо за советы.
Оно и не получится логически. Если удалите индексный элемент, индекс которого время в секундах, то остальные элементы сдвинутся и поменяют свои индексы, а значит и время. Поэтому, последующие обращения по времени вернут данные не для тех свечей... собственно, поэтому, как я и написал в первом сообщении, просто присваивайте nil элементу таблицы с соответствующим индексом.
Как присвоить значение бару?, Это можно реализовать в скрипте или обязательно делать через написание индикатора?
 
Цитата
sav 312 написал:
Мне нужно удалить именно первую ячейку не ссылаясь на ее ключ.
Первая ячейка есть только для индексированных таблиц, то-есть для массивов. Для них же работают ф-ции table.insert и table.remove, которые понимают этот индекс, и умеют сдвигать остальные элементы таблицы при вставке и удалении элемента, что занимает время и ресурсы, особенно для больших таблиц. Поэтому сама идея, удалить первый элемент таблицы, а потом ждать, пока вся таблица перестроится, не слишком удачная, где она не является самоцелью... так сказать. Когда же вы присваиваете nil, элементу таблицы, то вне зависимости от того, индексная эта таблица или нет, никакого перестроения таблицы не происходит.

Поскольку в качестве ключа вы используете number возвращаемый ф-цией os.time, то ваша таблица индексная, но начинается не с первого элемента, а с 1,5 млрд.-ого... поэтому, особого смысла удалять 1,5 млрд.-ый элемент через table.remove, чтобы 1,5 млрд.+1 элемент и все остальные сдвинулись на его место нет. Заведите переменные хранящие начало и конец вашего массива, и сдвигайте их вперёд по мере удаления старых через nil сначала таблицы и добавления новых к концу вашей таблицы.
Как присвоить значение бару?, Это можно реализовать в скрипте или обязательно делать через написание индикатора?
 
Цитата
sav 312 написал:
Array3Min[os.time(t[N-2].datetime)] = KF
Как удалить первый элемент? Я так понимаю, что table.remove(Array3Min, 1) здесь не прокатит?
Присвоить ему значение nil:
Array3Min[os.time(t[N-2].datetime)] = nil
Заявки "Stop if Bid" и "Stop if Offer"
 
Цитата
denini написал:
Я еще поищу, может как-нибудь можно настроить внешнюю бесплатную трансляцию котировок light, на мне кажется, навряд ли.
Ну да, так вряд ли получится. Котировки должны идти сквозь тот же сервер, где вы ставите стоп-заявки, так как алгоритм их обработки там находится. Поэтому, даже если отдельно в клиент завести котировки из стороннего источника, это не позволит выставлять стоп-заявки по связанной бумаге на самом сервере. Трясите своего брокера, короче. Или, меняйте его. Либо, переходите к написанию своего торгового робота.
котировки с финама+индикаторы
 
Цитата
Let_it_go написал:
Как мне грамотно передать её в функцию индикатора?
Нужно сделать как в примере, выкинуть все поля, кроме нужного поля close?
Не совсем понятен вопрос... В коде примера, можно просто поменять в трёх местах tbl[i] на tbl[i][6] и всё... разве нет?
Ошибка при освобождении памяти строк(LUA C API), Unknown error. Possible unhandled exception.
 
Цитата
null написал:
Это рекомендация стандарта С++ 2003 года, что надо помечать переменные, которые не меняются const, так же как const функции.
Создаётся впечатление, что вы просто не можете объяснить, зачем поставили это ключевое слово в свой код. В итоге, ссылаетесь на некие рекомендации. Даже я уже для себя увидел, одну из причин, зачем оно там нужно, но вот всё-таки хотелось бы автора услышать... ну да ладно.

Цитата
null написал:
Чем владеть я сам разберусь, мне так удобнее, читаемость не меняется.
Разумеется. Это лишь советы и мнения, как и на любом форуме. Тем не менее, своё мнение я высказал, и не меняю его. В вашем коде auto затрудняет читаемость и ничего не даёт взамен. Если вы считаете, что для вас наоборот, читаемость повышается, ну что ж, значит у вас такое восприятие кода...

Цитата
null написал:
Разве где-то я смешиваю new/delete и new[]/delete[] между собой?
Ну, если вы вызываете «delete[] p», и этот p объявлен типом «xxx *», то да, с синтаксической точки зрения. Потому что «delete[] p» можно делать только для p объявленным как «xxx []». Я могу даже вам привести пример коротенькой программы, где такое использование delete[] p приводит к зацикливанию и подвисанию кода. Если хотите. Тем не менее, в вашем случае, с примитивными типами (char, int и т.д.), это сработает. И вызов delete[] отработает для char * также как и для «char []», как впрочем и вызов просто delete, также освободит всю память без утечек для char []. Это только для базовых примитивных типов delete и delete[] равносильны, хотя с точки зрения синтаксиса и идеологии C++ это неправильно. Я даже затрудняюсь сказать, насколько это «specific behavior» и насколько противоречит каким версиям стандарта C++, это нужно глубоко ковырять все ревизии, но тем не менее. Это вообще проблема языка, что он не может возвращать массивы из ф-ций, для этой цели сделали даже std::array шаблон для массивов, который оборачивает их в структуру, и их можно возвращать из ф-ций. То-есть, тема более глубокая и сложная. Но суть я сказал в начале...

Цитата
null написал:
Разве в большинстве компиляторов C++ delete реализован не через free и отличие лишь в том, что delete запускает дескруктор?
Отличие там в дополнительных полях, за пределами массива, куда delete и delete[] лезут, чтобы узнать сколько и чего им удалять. Если вы им подсунете указатель из malloc'а, то это приведёт к ошибке выхода за пределы массива в общем случае. Да и вообще, сами malloc и free реализованы через системные ф-ции типа HeapAlloc, HeapFree и т.д. Как и new и delete. Это разные группы ф-ций работы с памятью, со своими структурами, и вызывать ф-ции одной группы для обработки памяти выделенной из другой просто бессмысленно.
Порядок запуска скриптов при запуске QUIK, как и что поступает, из-за чего скрипт может обработать то, чего ему не надо обрабатывать
 
Цитата
Александр написал:
но с другой стороны хранить кучу уникальных номеров это со временем вырастет в проблему именно количества, что тоже не есть гуд
Хранить только то, что активно. Ставится заявка, номер её сохраняется. Когда по ней идут сделки, соответственно она и обрабатывается. Когда все сделки прошли, позиция закрылась, то и заявка и её номер удаляются, они больше не нужны. Даже если после переподсоединения, или на следующий день, Quik повторно пришлёт по этой заявке обратный вызов, то поскольку её номер уже был удалён, это вызов просто отбрасывается и всё. Робот хранит только несколько номеров нескольких активных заявок с которыми работает в данный момент, всё остальное просто отбрасывается.
Заявки "Stop if Bid" и "Stop if Offer"
 
Цитата
denini написал:
Меня заставила их искать нефть light на ФОРТС.
Тогда ещё вариант есть. Если у вас брокер транслирует отдельно «Мировые рынки: Товарные фьючерсы» или что-то подобное. И там есть котировки фьючерсов на Light с американских бирж. То можно привязаться к их цене, выставив стоп-заявки типа «Стоп-цена по другой бумаге». И выбрав соответствующий фьючерс с мировых бирж в качестве инструмента, из которого будет браться стоп-цена.
Порядок запуска скриптов при запуске QUIK, как и что поступает, из-за чего скрипт может обработать то, чего ему не надо обрабатывать
 
Цитата
Александр написал:
да не, у меня все просто, купил фьюч - сразу поставил стоп, продал - сделал тоже самое
Ну тогда нужно следить за временем и датой в сделках, если у вас внутридневная торговля... А вообще, по хорошему, каждая заявка и сделка имеют уникальные номера. И вот к ним нужно привязываться. И помечать, что заявки и сделки с такими-то номерами были обработаны, чтобы на них повторно не попадать. Это отдельная задача, и не такая простая на самом деле. У меня это вылилось в отдельную торговую библиотеку.
Ошибка при освобождении памяти строк(LUA C API), Unknown error. Possible unhandled exception.
 
Цитата
null написал:
const позволяет компилятору оптимизировать лучше код.
Что вы там оптимизируете? можете объяснить? или вы где-то что-то прочитали и теперь лепите этот const куда ни попади...
Цитата
null написал:
Чем вам C++ 11 не угодил? Синтаксический сахар, очень удобен, особенно когда тип переменной очень длинный, очень облегчает читаемость кода, компилятор сам подставит нужный тип.
Вы сначала классическим способом овладейте написания программ на Си/Си++, а потом уже за сахар новый хватайтесь. Ошибки типизации это бич для новичка. А всякие auto только способствуют этому. И читаемость программы падает, когда вы не видите типа. Для того чтобы повысить читаемость, наоборот, эти типы даже в префиксах переменных нотируют.
Цитата
null написал:
Это с каких пор надо освобождать через delete?
С момента написания Страуструпом своей первой книги. Там, если не ошибаюсь, целая глава есть посвящённая вопросу, почему нельзя смешивать вызовы new/delete и new[]/delete[] между собой и чем это грозит. Вообще, масса тем в сети по этому поводу. Помимо того что это плохой стиль, это вообще «undefined behaviour» в общем случае.

Цитата
null написал:
так как по адресу указателя, или после хранится размерность
никогда, как раз для этого и введён delete[], чтобы этого не делать и оставить совместимость по структуре памяти с чистым Си

Цитата
null написал:
Просто delete c char * у вас оставит утечку памяти.
Я писал про то, что «char *» это просто указатель на какую-то память, которая пришла из недр lua_tostring. Вместо «char *» могло быть объявлено как «void *». Под «char *» часто (стандартная практика) имеется ввиду просто указатель на память и всё. А не то, что там кто-то выделял массив через new char[]. Вот про что речь шла. Какая-то неизвестная ф-ция, вернула вам память неизвестного происхождения, и вы её зафигачили delete[] увидев, что указатель на эту память объявлен типом «char *». Понимаете суть своей ошибки?... более того, внутри lua_tostring по определению не может быть никакого new char[], так как она написана на чистом Си, как и вся Lua! Исходники Lua посмотрите. Там эта память через malloc выделяется, а вы её в delete[] засунули. Так вообще делать нельзя, это уже системная ошибка освобождения памяти выделенной разными библиотеками. Поэтому она вам «Unknown error. Possible unhandled exception.» и выдала... осознаёте суть происходящего?
Порядок запуска скриптов при запуске QUIK, как и что поступает, из-за чего скрипт может обработать то, чего ему не надо обрабатывать
 
Цитата
Александр написал:
Собственно, непонятно, почему вчерашние сделки датированы сегодняшней датой.
Потому что есть «Дата торгов», а есть «Дата сделки». Зайдите в настройки «Таблицы сделок», и добавьте ещё параметр «Дата сделки». Сразу увидите, что они отличаются. Дата торгов, показывает сессию которая началась после вечернего клиринга, она идёт вечером предыдущего дня, и днём следующего, это всё одна сессия торговая. Соответственно, в скрипте, нужно проверять даты сделок, которые приходят в ф-ции обратного вызова. Это во-первых.

А во-вторых, а почему собственно ваш скрипт не может ставить стоп по сделкам за предыдущий день? Может у вас такой алгоритм, в один день покупаете, потом ждёте и на следующий день уже выставляете стопы и закрываете позиции. То-есть, это не вопрос к датам в Quik, это вопрос к ведению позиций в вашем алгоритме. Как вы их храните, считаете, открываете и закрываете. Хоть в текстовый файл информацию сохраняйте...
Ошибка при освобождении памяти строк(LUA C API), Unknown error. Possible unhandled exception.
 
Цитата
null написал:
Что не так и как правильно освободить память?
Всё не так...
1. lua_tostring просто конвертирует элемент на стеке в строку, но эта строка остаётся в рамках памяти сборщика мусора, и после следующего вызова lua_pop попадает в мусор. Между вызовами lua_tostring и lua_pop необходимо выделить память и скопировать туда содержимое строки, если следовать логике вашего кода.
2. операция «delete[] firmid» вообще не имеет смысла по трём причинам: Во-первых потому что как уже выше сказал, lua_tostring возвращает указатель на внутреннюю память освобождаемую сборщиком мусора, во-вторых, потому что у вас в условии, при lua_isnil == true вообще вернётся указатель на константную строку, которую нельзя освобождать через delete, а в-третьих, потому что строку «char *» вообще нельзя освобождать через delete[], так как это не массив «char []», а такие строки выделенные внутри ф-ций, если их и нужно освобождать, то нужно просто через delete.
3. И что это за «const auto»? зачем вам «const»? И «auto» (новодельный С++11) вы тоже зря засунули, пишите честно типы и тогда не будет путаницы с типами и delete и пр...
Заявки "Stop if Bid" и "Stop if Offer"
 
Если это обычные стоп-заявки, но берущие стоп-цену не из последней сделки, а из последней котировки, то скорее всего не получится. Тогда да, ваша идея с «сигнальной заявкой» может сработать. В Quik можно настроить локальное оповещение по цене котировки, но там только окно сможет показать и звуковой файл проиграть. Привязать к нему выставление заявки тоже не получится...
Заявки "Stop if Bid" и "Stop if Offer"
 
Цитата
denini написал:
Спасибо!) Я уже думал об этом; получается выставить сигнализирующую заявку на 1 лот, например, которая при исполнении выставит уже нужную. Маленький убыток, но точно уверен в срабатывании и без плагинов. Наверное, придется так и делать иногда, спасибо!: )
Я вообще другое имел ввиду. Сейчас глянул в сети по вашим названиям, и у меня такое ощущение, что это чисто Форекс-фишка. Расшифруйте, как точно должны эти заявки работать, по какому алгоритму, возможно, в Quik можно соорудить подобное поведение.
Порядок запуска скриптов при запуске QUIK, как и что поступает, из-за чего скрипт может обработать то, чего ему не надо обрабатывать
 
Цитата
Александр написал:
Спасибо) +1 лвл к освоению форума. +10 к карме  Suntor
)))

Цитата
Александр написал:
работаю я с таблицами stop_orders, futures_client_holding и orders и только в колбеках. нет ни какой обработки исторического содержимого этих таблица
Ну таблицы, как внутренние, так и пользовательские в Quik разумеет обновятся актуальными данными при подключении к серверу. Если заявки и стоп-завки сработали в момент отсутствия, то при подключении информация по ним придёт. Просто без картинок, непонятно изначально по каким «лишним стопам» был вопрос.
Заявки "Stop if Bid" и "Stop if Offer"
 
Цитата
denini написал:
Как осуществить создание заявок "Stop if Bid" и "Stop if Offer".
В «Таблице заявок» через меню, пункт «Стоп-заявка "по исполнению"».
 
Сделки которых я не совершал, В клиентском портфеле зафиксированы не мои бумаги
 
Цитата
Сергей написал:
Подскажите.  Что это за таблица и зачем в моем клиентском портфеле инфа о каких-то левых бумагах
С просторов сети:
Цитата
Таблица "Купить/Продать"

Отображение текущих позиций клиента по бумагам и максимально возможном  количестве бумаг для покупки и продажи. В таблице отображаются  инструменты, включенные брокером в списки маржинальных бумаг и  принимаемых в обеспечение, а также инструменты, имеющиеся в портфеле  клиента.
Порядок запуска скриптов при запуске QUIK, как и что поступает, из-за чего скрипт может обработать то, чего ему не надо обрабатывать
 
Цитата
Александр написал:
откуда сюда картинки то можно вставлять?
Прямо под полем ввода текста, ссылка есть «Загрузить картинки». После загрузки, на неё нажимаете, и вставляете в текст.

Цитата
Александр написал:
и вообще это нормально, что скрипт обрабатывает все что было в прошлом, пока терминал был закрыт?
Если он у вас по таблице всех сделок работает, то да. В неё подгружаются все сделки за текущую торговую сессию при соединении Quik с сервером.
Съехали размеры из-за рекламы
 
Моё решение проблемы, маленькая библиотечка QuikBannerKiller.dll и скрипт для её запуска один раз при загрузке Quik.

Файл QuikBannerKiller.c (или .cpp, не важно) для компиляции QuikBannerKiller.dll:
Код
//Copyleft, Suntor, 2018
#include <windows.h>
#include <commctrl.h>

#define LUA_LIB
#define LUA_BUILD_AS_DLL
#ifdef __cplusplus
extern "C" {
#endif
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#ifdef __cplusplus
}
#endif

#ifndef _countof
#define _countof(_array_)    \
    (sizeof(_array_)/sizeof((_array_)[0]))
#endif

#ifdef __cplusplus
extern "C" 
#endif
LUALIB_API int luaopen_QuikBannerKiller(lua_State *L)
{
    HWND hwndReBar;
    if (hwndReBar = FindWindowEx(FindWindow(TEXT("InfoClass"), NULL), NULL, REBARCLASSNAME, NULL))
    {
        REBARBANDINFO rbi = {sizeof(REBARBANDINFO), RBBIM_CHILD};
        {int i; for(i=0;i<SendMessage(hwndReBar, RB_GETBANDCOUNT, 0, 0) && SendMessage(hwndReBar, RB_GETBANDINFO, i, (LPARAM)&rbi);i++)
        {
            TCHAR szClassName[256];
            if (GetClassName(rbi.hwndChild, szClassName, _countof(szClassName)) && !lstrcmp(szClassName, TEXT("ShowBannerWindow")))
            {
                SendMessage(hwndReBar, RB_DELETEBAND, i, 0);
                break;
            }
        }}
    }

    return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {return TRUE;}

Файл QuikBannerKiller_Run.lua, из одной строчки:
Код
require "QuikBannerKiller"

Работает идеально, баннер отключается, размеры восстанавливаются. Пользуйтесь, на здоровье!
Запись в файл с одновременным чтением из другой программы?
 
Цитата
qt написал:
Будет ошибка или по очереди запишут?
Будет.
Съехали размеры из-за рекламы
 
Получил ответ от тех. поддержки ВТБ:
Цитата
Добрый день.
Данным баннер размещен в системе до пятницы включительно. В понедельник нужно будет перед включением программы запустить файл clear.cmd находящийся в папке Quik на локальном диске.
С уважением,

Сергей Череваткин
Эксперт
Департамент брокерского обслуживания
Банк ВТБ (ПАО)
Москва, Новая Басманная, 37А
тел: 8 (800) 333-24-24
broker.vtb.ru

Обнулил файл banners.dat, и выставил ему права в системе с запретом на запись, удаление и пр. Баннер исчез при загрузке Quik, но при подключении к серверу, всё равно появляется. Quik пытается сделать запись в файл banners.dat, получает ACCESS DENIED, но баннер всё равно показывает. Пока не знаю, что с этим делать. Можно накидать утилитку, и поменять стиль видимости на окне баннера в панели Quik, но время тратить на это не хочется. С другой стороны переделывать все вкладки тоже не хочется. Видимо придётся до пятницы ждать... в общем, без комментариев.
Запись в файл с одновременным чтением из другой программы?
 
Цитата
qt написал:
Открываю файл в блокноте и запись прекращается. Как открыть файл на запись чтобы можно было читать?
Вроде Блокнот (Notepad.exe) не читает изменения файла после открытия. Он единожды вычитывает файл в память, и всё. Можно во втором Блокноте открыть тот же самый файл, изменить и сохранить, и в первом Блокноте он не изменится, и сам Блокнот даже не предупредит, что файл был изменён извне. Поэтому, возможно у вас запись со стороны Lua идёт, но вы её просто в Блокноте не видите.

Попробуйте Notepad++ для сравнения, он по крайней мере сразу скажет, если файл извне был изменён, и предложит перезагрузить его. Можно опцию ещё поставить:
Settings -> Preferences... -> MISC. -> Update silently
тогда он должен сам автоматом перечитывать, по идее должно работать, но я не проверял...
Съехали размеры из-за рекламы
 
Честно говоря, даже не знаю, как про это писать. Открыл сегодня терминал, и вижу, что съехали все размеры окон на всех вкладках. Появились полосы прокрутки по вертикали и по горизонтали. Думал, что-то с Windows, с шириной панели задач и пр. А нет, оказывается, на панели инструментов Quik появилась реклама, в виде высокой подпанельки, из-за которой все размеры съехали. Попытался её убрать, но сделать это не получилось... Нет, я конечно всё понимаю, надо брокеру жаловаться и т.д. Но, господа разработчики, зачем вы это делаете? Превращаете биржевой терминал в какую-то шараварную утилиту с рекламой, которую нельзя отключить? Если, даёте такой функционал брокеру, выведите, галку в меню тогда. Просто свинство, по отношению к пользователям... больше слов нет никаких...

В меню не отключить:

Что я должен сейчас делать, перетаскивать размеры сотни окон на 30 вкладках?
Вычитание из числа округленного до сотых числа округленного до сотых, В скрипте две переменных, округленные до сотых. Из одной вычитается другая. Результаты математической операции ниже:
 
Цитата
sav 312 написал:
В скрипте две переменных, округленных до сотых. Из одной вычитается другая. Результаты математических операции ниже:
0.14999999999999
Подскажите каким образом получить нормальный результат?
Никак. Даже если напрямую запишите значение 0.15, оно всё равно не будет точным:
Код
local x = 0.15
print(string.format("%.16g", x))
print(string.format("%.17g", x))
Вывод:
Код
0.15
0.14999999999999999
Потому что десятичные дроби не раскладываются точно на двоичные по законам математики.
Lunatic Python проблема (питон+луа)
 
1. Для начала переведите в читаемый формат текст ошибки, который у вас на трёх последних картинках указан. Выделите в буфер «бракозебры» и распознайте их в декодировщике каком-нибудь... типа https://www.artlebedev.ru/decoder/advanced/, или любом другом который найдёте в сети. Или даже попробуйте перед запуском этих команд ввести chcp 1251, и ещё с chcp 866 попробуйте. Должно в итоге либо так либо так показать.

2. Файл lunatic-python-universal-2.1.1.tar.gz, который вы скачиваете через pip или easy_install, содержит только исходники библиотеки Lunatic Python, то-есть файлы:
luainpython.c
luainpython.h
pythoninlua.c
pythoninlua.h
Которые необходимо скомпилировать под Windows, чтобы получить библиотеку python.dll, которую вы потом будете в своём Lua коде подключать через команду:
python = require 'python'
Соответственно, чтобы это сделать, нужно, чтобы setup.py из пакета запустил компилятор типа gcc, которого он видимо не находит. И который вам нужно дополнительно поставить и настроить.

3. Даже когда поставите gcc под Windows, то скорее всего setup.py также не сможет сходу собрать библиотеку python.dll, так как на эту тему на оф. сайте Lua есть шпаргалка: http://lua-users.org/wiki/LunaticPython Внимательно её изучите, видимо придётся ручками по шагам собирать эту python.dll.
Вид бумаги в OnTrade, получить вид бумаги, по которой произошел трейд
 
Цитата
vgi написал:
ARQA не добавила все параметры ТТП в документацию.
это я знаю
Цитата
vgi написал:
Нашел его, сделав по рекомандации АРКИ DDE-экспорт ТТП в Excel с формальными заголовками по всем классам.
хитро и геморно... эт пришлось все классы в одну таблицу добавлять, потом для всех классов добавлять все параметры, потом все дубликаты параметров убирать, чтобы полный список параметров получить...  :cool:
Вид бумаги в OnTrade, получить вид бумаги, по которой произошел трейд
 
Цитата
vgi написал:
Код
local pi = getParamEx(class_code,sec_code ,"sectypestatic")
sectypestatic — откуда такой тип выцепили? не вижу в документации... только SECTYPE вижу
Можно ли одним скриптом луа запустить другой.?
 
Цитата
Алексей написал:
Mutex и MemoryMappedFile не создавая собственного внешнего кода на C (dll)?
Мутексы есть в w32.dll, но там нет memory-mapped файлов.
Поэтому, наверно проще всего через LuaIPC, там всё есть.
Quik + Python
 
Цитата
Let_it_go написал:
Suntor, а как мне её установить?
Тут не подскажу, сам его не ставил. Но судя по всему у вас не находит этот самый  Lunatic Python. Вы его под Windows собрали? Сама библиотека python.dll есть? Может вы просто голые сырцы скачали и пытаетесь их пакетной утилитой поставить, вот она и не находит библиотеку.
функции в функцию
 
Цитата
Archie_ написал:
если прописано fun_1() , то получим ошибку:   attempt to call a nil value (local 'fun_1')
Где-то у вас ошибка значит при вызове main, не подставили правильный аргумент. Вот код, компилируется и работает:
Код
function one()
    print("one")
end

function two()
    print("two")
end

function main(fun_1, fun_2)
        fun_1()
        fun_2()
end

main(one, two)
Вывод:
Код
one
two
функции в функцию
 
Цитата
Archie_ написал:
Думаю объяснил понятно
Ну так как вы написали, только скобки у ф-ций в аргументах уберите, и будет работать.
Код
function main(fun_1, fun_2)
    if something then
        --fun_1(????????)
    else
        --fun_2(????????)
    end
end

if     bla_1 then
    main(One, Two)
elseif bla_2 then
    main(Three, Four)
elseif bla_3 then
    main(Five, Four)
elseif bla_4 then
    main(Six, Seven)
elseif bla_5 then
    main(Seven, One)
end
Прочесть таблицу новости через LUA
 
Цитата
Юрий написал:
Я точно не помню, посмотрите в настройках квика, нет ли там опции читать все новости с сервера и сохранять. Я тело новости не парсил, мне нужны были только заголовки.
Есть флажок «Запрашивать тело новости вместе с заголовком». Но надо проверять, то или не то. Может и запрашивает, но в файл news.log не будет сохранять.
Прочесть таблицу новости через LUA
 
Цитата
null написал:
Вот самый стабильный вариант.
1. Не злоупотребляйте new/delete операциями. Это очень тяжёлые ресурсоёмкие операции, которые приводят к вызову системных ф-ций выделения памяти из кучи и пр. При этом исполняется код объёмом под 150 КБ... поэтому, всегда нужно стараться использовать обычные переменные на стеке, память под которые выделяется всего одной инструкцией процессора записи в регистр указателя стека... Я уже выше писал об этом про структуры. Но тоже самое касается и массивов с константным размером. Например ваш код:
Код
wchar_t *cname = new wchar_t[128];
if(GetClassName(hwnd, cname, 128) && !wcscmp(cname, L"InfoNews"))
...
delete[] cname;
можно ускорить в сотни раз:
Код
wchar_t cname[256];
if(GetClassName(hwnd, cname, _countof(cname)) && !wcscmp(cname, L"InfoNews"))

2. Максимальный размер имени класса окна в WNDCLASSEX равен 256, а не 128.

3. Ещё раз посмотрел весь код, и та же мысль... ну не так. Вообще не нужно количество новостей из заголовка вытаскивать. И мышка не нужна. И координаты не нужны. Нужно:
• нажать Ctrl+End (окно прокрутится вниз, и выделится самая последняя новость), а затем Enter (новость появится в RichEdit20A);
• далее в цикле идти вверх, нажимать UpArrow+Enter, читая новости и считая их количество и следя за сдвигом ползунка;
• в самом верху, как только позиция ползунка обнулилась, выходим из цикла;
В итоге, все новости прочитаны и их количество подсчитано. Да ещё в придачу, если в момент нашего цикла пришла новая новость, то ничего страшного, к моменту прихода нашего цикла вверх, она также обработается и подсчитается.

4. Про разбор даты, агентства и заголовка. Посмотрел формат там у всех агентств разный. Поэтому, если и делать разбор, то нужно сначала пробежать по новости, и поискать там ключевые слова: «ПРАЙМ», «Interfax» и пр.. То-есть, определить новостное агентство. И уже затем, для каждого из них, разбирать отдельно. У Интерфакса, за вычетом пустых строк, идёт в первой строчке дата, во второй ключ. слова, в следующей заголовок, и далее тело. Для ПРАЙМ всё слитно, вначале дата, и далее сразу тело новости без заголовка. Ну и т.д. Тут конечно можно поизвращаться, но что-то красивое и универсальное не сделать, скорее всего...
Прочесть таблицу новости через LUA
 
Цитата
Юрий написал:
Покопался в архивах, раньше файл назывался news.log, возможно название изменилось. Файл начинается с INFONEWS, строки оканчиваются нулём.
Идея хорошая... смущает только одна вещь. Посмотрел у себя этот файл, и такое впечатление, что там только заголовки новостей и те новости, которые читались. То-есть, если в окне новостей щёлкнуть на новость и её текст появится в
RichEdit20A, то он сохраняется в news.log. А если новость не читали, то её нет в news.log.
Quik + Python
 
Цитата
Let_it_go написал:
Неужели нет простого способа прочитать питоном стакан или текущую таблицу?
Из Lua через Lunatic Python вызываете Python ф-цию и передаёте в неё аргументами данные из стакана, ТТП и т.д..
https://stackoverflow.com/questions/20400390/how-to-call-a-python-function-from-lua
Автоматический запуск QUIK
 
Всё подробно расписано: https://blogs.msdn.microsoft.com/winsdk/2009/07/14/launching-an-interactive-process-from-windows-ser...
Автоматический запуск QUIK
 
Цитата
Виталий написал:
Уже не актуально - служба запускается в отдельном сеансе, соответственно все что запустит служба будет в том же сеансе, недоступном пользователю.
Без танцев с бубном это не победить
Как же тогда обычный планировщик (Task Scheduler) работает?
Глюки графиков в 7.19
 
Цитата
ISR написал:
и свой хостинг картинок
снизу поля сообщения есть ссылка «Загрузить картинки»
Прочесть таблицу новости через LUA
 
Цитата
null написал:
был какой-то глюк со свернутым окном, просто не находил InfoNews
свёрнутось окна не должна влиять, глюк был в чём-то другом... берите самое верхнее окно и от него делайте перебор детей... всё должно работать
Прочесть таблицу новости через LUA
 
Цитата
null написал:
Нашел способ как найти высоту строки. Но столкнулся с другой проблемой сообщения дабл клика приходят в окно, но новость не обновляется  
Код
  //Вычисляем высоту линии
SetScrollPos(hMulti, SB_VERT,  0 ,  true );
SendMessage(hMulti, WM_VSCROLL, SB_LINEDOWN,  0 );
const size_t height  =  GetScrollPos(hMulti, SB_VERT);  
Собственно, я об этом и написал перед этим... прокрутить на одну строчку вниз, и посмотреть nPos в GetScrollInfo, ну или как вы получаете тоже значение через GetScrollPos.

Цитата
null написал:
Вот сделал более менее рабочий вариант.
Мягко говоря... совсем «код новичка» так сказать. Ну по порядку:

Цитата
null написал:
Код
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
   hNews  =  FindWindowEx(hwnd, nullptr, L"InfoNews", nullptr);
    if  (hNews  !  =  nullptr)  
Зачем?... в эту ф-цию обратного вызова и так идут все хендлы детей и их детей и т.д.... не нужно в ней ещё поддетей детей проверять... здесь нужно взять имя класса через GetClassName и сравнить его с "InfoNews".

Цитата
null написал:
Код
      const HWND hMdi  =  FindWindowEx(hWnd, nullptr, L"MDIClient", nullptr);

       if  (hMdi  !  =  nullptr)
      {
Зачем?... Не нужно MDIClient получать, можно сразу для InfoNews вызывать EnumChildWindows.

Цитата
null написал:
Код
               const size_t centr  =  (rect -  > right  -  rect -  > left) /  2   -   100 ;
               
                  const size_t x  =  centr  +  rand() %  50 ;
                  const size_t y  =  height  +   3   +  rand() % (height  -   3 );
                  const LPARAM pos  =  MAKELPARAM(x, y);  
Что за адские вычисления?... через rand() с остатком? это вообще зачем?

Цитата
null написал:
Код
                  PostMessage(hMulti, WM_ACTIVATE, WA_CLICKACTIVE,  0 );
                  // Перемещаем курсор
                  SendMessage(hMulti, WM_MOUSEMOVE,  0 , pos);
                  // Дабл клик по новости
                  SendMessage(hMulti, WM_LBUTTONDBLCLK, MK_LBUTTON,pos);
                  // Отпускаем левую кнопку мыши
                  SendMessage(hMulti, WM_LBUTTONUP,  0 , pos);

                  // Клик по новости
                  SendMessage(hMulti, WM_LBUTTONDOWN, MK_LBUTTON, pos);
                  // Отпускаем левую кнопку мыши
                  SendMessage(hMulti, WM_LBUTTONUP,  0 , pos);

                  //Sleep( 10 );
                  PostMessage(hMulti, WM_ACTIVATE, WA_INACTIVE,  0 );
                  current_LEN  =  SendMessage(hRich, WM_GETTEXTLENGTH, NULL, NULL);
                  wchar_t *  buff  =  new wchar_t[current_LEN  +   1 ];
                  SendMessage(hRich, WM_GETTEXT, current_LEN  +   1 , LPARAM(buff));
                  current_CRC  =  crc32c(buff, current_LEN);

                  // Next line;
                  SendMessage(hMulti, WM_VSCROLL, SB_LINEDOWN,  0 );  
Вот честно не нравится мне это... совсем... Мне кажется это нужно по-другому вообще сделать. Нужно сначала SetFocus() на MultiList сделать, а потом вообще клавиатурой пройтись по всему списку нажимая кнопки VK_DOWN и VK_RETURN. Так с ходу не могу сказать, нужно экспериментировать... но мне кажется, что это лучше, чем вычисление координат и  тыкание мышкой...

Цитата
null написал:
Код
               SCROLLINFO *  si  =  new SCROLLINFO();

               wchar_t *  title  =  new wchar_t[tlen  +   1 ];

               RECT *  rect  =  new RECT();

                  wchar_t *  buff  =  new wchar_t[current_LEN  +   1 ];  
Ну и наконец — самое главное — «гвоздь „программы”» в прямом и переносном смысле: где delete???
Вы везде ставите new, в том числе и в цикл его засунули, но при этом не делаете delete. У вас в программе сплошные утечки памяти идут.
Да и не нужны new для тех же структур WinAPI, зачем?... все эти структуры локально на стеке выделить и проинициализировать:
Код
SCROLLINFO si = {sizeof(SCROLLINFO)};
si.fMask = SIF_ALL;
if (!GetScrollInfo(hMulti, SB_VERT, &si)) /*ошибка*/;
...
RECT rect;
if (!GetClientRect(hMulti, &rect)) /*ошибка*/; 
и вызовы самих ф-ций на ошибки тоже нужно проверять... ну и т.д.
Страницы: 1 2 3 4 5 6 7 След.
Наверх