f, error_desc = io.open ( getScriptPath () .. "\\M15_" .. sec_code .. ".log", "a" )
if not f then
message ( "Ошибка получения файла лога:" .. error_desc)
else
writeToLog( "MA" .. tostring(MA))
end
данный кусок кода присутствует только в function OnInit(quik_path).
Для начала попробуйте заменить функцию getScriptPath () на явный путь. Т е напишите имя файла путь и тип файла одной строкой например "D:/test.log"
Eldar написал: Создал скрипт (по аналогии с тремя экранами Элдера) и в нем пишу лог.
Код
f = nil --указатель на файл лога
MA = 0
sec_code = "SRH3"
function main ()
while is_run do
if IsWindowClosed (t) then
is_run = false
return
end
exMA()
f, error_desc = io.open ( getScriptPath () .. "\\M15_" .. sec_code .. ".log", "a" )
if not f then
message ( "Ошибка получения файла лога:" .. error_desc)
else
writeToLog( "MA" .. tostring(MA))
end
sleep ( 50 )
end
end
function writeToLog (proc_name)
f:write( os.date () .. " " .. proc_name .. "\n" )
f:flush()
end
работает. делаю копию скрипта. меняю тикер на SRM3 запускаю скрипт и падает квик с ошибкой. D:\LUA\M15_SRM.lua:524: attempt to index a nil value (global 'f')причем файл создается. делаю третий файл с тикером RIH3. запускаю SRH3 - работает, запускаю RIH3 - работает. запускаю SRM3 - падает. открываю снова терминал. закрываю все скрипты. запускаю SRM3 - работает. запускаю SRH3 - работет. запускаю RIH3 - работает. с правами на папку со скриптами и логами все в порядке.
что за пролтергейст какой-то.
У вас файл открывается в цикле много раз. Либо закрывайте его каждый раз, либо откройте один раз.
я тоже делал расчет свечей по таблицам обезличенных сделок. Для этой цели и чтобы тестировать запаздывание данных относительно времени сделок на бирже я синхронизирую компьютер с сервером точного времени , что обеспечивает погрешность относительно биржи в пределах 10 мs
Но если свечи рассчитывать в терминале, то начало таймов надо привязывать к атомным часам, иначе у Вас будут разные свечи на разных терминалах для одних и тех же интервалов.
Вроде бы не должно так быть.
Я просто рассчитываю свечи именно таким образом. А дату и время беру из пришедшего Тика.
так как Вы считаете для себя, то можно считать как Вам удобно. Но результаты у вас будут иные чем рассчитанные как надо. Особенно Вы будете ошибаться на не ликвидных инструментах. Кроме того, как вы решаете вопрос обнаружение попущенных интервалов, если у вас просто нет никаких тиков?
Добрый день, Просьба пояснить при каких условиях выдаются следующие сообщения: В документации не нашел, если есть, дайте ссылку. 1. Превышена позиция по инструменту 2. Превышен лимит отправки транзакций для данного логина.
еще такой прикол в демо есть. В терминале настроена таблица заявок. Но в ней нет номеров строк. Как их туда добавить. пока получается лишь уничтожить и снова создать таблицу.
Давайте упростим ситуацию и у нас не будет индикаторов, а только свечной график.
Как Вы и написали - Тик это сделка.
У свечи есть такой параметр, как цена закрытия, которая постоянно меняется при совершении сделки - то есть с каждым Тиком.
НО цена сделки может не меняться, то есть несколько сделка прошли по одной и той же цене, НО в и этом случае - есть параметр Volume, который увеличивается с каждым Тиком в не зависимости от цена Тика.
На основании этого я могу сделать вывод, что поток Тиков будет пропорционально в разы меньше заказанных интервалов свечей.
Вы почему-то не любите слово индикатор. и называете его параметром. ---------------------- В действительности мы не знаем как реализован алгоритм вычисления свечей на сервере. ---------------------- Вы спросили: То на сервер при SetUpdateCallback - идет по сути только один запрос по интервалу - "INTERVAL_TICK", а уже пришедшая цена с датой раскидывается по интервалу силами Квика ? --------------------------- Так тоже можно сделать. Например, если Вы считаете интервалы, которых нет в квике, то вы так и делаете. ------------------------- Но если свечи рассчитывать в терминале, то начало таймов надо привязывать к атомным часам, иначе у Вас будут разные свечи на разных терминалах для одних и тех же интервалов. -------------------------- В действительности свечи все одинаковые у всех брокеров. А это означает, что их формирует сервер биржи. ------------------------------- При этом Вам никто не гарантирует, что внутри свечи Вы получите все значения тиков. Свеча является таковой только в момент ее закрытия. Параметры открытой свечи передаются срезами.
То на сервер при SetUpdateCallback - идет по сути только один запрос по интервалу - "INTERVAL_TICK", а уже пришедшая цена с датой раскидывается по интервалу силами Квика ?
Нет, на сервер идет запрос для каждого интервала, так как свечи формирует не терминал, а сервер. ------------------ Поток свечей на 1-2 порядка меньше, чем поток тиков.
А как поток свечей может быть меньше - да еще и на порядок, если, TICK он один, а интервалов свечей несколько ? Если я выбираю дневную свечу - это же не значит - что колбек по ней будет вызываться один раз в день ? Он же будет вызываться ровно столько - сколько же и Тиковый интервал.
Поясняю, следите за руками. Тик - это сделка. Свеча - это способ сжатия информации о сделках путем вычисления четырех индикаторов на заданном интервале времени. -------------------------------- Если текущая сделка изменила значение какого-либо индикатора, то сервер пошлет это значение терминалу. Предположим у нас тайм 1 час. 1 индикатор - это первый тик в текущем часе. - 1 значение на интервал. 2 индикатор - это максимальная цена сделки на текущем часе. Этот индикатор изменится лишь при превышении цены текущей сделки максимальной цены предыдущих. 3 индикатор -это минимальная цена сделки на текущем часе. 4 индикатор - это текущая цена сделки, если она отличается от цены предыдущей сделки. ================= Теперь рассмотрим случаи когда тики будут пропускаться без создания новых значений индикаторов. Вот некоторые из них. 1) Если в сделке участвует айсберг или большой пакет, то цена сделок не будет меняться, следовательно значения свечей тоже не меняются 2) Если сделки совершаются внутри тела текущей свечи, то изменяется лишь 1 индикатор при условии , что цена сделки меняется ================= В итоге количество значений в свечах всегда меньше, чем число сделок. ============== Вы можете это проверить сами. Для этого напишите вычисление свечей по тикам и посчитайте количество полученных данных.
То на сервер при SetUpdateCallback - идет по сути только один запрос по интервалу - "INTERVAL_TICK", а уже пришедшая цена с датой раскидывается по интервалу силами Квика ?
Нет, на сервер идет запрос для каждого интервала, так как свечи формирует не терминал, а сервер. ------------------ Поток свечей на 1-2 порядка меньше, чем поток тиков.
Добрый день, Новый день не принес ничего нового. Квик-юниор как и вчера тормозит и не отвечает по несколько минут на каждый квик. Это поведение не зависит ни от версии ни от числа заявок. ----------------------- Что прикольно. У меня запущен в это время рабочий Квик , которые не тормозит и работает без проблем. ================= Работать с демо из такого торможения практически невозможно. =============== Какие есть мысли как выявить причину такого торможения.
Karina Dmitrieva написал: nikolz, просьба уточнить были ли также удалены файлы с расширением *.log и выполнялась ли рекомендация по исключению текущего файла настроек окон *.wnd? Если нет - просьба выполнить предложенные выше рекомендации и проверить работоспособность.
Если после этого эффект сохранится - для анализа описываемого поведения потребуется файл дампа. В момент зависания Рабочего места QUIK откройте Диспетчер задач. Далее в списке процессов найдите процесс "info.exe" ("Рабочее место информационно-торговой системы QUIK "). Кликните по нему правой клавишей мыши и в контекстном меню выберите "Создать файл дампа". Полученный дамп и архив Рабочего места QUIK (желательно получить дамп от терминала версии 10) направьте нам на почту: quiksupport@arqatech.com со ссылкой на данный Ваш отзыв. Если по какой-то причине отправить архив Рабочего места QUIK возможности нет, то пришлите дамп.
относительно файлов *.log - Да Настройки как у Вас в пакете на сайте, я ничего не менял. --------------------------- Выше я специально поместил картинку папки QUIK дабы Вы могли проверить ее содержимое лично.
Добрый день, Сегодня мне удалось завалить терминал версии 9.7. на демо счете Предположительно это связано как-то с большим числом строк в таблице заявок. Ранее такая же проблема возникла для версии 10. Очевидно что версия 9.7 более живучая чем 10. -------------------- В данном состоянии скрипты и индикаторы в терминал не загружены. Перед запуском терминала специально перезагрузил комп. Терминал завис после подключения к серверу
напоминает DDOS атаку на сервер QUIK. Могут и отключить нафиг.
Просто скриншот не удачно прикрепился, никаких атак :)
я имел ввиду Ваши интенсивные посылки my_ CreateDataSource __HISTORY__wrapper( "TQBR" ,"SBER", "INTERVAL_M1" ) это очевидно Ваша функция создание источника и так 200 раз и без пауз между посылками. --------------------- Так делают DDOS атаку. КУЧУ посылок в один порт чтобы сервер лег. Безусловно, Вы сервер брокера не положите, но все равно выглядит не комильфо.
Рекомендуете поставить небольшую задержку между вызовами ?
лучше поставить проверку сознания источника с заданным тайм-аутом т е продолжать подключать если очередное подключение есть или истек тайм. Если тайм истек то сообщение об этом Если подключились то тоже сообщение В итоге все будет понятно.
Добрый день, второй день на демо счете все чудеснее и чудеснее. В настоящее время при загрузке демо квика версии 10.01 терминал QUIK-JUNIOR подключается к демо счету после этого не отвечает по несколько минут на каждое нажатие мышки на экране. А в диспетчере задач видим следующее. 2-я строка это демо сервер версия 10 загрузка процессора около 30% 1-я строка рабочий терминал версия 8.7 загрузка процессора около 3%
для сравнения загрузил версию 9.7 и наблюдаем чудеса:
----------- На рабоем терминале работают индикаторы и скрипты На демо терминалах ничего своего не ставил. Просто скачал развернул и подключил. И ловлю кайф. Такого прикола еще не видел.
напоминает DDOS атаку на сервер QUIK. Могут и отключить нафиг.
Просто скриншот не удачно прикрепился, никаких атак :)
я имел ввиду Ваши интенсивные посылки my_ CreateDataSource __HISTORY__wrapper( "TQBR" ,"SBER", "INTERVAL_M1" ) это очевидно Ваша функция создание источника и так 200 раз и без пауз между посылками. --------------------- Так делают DDOS атаку. КУЧУ посылок в один порт чтобы сервер лег. Безусловно, Вы сервер брокера не положите, но все равно выглядит не комильфо.
nikolz написал: Хочу поинтересоваться, что дает запись кода фьючерса в id. если можно, то интересует численная оценка выигрыша относительно целочисленного id. Номера советников можно написать в старших байтах. Я так раньше делал. Типа 32 бита в итоге 1024 советника и 4194304 (4 миллиона) заявки в день для каждого из них. ------------------------ Чего уж проще.
Дело в том, чтоMDI приложении работают одновременно от 97- до 134 роботов. Ордера я отсылаю асинхронно. При генерации dwTransID каждым из роботов, неизбежно дублирование ID, поэтому нужно делать уникальные ID
А если вместо фьючерсов будут акции или опционы - тогда кирдык Вашей схеме? ---------------------- Я делал все гораздо проще номер робота в старшие 10 бит (1024 робота одновременно )и вся проблема решена и не имеет значение чем торгуем
nikolz написал: Относительно халявы для QUIK на луа сложно сказать. Можете посмотреть мой тест https://forum.quik.ru/forum10/topic7909/ это рабочая болванка для робота При приходе сделки формирует все параметры для заявки по инструменту. =============== Если надо что-то конкретное и не сложное, напишите, нарисую.
Спасибо, конечно, но в ветке написано, что есть проблемы, тогда как у меня все работает. Я открыл эту тему, чтобы понять Квик шалит, или в моем приложении есть косяк. Приложение получилось большое (более 8 000 строк кода), возможно у меня где-то недочет.
проблемы с функцией getDepo на демо счете Я просто тестил все функции из библиотеки QLUA. Эту функцию я не использую, так как Depolimit в lua читается без проблем. --------------------------- Если строку с этой функцией заменить на чтение вашей таблицы, и записать это в лог файл (там это есть) то получите экспорт через файловую систему. ----------------------------- Но решение за вами. Вы просили рассказать какие есть способы - я рассказал. ------------------------- относительно языка программирования полагаю что паскаль - это мертвый язык. его уж точно используют лишь те, кто заканчивал вуз лет 20 назад. Тогда его во всех технических вузах преподавали.
Понятно, а где взять примеры на Луа, чтобы что-то выбрать? Очень не хочется разбираться в мертвом LUA
Относительно луа Вы заблуждаетесь. Из скриптовых языков это единственный который в страивается в мобильные приборы и SoC. Кроме того из скриптовых это самый быстрый и компактный язык. Много игр написано на нем. Редактор SciTe ( хороший редактор с отладчиком) Поэтому луа скорее живее всех живых. ---------------------- Относительно халявы для QUIK на луа сложно сказать. Можете посмотреть мой тест https://forum.quik.ru/forum10/topic7909/ это рабочая болванка для робота При приходе сделки формирует все параметры для заявки по инструменту. =============== Если надо что-то конкретное и не сложное, напишите, нарисую.
... еще забыл об одном способе, который использую для быстрого обмена небольшими объемами данных. Это самый быстрый способ обмена из всех существующих. обмен через Shared memory
Михаил Филимонов написал: Квик я пишу на Паскале (Дедфи), а вообще-то мне все-равно на каком языке писать
Возможно несколько вариантов. В терминале QUIK на луа можно получить параметры из всех таблиц , кроме доски опционов. ============================ Рассказываю, лишь о том, что делал и тестировал сам. --------------------------------- 1) Ранее спрашивал как Вы экспортируете по DDE, я написал на API C for Lua DDE сервер и в нем принимаю любые таблицы из QUIK. ----------------------- 2) Для питона делал так же, как и для луа DDE в обертке . --------------------- 3) проще всего обойтись без DLL и экспортировать из луа через файловую систему (делал так для QPILE). ==================== 4) самый сложный, но самый быстрый способ экспорта любых объемов данных в любые приложения на основе File Mapping. На основе File Mapping делал экспорт между скриптами луа , терминалом QUIK и Amibroker, терминалом QUIK и внешним приложением на луа. -------------------------------- Все способы работаю прекрасно. --------------------------------- Последний вариант у меня реализован так. Загружаю DLL с DDE и с File Mapping при старте терминала QUIK. В итоге все таблицы, которые подключатся к DDE, становятся доступными через File Mapping любым скриптам и приложениям на любом языке. При этом доступ к данным из приложений и скриптов практически одновременный. Данные лишь в одной копии для всех. Какие таблицы и какие параметры экспортировать из терминала задаю с помощью INI-файлов. -------------------------------------------------- Выбирайте на свой вкус и цвет.
для справки. В луа строки хранятся как числа в виде хеш кода. поэтому нет проблемы в поиске по таблицам Сравнение выполняется не над строками а над числами.
Хочу поинтересоваться, что дает запись кода фьючерса в id. если можно, то интересует численная оценка выигрыша относительно целочисленного id. Номера советников можно написать в старших байтах. Я так раньше делал. Типа 32 бита в итоге 1024 советника и 4194304 (4 миллиона) заявки в день для каждого из них. ------------------------ Чего уж проще.
Anzhelika Belokur написал: Просто попробуйте установить программу заново не в Program Files, а в диск С.
Если проблема все еще актуальна, просьба прислать архив терминала. Для этого выполните следующие действия:
1. Откройте таблицу "Текущие торги". 2. Закройте программу QUIK. 3. Убедитесь, что QUIK исчез из списка процессов в диспетчере задач Windows. 4. Сделайте копию папки с QUIK. 5. Удалите из копии папки с QUIK файлы ключей pubring.txk и secring.txk, если они там присутствуют. 6. Сделайте архив копии папки с QUIK и пришлите его нам в почту на quiksupport@arqatech.com (или выложите на любой удобный для Вас файлообменник, а нам пришлите ссылку на скачивание).
После формирования архива просьба перезаказать данные: Выберите пункт меню Система / Заказ данных / Перезаказать данные, включите флажки «Торговые данные текущей сессии» и «Локальные справочники», нажмите на кнопку «Перезаказать». Программа закроется и автоматически запустится. Проверьте наличие Срочного рынка и сообщите нам результат, пожалуйста.
опять глупый ответ ------------------------ Это же QUIK-Junior и демо сервер. ----------------------- вы все можете скачать с Вашего сервера. ---------------------- Там есть инструкция как установить. -------------------------------------------------------------------------- Вопросы глупыми не бывают, бывают глупые ответы.
Полагаю, что отсутствие класса фьючерсов на демо связано с тем, что Вы забыли установить входящий остаток по средствам на демо счете фьючерсов. --------------------- Потому и класс нет. ====================== Может в консерватории надо что-то исправить.
nikolz написал: это равносильно вопросу "У вас windows установлена?"
Обычный вопрос, у некоторых установлена ОС Linux.
Вы не ответили на мой вопрос. повторяю: Как Вы объясните чтодля класса акций и валюты не надо (все работает) предложенных вами танцев с бубном, а для фьючерсов надо(класса вообще нет)? ================================================ Вопросы глупыми не бывают, бывают глупые ответы.
Права на Срочный рынок имеются. У Вас папка с программой в Program Files установлена? Если да, перенесите папку с программой на любой диск, например, на диск С и запустите от имени администратора info.exe.
прикольно, У меня каталог квик-демо установлен год назад. За прошедшее время я раз десять пере подключался к демо серверу. ------------------------------- Т е год все работало , а сейчас надо переносить на другой диск и менять права? --------------------------------- Попробуйте объяснит Ваше стремное предложение. ----------------- Почему класс акции и валюты есть а класс фьючерсов исчезает? Как это связано с диском и правами запуска. --------------------- Сейчас запустил - есть лишь класс акций. ================================================ Вопросы глупыми не бывают, бывают глупые ответы. ------------ Примечание: Мой вам совет. Никогда не спрашивайте это: У Вас папка с программой в Program Files установлена? это равносильно вопросу "У вас windiws установлена?"
Log=io.open("D:/test.log","w") --лог файл
tparam={}
function main()
local firm,account,client,x;
while true do
while #tparam>0 do
local t=tparam[1];
local clas=t[1]; local sec=t[2]; w=nil; local z=string.find(clas,'FUT');
for i=0,getNumberOf("client_codes")-1 do
x=getItem("client_codes",i); if x~="" then if string.find(clas,'FUT')==z then client=x; break; end end
end
for i=0,getNumberOf("trade_accounts")-1 do
x=getItem("trade_accounts",i);
if string.find(x.class_codes,clas) and x.status==0 then firm=x.firmid; account=x.trdaccid;break; end
end
Log:write("clas="..clas..",sec="..sec..",firm="..firm..",account="..account..",client="..client.."\n");Log:flush();
local t1=getDepo(client,firm,sec,account);
Log:write("type="..type(t1).."\n");Log:flush();
table.sremove(tparam, 1)
end
sleep(1);
end
end
--------------
function OnInit(pfile) sleep(1000); end
-------------------
function OnParam(c,s) table.sinsert(tparam,{c,s}); end
nikolz написал Вы экспортируйте своим сервером в свою прогу или сервером Excel в таблицу Excel. ------------------ У меня свой сервер для скрипта луа, вроде нет проблем.
А возможно из луа экспортировать таблицу "Купить/Продать", которая в Квике составляется из таблицы "Клиентский портфель" ?
в луа можно получить это : getPortfolioInfo -Функция предназначена для получения значений параметров таблицы «Клиентский портфель» , соответствующих идентификатору участника торгов «firmid» и коду клиента и это getBuySellInfo - Функция предназначена для получения параметров таблицы «Купить/Продать».
Quikos_1 написал: Перезапустил Квик - заработало. Что ж за странность такая.
Ранее уже писал на форуме, что есть изъян в работе сервера QUIK (мое субъективное мнение) -------------------------------- Проблема в том, что если запустите терминал рано до начала сессии, то сервер не все загружает , но позже не проверяет корректность начальных данных. спасает лишь перезагрузка терминала, но обязательно надо подождать, чтобы сервер обнаружил потерю соединения и загрузил все сначала. --------------------------- В таких ситуациях можно получить вчерашнюю дату сервера, пропущенные торговые дни ну и т д ------------------------ Не исключаю, что проблема связана с брокером ( слабой тех поддержкой) Но и в этом случае - -это недоработка разработчиков. Надо учитывать низкую квалификацию не только клиентов но и брокеров. ======================================================================== И – боже вас сохрани – не читайте до обеда сказки про искусственный интеллект у брокеров.
специально для очень занятых разработчиков написал очень простой тест
Код
Log=io.open("D:/test.log","w") --лог файл
------------------------
tparam={}
function main()
local firm,account,client,x;
while true do
while #tparam>0 do
local t=tparam[1]; local clas=t[1]; local sec=t[2]; w=nil;
local z=string.find(clas,'FUT');
for i=0,getNumberOf("client_codes")-1 do
x=getItem("client_codes",i);
if e~="" then local z1=string.find(clas,'FUT');if z1==z2 then client=x; break; end end
end
--------------------
for i=0,getNumberOf("trade_accounts")-1 do
x=getItem("trade_accounts",i);
if string.find(x.class_codes,clas) and x.status==0 then firm=x.firmid; account=x.trdaccid;break; end
end
----------------------------------
Log:write("clas="..clas..",sec="..sec..",firm="..firm..",account="..account..",client="..client.."\n");Log:flush();
local t1=getDepo(client,firm,sec,account);
Log:write("type="..type(t1).."\n");Log:flush();
table.sremove(tparam, 1)
end
sleep(1);
end
end
--------------
function OnInit(pfile) sleep(1000); end
-------------------
function OnParam(c,s) table.sinsert(tparam,{c,s}); end
условия тестирования такие же как указаны выше. В таблице позиций лишь SBER с нулями ---------------- если в тесте закомментировать строку local t1=getDepo(client,firm,sec,account); то работает без проблем ------------------ с активной строкой в лог файле получаем: