Александр написал: Suntor, прошу прощения - не заметил в своем первом сообщении вообще отсутствующих кавычек у M. Вы правильно указали на это Перепробовал за последнее время все какие мог варианты со всеми параметрами в заявке что уже путаюсь
Вроде уже очевидно было, когда указал на пропущенные кавычки, но судя по дальнейшей переписке нет.
У вас ошибка в коде. Вы не поставили букву "M" в кавычки. Из-за этого она воспринимается как переменная со значением nil. И присваивая этот nil элементу таблицы с именем TYPE, вы просто удаляете его из таблицы, или точнее вообще его не создаёте. В итоге, у вас остаётся только элемент PRICE со значением "0". А поскольку TYPE не указан, то по умолчанию заявка считается «Лимитированной», что вкупе с нулевой ценой приводит к возврату ошибки: "Цена заявки должна быть положительна". Потому что для «Лимитированной» заявки нельзя указывать нулевую цену.
Правильно заполните все поля таблицы транзакции, после этого выведите их на печать через ф-цию message, убедившись, что все поля присутствуют и имеют правильные значения, а уже потом вызывайте ф-цию sendTransaction, и тогда избежите подобных ошибок.
(*) Кавычки можете использовать любые. Они в Lua сделаны, чтобы вкладываться друг в друга. Двойные в одинарные и наоборот. Но в данном случае это не нужно.
Сервер1 [91.209.122.66:15100] теперь выдаёт: Соединение установить не удалось. Возможно, Вы используете ключи, которые не зарегистрированы на сервере. Сообщение об ошибке: "Connection was closed by peer: Can't get message size from net"
В 13:16 перестали приходить данные торгов. Всё замерло. Отключился от сервера. Потом пытался подключиться ко всем 5-ти по очереди. Ни к одному не смог в течение 11 минут. В ходе этого пару раз выдавало сообщение «Вы уже работаете в системе».
Сейчас в 19:05 перестали приходить данные торгов. Снова отключился. Снова пытаюсь подключиться. И не могу ни к одному. Переодически выдаёт сообщение «Вы уже работаете в системе». Либо что сервер по указанному адресу и порту не обнаружен. И так до сих пор. Уже 19:41.
Nikita написал: Так все-таки как можно подгрузить котировки к графику? все что мог пересмотрел ничего не нашел)
Никак. Quik это терминал, а не программа для технического анализа. Или, как тут неоднократно писали представители разработчика, программа для «интрадей торговли».
Quik 8.0.2.3 При прокрутке колёсиком вверх в «Дата и время» окна «Новости» прокручивается текст из разных символов. Столбик «Дата и время», третья строка:
Вот сейчас наблюдаю опять проблемы с работой первого сервера ВТБ [91.209.122.66:15100].
В 12:10:10 остановилось получение данных в таблицах всех сделок по фьючерсам. Например по SiZ9. И графики перестали обновляться по SiZ9. Но при этом графики по USDRUB_TOM продолжают обновляться. Потом вообще стакан по SiZ9 исчез. Подождал три минуты, разорвал соединение и заново подключаюсь к серверу. Опять «висяк» на 7..10 минут. И вот, подсоединился, стакан обновился, таблицы обновились, графики обновились. И что это было только что?
Всегда были проблемы с соединением. И на текущей версии (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 файлов). Я так понимаю вам нужна только вторая папка? Но всё равно многовато для почтовой пересылки.
sav 312 написал: Мысль понятна. Не буду заморачиваться с удалением 1-го элемента. Поскольку данных за торговую сессию будет немного, буду обнулять массив в начале следующего дня. Всем спасибо за советы.
Оно и не получится логически. Если удалите индексный элемент, индекс которого время в секундах, то остальные элементы сдвинутся и поменяют свои индексы, а значит и время. Поэтому, последующие обращения по времени вернут данные не для тех свечей... собственно, поэтому, как я и написал в первом сообщении, просто присваивайте nil элементу таблицы с соответствующим индексом.
sav 312 написал: Мне нужно удалить именно первую ячейку не ссылаясь на ее ключ.
Первая ячейка есть только для индексированных таблиц, то-есть для массивов. Для них же работают ф-ции table.insert и table.remove, которые понимают этот индекс, и умеют сдвигать остальные элементы таблицы при вставке и удалении элемента, что занимает время и ресурсы, особенно для больших таблиц. Поэтому сама идея, удалить первый элемент таблицы, а потом ждать, пока вся таблица перестроится, не слишком удачная, где она не является самоцелью... так сказать. Когда же вы присваиваете nil, элементу таблицы, то вне зависимости от того, индексная эта таблица или нет, никакого перестроения таблицы не происходит.
Поскольку в качестве ключа вы используете number возвращаемый ф-цией os.time, то ваша таблица индексная, но начинается не с первого элемента, а с 1,5 млрд.-ого... поэтому, особого смысла удалять 1,5 млрд.-ый элемент через table.remove, чтобы 1,5 млрд.+1 элемент и все остальные сдвинулись на его место нет. Заведите переменные хранящие начало и конец вашего массива, и сдвигайте их вперёд по мере удаления старых через nil сначала таблицы и добавления новых к концу вашей таблицы.
denini написал: Я еще поищу, может как-нибудь можно настроить внешнюю бесплатную трансляцию котировок light, на мне кажется, навряд ли.
Ну да, так вряд ли получится. Котировки должны идти сквозь тот же сервер, где вы ставите стоп-заявки, так как алгоритм их обработки там находится. Поэтому, даже если отдельно в клиент завести котировки из стороннего источника, это не позволит выставлять стоп-заявки по связанной бумаге на самом сервере. Трясите своего брокера, короче. Или, меняйте его. Либо, переходите к написанию своего торгового робота.
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 повторно пришлёт по этой заявке обратный вызов, то поскольку её номер уже был удалён, это вызов просто отбрасывается и всё. Робот хранит только несколько номеров нескольких активных заявок с которыми работает в данный момент, всё остальное просто отбрасывается.
denini написал: Меня заставила их искать нефть light на ФОРТС.
Тогда ещё вариант есть. Если у вас брокер транслирует отдельно «Мировые рынки: Товарные фьючерсы» или что-то подобное. И там есть котировки фьючерсов на Light с американских бирж. То можно привязаться к их цене, выставив стоп-заявки типа «Стоп-цена по другой бумаге». И выбрав соответствующий фьючерс с мировых бирж в качестве инструмента, из которого будет браться стоп-цена.
Александр написал: да не, у меня все просто, купил фьюч - сразу поставил стоп, продал - сделал тоже самое
Ну тогда нужно следить за временем и датой в сделках, если у вас внутридневная торговля... А вообще, по хорошему, каждая заявка и сделка имеют уникальные номера. И вот к ним нужно привязываться. И помечать, что заявки и сделки с такими-то номерами были обработаны, чтобы на них повторно не попадать. Это отдельная задача, и не такая простая на самом деле. У меня это вылилось в отдельную торговую библиотеку.
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, это вопрос к ведению позиций в вашем алгоритме. Как вы их храните, считаете, открываете и закрываете. Хоть в текстовый файл информацию сохраняйте...
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 и пр...
Если это обычные стоп-заявки, но берущие стоп-цену не из последней сделки, а из последней котировки, то скорее всего не получится. Тогда да, ваша идея с «сигнальной заявкой» может сработать. В Quik можно настроить локальное оповещение по цене котировки, но там только окно сможет показать и звуковой файл проиграть. Привязать к нему выставление заявки тоже не получится...
denini написал: Спасибо!) Я уже думал об этом; получается выставить сигнализирующую заявку на 1 лот, например, которая при исполнении выставит уже нужную. Маленький убыток, но точно уверен в срабатывании и без плагинов. Наверное, придется так и делать иногда, спасибо!: )
Я вообще другое имел ввиду. Сейчас глянул в сети по вашим названиям, и у меня такое ощущение, что это чисто Форекс-фишка. Расшифруйте, как точно должны эти заявки работать, по какому алгоритму, возможно, в Quik можно соорудить подобное поведение.
Александр написал: Спасибо) +1 лвл к освоению форума. +10 к карме Suntor
)))
Цитата
Александр написал: работаю я с таблицами stop_orders, futures_client_holding и orders и только в колбеках. нет ни какой обработки исторического содержимого этих таблица
Ну таблицы, как внутренние, так и пользовательские в Quik разумеет обновятся актуальными данными при подключении к серверу. Если заявки и стоп-завки сработали в момент отсутствия, то при подключении информация по ним придёт. Просто без картинок, непонятно изначально по каким «лишним стопам» был вопрос.
Сергей написал: Подскажите. Что это за таблица и зачем в моем клиентском портфеле инфа о каких-то левых бумагах
С просторов сети:
Цитата
Таблица "Купить/Продать"
Отображение текущих позиций клиента по бумагам и максимально возможном количестве бумаг для покупки и продажи. В таблице отображаются инструменты, включенные брокером в списки маржинальных бумаг и принимаемых в обеспечение, а также инструменты, имеющиеся в портфеле клиента.
Добрый день. Данным баннер размещен в системе до пятницы включительно. В понедельник нужно будет перед включением программы запустить файл 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
Потому что десятичные дроби не раскладываются точно на двоичные по законам математики.
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.
vgi написал: ARQA не добавила все параметры ТТП в документацию.
это я знаю
Цитата
vgi написал: Нашел его, сделав по рекомандации АРКИ DDE-экспорт ТТП в Excel с формальными заголовками по всем классам.
хитро и геморно... эт пришлось все классы в одну таблицу добавлять, потом для всех классов добавлять все параметры, потом все дубликаты параметров убирать, чтобы полный список параметров получить...
Let_it_go написал: Suntor, а как мне её установить?
Тут не подскажу, сам его не ставил. Но судя по всему у вас не находит этот самый Lunatic Python. Вы его под Windows собрали? Сама библиотека python.dll есть? Может вы просто голые сырцы скачали и пытаетесь их пакетной утилитой поставить, вот она и не находит библиотеку.