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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 12 ... 24 След.
Зависание QUIK
 
Цитата
Старатель написал:
Ошибки не дождался
У меня с патченой не было ни одного зависания/падения, гонял все тесты одновременно, перезаказывал по многу раз. Заменяешь на родную и достаточно быстро на тех же тестах что-нибудь ловишь. Кстати, патч только на колбеки, на SearchItems и потокобезопасные оставлено как есть. До них дорыться сложнее, все ж это пруф оф концепт, а не для работы.

Цитата
Старатель написал:
Сейчас вышла версия 8.9. Посмотрим насколько она стабильнее.
Одним глазком заглянул, lua_checkstack(1) на месте.
Работа main() при наличии 1 ядра
 
Цитата
Imersio Arrigo написал:
Или там какая-то внутренняя кухня луа, не позволяющая одновременно двум стейтам из двух потоков работать?
Там критическая секция. Луа выполняется всегда под ней, выпускает только когда сишную функцию вызывает. Получается что от сишной до сишной строго по одному. Сами сишные могут параллельно, но обычно там через три инструкции lua_то и lua_сё, так что кроме лишних переключений контекста ничего не будет.
Работа main() при наличии 1 ядра
 
Цитата
TGB написал:
Я думаю, что разработчики QUIK это, наверное, понимают и не подавляют параллелизм выполнения таких функций
Везде, где в кондовом луа стоит lua_lock, в qlua происходит EnterCriticalSection. Это что касается скриптов (не индикаторов).
Как убрать нуль после точки?, .0
 
Цитата
Старатель написал:
Плохая практика
Да, согласен. Надо убрать эту строчку.
Вопросы, не требующие ответов
 
Цитата
TGB написал:
выдача кода EXCEPTION_CONTINUE_SEARCH
Если всегда его выдавать, есть решение проще - просто не ставить ловушку, результат абсолютно тот же. Большинство SEH исключений фатальными не являются, многие даже позволяют EXCEPTION_CONTINUE_EXECUTION (но с использованием транслятора так не сделать). Реально смертельных там штуки три всего, вот их точно надо выше пробрасывать без обработки.
Работа main() при наличии 1 ядра
 
Цитата
TGB написал:
Если ядер несколько, то, может быть ситуация, когда мейн и колбеки работают параллельно.
Выделю в процитированном для привлечения внимания
Цитата
в каждый момент времени с луа работает либо мейн, либо колбек.
Про сишные функции, работающие без лока, там тоже написано. Вот если вы в сишной функции луа не трогаете, то работаете параллельно, как только полезли в lua_что-нибудь, встали на локе, пока второй поток не соизволит вас пустить, то есть не вывалится тоже в сишную функцию. Написанный только на луа код будет выполняться строго последовательно короткими перебежками от сишной функции до сишной функции (библиотечные и квиковские функции тоже сишные).
Как убрать нуль после точки?, .0
 
Цитата
Владимир написал:
Вот навскидку алгоритм
Это техническая часть, как именно резать, вопрос в том, до скольких нулей резать. Выше само форматирование две строки занимает безо всяких циклов, все остальное там это кэш информации по бумагам, чтобы не дергать на каждом вызове getSecurityInfo. Если заранее известно, как обрезать, две строки и останется. Сделайте лучше, я будто против.
Как убрать нуль после точки?, .0
 
Цитата
Владимир написал:
А нельзя просто отрезать нули после запятой к чертям собачьим с помощью string.sub?
Можно. Тогда следующий вопрос будет "я сделал как написано в этой ветке, теряется дробная часть у <подставить бумагу>".
Как убрать нуль после точки?, .0
 
Цитата
s_mike@rambler.ru написал:
Шаг цены не представляет никакого интереса в данном случае.
Звучит как предложение иметь особую функцию форматирования для каждого случая. Так тоже можно, конечно.
Как убрать нуль после точки?, .0
 
Цитата
s_mike@rambler.ru написал:
И?
Непорядочек. Ладно, с зилом это вроде шутки, но есть шаги и 0.02, и 0.0025 и еще какие-то, там будет совсем нехорошо.
Как убрать нуль после точки?, .0
 
