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

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

Страницы: Пред. 1 2 3 4 5 6 7 След.
Not enough memory, not enough memory
 
Цитата
Александр написал:
Так я об этом и говорю. Что приложение x32 может использовать до 2Гб стандартно или до 3, если в реестре Windows есть специальный ключ, то до 4гб. Фишка в том, что сама 32 битная ОС не способна увидеть более, чем 4Гб. Но и тут засада - 2ГБ из этих максимальных 4-х будет принудительно отдано под работу системы. Вернее, минимум 2Гб. Скорее всего, именно поэтому у меня и вылетает ошибка о нехватке памяти. Стоит 6 гигов, система пишет что видит только 2,75Гб. Dsxbnftv 2Гб (минимум) на работу самой системы и получаем те самые 1.75ГБ на процесс. А ведь есть еще иные в фоне программы. Т.е., возможно, что система и есть от самый камень преткновения.
Нет, изначально вы говорили про «процесс»... и ответ был про это, что Quik не сможет использовать размер 64-битного адресного пространства...

Далее, то что вы пишите в следующем сообщении, и правильно и неправильно одновременно. Неправильно то, что вы думаете что фоновые приложения как-то там влияют. Нет, никак они не влияют, у них другие процессы и своё адресное пространство. Далее, вы пишите про оперативную память и её распределение между приложением и ОС, а это неправильно. ОС и приложение не оперативную память делят, а адресное пространство, так как ОС сидит в том же адресном пространстве процесса, в отличии от фоновых приложений. Ну и т.д...

С другой стороны, вы правы в том, что есть распределение памяти (куда и кому, сколько, туда 2ГиБ, сюда 1ГиБ и т.д.). С этим распределением можно поиграть. Оно разное для x32 и  x64 систем. В чём-то лучше, в чём-то хуже. Для x32 битных приложений путём комбинации ключей компиляции и опций запуска ОС, можно добиться памяти до 3ГиБ на x32 Windows и до 3,5ГиБ для x64 Windows. Если есть соответствующий опыт в настройке ОС, можете экспериментировать.

Для примера: У меня стоит серверная ОСь и у неё немного другие параметры распределения памяти. Я ничего специально не делал с настройками для x32 приложений. Конфигурация Quik, файл .wnd, у меня больше 250 КиБ (десятки вкладок, таблиц и графиков), через Lua скрипт я при этом могу выделить максимум до 2,3 ГиБ памяти до возникновения ошибки.
Not enough memory, not enough memory
 
Цитата
Александр написал:
Я читал, что у Win7 x32 на процесс выделено до 2GB Ram, а у x64 то 16Tb Ram. С этим и связал.
Сам Quik является 32-хбитным... и без разницы, где вы его запустите, на 32-хбитной или на 64-хбитной ОС... он так и будет ограничен 4 ГиБ адресного пространства... поэтому, единственное что можно посоветовать, это настроить сам Quik... отрубите часть своих «вкусностей», пошуршите по форуму и сети, были темы по оптимизации работы Quik'а...
В чем практическое отличие срочного рынка (фьчерсы) и фондовая биржа (акции), реальный счет
 
Вы вопросы задаёте, на тему которых можно целую книгу написать... но если кратко, то фондовый рынок нужен, если вы собираетесь скорее не торговать, а инвестировать. То-есть купили на приличную сумму акций, и оставили их на брокерском счёте. В конце года получите по ним дивиденды, а если ещё и в цене вырастут, то продадите с прибылью... Если же вы хотите спекулировать на акциях, торговать какие-то свои стратегии, работать с плечами, то сразу столкнётесь с тем, что это делать неудобно. Потому что маржинальное кредитование дорого стоит, ставки там двухначные. При этом сами плечи небольшие, обычно 3... и тут вам на помощь приходит срочный рынок, где нет необходимости занимать у брокера в долг деньги под лонги, или акции под шорты... на срочном рынке плечи включены в состав самого инструмента. Например, для фьючерса есть ГО (гарантийное обеспечение). Это часть цены, которую у вас блокируют на счёте при покупке фьючерса, но она меньше полной цены базового актива к которому привязан фьючерс. Таким образом, покупая фьючерс на акцию с ГО равным 10%, вы можете на тоже самое количество денег купить фьючерсов в 10 раз больше, чем смогли бы купить акций. При этом вы никому за это никаких процентов не платите, так как ни у кого денег не занимали под эту операцию. Соответственно, играя на изменениях курса, вы можете 10-тикратно повысить результат своих операций, разумеется как в положительную, так и в отрицательную сторону. Вот собственно и всё... ну а если серьёзно, то есть хеджирование, опционные стратегии, арбитраж, скальпинг и ещё 1 млн. вещей, про которые написано множество книг...
Некоторые глюки в 7.2
 
Цитата
Роман написал:
Suntor , это не тот вариант!
Ждём комментарий разработчиков, у меня при открытии рынка на волатиле, убытки возникают.
Не понятна ваша проблема... я выше вначале привёл простой код-шаблон... если будете как положено обрабатывать result, то price всегда будет считаться тоже правильно... откуда у вас могут быть убытки?
Тормозит КВИК
 
Без шуток... у вас диск накрывается... ))) У меня в своё время один так умер, потихоньку, начал тормозить, какое-то время поработал ещё и скончался уже потом.

А вообще, info.log и должен быть большим, из-за него тормозить не должно. По своему опыту наблюдений из-за большого info.log тормозит первичная загрузка Quik'а, но потом уже работает нормально.
Как закрыть файл?
 
Цитата
Let_it_go написал:
Вызываю я функцию так:
При таком вызове рваться не должно... у вас какая-то серьёзная проблема с вводом/выводом. Возможно дело даже не в Lua, а в вашей виртуальной машине, настройках виртуального диска и пр.

