nikolz написал: Цитата Евгений написал: function Init() func = SO() return #Settings.line end попробуйте перенести функцию Init в самый конец скрипта
Здравствуйте. Не помогло. Ошибку "311:attempt to call a number value (global 'C')" удалось убрать, поменяв в моём коде, который обращается к файлу индикатора цену C на c. Но значения индикатора не удаётся получить, появляется ошибка "attempt to concatenate a nil value (global 'so2')". Видимо я неправильно обращаюсь к индикатору, хотя по подобному запросу к PSAR скрипт получает значения:
вы пытаетесь использовать монстра который нагородили разработчики, но они его сами не применяют в квике. --------------- Проще всего поместите встроенный этот индикатор на график, задайте идентификатор и прочитайте значения с графика. В результате получите ровно то, что увидите. -------------- если надо скрипт на луа, то либо найдите существенно более простой код что то что взяли, либо напишите сами по формуле из вики.
понять, что сделки были рождены одной заявкой можно по времени. Оно должно совпадать с точностью микросекунд и параметр Соunt должен инкриментироваться на единицу
вообще-то не заявка делится, а это сделки, которые совершены по встречным заявкам, которые совпали по цене с этой заявкой, но количеством меньшим чем в заявке. Объединить Вы их можете, но не в этой таблце так как это таблица сделок - т е одна строка - одна сделка
Kirill EL написал: ни о каких заявках речи не идет
выставление лимитной заявки из алгоритмической, как способ проверить быстродействие инфраструктуры брокера
Я не могу войти в терминал. Висят графики и не прогружаеются. Вместе с грфиками не прогружается ничего от клиентского портфеля до котировок.
Он входит только через полчаса - час Вот когда уже зайду в терминал и он заработает таки, то можно попробовать манипуляцию с заявками, только смысл?
Рекомендую сделать следующее: Установите еще один квик из исходного пакета. Запустите новый квик и оцените быстродействие. После этого в новом квике настройте получение и отображение на графике одного инструмента. Если все нормально, то проблема в большом числе окон и большом размере архива. Если все не нормально то проблемы в канале связи или ошибки в подключении к серверу брокера. ----------------- Рекомендую так же поиграть с демо версией и посмотреть будут ли там проблемы.
Владимир написал: nikolz, Представляю, что разработчики должны думать о таких программерах. ::
Вот именно, лапуль, что документация про QLUA а не про QUIK. Здесь ЕСТЬ возможность написать фильтр на луа и подключить его к таблице, а не тыкать мышкой по экрану, и никакой колбек для этого не нужен. У меня в скрипте есть два независимых фильтра: по валютам и по наличию или отсутствию тикера в портфеле. Есть ещё третий, по таймфреймам, но это уже в одном из видов контекстного меню. Просто программировать надо уметь, хоть немножечко.
относительно данной темы, вы опять не поняли и поэтому как обычно растеклись соплями по экрану. ----------------- О том что можно написать, я знаю без сопливых. Я спрашивал о заявленных в документации функциях, которые создали разработчики для подключения к таблицам пользовательских фильтров. Вы очевидно не в курсе, что любые понятия, которые заявлены в вашей писанине в том числе документации должны быть определены изначально.
Владимир написал: nikolz, Представляю, что разработчики должны думать о таких программерах. ::
Вот именно, лапуль, что документация про QLUA а не про QUIK. Здесь ЕСТЬ возможность написать фильтр на луа и подключить его к таблице, а не тыкать мышкой по экрану, и никакой колбек для этого не нужен. У меня в скрипте есть два независимых фильтра: по валютам и по наличию или отсутствию тикера в портфеле. Есть ещё третий, по таймфреймам, но это уже в одном из видов контекстного меню. Просто программировать надо уметь, хоть немножечко.
Ну вы так не убивайтесь, еще научитесь. Если будут проблемы с сортировкой или еще какие, пишите, не стесняйтесь, подскажу как ускорить раз в 100.
В документации QLua в разделе: "Функции для работы с таблицами Рабочего места QUIK" ------------------- написано: ----------------- В таблицах Рабочего места QUIK, созданных с помощью скриптов на языке Lua, поддержаны следующие возможности : .. пользовательские фильтры, ... ===========================
А где там написано про фильтры на Lua? Созданная на Lua таблица поддерживает установку пользовательских фильтров. Капризничаете. Дай вам волю так вы потребуете возможность убрать столбец с нумерацией и привязку таблицы к конкретному окну. Много вас таких, а разработчики серьезными делами заняты )))
Так документация же про QLUA а не про QUIK. Поэтому подумал, что есть возможность написать фильтр на луа и через колбек подключить к таблице, а не тыкать мышкой по экрану. Очевидно, зря так хорошо подумал о разработчиках. Больше не буду так думать.
Kirill EL написал: Добрый день! Долго загружается Квик или долго не загружает графики при входе. По 30 минут вхожу в квик, постоянно меняя серверы брокера и в какой то момент это удаётся сделать, но смотришь на часы и время уже 10:40 к примеру. Утреннюю сессию пропустил.
Уже не знаю что делать и в чем причина. Переписывался долгое время с брокером и сделал все его рекомендации, но ничего координально не поменялось.
Хочется узнать в чем может быть причина. Исходные данные. 3g интернет иногда 1-3мбит, часто 5-7мбитс, иногда 10-12мбис От скорости интернета, насколько я заметил, не зависит этот глюк. Сегодня была скорость утром до 10-12мбитс, но графики не загружались. Скрин приложил. Помогите разобраться!
можно сделать следующее: ----------------------------- 1) При выходе из квика сворачивайте все окна, чтобы при входе они были свернуты. ------------------------------- 2) кардинально ускорить можно лишь стирая периодически архив данных.
Игорь написал: Здравствуйте. Можно ли отключить функцию усреднения цены, по одной позиции? Пример: купил 100 акций по 100р. Цена поднимается. Купил ещё 100 по110р. Получится 200 по 105 в одной строке. Надо, чтобы каждые 100 лотов были в своей строке, со своей ценой покупки.
Добрый день, Вопрос к знатокам. В документации QLua в разделе: "Функции для работы с таблицами Рабочего места QUIK" ------------------- написано: ----------------- В таблицах Рабочего места QUIK, созданных с помощью скриптов на языке Lua, поддержаны следующие возможности :
..
пользовательские фильтры,
...
=========================== прошу подсказать, где я могу прочитать про эти "секретные возможности" под названием " пользовательские фильтры" ------------------ Читать на расстоянии мысли разработчиков пока не научился, а в документации ничего не нашел.
void sortb(int *m,int n)
{ int tmp,k;
while(n>1) { // проход проверят, не пора ли заканчивать
k=0; // нет перестановок
for (int i=1; i<n;++i) {
if(m[i]/10<m[i-1]/10) {
tmp=m[i-1];
m[i-1]=m[i];
m[i]=tmp;
k=i; // в к будет последний переставленный элемент
}
}
n=k; // с k все отсортировано
}
}
Владимир написал: nikolz, Лапуль, это только распальцованные дебилы смотрят на всякие полурекламные штучки-дрючки, а нормальные люди ориентируются именно на худший случай. Так, моя "воронка" имеет логарифмическую сложность именно В ХУДШЕМ случае, а так она почти всегда линейная - особенно, если учитывать время загрузки и выгрузки данных, т.е. РЕАЛЬНОГО быстродействия, а не "по документации".
Ну я понял , что ты распальцованный м..к, поэтому всегда кроме бла бла ничего в доказательство не пишешь. ---------------- худший случай у быстрой сортировке - это когда у тебя все сортируемые данные находятся в самом конце их поиска. Но если худший случай у пузыря и фаст сортировки требует одинаковых затрат, то в среднем фаст всегда выигрывает и НИКОГДА не проигрывает. но у тебя как всегда и труба ниже и дым жиже, но твое дебильное свое.
Владимир написал: nikolz, Лапуль, ну Вы бы хоть в сортировку не лезли, изображая из себя знатока. Уж это СОВСЕМ моя зона.
В луа БЕЗОБРАЗНО реализована сортировка, поэтому нет смысла ею пользоваться вообще.
Сортировка пузырьком - это ПРОСТЕЙШАЯ сортировка, пишется в 5 секунд и в 99.999% случаев она достаточна для практического использования.
По поводу Вашей долбаной "документации": Ваша быстрая сортировка имеет, как и пузырёк , КВАДРАТИЧНУЮ сложность, и совершенно по барабану, на каком языке она написана. А теоретически предельная сложность сортировки - ЛОГАРИФМИЧЕСКАЯ, и потому Ваши сказания о "мульонах значений за доли секунды" есть бредни неграмотного идиота. К слову, сортировка, используемая в Виндах тоже безобразная, хотя и не так ужасна, как в операционках серии Win-95. Наконец, при оценке сложности сортировки используют не то количество сравнений, не то перестановок, что почти незаметно при замерах общего времени сортировки, нпри этом НИКАК не учитывается ни загрузка данных в ОЗУ, ни выгрузка их оттуда.
Ну вы и дуб ВИ, Вы хотя бы таблицу выше посмотрели Там правда без Вашего поноса словесного написано, что быстрая сортировка имеет сложность в худшем случая N^2, а в среднем это N*logN. а для пузырька в среднем это N^2 т е для 1024 элементов быстрая сортировка дает в среднем сложность 10 000 а пузырек 1 000 000. т е пузырек в 100 раз медленнее чем быстрая уже на 1000 элементах. вы же хвастаетесь сортировкой миллионов записей, а это будет уже тысячи раз. --------------------- Быстрая сортировка пишется 4 секунды.
nikolz написал: у Вас не указаны параметры, которое будут определять требуемое быстродействие данного робота
Параметры требуемого быстродействия - это не проверка раз в минуту, о которой я писал, Вы имели в виду другие параметры ?
На биржах существуют десятки тысяч инструментов для торговли. кроме того, алгоритм обработки может быть различным по сложности. кроме этого, стратегия торговли может быть различной по скорости реакции. Но кая я Вас понял, Вы все будете делать вручную. Поэтому проблем не будет, кроме слива депозита.
Ау, спецы по сортир...овке, кто может без бла-бла-бла , сказать конкретно, что не сортирует правильно пример скрипта таблицы в документации. ------------------ В нем есть все - и числа и строки. Не удивлюсь, если окажется, что вы его даже не смотрели. ------------------- Я не обнаружил в нем какие-либо проблемы. если не прав, покажите конкретно.
у Вас не указаны параметры, которое будут определять требуемое быстродействие данного робота Если это не важно, то запрограммировать можно все на луа плюс сторонние библиотеки для луа. ------------ QLua в данном случае -это одна из библиотек, которая реализует интерфейс взаимодействия с терминалом QUIK. Но QLua написана не на луа, а на СИ. К написанию Вашего робота QLua пригодна лишь в части интерфейса с терминалом, в остальном эта библиотека вообще не причем. -------------------------- Поэтому не надо путать библиотеку QLua и скриптовый язык программирования Lua. У них общее лишь три буквы. Это как кислое сравнивать с зеленым.
для тех, кто не знает. ----------------------- В луа реализована сортировка, поэтому нет надобности городить сортировку. ----------------------- сортировка пузырьками - это медленная сортировка. ------------------------ читаем документацию: Внутри table.sort используется быстрая сортировка, и она написана на C.
вот фрагмент из исходников обращения к элементу массива. Кто знает СИ да увидит. ---------------- for (; i <= lim; i++) { if (!ttisnil(&t->array[i-1])) lc++; } nums[lg] += lc; ause += lc; }
для тех,кто не в курсе. читаем документацию: ----------------------- Реализация таблиц (они же массивы, объекты или хеш-таблицы). Таблицы содержат свои элементы в двух частях: часть массива и часть хэша. Все неотрицательные целочисленные ключи являются кандидатами на сохранение в части массива. Фактический размер массива равен наибольшему 'n' такому, что используется более половины слотов между 1 и n. Хэш использует сочетание таблицы разброса в цепочке с вариацией Брента. Основным инвариантом этих таблиц является то, что если элемент не находится в своей основной позиции (т. е. «исходной» позиции, которую его хэш дает ему ), то конфликтующий элемент находится в своей собственной основной позиции. Следовательно, даже когда коэффициент загрузки достигает 100%, производительность остается хорошей. ------------------------- Для тех, кто не понял, поясняю: --------------------- Массивы в луа - это массивы в памяти. Если используете индексы - целые числа, то это фактически массивы СИ. --------------- Передача массивов в функции выполняется по ссылке, т е копия массива не делается а передается указатель.
Для тех, кто в танке. ============== Вот вам картинки удаления меток при удалении индикатора. ============= На графике два индикатора метки м1 - первый, m2- второй
s_mike@rambler.ru написал: в лучшем случае метка показывается не там где надо
Интереса ради (чисто разговор поддержать). Какое время задавали? По Мск или локальное и где метка в этом случае показывается?
Все просто-препросто. Берем самую правую свечу графика, получаем ее время и в это же время ставим метку. А вот вам хрен, Волобуев!
У дворового пса блох меньше.
если без словесного поноса. Вы берете открытую свечу,верно? следовательно вопрос касается возможности установки метки на открытой свече. верно? тогда вопрос. возникает ли такая же проблема для свечи закрытой. -------------------- а чтобы клиент не занимался херней, вы ему объясните что в розетку не надо ради любопытства засовывать два пальца, если не изучили документацию, а вы как разработчик не разрешили это делать. ==================== Если чел въехал в столб, нажав скорость вместо стоп, это проблема не производителя авто.
Я работаю с потоками в квике даже с пулом потоков в тестах максимально открывалось 15 потоков. О тестах уже писал. В тесте выставлялись заявки и после выставления снимались по 200 инструментам за 4 часа работы было выставлено и снято 200 тысяч заявок. Не было ни одной ошибке типа "заявку снять невозможно" Ни одного зависания. ---------------- Я это к тому, что Ваши рассуждения лишь доказательство ошибок в вашем софте.
Павел Bosco написал: вопрос, как увидеть существование блокировки при вызове quik lua api для меня остался открытым.
У меня встречный вопрос: Если вам нужно просто реализовать своего робота, а не выполнять научно-исследовательскую работу :: , то зачем вам нужны потоки и прочая "лабуда"? Пишите своего робота на QLua, как советует Владимир, стараясь обходиться даже без внешних библиотек. Это хороший совет для всех и, особенно, для начинающих.
а вы всё-таки любите опираться на свои гипотезы и делать по ним выводы, интересный вы тип в этом плане :) нет, интерес не праздный. робот реализован, но в нём есть и проблема, которую я не понимал, связанная "возможно" (да) с блокировками природа которых мне была не ясна.
я предполагаю, что мой тест провалился, потому что обрамление в lock/unlock происходит только для вызовов из lua байткода. а я вызывал sleep через pcall в своей c функции. в этом случае обрамления не происходит. тогда я попробовал даже дополнительный способ: вставил вызов функции sleep внутрь новой lua функции m_sleep, чтобы получить задействовать VM, но и тут ожидаемого "обрамления" не произошло. возможно там где-то есть и хитрые проверки, чтобы не получалось так, что мы из C функции вызываем из неё другую C функцию, та вызывает lua функцию и мы получаем блокировку.
байткод не причем, ----------------- /* ** macros that are executed whenever program enters the Lua core ** ('lua_lock') and leaves the core ('lua_unlock') */ #if !defined(lua_lock) #define lua_lock(L) ((void) 0) #define lua_unlock(L) ((void) 0) #endif ----------------------------------------- /*** макросы, которые выполняются всякий раз, когда программа входит в ядро Lua ** ('lua_lock') и оставляет ядро ('lua_unlock') */ #если !определено(lua_lock) #определить lua_lock(L) ((void) 0) #определить lua_unlock(L) ((недействительный) 0) #конечный код ----------------------- таким образом, это макросы для ядра VMLua и они определяются на стадии сборки VMLua. Если разработчики их определили, то они есть иначе это пустышки. ================= при вызове через pcall эти макросы тоже работают если их определили: ===========
LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, lua_KContext ctx, lua_KFunction k) { struct CallS c; int status; ptrdiff_t func; lua_lock(L); api_check(L, k == NULL || !isLua(L->ci), "cannot use continuations inside hooks"); api_checknelems(L, nargs+1); api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); checkresults(L, nargs, nresults); if (errfunc == 0) func = 0; else { StkId o = index2addr(L, errfunc); api_checkstackindex(L, errfunc, o); func = savestack(L, o); } c.func = L->top - (nargs+1); /* function to be called */ if (k == NULL || L->nny > 0) { /* no continuation or no yieldable? */ c.nresults = nresults; /* do a 'conventional' protected call */ status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); } else { /* prepare continuation (call is already protected by 'resume') */ CallInfo *ci = L->ci; ci->u.c.k = k; /* save continuation */ ci->u.c.ctx = ctx; /* save context */ /* save information for error recovery */ ci->extra = savestack(L, c.func); ci->u.c.old_errfunc = L->errfunc; L->errfunc = func; setoah(ci->callstatus, L->allowhook); /* save value of 'allowhook' */ ci->callstatus |= CIST_YPCALL; /* function can do error recovery */ luaD_call(L, c.func, nresults); /* do the call */ ci->callstatus &= ~CIST_YPCALL; L->errfunc = ci->u.c.old_errfunc; status = LUA_OK; /* if it is here, there were no errors */ } adjustresults(L, nresults); lua_unlock(L); return status; }
Boris написал: Здравствуйте. Не нашёл в документации как необходимо организовать создание таблицы средствами lua - для того чтобы можно было использовать встроенные в quik функции сортировки и фильтров по столбцу ? Где об этом можно прочитать ?
По ощущениям - всегда учитывается только формат string. Ни дату, время ни числа в созданной lua таблице не отсортировать ?
а в чем разница число это или дата или string? VMLua сравнивает строки как числа , используя для этого хеш.
Добрый день, всем, Хотя о том, про что буду рассказывать знаю с момента появления LUA VM в КВИКЕ и думал, что эту подлянку давно поборол, однако она снова дала о себе знать. --------------------- В частности примерно это же недавно обнаружил посетитель по нику Старатель. -------------------- Так как я давно казалось бы проблему решил, поэтому на его вопрос особо не обратил внимание. =============== но вот недавно столкнулся с проблемой удваивания заявок-близнецов. ================= Хотя ничего хорошего мне на форуме как обычно не посоветовали, но вредные советы тоже пригодились. =============== Например, представитель разработчиков гневно заявил, что мол надо все обнулять при index=1 в индикаторах. Благодарю его за его вредный совет. ------------------ Действительно, верно говорят -выслушай совет на Красной площади и сделай наоборот. ---------------------------- Поэтому я обратил внимание, что именно по index=1 я обнулил лог файл. ------------- продолжение следует..
swerg написал: Николз, нужен полный код. Для возможности анализа, повторения. За фрагменты на любом форуме посылают лесом, порой в грубой форме. Здесь напрасно нянькаются.
попробую сделать короткий вариант. но прежде сделаю еще одну попытку объяснить. Это тест-индикатор и запускается он на демо сервере. в нет три функции 1- проверяет есть ли неисполненные транзакции эта функция ничего не отсылает, а выдает лишь число активных транзакций 2- посылает транзакцию на выставление заявки если функция 1 выдала 0 3- проверяет есть ли активные заявки и если есть снимает их --------------------- Таким образом , в on Calculate крутятся эти три функции ----------------- В этих функциях есть два места вывода транзакций в функции 3- в выставлении заявки вот это место ---------------------------
Код
id=id+1; t1.TRANS_ID=tostring(id); -- Уникальный идентификационный номер заявки, от «1» до «2 147 483 647»
local str=sendTransaction(t1); --отправить транзакцию
Log:write("str="..tostring(str)..",id="..tostring(id).."\n"); Log:flush()
Обратите внимание на следующее: id- идентификатор всегда увеличивается на 1 перед записью в транзакцию Сразу после отсылки транзакции выводится в лог сообщение транзакции и id ---------------- таким образом, если в этом месте будет выдано две транзакции то они будут иметь разные id и в лог файле будет две записи ========== второе место отсылки транзакции в функции 2 ------------------ вот это место
Код
id=id+1; t1.TRANS_ID=tostring(id); -- Уникальный идентификационный номер заявки
local str=sendTransaction(t1); --отправить транзакцию
Log:write("str2="..tostring(str)..",id2="..tostring(id).."\n"); Log:flush()
логика та же, что и выше. ========================== смотрим лог файл:
Код
str=,id=2173
str2=,id2=2174
str2=,id2=2175
Есть одно сообщение о выставлении заявки с id=2173 и далее два сообщения (id=2174 и id=2175) о снятии двух заявок. а это таблица заявок