еще надо (я отслеживаю) заявки, которые выставляет человек, от заявок робота; заявки, которые являются стопами от заявок которые являются условными для открытия позиции. это до кучи
--shares -- список инструментов local oldt_si,oldt_eu,flag=0,0,0; local ds={}; function main() local i = 1 for sec,v in pairs(shares) do local t=ds[i] if t==false then t,er= CreateDataSource(v.classcode,sec, INTERVAL_H1) if er==nil then t.clas=v.classcode; t.sec=sec; t:SetUpdateCallback(function(index) cb(index,ds[i]) end) toLog(log,"ds added i="..i.." classcode:"..v.classcode.." seccode:"..sec) ds[i]=t; else Log(log,"er="..er) end end i=i+1 end
while is_run do sleep(1000) end
end
function cb(ind,t) local Ti = t:T(ind-1) local h = Ti.hour local curhms = h*10 if flag==2 and (curhms~=oldt_si or curhms~=oldt_si) then flag=0 end if flag==2 then return end if curhms==oldt_si then flag=flag+1; oldt_si=curhms end if curhms==oldt_eu then flag=flag+1; oldt_eu=curhms end
Я уже писал как решать данную проблему. Повторю еще раз. Надо контролировать изменение лимитов. И при их изменении шевелиться с заявками. тогда будет по ... сколько раз у вас сработает OnOrder
нет, взламывать не надо. Так как мы имеем встроенную в основной поток VMLUA , следовательно все dll, которые мы подключаем к ней являются родными для процесса info.exe (терминала КВИК) ------------------------- Проблема лишь в отсутствии документации. Но хорошей документацией QUIK никогда не славился. Поэтому простейший реинженеринг софта потребуется ----------------------------- Раньше, когда требовался взлом (до времен VM Lua) подобную задачу я делал даже без СИ, на скриптовом языке Autoit. ------------------ Но, правда, не вижу практической надобности этого мероприятия.
можно делать так: -------------------------------- руками в квике 1) нажать в меню "Очистить все и начать новый сеанс"' ------------------------------- автоматом: 2) батник прописать сценарий удалить файлы 3) п 1 сделать автоматом 4) написать скрипт в батник для запуска квика и прочего. Например: у меня уже лет ...надцать квик по расписанию запускается скриптом и вводит пароли. запускает все, что еще надо, можно удалять все, что не надо .
Нельзя колбек вставлять в main попробуйте разобраться с назначением колбеков и main. Так НЕЛЬЗЯ: function main() while is_run do OnOrder() sleep(50) end end
function OnInit (path) -- инициализация функции main lenT_old=getNumberOf("trades") flag=false; end
function OnTrade(trade) lenT=getNumberOf("trades") if lenT==lenT_old then flag=true end lenT=lenT_old; if flag then --.... -- обработка колбека end end
вопрос скорее будет в том, как быстро Вы сможете отреагировать на изменение данных. Полагаю, что это время составит в среднем не менее 100 мс. Поэтому разницы нет, если Вам не имеет значения очередь берите из ТТП
можно использовать: 1) getParamEx – значения всех параметров биржевой информации из Таблицы текущих значений параметров, 2) getQuoteLevel2 – стакан по указанному классу и бумаге, 3) getItem – для таблицы all_trades
local acc="...." --- это Ваш счет депо --------------------------------- function LB(sec) local n = getNumberOf("depo_limits") for y = 0, n-1 do local trade = getItem("depo_limits", y) if trade.sec_code==sec and trade.trdaccid==acc then return trade.currentbal end end return 0 end
function OnQuote(CLASS, SEC) --..... local Limit=LB( SEC) -- получим лимит --.... end
function main() message("_________________________________") local class_code0="TQBR" local hm=#sec_code if ds~=true then ds={}; for h=1,hm do ds[n]=nil end end for h=1,hm do if ds[h]~=true then ds[h],error=CreateDataSource(class_code0,sec_code[h],INTERVAL_M1) if ds[h] then text=string.format("%-2d %-5s created",h,sec_code[h]) else text=string.format("%-2d %-5s error: %s",h,sec_code[h],error) end message(text) end end message("---------------------------------") end
function main() message("_________________________________") local class_code0="TQBR" local hm=#sec_code if ds~=true then ds={}; for h=1,hm do ds[n]=nil end end for h=1,hm do if ds[h]~=true then ds[h],error=CreateDataSource(class_code0,sec_code[h],INTERVAL_M1) if ds[h] then text=string.format("%-2d %-5s created",h,sec_code[h]) else text=string.format("%-2d %-5s error: %s",h,sec_code[h],error) end message(text) end end message("---------------------------------") sleep(1000) for h=1,hm do if ds[h] then text=string.format("%-2d %-5s size: %d",h,sec_code[h],ds[h]:Size()) if ds[h]:Close() then text=text.." closed" else text=text.." error" end else text=string.format("%-2d %-5s empty",h,sec_code[h]) end message(text) end message("=================================") end
swerg, так как текст программы не приведен, то Ваше замечание тоже не верно. Например, если обработка данных от колбека делается в main. Тогда очередной вызов колбека может изменить данные в таблице, через которую они передаются в функцию в майн. Т е теоретически указанная выше ситуация возможна. Но, повторюсь, из приведенного рассказа автора это явно не следует.
Michael Bulychev, 1) А Вы полагаете, что аварийный вылет КВИКА на скрптах VMLua - это нормальная обработка ошибок ? 2) Как убрать линии на первом графике?
дело в том, что раньше в версии 6 я вообще последние полгода не получал аварийных сообщений поставил 7.0.4.10 и за 2 дня 30 штук дампов. просто уже задолбало. -------------------------------- Уж лучше бы оставили как было. Нет функции скрипт молча ничего не сообщает и не вылетает. Долго приходтся соображать почему ничего не рисует. Но найти ошибку все же проще, не надо каждый раз снова грузить КВИК. ----------------------------------- При этом размещаю индикатор на графике. все нормально. снимаю индикатор. ставлю его же снова - получаю дамп. снова загружаюсь. Ставлю тот же индикатор - все нормально. Потом может и не вылететь при повторной установке а может и слететь. все дампы отослал Вам как и просили в сообщении на почту support.
еще приколы. "чтобы жизнь не была скучной" данную версию поставил недавно. но сразу обнаружилось ее неустойчивая работа. теперь очень часто выскакивает аварийное завершение без внятной диагностики ошибки а лишь с предложением отправить дамп. например, 1) можно один и тот же скрипт индикатора загрузить и снять 3 раза а на четвертый квик аварийно вылетает. 2) можно закрыть квик в конце дня. И после закрытия пытаться его загрузить снова. Но он будет аварийно вылетать. Лишь удаление файла info.log позволяет его загрузить повторно. 3) Ранее уже указывал, повотрю здесь "до кучи" Теперь обращение в скрипте к несуществующей функции вызывает аварийное завершения КВИКА.
Обнаружил очередной прикол. На картинке есть линии тренда - горизонтальные белые линии внизу. А в меню нет пункта "удалить все тренды в текущем окне" Вопрос к знатокам: Как удалить данные тренды?
В версии 7.0.4.10 есть такой прикол. ------------------------------------- Если происходит обращение к функции, которой нет, т е по адресу nil, то вместо сообщения типа "отсутствует функция XXX" , происходит аварийное завершение квика с предложением послать дамп разработчикам. -------------------------------- В версиях 6 такая ситуация обходилась молчанием и без аварии. Тоже было прикольно. ------------------------------ Предложение: Реализовать нормальное обработки такой ошибки, с сообщением об отсутствии функции и без аварийного завершения КВИКА. Спасибо
Поясняю. В ТВС данные заезжают не срезами, а пакетами. Разница между этими понятиями следующая. срез делается по времени например через каждые 100 мс передаем некоторый набор параметров. Для сжатия трафика передаем лишь изменения. При этом если какой-то параметр меняется раз в 10 мс, то в срезе будет каждое 10-е изменение параметра -------------------------- При передаче пакетами, передаются все изменения параметров, но момент отправки этих значений определяется не временем, а количеством (размером пакета) Например, размер пакета 10 значений (число взято произвольно) У нас совершается 1 сделка в 100 мс. Пакет сформируется и будет отправлен через 1 секунду от первой сделки. Еще пример, сделки совершаются через 1 мс, пакет будет сформирован и отправлен через 10 мс. Последний пример не совсем верен для биржи. Есть информация, которую биржа рассылает всем по времени, но пакетами. Т е набирается пакет 500 мс и отсылается всем. Т е получаем пакеты , т е без пропусков, но не ранее чем через установленный на бирже интервал. ------------------------ Примерно так.
Это сообщение, системное. Т е VMLua не перехватывает ошибку и не распознает. Предположу что нет какой-то библиотеки. Возможно не прописан путь. попробуйте проверить зависимость библиотек и увидите чего не хватает.
если указать один инструмент, то будет приходить один. Относительно скорости прихода данных Вы немного заблуждаетесь. Данные в ленте (ТВС) приходят тоже не быстрее чем раз в 50 мс. когда-то давно я делал такие исследования и получил большие времена. Дело в том, что эти данные приходят пакетом. Т е вместе могут прийти сделки которые выполнены через 100 мс или даже больше. Но Вы смотрите на время заключение этих сделок на бирже, а не на время прихода этой информации к Вам Кроме того, даже если к Вам придут сделки быстрее чем через 50 мс, Ваш комп отправит Ваши заявки тоже пакетом и если Вы ничего не предпринимаете с его настройкой то скорее всего среднее время будет 100-200 мc. плюс задержка ответа сервера кквик на ваши запросы (у меня она минимум 30 мс). Поэтому реально считайте, что реакция Вашего робота будет 100-200 мс.
если сохраним строку то при переборе будет выполнятся обработка и поиск в строке если сохраним в массиве, то в массиве будет хранится хеш т е числа. Перебор будет выполнятся не строк а чисел . Поэтому первый способ медленнее, второй потребует больше памяти. Выбор за вами. Но если у Вас объем перебираемых данных небольшой то делаете так, как Вам привычнее и понятнее
используйте функции SetValue(NUMBER index, NUMBER line_number, NUMBER value) Но есть небольшой баг в применении этой функции при формате линий - штрих почему-то исправляется лишь вторая половинка штриха.
Николай Камынин пишет: оператор goto считается в программировании самым мощным оператором перехода. Поэтому он в неумелых руках может так разрушить и запутать программу, что потом будете долго искать ошибки. ------------------------------ Поэтому применение данного оператора считается признаком неумения разрабатывать алгоритмы. --------------------------------- многие языки по указанным ранее причинам не содержат данный оператор. --------------------------------------------- Учитесь печь правильные программы без этого оператора.
Смеялсо. Ох уж эта философия... есть миллион примеров, где использование одного-единственного goto позволяет сделать простой и быстрый код, а не городить огород из иных конструкций, развивая в себе "неумения разрабатывать алгоритмы"
Еще программистам на ассемблере расскажите что безусловный переход это плохо.
Не буду вдаваться в полемику. Но замечу простой и быстрый код - это не критерий правильности его работы и возможности развития и сопровождения в дальнейшем. GOTO позволяет делать непредсказуемые и не очевидные выходы в любые места и из любых мест. В таких программах бывает сложно проследить такие выходы о которых разработчик и сам порою забывает. Дальнейшая модернизация таких программ при коллективной разработке более сложна чем программы созданные по модульному принципу (один вход -один выход) Но конечно, каждый пишет , как умеет. Я тоже, когда начинал разрабатывать программы еще на ассемблерах часто использовал безусловный goto. теперь - никогда его не применяю, хотя люблю писать на СИ,С++.
Edunon пишет: Николай , большое спасибо за развёрнутый ответ! Пока есть несколько непонятных моментов, которые опускаются в объяснениях, буду рад, если вкратце поясните их. В QLua и через DDE можно смотреть открытые таблицы или открывать новые. Правильно ли я понимаю, что нужно учитывать, что пользователь может случайно закрыть таблицы, забыться и поменять состав столбцов, или ещё как-либо непреднамеренно повлиять на области видимости робота? Я пока плохо знаю QUIK, потому есть опасения. Пока писал ответ, нашёл как отправлять заявку: sendTransaction(), значит есть всё таки «не табличные» функции? Как это укладывается в общую парадигму? Вы написали, что QUIK хранит данные, полученные от серверов биржи. Правильно ли я понимаю, что таким образом можно смотреть историю?
Спасибо за помощь!
В своем ответе под таблицами я имел ввиду внутреннее хранилище. Поясню свое видение QUIK В квике есть хранилище и есть внешнее отображение данных из него. Как сделано хранилище я не знаю. Учитавая с какими напрягами туда надо лазить, полагаю что как-то через что-то. Но это не важно Если память мне не изменяет (уже давно не работаю с DDE) DDE экспорт во внешние программы работает с форматом отображаемых таблиц . Т е есть меняем порядок столбцов то и в DDE будет меняться При работе c библиотекой QLUA обращение осуществляется к хранилищу по именам Следовательно никакого значения порядок столбцов на экране для QLUA не имеет Т к данные в колбек отдаются практически перед отображением на экране и перед передачей в DDE, то QLUA получается более удобнее , чем DDE ---------------------- sendTransaction() - эта функция отправки заявки на биржу. Никакого отношения к хранению данных не имеет. Конечно в QLUA есть множество функций прикладного назначения, а не только обращения к хранилищу данных. ---------------------- В целом, LUA с библиотекой QLUA и расширениями DLL на Си позволяют написать любого робота или эксперта или индикатор.