Цитата
s_mike@rambler.ru написал:
тогда все нули после запятой отрежутся
А у зила шаг цены 5 )
Как убрать нуль после точки?, .0
 
Порешаем вопрос радикальненько. Функция FormatPrice форматирует цену согласно справочнику инструментов, с правильным шагом цены и правильным числом знаков после запятой. Если цена указана не кратно шагу, она округляется по правилу "к ближайшему". Для неизвестных квику бумаг цена форматируется с 6 знаками после запятой.

Че делать по шагам:
1) рядом со своим скриптом создаем файл FormatPrice.lua
2) в него копипастим следующий код
Код
local defparams = { ['scale'] = 6, ['step'] = 0.000001 }
local strm = '-'
local stre = ''
local strf =
{
   [0] = '%s%u',
   [1] = '%s%u.%01u',
   [2] = '%s%u.%02u',
   [3] = '%s%u.%03u',
   [4] = '%s%u.%04u',
   [5] = '%s%u.%05u',
   [6] = '%s%u.%06u',
   [7] = '%s%u.%07u',
   [8] = '%s%u.%08u',
   [9] = '%s%u.%09u'
}
local pwr10 =
{
   [0] = 1,
   [1] = 10,
   [2] = 100,
   [3] = 1000,
   [4] = 10000,
   [5] = 100000,
   [6] = 1000000,
   [7] = 10000000,
   [8] = 100000000,
   [9] = 1000000000,
}
local seccache = {}

local function SecCacheMiss(classcode, seccode)
   local t = getSecurityInfo(classcode, seccode)
   if not t or not t.scale then
      return defparams
   end
   local tsec = seccache[seccode]
   if not tsec then
      tsec = {}
      seccache[seccode] = tsec
   end
   local tcls = tsec[classcode]
   if not tcls then
      tcls = { ['scale'] = t.scale, ['step'] = t.min_price_step }
      tsec[classcode] = tcls
   end
   return tcls
end

local function GetSecParams(classcode, seccode)
   local tsec = seccache[seccode]
   if not tsec then
      return SecCacheMiss(classcode, seccode)
   end
   local tcls = tsec[classcode]
   if not tcls then
      return SecCacheMiss(classcode, seccode)
   end
   return tcls
end

function FormatPrice(classcode, seccode, price)
   if nil == price then price = 0 end
   local prefix
   if price < 0 then
      prefix = strm
      price = math.abs(price)
   else
      prefix = stre
   end
   local sp = GetSecParams(classcode, seccode)
   local iprice, fprice = math.modf(math.floor(price / sp.step + 0.5) * sp.step)
   return string.format(strf[sp.scale], prefix, iprice, math.floor(fprice * pwr10[sp.scale] + 0.5))
end

function FormatPriceFlushCache()
   seccache = {}
end
3) в начале своего скрипта пишем
Код
require('FormatPrice')
4) где надо отформатировать цену, пишем
Код
string_price = FormatPrice(class_code, sec_code, price)
5) если скрипт не останавливается между сессиями, при возможном изменении справочников (т.е. в OnConnected или OnCleanUp) пишем
Код
FormatPriceFlushCache()
Последнее ничего не ломает, так что можно по желанию и чаще вызывать. Только смысла нет.
Работа main() при наличии 1 ядра
 
Цитата
Владимир написал:
А зачем из бочки-то вылезать?
"Why get out from a tank?" прочитал я на автомате. Действительно, вай.

Цитата
Владимир написал:
а мы - с терминалом
Только торгуем не с терминалом и даже не с сервером и даже не с аркой и даже не с биржей. О как все сложно.
Работа main() при наличии 1 ядра
 
Владимир, ну Диоген вон в бочке жил вообще, просил только солнце не загораживать.
Работа main() при наличии 1 ядра
 