Попробуйте отключиться кэш совсем, через file:setvbuf:
Код
function rec_big_data(file_path, value, paper)
    rn = rn or {}
    rn[paper] = rn[paper] or {}
    if file_path~=rn[paper].file_path then
        if rn[paper].handler then
            rn[paper].handler:close()
        end
        rn[paper].handler = io.open(file_path, "a+")
        if rn[paper].handler then
            rn[paper].handler:setvbuf("no")        --<<<--- отключение кэша
            rn[paper].file_path = file_path
        else
            mm("QL:open file error "..file_path)
        end
    end
    if rn[paper].handler then
        rn[paper].handler:write(value.."\n")
    end
end
а в другой день, наоборот, увеличьте его до 1 МиБ, заодно сравните скорость работы, и посмотрите, будут ли глюки и при каком режиме кэширования:
Код
            rn[paper].handler:setvbuf("full", 1024*1024)
Как закрыть файл?
 
Цитата
Let_it_go написал:
Получаю данные колбеком OnParam. В него вставлена обсуждаемая функция.
А внутри OnParam вы несколько раз getParamEx дёргаете для разных параметров? И потом их объединяете в таблицу или строку и кидаете дальше в вашу функцию записи?... если так, то сдаётся мне вы оба (вы и ваш коллега с соседней темы «Некоторые глюки в 7.2») встретились, собратья по несчастью... с одной и той же проблемой...

Покажите, что вы делаете в OnParam, и как у вас идёт вызов вашей функции rec_big_data...
Работа с таблицей состояние счета
 
Цитата
Илья написал:
Цитата
Egor Zaytsev   написал:
Аналогичным образом выставляете заявку на не исполненный остаток.
т.е. предположим я открыл позицию в лонг - и купил акции объемом 10. Но потом заметил что акции дешевеют и нужно открывать шорт : тогда что бы закрыть лонговую позицию мне нужно 10 продать (теперь моя позиция закрыта) и только после этого можно заявку на продажу ?
Нет. Можно сразу ставить заявку по сумме. Например, продать 20 штук. Тогда ваш лонг 10 закроется, а шорт равный -10 откроется. Называется «Переворот», соседняя кнопочка рядом с кнопкой «Закрыть» в таблице «Состояние счёта». Эти же обе кнопки есть в стакане, в «Панели торговли» в подпанели «Панель информации о позиции».
Убыток после закрытия прибыльной позиции
 
Цитата
Илья написал:
Самое забавное, что позиция точно открыта, но в таблице пусто.
Эта таблица только для срочного рынка, только по «фьючерсам», собственно, она так и называется поэтому «Позиции по клиентским счетам (фьючерсы)»... а вы акции купили... их нужно смотреть в «Таблица лимитов по бумагам».

Цитата
Илья написал:
В Руководстве пользователя Quik
Так и написано :
Нереал. PLПрибыль, возникающая при закрытии позицииЗначение рассчитывается следующим образом:
Ликв. стоимость –  Баланс. ст-ть
Так почему когда я закрываю позицию у меня не прибыль а убыток ?
Потому что, ещё раз... это расчётный параметр! Это виртуальные деньги, для оценки, сколько бы вы теоретически могли бы заработать в данный момент, если бы продали свои бумаги по цене, по которой сейчас в «стакане» есть предложение... но проблема в том, что там это предложение берётся только по самой лучшей цене... то-есть, стоит там заявка на покупку с количеством 1 и с ценой 100, а ниже неё стоит заявка с количеством 200 и с ценой 95... Вы хотите продать 200 штук акций своих... вам система, показывает прибыль, которую вы получите, если продали бы по цене 100... но продать по этой цене можно только 1 штуку, а не 200... нет ликвидности такой по этой хорошей цене. Поэтому, когда вы нажимаете кнопочку «Закрыть позицию», у вас кидается рыночная заявка, которая 1 штуку продаёт за 100, а остальные 199 штук, продаёт по 95... и у вас сделки получаются такие:
Сделка №1: Продажа 1 штука 100 руб.
Сделка №2: Продажа 199 штук 95 руб.
Итого: 19 005 руб. по рыночной заявке
А покупали вы за 97 руб., и потратили на 200 штук 19400 руб.
И когда система вам по цене 100 руб., показала, что ваша виртуальная прибыль будет 100*200 = 20000 руб., вы радостно нажали кнопочку «Закрыть позицию», даже не разбираясь и не глядя в стакан и вообще что там на бирже происходит, и получили 19005 руб., и ваш убыток составил 19005-19400 = -395 руб., вместо прибыли 20000-19400=600 руб. которую вы хотели...
Убыток после закрытия прибыльной позиции
 
Цитата
Илья написал:
В чем смысл столбца `Нереал. PL`  в таблице `Состояние счета` в строке с открытой позицией, если прибыль или убыток нужно считать самому ? Где нибудь можно получить актуальное значение по позиции без пересчета таблицы сделок ?
Все подобные значения, типа вашей «Нереал. PL», вар. маржи и прочего... это расчётные значения... Как точно рассчитывается значение поля «Нереал. PL» можете посмотреть в:
Руководство пользователя Quik
+Раздел 3. Просмотр информации
++Состояние счёта
+++Позиции

Так вот, эти расчётные значения не имеют никакого отношения к тому, что вы получите после того как нажмёте кнопку «Закрыть позицию». Потому что ваши сделки могут пройти совсем по другим ценам, из-за нехватки ликвидности лучшего спроса/предложения, из-за скачущей цены и пр. Чтобы понять, что и по каким ценам вы реально продали/купили, нужно смотреть таблицу своих сделок. А чтобы понять, что и как вы в сумме наторговали, нужно смотреть в таблицах «Позиции по клиентским счетам», «Лимиты по бумагам» и пр., где можно увидеть итоговый баланс по вашим инструментам после всех сделок.
Убыток после закрытия прибыльной позиции
 
Цитата
Илья написал:
Откуда минус ?
Таблицу сделок посмотрите свою... пересчитайте её, и сразу увидите где цифры не сходятся...
Как закрыть файл?
 
Цитата
Let_it_go написал:
Выключил flush.
Почему-то на всех сегодняшних файлах стал появляться одинаковый глюк: вот такое искажение:
А у вас получение данных и запись их в файл идут в одном потоке или в разных? Очень на «рассинхрон» похоже...
Некоторые глюки в 7.2
 
