Так а версию квика-то назовите, может у вас вообще седьмая какая-нибудь. Скрипт qPlaySound.lua должен лежать рядом с вашим скриптом и рядом же должна лежать qPlaySound.dll.
Всегда забавляет, когда люди внимательно изучают сорцы на гитхабе, а потом скачивают готовый бинарник с какого-то левого сайта. Почему они считают, что бинарник собран именно из тех сорцев, что им показали, для меня загадка. Впечатляющий прорыв творческой мысли, не правда ли?
Вот держите. Положить луа и длл в одну папку с вашим скриптом, включить файл qPlaySound через require, вызывать функцию qPlaySound(filename). Пример
Код
require "qPlaySound"
local run = true
function main()
while run do
sleep(3000)
qPlaySound("c:\\windows\\media\\tada.wav")
end
end
function OnStop()
run = false
end
Николай Камынин, вы выдергиваете особенность реализации и позиционируете ее как отличительный признак строки вообще. Луа добавляет ноль чисто для удобства и даже можно сказать чисто технически, потому что есть lua_pushlstring, принимающая размер, и вы можете сделать так
Если бы луа не добалял ноль, то в следующем вызове
Код
const char * pstr = lua_tostring(s, -1);
вы бы получили "hell" без нуля на конце и крэшнули бы приложение, пытаясь работать с ним сишными функциями. Именно поэтому луа ноль и добавляет, чтобы всегда возвращать терминированную строку. А теперь следите за руками. В сях я пишу
и внезапно получаю (широкую!) строку "HELLODOLLY". То есть луа не только сохранил строки в utf-16 и потом правильно вернул, но и правильно их склеил даже. Почему? А потому что плевал он на нолики в конце. У него есть сохраненная длина строки и по ней он ориентируется. Для сравнения сишный strcat (который по ноликам ориентируется) на таких строках сфейлит, вернет "HD", потому что тут после каждого байта ноль идет. Все это к чему. К тому, что в луа строки это тупо мусор заданной длины (даже без нолика), никакой семантики луа им не придает. А где должен бы придавать, там фейлит. Например, если я эту строчку "DOLLY" сделаю ключом в таблице (из сей), луа это слопает на ура. Но вот из самого луа я этого ключа не увижу (через перебор всех ключей только), потому что кодировка не совпадает. О чем и говорил выше, любая именно строковая операция кроме копирования требует знания кодировки. Как только нужна семантика, тут луа умывает руки.
Николай Камынин написал: текст в любой кодировке - это массив байт
Вообще все в компьютере это массив байт. Остальное все неверно. Ноль в конце это чисто сишная фишка, в паскале их нет например. Строка это не байты, а codepoints, каждая из которых может быть больше байта (до четырех например в utf8). Если вы разрежете строку посреди codepoint, обе половины уже не будут строками или, в лучшем случае, будут битыми строками. Отображение это вообще отдельная тема, там не только codepoints действуют, композиция включается, а еще куча параметров конкретного шрифта. Знание кодировки нужно для любых действий со строкой, отличных от простого копирования. Это если говорить о строках, а не о кучке мусора с приделанным ноликом. Прежде чем пояснять, стоит все же хоть немного тему изучить.
Иван написал: Мне хотелось бы в функцию передавать именно массив в таком виде (хэш-таблице). Но как тогда сохранить порядок ключей что передается?
В таком виде - никак. Сравните с сями, у вас либо структура и вы обращаетесь к элементам по имени (t.a, t.b) и вообще нет способа по ним итерировать, либо у вас массив и вы обращаетесь по индексу (t[0], t[1]) и имен никаких нет. Тут то же самое, либо имена (плюс еще и возможность в цикле по ним пройти, хоть и в непредсказуемом порядке, с помощью pairs), либо индексы и ipairs в заданном порядке.
В связи с этой проблемой возникла такая мысль, а что если нам попросить такую фичу: функция для вызова пользовательского колбека в основном потоке и соответствующий колбек. То есть например
с простой реализацией: первая посылает сообщение главному окну со ссылкой на произвольный юзерский тип, главное окно по получении сообщения дергает колбек с полученным значением и возвращенное значение возвращает из сообщения. Если посылаем из мейна - мейн встает и ждет, пока в главном потоке выполнится колбек, причем это "даром", за счет свойств винды. Если посылаем из другого колбека - колбек выполняется синхронно, тоже за счет свойств винды. Это хоть какая-то синхронизация была бы, а то ж сейчас ее нет от слова совсем. Приглашаю накидать аргументов против, если кому интересно.
Николай Камынин написал: tostring работает со строками в коде ASCII (American Standart Code for Inmormation Interchange) вернее ASCIIZ
Абсолютно неверное утверждение. В случае автоматического преобразования числа в строку да, получается ASCIIZ (а можно сказать, что получается utf-8 или win-1251 или что угодно, т.к. первая страница у всех codepage одинаковая, если не учитывать экзотику), но в случае строки возвращается строка как она есть, ровно в том виде, в каком ее туда засунули, в том числе со внутренними нулями (что автоматически отвергает ASCIIZ и, кстати, позволяет при некоторой осторожности впихнуть даже utf-16).
Кажется понял, почему виснет. Мейн у нас в отдельном потоке, работа с таблицей так или иначе приводит к SendMessage окну (в основной поток то есть), и собственно все, основной поток стоит на критической секции в колбеке и обработать сообщение не может. Если так, надо либо из мейна в окно не лазить, либо из колбеков (всех). Сиречь либо редиректить события в мейн и лазить только оттуда, либо лазить только из колбеков. Ну либо хачить со всеми вытекающими.
Александр написал: В какой кодировке будут строки, если вызвать lua_tolstring для преобразования в unicode?
А как вы вызовете lua_tolstring для преобразования в unicode? Она просто вернет пойнтер на строку в хранилище и все, никаких преобразований не случится. Аналогично lua_pushstring ничего не будет преобразовывать, как дали ей массив байтов, так она их в хранилище и засунет. Отсюда вывод: в какой кодировке скормили, в той и назад получите. Сравнение строк на равенство тоже побайтово делается. Единственное - это сравнение на неравенство, луа вызывает strcoll и поэтому правильный вопрос к арке будет такой: какую локаль устанавливает квик при старте? Мое предположение - locale("").
Тоже говорю спасибо разработчикам, вот это уже похоже на то, что должно быть, судя по паре тестов. И даже кое-что бонусом поправили, на что уж и надежд не было.
Андрей написал: Как сделать в квике, чтобы "Этим экстремумом была цена активации"?
Я тут уже полфорума загадил одним и тем же сообщением: "стоп-цена по другой бумаге". Это ровно тот самый "тейк-профит" какой все так хотят видеть, тупой фиксированный без трейлинга. Но больше всего меня интересует, чем лимитник простой не устраивает? Он-то гарантированно уже в стакане стоит и если цена туда дойдет, его зальют сто процентов без всяких прочих если. Почему не использовать?
Latrop, я б сейчас вообще не очень заморачивался, как именно падает, бо там адъ внутри. Лонгджампы смешаны с исключениями, гарбидж коллектор не работает местами, стейты битые создаются и т.д. Пока версию без этих адовых косяков не выложат, ловить нечего, а дальше будем новые косяки искать.
Цитата
Николай Камынин написал: так как если mainRun не определен, то он false
Если он не определен, то он не определен. Имеете в виду, что если он не инициализирован, то он nil, который в сравнении ведет себя аналогично false. Это не есть хорошая практика. Все эти языки придуманы, чтобы человек прочитал и понял, что происходит, не надо манглить код ради мнимой производительности, или тогда уже сразу массивы опкодов в char[] и jmp туда, вот уж летать будет (но недолго).
local ticksNum = getNumberOf("all_trades")
if (ticksNum > 0) then
local tick = getItem("all_trades", ticksNum - 1);
if (math.fmod(n, 1000) == 0) then
message("AllTrades num: " .. ticksNum .. " tick: " .. tostring(tick.trade_num))
end
end
Не факт, что очистка ТВС не произойдет между getNumberOf и getItem, а результат второй разыменовывается без проверки на nil. Перезаказ = крэш. Не квика (должен быть), но скрипта, хотя как сейчас сделано, и нила не надо, сам грохнется, найдет почему.
Занятное наблюдение: в старом луа через пять строчек было EnterCriticalSection, а в новом их вообще нет (ну только что плюсовый рантайм добавил для своих целей). Вот и возникает вопрос, макросы синхронизации тоже что ли забыли переопределить? Или это новый дизайн такой, лок-фри по последнему слову техники (правда, интерлоков тоже чета не видать).
Просто надо было к 8.5.1 приписать "бета" и все было бы понятно, и репортили бы как баги беты. Для продакшена она все же слишком забагована, несовместимо с жизнью я бы сказал.
Квик возвращает вам массив, начинающийся с нуля, а бестолковый оператор # считает с единицы. Попробуйте вот это, то же самое вид сбоку, элемента по индексу 0 оператор в упор не видит.
Код
function main()
local t = {}
message('' .. #t)
t[0] = 1
message('' .. #t)
t[1] = 1
message('' .. #t)
end
Это уже когда купил, я ж про исполнение. Даже не закон подлости, а просто закон, цена движется скачками, нельзя прицепиться к движению, которое уже началось, рыночный ордер уже собирает стакан, поезд ушел. А когда это микродвижение кончилось, дальше опять болотина до следующего шага, который неизвестно в какую сторону будет и какой величины. Хотел написать "впрочем", но лучше прекращу дозволенные речи )
Обычно да, у физиков кишка тонка перекосить на крупном фрейме, да и они вразнобой, кто в лес кто по дрова. А тут набежали в одну сторону, совокупно-то там неплохая денюшка получилась. Но вообще-то я не про глобальное выше упоминал, а про исполнение в моменте.
Дмитрий написал: Появилась 1 мысль открыть реал и отслеживать данные цен с реального счета и анализировать их.
Если на исторических оттестировали, открываете реал, заносите минимальное ГО и гоняете одним лотом до понимания, насколько на истории косячно натестили (или, паче чаяния, не косячно). Или вопрос как на истории тестировать? Качаете тики хоть бы и с финама и тестируете. Пытаться воспроизвести всю биржу со всеми нюансами - бесполезная трата времени, игрушки ради игрушек, все равно некоторые вещи происходят как реакция на ваше вмешательство в торги, это вы никак не сымитируете.
Александр Волфовиц написал: unsigned переменных нет вообще, код написан очень просто.
Имею в виду что-нибудь типа такого (тоже ведь ничего сложного)
Код
long pos = 0;
FILE * f = fopen(...);
...
fseek(f, pos * sizeof(RECORD), SEEK_SET);
fwrite(...); ++pos;
Вот здесь после переполнения pos начнутся чудеса. Более того, его переполнение это UB, компайлер может еще и от себя чудес добавить. Этот пример должен без ворнингов собраться (разве что только deprecation, на который все плюют обычно и отключают его макросом), а чудо заложено.
Nikolay написал: Так вот дальше стало все интерснее, при запуске этой утилиты Квик не падал. Без нее падает.
А вот такое поведение характерно для косяков в межпоточном взаимодействии. То же самое вид сбоку: под отладчиком не падает, а без него падает. Более конкретно какой-то поток что-то выдергивает из-под носа у другого потока, отладчик/дампер все замедляет и ошибки нет.
Когда программа (любая) падает мгновенно и без каких-то сообщений, даже под отладчиком, - была конечно, обычно это повреждение стека тем или иным способом. Конкретно по ситуации (переход с 32 на 64) я б первым делом включил все ворнинги в компиляторе и посмотрел, где происходит урезание 64 бит до 32 и где signed/unsigned mismatch в сравнениях, скорей всего откуда-то оттуда ноги растут. Смотрите сами: первые часы все нормально, потом что-то дорастает до 64 бит, не лезет в 32 и крэш. Про AMD я б в последнюю очередь думал.
Игорь написал: Имею опыт программирования на других языках, и там как-то интерпретатор /компилятор справляются...
Нигде не справляются, это фича чисел с плавающей точкой. На тех же сях то же самое, там просто в pfintf/sprintf/etc по дефолту режется до (не более чем) 6 знаков после запятой тем же способом, что вы привели, поэтому на первый взгляд кажется, что все точно. Посмотрите в интернетах, целые статьи как два дабла сравнить чтобы не было мучительно больно. Если нужно перфекционизьму, надо с ценами работать с фиксированной точкой, но в луа целых вычислений нет как таковых, так что ваш вариант вполне себе оптимальный (только не учитывает возможность отрицательного аргумента, в этом случае не в ту сторону округлите). О лишних вычислениях переживать незачем, там столько оверхеда по другим поводам, что это вообще никак не повлияет, даже если глубоко в цикл вложить.
Надо убедиться, что этот вызов в main делается, а не где-то еще. В потоке квика уже все было вызвано самим квиком, там CoInitialize вообще-то не нужна. А в мейне нужна. И в конце мейна еще CoUninitialize() надо.
Цитата
Sergey Denegin написал: Как правило, если потом перезапустить скрипт, ошибка уже повторяется. пока терминал не перезагрузишь
А это косячок в квике, при ошибке длл не выгружается и вообще много чего не подчищается.
Дмитрий написал: Ну почему нельзя сделать если я поставил цену тэйк-профита 5.00$ ... то чтоб при достижении цены 5$ тут же выставлялась лимитная заявка по цене 5$?
"Стоп-цена по другой бумаге" делает именно это, зачем кактус-то грызть.
ЧТД, задача не решается нигде. Просто киллнуть тред - не стоило и разговор затевать, все и так это умеют. А хэндлы у вас тоже в сандбоксе? При некоторой удаче вы всю винду так свалите, не то что хост свой.
А вы можете сделать такую же библиотеку на сях? Ну то есть вы стартанули тред, вызвали в нем произвольную юзерскую функцию и... как вы будете его останавливать, если понадобится? При чем тут квик, при чем тут луа, в такой форме задача не решается нигде.
rst9 написал: вам вопрос "со звездочкой": если другая библиотека, не ваша, выкинула ошибку, спровоцировала панику
Это как? Мой скрипт сидит в квике в отдельной луа-машине. Если я не умею обрабатывать ошибки в своей либе, то да, мне не надо потоков запускать, и, по-хорошему, вообще библиотек писать не надо, а надо улицы подметать.
Не знаю, но могу другой автологин подкинуть. Тупо заполняет имя-пароль из скрипта всякий раз, когда появляется окно авторизации (по любой причине) и "нажимает" окей. На случай ручками отменить в скрипте можно поставить задержку между появлением окна и автозаполнением. Взять тут.
Александр написал: только данная проблема наблюдается как с 64-ех битной версией так и с 32-ух битной
Это потому, что невнимательно прочли, что написано. Версия-то 64-битная, а ИНСТАЛЛЕР у нее 32-битный. И это (инсталлер) поделие не арки, а брокера конкретного. А поделия арки (к вопросу откуда скачать) лежат здесь. Только имейте в виду, что они под конкретного брокера не настроены, это надо либо ручками делать (не только лишь все осилят), либо установить брокерский вариант на жертвенную винду и утащить оттуда всю папку с квиком. Он, к счастью, вполне себе переносимый.