Цитата
Христиан написал:
main будет работать в том же потоке что и квик
Поток это логическая сущность, ядро - физическая. При наличии нескольких ядер винда тоже не очень охотно перебрасывает поток на другое ядро, чтобы кэш туда-сюда не перетаскивать (посмотрите в диспетчере задач, пока одно ядро менее половины загружено, остальные почти простаивают). Да и синхронизация в луа устроена так, что мейн и колбеки в одном скрипте все равно по очереди выполняются, т.е. в каждый момент времени с луа работает либо мейн, либо колбек. Если грузите длл, сишные функции без лока выполняются, но тоже выгоду заметите, если такая функция что-то достаточно тяжелое делает без обращений к луа.
Вопросы, не требующие ответов
 
Цитата
nikolz написал:
Как нельзя найти все ошибки, так и невозможно перехватить все исключения. Это аксиома.
Вы, конечно, имели в виду "обработать все исключения". Потому что перехватить их все вообще не вопрос, попробуйте раскомментировать любое:
Код
void wrap(void)
{
   //throw std::runtime_error("hello");
   //throw 0;
   //int * pi = nullptr; *pi = 0;
}

void main(void)
{
   __try
   {
      wrap();
   }
   __except(1)
   {
      printf("exception caught\n");
      getchar();
   }
}
Установка QUIK на Linux под Wine, Проблемы с актуальными на сегодняшний день версиями
 
Цитата
hook написал:
выскакивает окно  с текстом
Просто уберите этот instrclient.dll из папки квика и не будет выскакивать.
Вопросы, не требующие ответов
 
Цитата
новичок написал:
Цитата
Владимир написал:
exceptions надо давить в зародыше
и желательно вместе с с++ :)
С плюсами как раз проблем нет, луа его исключения ловит, стек разматывает и показывает ошибку типа "Unknown error. Possible unhandled exception". Кстати говоря, ветка для плюсовых исключений в qlua.dll не сработает никогда именно поэтому. А вот SEH исключения луа не ловит и, что важно, при этом по дефолту и стек не разматывается. А арке надо, чтобы разматывался, у них там деструкторы ждут с локами например. Чтобы разматывался, надо компилировать с /EHa и ставить транслятор, как арка и сделала. Я всего лишь предлагаю перетащить эту размотку в lua53.dll, на место преступления тксть, тогда и стейт будет оставаться живым, и qlua.dll можно без /EHa собирать, да и обработка ошибок упростится очень существенно. Либо дать уже (любому) исключению долететь до верха и пусть падает. А так как есть получается вроде изобразили размотку, на самом деле ничего толком не размотали и оставили выполняться в этом непонятном виде.
Старая телега со связкой QUIK - MySQL, Проблема с трансляцией котировок в таблицу MySQL.
 
Цитата
Алексей написал:
Connector ODBC - 8.0 Unicode
А надо ANSI
Вопросы, не требующие ответов
 
Цитата
TGB написал:
сигнализирующие о разрушении контекста исполнения
Да, строго говоря, в луа как таковом (непойманные) исключения возникать не должны, если они возникают, то либо а) в самом квике (вне луа), либо б) в загруженной пользователем длл. По-хорошему их вообще ловить не нужно, нужно падать, с дампом по возможности. Но луа из коробки ловит плюсовые исключения все же. Можно и в эту сторону поправить, пробрасывать не-луа исключения дальше и убрать ловушку из qlua.dll, пусть рушится, глядишь и дампы какие-то более содержательные будут получаться.
Как прочитать таблицу Текущие торги?
 
Цитата
Владимир написал:
А без него "просто не работает"!
Потому что скобки после него не надо вместе с ним убирать.
Долгое исполнение сделки, Сделка на демо счете отработала более чем за 30 сек.
 
Заявка это заявка, сделка это сделка. Если выставить заявку на покупку по нижнему лимиту, она и вообще никогда не исполнится (ну почти никогда).
Снимается заявка сразу после отправки транзакции
 
Цитата
Roman Azarov написал:
будет автоматически подставлена идентично худшей в стакане
В том стакане, что юзеру показывают, урезанном то есть? В этом случае, получается, наставив 50 единичек на каждом уровне, можно такую псевдорыночную заявку заставить отмениться до того, как она доберется до "настоящих" объемов. Или худшая цена из ордерлога берется?
Вопросы, не требующие ответов
 