Цитата
Роман написал:
Ещё, такая же проблема с ценой последней сделки.
Беру цену последней сделки с OnAllTrade, и таких «проблем» нет. Да и bid ваш также можно брать по OnQuote.
Если вы не хотите обрабатывать холостые вызовы getParamEx с result == "0", то может лучше переделать логику скрипта на «колбэки»!?...
Некоторые глюки в 7.2
 
Цитата
Роман написал:
Suntor , на этом инструменте у меня выдаст ошибку. Что и правильно. Поэтому я о нём речи не веду. А вот на фьючерсе RTSI меня это озадачивает :(.
Так на фьючерсе Индекса РТС тоже самое... говорю же, буквально месяц назад в начале апреля такой же стакан был по РТС, доходили до границы, там до расширения лимитов стояли с нулевым спросом... Это я просто к тому, что фундаментально нельзя закладывать в код идею, что «всегда должно приходить», пропускать обработку ошибок и писать как вы всё в одну строчку... это неправильно.

Отдельный интерес, это ситуация, когда bid действительно должен прийти, но не приходит. То-есть когда стакан заполнен, а вы периодически получаете ноль. Подозреваю, что getParamEx работает асинхронно, то-есть, если имеющаяся информация о лучшем спросе уже устарела, а новая ещё не пришла по сети, то функция отрабатывает немедленно и возвращает ноль. В противном случае, она бы зависла на несколько секунд, пока ожидала бы новую информацию по сети, что приводило бы просто к постоянному подвисанию любых скриптов на таких функциях.
Некоторые глюки в 7.2
 
Цитата
Роман написал:
Suntor , это фьючерс РТС, я не думаю что биржа загнулась так что бы "бид" пропал. :)
Создайте новую таблицу торгов в Quik... добавьте в неё все инструменты класса «FORTS: Фьючерсы», в параметры добавьте «Общ. спрос» и «Общ. предл.»... и затем отсортируйте таблицу по любому из столбцов «Общ. спрос» или «Общ. предл.»... берите любой инструмент, где значение параметра равно 0, открывайте по нему стакан и смотрите...

Вот к примеру сейчас, один из инструментов открыл с нулевым спросом:

И какой bid вы тут хотите получить через getParamEx?
Не мог закрыть позицию.
 
чёт не дочитал до конца... удалите последнее сообщение... )))
Не мог закрыть позицию.
 
Цитата
Иван Сидоров написал:
Сегодня опять не сработало при нажатии в стакане на кнопку "С" - Выставить заявку, исполнение которой приведёт к закрытию текущей позиции по указанному инструменту. В сообщениях пишет - Превышен лимит по инструменту. Как так? Я ведь не покупал, не продавал, я просто хотел закрыть позицию.
У вас скорее всего какие-то сообщения должно кидать... вы их просто не видите.
Вам выше писали «нажмите F7» и создайте «Таблица сообщений»... посмотрите по времени, когда вы тыкаете на свою кнопку, появляются там в этой таблице записи какие-нибудь!
Некоторые глюки в 7.2
 
Цитата
Роман написал:
Suntor , не я не против проверки, всё правильно говорите. просто у меня по другому обрабатывается, это глюк не пожизненный, надеюсь ребята сейчас решат.
Что они решат? изменят правила торгов на всех биржах мира?... я же говорю, приход result = "0" для bid, это не ошибка...
Как закрыть файл?
 
Цитата
Let_it_go написал:
Спасибо, друзья. Проясняется, хотя мне очень тяжело с этим разбираться. Не то образование...
Вот текущая редакция функции, которая пишет слепки стакана. Триместр сменился, если путь поменялся. В этом случае закрываем старый файл, открываем новый.
В таком виде, как правильно написал s_mike@rambler.ru, flush перед самым close смысла особого не имеет. Поэтому можете стереть там строчку.
Мне вообще ваш подход не нравится. Вы пытаетесь запихать в одну функцию всю логику работы с файлами. Поэтому у вас в этой функции будет куча лишних проверок замедляющий её основную работу — запись. Но даже, в рамках вашего подхода, я бы всё переписал по-другому. Как-то вот так:
Код
rn = rn or {}
rn[paper] = rn[paper] or {}
if file_path~=rn[paper].file_path then
    if rn[paper].handler then
        rn[paper].handler:close()
    end
    rn[paper].handler:io.open(file_path, "a+")
    if rn[paper].handler then
        rn[paper].file_path = file_path
    else
        mm("QL:open file error "..file_path)
    end
end
if rn[paper].handler then
    rn[paper].handler:write(value.."\n")
end
— код не проверял, пишу из головы, чтобы передать суть.
Некоторые глюки в 7.2
 
Цитата
Роман написал:
всё равно 0 или правильное значение. Можно поставить  проверку на result, но это ситуацию не изменит, так как понятно что 0 это уже ошибка.
Если result == "0", то значение из поля param_value использовать нельзя, его там просто «нет»... а что там есть, ноль или что-то другое не важно.
Вы суть поймите, статусы ошибок не просто так возвращаются, их проверять нужно... это азы программирования.

И кто вам сказал, что bid у вас всегда должен возвращаться. Вы одностороннего стакана что ли никогда не видели?... в начале апреля на срочке многих акций и индекса были. Да сейчас любой неликвид посмотрите, как там стаканы выглядят. Могут так же быть «шипы», которые собирают все bid'ы, и на короткое время опять их нет в стакане. Могут технически снимать все заявки при сбоях на бирже... да полно вариантов.
Некоторые глюки в 7.2
 
Цитата
Роман написал:
Egor Zaytsev , пункт "Исходя из настроек открытых пользователем таблиц" стоит по умолчанию.
Написал же ещё три дня назад, что вы неправильно пишите код... что у вас нет проверки на result == "1" для обоих вызовов...
У вас в первом вызове возвращается таблица со значениями {result == "0", param_value = "0"}, а во втором вызове возвращается таблица со значениями {result == "1", param_value = "10"}, и в результате у вас и получается 0+11*10=110...

Напишите что-то типа такого:
Код
bid  = getParamEx(class_code, security, "BID")
step = getParamEx(class_code, security, "SEC_PRICE_STEP")
if bid.result == "1" and step.result == "1" then
    price = tonumber(bid.param_value)+11*tonumber(step.param_value)
end
— код не проверял, набросал от руки!
Как закрыть файл?
 
Цитата
Let_it_go написал:
Я открыл файл с помощью io.open.
После этого я остановил скрипт.
Файл останется открытым, верно?
Нет. Закроется.
Цитата
Let_it_go написал:
И ещё один вопрос. Как мне принудительно закрыть файл, имея не дескриптор, а только путь file_path?
Никак. Если речь идёт о дескрипторе файла в Lua, который имеет тип «userdata».
Цитата
Let_it_go написал:
Как мне отлавливать средствами Луа, Windows или специальных программ открытые в данный момент луа-файлы?
Можете использовать для этих целей Process Explorer (https://ru.wikipedia.org/wiki/Process_Explorer).
Цитата
Let_it_go написал:
В Windows server 2003 эта функция не работает и не лечится. Я искал советы по данной проблеме, но они не сработали.
Вы не то смотрите. Эта оснастка «Общие папки» показывает файлы открытые по сети (по протоколу SMB), и это никакого отношения к файловой системе и файлом открытым локально не имеет. Оснастка у вас не работает скорее всего, если мне не изменяет память, потому что не запущена одна из служб, на подобие «Files and Folder bla bla bla» или что-то вроде того... чтобы посмотреть системные ресурсы открытые конкретным процессом, в том числе и файлы, используйте Process Explorer.

Цитата
Let_it_go написал:
Добавил в функцию переменную files_qty - это количество бумаг, которые пишутся. Если размер таблицы rn больше files_qty, значит сменился триместр и надо закрывать старые файлы. Очевиден недостаток: при смене триместра функция один раз закроет хороший файл - файл новенького триместра. Потом ей придётся его переоткрывать.
1. Файл закрывайте там, где вы определяете смену «триместра», то-есть там, где у вас создаётся новая path. И там же открывайте сразу новый по новому имени. А внутри функции записи оставьте собственно только запись.
2. Уберите строчку «rn[file_path]:flush()», это тяжёлая операция, на которой у вас всё будет тормозить. Этот flush делайте только перед самым закрытием файла, то-есть перед close().
3. Зачем вам вторая таблица file_open где вы ставите true, она просто дублирует вашу основную таблицу rn с дескрипторами. Уберите её из кода, а открытие файла для конкретного file_path проверяйте условием «nil == rn[file_path]», а после закрытия файла обнуляйте этот же элемент через «rn[file_path] = nil».
4. Выражение «#rn>files_qty» не сработает, потому что у вас таблица строится по строковым ключам, а оператор # работает только для индексированных по номерам таблиц, то-есть когда они используются как массивы.
5. Структура кода у вас неправильная, запись в файл нужно делать после проверки на nil возврата функции io.open. Вы эту проверку вообще не делаете после вызова io.open, а делает только при повторном вызове основной функции при следующей записи. У вас там нужно часть строк стереть, а часть местами поменять, чтобы привести код в порядок.
Как закрыть файл?
 
Цитата
Let_it_go написал:
После исполнения dofile эти файлы остаются открытыми? Надо ли заботиться о том чтобы их закрывать?
Нет. Они закрываются внутри dofile, причём ещё до того, как запустится интерпретатор кода загруженного из этих файлов.
Некоторые глюки в 7.2
 
Цитата
Роман написал:
вот так полностью: price = tonumber(getParamEx(class_code,security,"bid").param_value+(11*getParamEx(class_code,security,"SEC_PRICE_STEP").param_value))
Так вообще можно писать!?... где проверка на result == "1" для обоих вызовов?
Вечерняя сессия в таблице "Текущие торги"
 
Цитата
qwerty123 написал:
Откуда такие данные?
Сейчас смотрю на сайте биржи: Продолжительность торговой сессии на фондовом рынке с 09:30 до 19:00 мск,
на срочном, валютном, товарном рынках - с 10:00 до 23:50 мск
Торговая сессия на срочке заканчивается клирингом, а также снятием заявок. В 23:50 клиринга нет и заявки остаются со своими номерами на следующий день. Поэтому, да, с вечера пятницы до 18:45 понедельника идёт одна и та же торговая сессия. Заявку можете поставить в пятницу вечером, а снять её после обеда в понедельник... Все остальные значения во всех таблицах и портфелях типа «Предыд. лимит откр. поз.» и пр., также привязаны к последнему основному клирингу.
not enough memory
 
Цитата
Let_it_go написал:
В нынешнем варианте мой скрипт бегает по полям гигантской таблицы, а теперь будет бегать по строчкам файла.
Не получится ли чрезмерная нагрузка на процессор, замедление работы и т.д.
Торгующий робот установлен там же где и считающий, поэтому для меня такие вещи важны.
Lua сделан для удобства, а не для скорости. Если нужна высокая производительность, то нужно делать отдельную DLL на другом языке программирования, где реализовывать всю сложную математику, обработку больших массивов данных и прочее... а потом, уже эту DLL подключать к Lua скрипту и использовать. Но вполне возможно, что и самого Lua вам хватит с головой. Сделайте сначала по-простому, замерьте производительность, а дальше уже будет видно, хватает вам скорости той же loadstring или нет.

Мне стало любопытно про скорость loadstring, сделал профилировку на таблице строк, и получилось, что она ровно в 10 раз медленнее по сравнению с gsub. Что вообще говоря очень даже неплохо, учитывая, что loadstring не просто пару символов в строке меняет, а компилирует её создавая целую новую функцию с возвращаемой таблицей. Прогоны на двух таблицах по 100 тыс. и по 1 млн. строк дали:
Код
n = 100000
     alloc: sec =   0.193, mem =   9.429 MiB
      gsub: sec =   0.142, mem =  14.571 MiB
loadstring: sec =   1.073, mem =  15.538 MiB

n = 1000000
     alloc: sec =   8.812, mem =  93.877 MiB
      gsub: sec =   5.438, mem = 137.766 MiB
loadstring: sec =  55.328, mem = 113.608 MiB
По объёму такие таблицы соответствуют файлам размером около 5 и 50 МиБ соответственно. Со строками вида:
{a = 999999, b = 999999, c = 999999, d = 999999, f = 999999}
not enough memory
 
Цитата
Let_it_go написал:
Suntor,
запустил первоначальный вариант кода на боевой виртуалке, на которой возникает проблема not enough memory. (подвисание квика было не на ней, а на ноутбуке).
Ну судя по картинке памяти у вас там кот наплакал... и что странно, что начинается с 610 МиБ, а потом идёт по 16 МиБ... то-есть, вы либо константу всё же поменяли в string.rep, но почему тогда у вас с 610 начинается, должно начинаться с 70 МиБ... ЛИБО! у вас какой-то режим стоит в вашей виртуалке по динамическому выделению памяти, который так чудит, и из-за этого у вас все проблемы. Может стоит запустить для начала на прямом железе, чтобы вы сами увидели, что у вас получается. А потом уже сравните с виртуалкой...

Цитата
Let_it_go написал:
Но прочтённые строки не воспринимаются как таблицы. Это стринг.
Посоветуйте пожалуйста как быть.
Вместо
stroka=line
Напишите
Код
local t = loadstring("local t = "..line.." return t")()
И QPILE есть функция GET_PARAM_EX, не могу в описании интерпретатора LUA найти аналог..
 
Цитата
Igor Golovin написал:
Еще беда - для некоторых параметров делать .param_value а для некоторых .param_image (иначе не работает) в описании это есть? - ответ - нет... жалко время из-за чьей то (не своей) бестолковости...
Вы скачайте документацию с примерами https://arqatech.com/upload/iblock/194/quik_lua.zip
И там файлы примеров посмотрите:
\quik_lua\examples\test_trans.lua
\quik_lua\examples\tpf.lua
Как таблицы в файл можно распечатать.

Вот этот файлик tpf.lua из примера можете также использовать в своём скрипте, и распечатывать таблицу целиком. Потом смотреть что там за таблица получилась, и сразу увидите какие из неё ключи со значениями лучше брать. В документации так подробно ничего не увидите.

То-есть, делайте у себя в скрипте так:
Код
table_save("getParamEx", file, getParamEx(class_code, sec_code, param_name))
И потом в файле сразу увидите, что находится внутри таблицы возвращаемой getParamEx.
not enough memory
 
Цитата
Let_it_go написал:
Suntor
Ваш код сразу вешает КВИК, и его приходится принудительно закрывать. так что результата никакого нет.
Вы уверены?... почистите всё у себя. Запустите чистый Quik без настроек и без других скриптов, и проведите опыт повторно.

Единственное, на чём может повиснуть этот скрипт, так это на строчке string.rep, где создаётся строка размером 128 МиБ. Реализация функции такова, что она съедает в 4 раза больше памяти, до 600 МиБ из стека. На быстрой машине выполнение скрипта на этой строчке зависает на несколько секунд. Подозреваю, что если запустить этот скрипт на медленной машине да ещё с памятью выделенной из файла подкачки, который лежит где-нибудь на старом HDD, то зависнуть может на несколько минут... но это проблема с железом тогда у вас. Ваш собственный скрипт будет жутко тормозить и глючить в таких условиях, если он пытается обработать ГиБ данных.

Попробуйте для начала заменить:
local s = string.rep(" ", 128 * 1024 * 1024)
На:
local s = string.rep(" ", 1024 * 1024)
Можно ли одним скриптом луа запустить другой.?
 
Цитата
Igor Golovin написал:
Можно ли одним скриптом луа запустить другой.? Пример идет скальпинг, и есть таблица визуализации итогов. Нужно, что бы скальпинг жил своей быстрой жизнью, а таблица своей медленной (дабы не тормозить процесс) . Можно за пустить два разных скрипта,....  Но можно ли сделать из одного (один скрипт загружает другой) ?
Скрипты Lua в Quik работают в контексте двух потоков, один поток это поток самого Quik в контексте которого вызываются функции OnTransReply, OnOrder, OnTrade и др., а второй поток это поток функции main. Соответственно, вы можете поместить быструю часть своей логики в вызовы OnTransReply, OnOrder, OnTrade и др., а медленную часть визуализации таблицы в main. Наверно будет как раз то, что вы хотите.

Если же хотите больше потоков, то можете попробовать использовать дополнительные библиотеки для реализации многопоточности, на подобие LuaLanes. Сам Lua на уровне языка не поддерживает многопоточность.
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
 
Цитата
Андрей написал:
По каким причинам могут отменяться заявки в таком большом количестве?
Сами пользователи их ставят и снимают без совершения сделок, потому что сделки проходят только по одной цене в стакане, где встречаются спрос и предложение, а по остальным ценам оставшиеся заявки просто висят неисполненными в очереди, пока не будут исполнены позже либо сняты. Собственно их вы и видите в стакане... Заявок всегда больше, чем сделок по определению. Так работает аукцион.

Тут дело не в Quik и не в бирже, а совсем в другом. Аукцион в принципе подразумевает множество заявок, и в конце сделку по достижению цены исполнения аукциона. Любой аукцион так работает. Найдите видео реального аукциона какого-нибудь, где люди поднимают руки десятки раз, а ведущий зачитывает цену и в конце бьёт молоточком. Посчитайте сколько проходит заявок перед тем как будет совершена одна сделка, и сразу поймёте принцип.
Поле "Курс" таблицы текущих итогов, класс кросс-курсы валют., Как обратиться к полю "Курс" таблицы текущих итогов? Не знаю где найти название параметра
 
Цитата
Ace написал:
Где можно найти названия всех полей таблицы текущих итогов?
Сам недавно искал... полная таблица есть тут:

Руководство пользователя QUIK v.7.16
·Раздел 8. Алгоритмический язык QPILE
··Функции для получения значений Таблицы текущих торгов
···Значения параметров функций
····«Список возможных идентификаторов параметров»
not enough memory
 
Цитата
Let_it_go написал:
Но у меня вылетает скрипт как раз на 1 гигабайте оперативки.
Должно быть больше, чем 1 ГиБ.

Попробуйте запустить у себя этот .lua файл:
Код
local print = message and message or print
local s = string.rep(" ", 128 * 1024 * 1024)
local t = {}
for i = 1, 1024 do
    local status, errmsg = pcall(function () t[i] = s..i end)
    local m = collectgarbage("count")/1024
    print("Lua memory "..(status and (m - m % 0.001).." Mbytes" or "allocation failed. Error: "..errmsg))
    if not status then break end
end

У меня на свежезапущенном Quik даже с десятками открытых вкладок и окон выдаёт около 2,1..2,3 ГиБ, если запускать консольным интерпретатором, то 1,4..1,5 ГиБ.
Случайно сбросил настройки за последние две недели
 
Цитата
Anastasia Gordienko написал:
Добрый день.
Система QUIK может автоматически запоминать конфигурацию экрана, включая  расположение окон и их настройки при каждом завершении работы с программой.  Данное свойство активизируется через пункт меню  Система/Настройки/Основные настройки..., раздел «Программа» /  «Файлы настроек», установить флажок «Сохранять настройки в файл при выходе».  Файлы настройки автоматически сохраняться в папке WNDSAV по дате.
Да не то это совсем... бесполезная вещь. Написал же, что Quik запущенный висел несколько недель, и когда упал, то настройки потерялись. Он же не просто так висел, специально, чтобы его не закрывать и запускать заново.

У вас настройки запоминаются только в двух случаях, либо нужно закрывать Quik каждый раз, чтобы он настройки сохранил. Либо вручную делать это через пункт меню. И то и то неприемлемо.

Нужно, чтобы программа сохраняла настройки сама каждый раз, когда они меняются. Сделал новое окно, и Quik сразу сам настройки в файле обновил. Всё очень просто. Так работают 99% программ.
Случайно сбросил настройки за последние две недели
 
Можно сделать автосохранение настроек Quik при изменениях? или хотя бы раз в день/час/по заданному времени?

Quik висит загруженный неделями, и при каждом добавлении графика, инструмента, при каждом действии и чихе лазить постоянно в «Система / Сохранить настройки в файл...» абсолютно невозможно. В результате, в неожиданный момент Quik слетает, и всё теряется, и нету никакого автосохранённого файла с настройками. У всех программ он есть, даже у простейших текстовых редакторов, у «Офиса», у «браузера», можно достать резервную копию последнего файла.

Зарегистрируйте пожелание, пожалуйста.
Пользователи Telegram-Bot! Как организовать работу через proxy?
 
Цитата
Алексей написал:
Артем  ,
Разве OpenVPN Client позволяет направить только трафик, адресованный Telegram, на vpn сервер, а остальной - по дефолтному сетевому маршруту?
Попробуйте так:
https://superuser.com/questions/12022/how-can-i-make-the-windows-vpn-route-selective-traffic-by-dest...
https://superuser.com/questions/861454/how-to-prevent-windows-7-using-vpn-gateway-by-default

То-есть, отключить использование шлюза в настройках вашего VPN соединения, а потом прописать отдельно в таблице маршрутизации маршрут к IP вашего Telegram-сайта через шлюз VPN и его интерфейс.
Вопрос по обработке исключений в Qlua, Вопрос по обработке исключений в Qlua
 
Цитата
Артем написал:
QUIK ПОЛНОСТЬЮ ВЫЛЕТАЕТ.
Вопрос КАК заставить QLUA обработать исключение.
Если нужен дополнительный сетевой функционал, то можно попробовать поместить ваш код в небольшую отдельную DLL, которую уже вызывать из Lua.
А если нужно просто выполнить http запрос к сайту, то проще наверно просто запустить IE с ним, в одну строчку:
Код
os.execute("\""..os.getenv("ProgramFiles").."\\Internet Explorer\\iexplore.exe\" https://ru.wikipedia.org/wiki/Lua")
Кода в 20 раз меньше, а толку больше...

Цитата
Sergey Gorokhov написал:
Боюсь что кроме как предварительно установить проверку других идей нет.
Проверку можно выполнить через тот же  Ping
Это не будет работать по многим причинам. Во-первых, в момент проверки соединение может ещё быть, а уже при повторном запросе нет, поэтому предварительная проверка ничего не гарантирует. Во-вторых, IP-адреса возвращаемые через DNS постоянно меняются сетью CDN, и тот который вернулся при вызове ping может не совпадать с тем, который вернулся при последующем соединении. И т.д...

Да и сам подход неправильный. Не должен Quik падать из-за необработанного исключения в подгружаемом модуле. Если это имеет место быть, то это серьёзный глюк, и его лучше исправить...
Странное системное сообщение от биржи с вопросом
 
Цитата
Zoya Skvorcova написал:
Suntor  ,добрый день.
Ответить никак не получится. Попробуйте обратиться к брокеру.
Не думаю, что это от брокера, как по форме так и по содержанию. Видимо на бирже кто-то что-то не туда отправил... хотя всё может быть.
Странное системное сообщение от биржи с вопросом
 
Два часа назад появилось такое окно с сообщением:

Как бы мне на него ответить?... )))
Как задать срок действия лимит заявки в функции sendTransaction (tab)?
 