Цитата
_sk_ написал:
Интересно, разработчики прислушаются или нет?
У них могут быть какие-то свои дополнительные соображения, о которых мы не знаем. Посмотрим. Если вышеупомянутый lua_checkstack(1) это явно недосмотр (вообще-то, уверен, они наступили на граблю, подложенную разработчиками луа в виде неработающего EXTRA_STACK), то здесь могут быть нюансы.
Цена последней сделки
 
Цитата
Георгий написал:
Нашел один вариант, добавить переменную, которая будет сама считать кол-во сделок с нуля и вызывать в функции getitem эту переменную, но все равно кажется, что можно проще
Откройте ж инструкцию уже, или так и будете методом тыка все изучать

 
Вопросы, не требующие ответов
 
В паре веток понаписал свое фи по поводу обработки исключений в qlua.dll, как она мне представилась через окошко отладчика. Напомню вкратце, вокруг lua_pcallk, через которую qlua вызывает пользовательские колбеки, построен try-catch блок и перед вызовом lua_pcallk устанавливается SEH-транслятор (превращающий SEH-исключения в плюсовые). Проблема в том, что исключение (плюсовое или транслированное), пролетая мимо lua_pcallk, пропускает всю его обработку после ошибки и, таким образом, стейт после этого уже нежизнеспособен. В арке последнее понимают и в случае ошибки, пролетевшей мимо lua_pcallk, тут же прибивают скрипт.

Сказавши А, хочу добавить и Б, а именно, как можно все это покрасивее организовать. Очевидно, ловить и транслировать исключения надо не в qlua.dll (там уже поздно), а в lua53.dll. Это не значит, что надо переделывать луа, его надо просто кастомизировать имеющимися в нем средствами, а именно через luaconf.h. Хочу показать, как я это сделал у себя и предложить арке посмотреть, не лучше ли будет так.

Скрытый текст
Вопросы, не требующие ответов
 
Тем временем 25 числа появился луа 5.3.6, изменения минимальные. Говорят, на этом 5.3 канонизируется и меняться больше не будет.
Зависание QUIK
 
Цитата
Старатель написал:
и почти сразу ошибка
Этот тест у меня никак не хочет воспроизводиться, ни на оригинальной, ни на патченой. Весь сервер перезаказами издергал - ноль результата.
Зависание QUIK
 
Старатель,  а вы тоже наблюдаете такой эффект: если много этих тестовых скриптов запущено, таблица всех сделок не успевает обновляться, перерисовывается изредка сразу с большим шагом. Но если кликнуть на каком-то меню, чтобы оно вылезло, таблица начинает рисоваться как обычно. Или открыть какой-нибудь модальный диалог, вроде заказа данных.

На новом джуне и ваших тестах получил кучку дампов и одно зависание с полпинка. После замены клуа на патченую перезаказываю уже который раз и пока все без эксцессов.

Для нехакеров замечу, что патченая длл для продакшена не предназначена, она патчена наскоро кое-как, чисто для тестов. Правильную длл сделает арка.
Зависание QUIK
 
Чет увлекся деталями и краткого ответа по существу не написал. В общем, если ошибка (любая) была поймана pcall'ом, никаких разрушений в квике нет. Если поймана костыльной ловушкой, разрушения есть. Второе не значит, что дальше обязательно зависнет, все может быть хорошо, разве что утечет сколько-нибудь памяти (вряд ли много). В колбеках разница видна снаружи, пойманные pcall'ом ошибки скрипт не останавливают, только выводят сообщение, пойманные ловушкой - останавливают. С мейном сложнее, скрипт прибивается в любом случае. Сообщение ACCESS VIOLATION говорит о том, что поймала ловушка, типовое луа-сообщение типа не есть функция и подобные - это из pcall.
Зависание QUIK
 
Цитата
Старатель написал:
И в какой-то момент вместо данных там оказался nil. Скрипт остановился. Это может повлиять на будущую работу?
В идеальном мире не должно, квик вызывает скрипты и колбеки под pcall, такие ошибки должны им отлавливаться и правильно обрабатываться. В реальном мире квик не всегда проверяет, когда ему из скрипта передан nil или битый указатель, лезет по ним и получает по ушам. Недавняя тема тому пример. Эти ошибки почему-то пролетают мимо pcall, в качестве костыля арка настроила вокруг pcall'а try-catch блок, и если ошибка долетела до него, скрипт принудительно прибивается прямо в ловушке. Проблема в том, что в этом случае вся постобработка в pcall обходится, то есть стек не выравнивается (одна из причин, видимо, почему в арке решили тут же скрипт прибивать, он уже и так не жилец), но главное не выпускается лок. С одной стороны, у каждого скрипта лок свой, раз скрипт прибили, то и проблем быть не должно, остался ли он захваченным или нет. С другой можно придумать (и изредка пронаблюдать) сценарий, в котором квик уже после прибития скрипта попытается что-то проделать в том же стейте, соответственно попробует захватить лок и повиснет на нем (а выпускать его уже некому). Это проблема отдельная, по-хорошему от костыля с ловушкой надо избавляться, а сначала расковырять все места, где квик наступает на мину в виде нила или битого указателя.
Зависание QUIK
 
Цитата
Старатель написал:
JUNIOR 1
Спасибо, прицепился. Ща потестируем от пуза.
Зависание QUIK
 
Цитата
Старатель написал:
А логические ошибки, когда в непредсказуемом месте вылезает nil, типа attempt to compare number with nil и т.п., они могут как-то в будущем повлиять? QUIK перегружать нужно?
Когда после ошибки в одном скрипте начинают сыпаться ошибки в других, или в нем же после рестарта, это показывает, что стек был покоцан, дальше уже как повезет, насколько сильно и т.д., где-то закончится небольшой утечкой, где-то уже серьезные повреждения, которые вылезут позже.

PS Не поделитесь содержимым ip.cfg от джуниора? Чет я его в виде архива не найду.
Зависание QUIK
 
Цитата
Старатель написал:
Не, знаю, после долгого тестирования, QUIK ошибки накапливает или чё?
Каждый слот стека начинается с GCObject, а его первое поле это GCObject * next. То есть все луа-объекты связаны в списки, используемые коллектором для прибития зомбаков. Раз уж вы словили разрушение стека, все эти списки коллектора уже сломаны, так что он начнет творить непредсказуемые вещи. Плюс, вылезая за границы выделенной памяти (и не будучи пойманным), луа ломает также и списки аллокатора, так что опять же когда-то потом в непредсказуемом месте (может быть, через пару дней) случится внезапный крэшик, концов которого не найдешь.
Зависание QUIK
 
ДокладАю. Приведенный здесь тест у меня не воспроизвелся, воспользовался тестом из этого поста, он у меня хорошо воспроизводится. На оригинальной qlua.dll вывалился с дампом (все того же вида) с первого перезаказа. На патченой четыре перезаказа (вот сейчас, на большой ТВС) отработал, полет нормальный. Особо нагружать боевой сервер я стесняюсь, так что для сбора статистики предлагаю заинтересованным коллегам повторить эксперименты у себя. Если подтвердится работоспособность в патченом виде, то причина разрушения луа-стека в inline-обертке lua_checkstack внутри qlua.dll, там захардкодили расширение стека на 1 слот. Патч меняет это значение на 256 и в одном месте на 63 (не хватило байт для опкода).
Зависание QUIK
 
Разобрался и с OnParam, это там компилятор начудил своих оптимизаций, у арки было 1 как везде, гыгы. Как оказалось, я не 16, а 256 везде понаставил, ну даже и лучше, чай не на контроллере выполняемся. Тут вариант 2 с патчем и на OnParam тоже.
Зависание QUIK
 
Старатель,  не желаете патченую qlua.dll запробовать со своими тестами? Заменил там все lua_checkstack(1) на lua_checkstack(16), кроме OnParam, с этой сходу не понял даже, что там вытворено такое, выглядит как (в том фильме). Если паранойя не мучает, качнуть можно здесь. У меня нынче брокера нет на связи, оффлайн я не могу ваши крэши воспроизвести, а без крэшей что с патчем, что без, работает одинаково.
При входе в сделку, цена отскакивает на 50 - 200 пунктов. Обман брокера?
 
новичок, зочем ви тгавите )
Вопросы, не требующие ответов
 