Цитата
Igor Golovin написал:
Добрый день! Как задать срок действия лимит заявки в функции sendTransaction (tab)? Для стоп-лимит заявки есть параметр - EXPIRY_DATE, а для лимит - не нашел... вченашняя снимается автоматически системой... спасибо.
Это называется «перенос заявки», и для его использования нужен «универсальный формат» в терминах Quik, там другие названия полей таблицы для sendTransaction.

Со страницы:https://arqatech.com/ru/support/files/
Скачайте: «Документация по языку LUA в QUIK и примерыzip, 5.6 МБ» (https://arqatech.com/upload/iblock/194/quik_lua.zip)
Там в файле «Использование Lua в Рабочем месте QUIK.pdf», в разделе «4. Отправка транзакций из Lua скрипта» на страницах 31 и 32 есть пример использования этого формата.

Проблема только в том, что в общем случае это не работает, так как для фондового рынка МосБиржа не поддерживает перенос заявок, они всегда снимаются. А вот для срочного рынка FORTS работает, и можно использовать.
Поэтому рекомендуют делать так: Создаёте таблицу «Карман транзакций» в Quik, в ней создаёте для нужного класса нужную вам транзакцию, например «Ввод заявки» со сроком действия, и затем сохраняете этот карман транзакций в .tri файл. Из которого и берёте названия полей для заполнения таблицы в «универсальном формате» для sendTransaction.

Далее после переноса заявки у неё меняется номер order_num, то-есть в начале новой торговой сессии выставляется фактически новая заявка с параметрами из старой заявки. У новой заявки через поле linkedorder передаётся номер старой заявки, которая была снята в конце прошлой торговой сессии и по которой была выставлена эта новая заявка. Также у новой заявки  trans_id равен нулю. Поэтому связывать новую заявку заявку со старой нужно именно по полю linkedorder. Нужно ещё учитывать ряд вещей, например, что поле linkedorder хранит номер заявки предыдущей торговой сессии, а не номер самой первой исходной заявки. То-есть, номера в order_num и linkedorder будут постоянно сдвигаться, каждый день. Также в сделках отсутствует поле linkedorder, поэтому если вызов OnOrder с номером новой заявки потерялся во время вечернего клиринга, то вызовы OnTrade по новой заявке будут содержать trans_id равный нулю, и order_num который неизвестно к чему относится. Я их назвал «сделки из ниоткуда»... обсуждалось в теме «order_num == nil и status == 3 в ответ на NEW_ORDER» (https://forum.quik.ru/forum10/topic3525/)...

Я пока для себя эту тему отложил в сторону, а потом планирую делать это в общем виде без жёсткой привязки к этому функционалу. То-есть скрипт сам будет отслеживать конец и начало торговой сессии, и сам перевыставлять заявки. В любом случае это придётся делать, чтобы работало на тех разделах, где функция переноса заявки отсутствует в принципе...
Вопрос про getItem в луа.
 
Цитата
Igor Golovin написал:
Переписываю скрипты с QPILE на LUA.... нужно снимать ненужные заявки по признаку, например, активные на продажу... так в строках таблиц QPILE есть параметры OPERATION = "SELL" , STATUS="ACTIVE". Внимательно прочитал описание таблиц для ЛУА и не нашел там аналогов для  getItem .. кто поможет... и обидно время тратить на решение простых вопросов.. Видимо, описание не удачно составлено.. Спасибо..
Для таблиц заявок и сделок направление операции и состояние заявки определяются по битам поля flags. Рядом есть ссылка «Набор битовых флагов» на страницу с описанием этих битов.
status == 15 в OnTransReply
 
Цитата
Zoya Skvorcova написал:
Suntor  ,добрый день.
предлагаем добавить только картинку с сообщением. Так как подробное описание и номера статусов описаны под Контролем доступных ограничений
Там всё очень поверхностно описано... непонятно кто и где устанавливает ограничения, как вызвать этот пункт меню, на какие типы транзакций влияет и пр., о чём были вопросы в этой ветке.

И главное полностью отсутствует описание статуса «14»... насколько я понял, этот статус аналогичен статусам «0» и «1», то-есть он не окончательный. Если он пришёл в OnTransReply, то это не ошибка (по status >=2, но кроме 3), и нужно дальше ждать ответы «15» и «16»... всё это нужно описать в документации.

Пока, по итогам обсуждения, для NEW_ORDER складывается следующий шаблон обработки статуса:
Код
if status == 3 or status == 15 then
    --транзакция успешно обработана
elseif status >= 2 and status ~= 14 then
    --ошибка при обработке транзакции
else
    --ответы со статусом «0», «1» и «14» игнорируем
end
Здесь ошибка означает, была ли выставлена заявка в торговую систему или нет.

А для KILL_ORDER такой:
Код
if status == 3 then
    --транзакция успешно обработана
elseif status >= 2 then
    --ошибка при обработке транзакции
else
    --ответы со статусом «0» и «1» игнорируем
end
Здесь ошибка означает, была ли снята заявка из торговой системы или нет.
Странная типизация результата
 
Цитата
Алексей написал:
1. При сравнении двух double чисел последние 16 разрядов мантиссы игнорируются, что соответствует 12-13 значащим цифрам в десятичном представлении числа.
Первый раз такое слышу... это вообще откуда такое?... можно ссылочку.
Подозреваю, что вы перепутали 64-хбитный double и внутрисопроцессорный 80-ибитный long double. Эти 16 разрядов отбрасываются не от double'а, а от вычисленного внутри сопроцессора long double при возврате обратно из сопроцессора и привидении его к типу double, то-есть 80-16=64. Точность double при сравнении не меняется, там около 17 десятичных цифр получается.

Такой вот простой .lua файл:
Код
local     DBL_EPSILON = 2.2204460492503131e-016
local NOT_DBL_EPSILON = DBL_EPSILON/2

local function checkDblEpsilon(v1, v2)
    message(string.format("(%.20g == %.20g) == ", v1, v2)..(v1 == v2 and "true" or "false"))
end

checkDblEpsilon(1.0, 1.0+NOT_DBL_EPSILON)
checkDblEpsilon(1.0, 1.0+DBL_EPSILON)
Выдаёт:
Код
(1 == 1) == true
(1 == 1.0000000000000002) == false
Как и положено. Никакие последние разряды не откидываются.
Странная типизация результата
 
Цитата
Andrei2016 написал:
Suntor, и вы туда же.
Мне что: больше делать нечего, кроме как моделировать странный эффект?
Я вам привел функцию, можете оставить в ней вообще 5 строк и воспроизводить хоть миллион раз. Только, прежде чем соберетесь увидеть этот эффект, увеличьте объем своего программного кода до 200К
Сделал .lua файл с таким содержанием:
Код
local function func()
    local x, y, z, param
    y = 10
    z = 5
    param = 2
    x = (y-z)*param
    message("x = "..x)
    x = (y-z)*param
    message("x = "..x)
    x = (y-z)*param
    message("x = "..x)
end

func()
Запустил у себя и получил чётко три сообщения с текстом:
x = 10
x = 10
x = 10
Ничего удивительно.

Теперь, можете скопировать эту функцию (НЕ МЕНЯЯ В НЕЙ НИ ОДНОЙ СТРОЧКИ КОДА!) внутрь своего «большого» 200К скрипта, и посмотреть вывод сообщений.
Я уже знаю в общем-то что у вас получится, но нужно, чтобы вы сами в этом убедились...
status == 15 в OnTransReply
 
Цитата
Zoya Skvorcova написал:
Suntor  , Статус 14 появляется в таблице транзакций сразу , как появляется окно с сообщением.
Да, только для NEW_ORDER
Ага... всё, теперь кажется стало понятно.

Статус «14» промежуточный, сначала в OnTransReply приходит он, а после того как пользователь в диалоге ответит «Да» или «Нет», повторно придёт уже статус «15» или «16» соответственно.

Неплохо бы всё это добавить в документацию, прямо в абзац «Доступные функции»  внизу страницы «Раздел 3. Просмотр информации \ Таблица транзакций».
А ещё лучше, вынести это в отдельную страницу как подраздел «Раздел 3. Просмотр информации \ Таблица транзакций \ Доступные функции», потому что этот абзац в самом низу ещё найти нужно.
И в эту отдельную страницу «Доступные функции» добавить описание с картинкой диалогового окна «Заявка не соответствует заданным ограничениям» с кнопками «Да» и «Нет». И всех статусов «14», «15» и «16».

Зарегистрируйте пожалуйста это пожелание...
Странная типизация результата
 
Цитата
Andrei2016 написал:
Suntor, так я привел его в своем первом сообщении.
Это не код... это его схема с комментариями... так ошибку не поймать.

Эту функцию вашу, где происходит глюк в математике, вынесите в отдельный .lua файл... отрежьте всё лишнее, чтобы остались только те несколько строчек с вычислениями где глючит... но код должен быть рабочий со значениями констант, чтобы его можно было запустить и воспроизвести эффект... после этого его сюда киньте, и мы посмотрим в отладчиках и по коду, что там реально происходит... чтобы найти причину
Цитата
Andrei2016 написал:
Решение оказалось не менее странным, чем сам эффект:
Перед третьим присваиванием "x = (y-z)*param" нужно добавить еще одно присваивание, скажем так:
"x=10". Все - на этом эффект числа с плавающей точкой в x исчезает, и message выводит нормальное 2.
А теперь, если вы уберете "подпорку", эффект double возвращается на место.
Никогда так не делайте... вы закрыли непонятную ошибку, непонятной заплаткой... проблема осталась и выплывет в будущем в самый неподходящий момент. В результате, можете просто деньги потерять от заглючившего скрипта...
Странная типизация результата
 
Цитата
Andrei2016 написал:
kroki,
проблема в том, что эффект проявился на 11-м знаке, а не на 17-м:
вместо 2 message выдал 1.999999999991. Это первое.
Второе. Я же четко написал: присваивается операнду ЦЕЛОЧИСЛЕННОЕ значение, т.е. условно "x=10".
Выложите сюда фрагмент кода с ошибкой, чтобы мы смогли его запустить у себя на Quik и воссоздать ситуацию. Тогда быстрее поможем найти ошибку...
status == 15 в OnTransReply
 
Цитата
Zoya Skvorcova написал:
Ограничения можно установить на цены заявок, на запрет торговли определёнными бумагами и.т.д
Этот функционал больше рассчитан на сотрудников брокера, чем для клиентов.

Нажатие кнопки “Закрыть” будет означать намерение пользователя вернуться  к обработке транзакции позже, после нажатия кнопки диалог будет закрыт и  дальнейшую обработку транзакции можно будет продолжить из таблицы  транзакций.   Нажатие кнопки “Нет” будет означать намерение пользователя  прекратить обработку транзакции. Нажатие кнопки “Да” будет означать  намерение пользователя проигнорировать нарушенные ограничения и  продолжить выставление заявки.
Теперь более менее становится понятно к чему эти статусы... Спасибо за ответ.

Ещё пара уточняющих вопросов.
• При нажатии кнопок «Да» и «Нет» идут статусы «15» и «16» соответственно, это понятно. А при каком условии приходит статус «14»?
• Эти статусы «14», «15» и «16» возможны только для NEW_ORDER, а для KILL_ORDER они никогда не придут. Правильно?
status == 15 в OnTransReply
 
Цитата
Zoya Skvorcova написал:
Suntor  ,добрый день.
Если со стороны брокера, на Вашего пользователя были бы установлены дополнительные ограничения, которые можно нарушать, то Вы бы получали значения 14,15,16.
О чём вообще идёт речь?... это ограничения на что? на максимальную сумму в одной заявке в %-тах от общей суммы счёта? или это какие-то запреты на торговлю конкретными инструментами? или это что-то совсем другое?... хотелось бы увидеть внешний вид этого диалога для пользователя, и о чём там вообще идёт речь, чтобы понять насколько это актуально в будущем, для кого брокер может установить такие ограничения и по какой причине?

Не хотелось бы однажды утром увидеть странное окно с двумя кнопками, и получить после их нажатия обвал работы всех скриптов...
status == 15 в OnTransReply
 
Вопрос к Тех. поддержке:
Как сделать так, чтобы в контекстном меню «Таблицы транзакций» появился пункт «Контроль дополнительных ограничений»?
Страницы: Пред. 1 2 3 4 5 6 7 След.
Наверх