Дабы не загаживать прочие темы своими наблюдениями, создам себе отдельную. Цели получить ответ от сотрудников арки не ставлю, но если лишний раз глянут в свой код и убедятся, что заданный вопрос всего лишь ошибка наблюдений, или, паче чаяния, поправят что-нибудь, никому хуже не станет. Если в какой-то момент арка решит, что вопросы здесь излишне интимные, фил фри, как говорится, прибить всю ветку без размышлений, никто не обидится.


Для начала наблюдение номер один. Где-то в глубине qlua.dll готовится вызов OnAllTrade. Как положено, вызывается lua_checkstack. Но погодите, вызывается lua_checkstack(state, 1) и тут же на стек кладутся ДВА элемента, сама функция и ее аргумент. Кроме того, в процессе заполнения таблицы еще и временные элементы кладутся. Все ли верно, нигде ли стек не испортится?

Аналогичное наблюдение можно сделать при вызове (видимо) любого колбека с аргументом. OnConnected, OnDepoLimit, OnDepoLimitDelete, OnFirm, ...
dll на c++ вылетает при detach
 
Цитата
Виктор написал:
если не использовать ref() при вызове функции в новый поток, то значение передаётся по значению
Конструктор делает move() того, что ему дали. Подразумевается, что передается именно плюсовый объект, что он отработает мув и потом деструктор в основном потоке увидит, что прибивать уже нечего. Или POD (но не указатель), где по барабану на мув. С сишным указателем, например, будут проблемы, это та же ссылка вид сбоку.

А вообще поток создавать стоит только если ожидается хотя бы пара секунд его работы, там очень существенный оверхед. Под мелкие задачи лучше поток из пула брать (тем же async хотя бы).
Кривые шибки в QLua
 
Цитата
Старатель написал:
в тестовом квике даже графики не открыты
Ага, спасибо. Закралась было мыслЯ, но нет )
Кривые шибки в QLua
 
Старатель, вопрос-предположение, у вас всегда параллельно со скриптами работает хоть один луа-индикатор?
Индикация языка ввода
 
Цитата
Gla написал:
Некоторые пижоны делают еще и - символы не латиница - просто не вводятся в поле программно. Блокирована возможность.
У половины банков логин - фио на самом что ни на есть русском. Ежли вы не знали.
Кривые шибки в QLua
 
Цитата
Старатель написал:
Ошибка в строке getinfo(1)
Не воспроизвелось, работает себе и работает.
dll на c++ вылетает при detach
 
Два варианта ответа для разных уровней дзена.
1. Смотрите, что в аргументах передаете потоку. Эти аргументы живут в вызывающем потоке, как только вы второй отцепили, они сразу же будут прибиты, а второй поток об этом не узнает и будет их пытаться использовать, и либо нагрузит вам в базу мусора, либо вызовет av, что еще хороший исход (вам повезло, да).
2. Добавьте в (стандартный) <thread> первую строку следующего вида:
Код
#error This garbage should never be used in production code.
Экспорт odbc в access
 
Цитата
Алексей Украинцев написал:
но это одна из загадок вселенной, зачем это сделано. в ЛЮБОЙ БД есть типы date и time, но нет...
Как раз ничего загадочного, типы-то есть, только бинарное представление их разное, а строка она и в африке строка.
Автоматическое выставление стоплоса и тейкпрофита
 
Цитата
Gla написал:
классовую неприязнь ко всем этим буржуям, торгашам, делающим деньги из воздуха и т.п.
Не, это как ритуальные услуги, возня с которыми призвана скрасить горечь события. Недостаточно гламурные иконки облегчают вам прощание навеки с денюшкой, которую вы так любили.
Экспорт odbc в access
 
Алексей Украинцев, если тип в базе поставить datetime2, что будет?
Экспорт odbc в access
 
Цитата
Алексей Украинцев написал:
поле "Дата торгов"
не то же самое, что поле "дата", о котором пишет Egor Zaytsev
Автоматическое выставление стоплоса и тейкпрофита
 
Цитата
Gla написал:
Если разраб не делает удобную одну кнопку
Такую?
 
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 12 ... 24 След.
Наверх