дело в том, что раньше в версии 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 на Си позволяют написать любого робота или эксперта или индикатор.
оператор goto считается в программировании самым мощным оператором перехода. Поэтому он в неумелых руках может так разрушить и запутать программу, что потом будете долго искать ошибки. ------------------------------ Поэтому применение данного оператора считается признаком неумения разрабатывать алгоритмы. --------------------------------- многие языки по указанным ранее причинам не содержат данный оператор. --------------------------------------------- Учитесь печь правильные программы без этого оператора.
Denis пишет: Добрый день. Не нашел в руководстве можно ли средствами Луа активировать активную стоп-заявку (аналог "правый клик-активировать стоп-заявку")?
Готовой функции нет. надо убрать стоп заявку и выставить безусловную заявку с такими же параметрами
Если это так, какие есть концептуальные особенности использования такой прослойки? Нормально ли живётся с таким подходом? В идеале я хотел работать через Plaza 2, на нормальном языке, с нормальной отладкой, с нормальным API, но ежемесячная оплата доступа охладила пыл. Можно ли с QLua как-то приблизиться к архитектурному уровню работы через Plaza 2 или всё-таки придётся оперировать таблицами QUIK?
Разница примерно в следующем. когда Вы работаете с плазой, то реализуется схема клиент-сервер . Клиентом выступает ваш робот. А сервером -сервер биржи В этой схеме сервер отдает вам ответы на запросы, а хранение переданной сервером информации Вы осуществляете сами в своей программе. Т е создаете свою БазуДанных ------------------------------------------ В случае работы с квиком, в качестве клиента выступает торговый терминал КВИК. Он реализует хранение ответов и пересылку запросов на сервер Сервером выступает сервер брокера, он транслирует ответы сервера биржи Торговый терминал QUIK организует хранение полученной с сервера информации. Поэтому появляются таблицы (как известно таблицы - это способ хранения в реляционных базах данных ) --------------------------------------- Таким образом, при работе с QUIK Вы обращаетесь за данными к базе данных терминала QUIK , а ваши запросы и ответы на них QUIK транслирует на сервер брокера и далее на сервер биржи. Т е при работе с плазой у Вас нет готовой базы данных, а при работе с QUIK - есть - это таблицы терминала.
Добрый вечер, Объясняю для тех,кто не понял. -------------------------- Речь идет не об отправлении пулеметом 1000 транзакций по 1 сделке в каждой, а об отправлении 1000 транзакций по различным бумагам и различным счетам. ------------------------------------- Кратко рассказываю про грабли. ------------------- Для начала, решите на основе какой информации будут отправляться эти 1000 транзакций. ----------------------------- Если это информация по свечам, то она приходит не чаще, чем 10 раз в секунду. Кроме того, на Вашем компе работает алгоритм энгл, который обеспечит вам отправку транзакций примерно 10 раз в секунду Ну и так далее... ==================== Кроме того, учтите , то время обработки транзакции ядром сервера брокера да и биржи примерно 1 ms. А Вы в очереди не первый. ------------------------ После того, как учтете все это, то можете попробовать отправить хотя бы 100 в секунду, хотя бы по 10 бумагам, хотя бы по 5 счетам. ------------------------------------------- Успехов Вам мечтатели.
1000 заявок в секунду по разным инструментам и разным счетам да еще через терминал КВИК? Так Вы ж, батенька, фантазер!!! Для начала попробуйте хотя бы 100 отправить.
тот самый пишет: почему я думаю, что CreateDatasource - автономна, т.е. имеет свой LUA-поток? Потому что она служит для прямого получения данных с сервера QUIK и имеет свои коллбеки, которые не связаны со стандартными QLUA-коллбеками, выполняющимися в основном потоке квика для всех скриптов.
полагаю, что отдельный поток может иметь (или не иметь ) луа машина. У нас есть два потока -функция main и основной поток QUIK. ------------------------------------------ CreateDatasource запускается либо в Main, либо вне ее ( в основном раньше не работало, поэтому сейчас запускаю лишь в main) ------------------------------------- Таким образом, получаем либо в потоке main, либо в основном потоке. ------------------------------------
Хочу добавить свою ложку в Вашу бочку. Возможно мирное решение данной проблемы заключается в следующем. ------------------- Создателям скриптов (т е нам, вам) взять за основу тот факт, что скрипты работают с асинхронными событиями. --------------------- Следовательно, пока событие не наступило, его нет, и гадать о его наступлении бессмысленно. ------------------------------ Например, если trans_id=0 , то это означает, что "ноль" если trans_id=nil , то это означает, что "nil" А когда поступит trans_id не равен 0, то и будем его обрабатывать. Т е либо мы обрабатываем интересующие нас события, либо игнорируем их. ------------------------------ При этом, безусловно, список событий должен быть отражен в документации разработчиков. ---------------------------- Тогда нет проблемы в том, что и сколько раз обновляется.
Если проблема в отсутствии элементарной дисциплины, то надо быстрее уходить с рынка, пока депозит еще не слили. сольете обязательно и даже если будете подавать лишь одну заявку в 5 минут.
green_X5 пишет: Сделать легко. Отслеживание окна заявки через WinApi, с появлением в окне заданного инструмента убивать окно заявки. В тот же момент месага в пейджер -"Заявки чаще чем раз в 5 минут приводят к разорению депозита и приступу простатита! Ваши руки тяжелеют, пальцы немеют, резь в предстательной железе становится невыносимой... тик-так.. тик-так.. ".
Использование WinApi предполагает определенного уровня знаний у разработчика. Полагаю,что у задавшего вопрос этих знаний нет. Поэтому это не легко для него будет.
Надо начать с изучения луа на простых примерах без КВИК (взять Scite и делать примеры с массивами переменными , взять различные модули и делать примеры с графиками с окнами) После этого изучить модуль QLUA на простых примерах (читать свечи, обнаруживать пересечение линий выводить линии выводить метки и т д) В процессе познания придет понимание как сделать то, что хотите.
Если хотите сделать это сами, то вариант действий всего один: 1) Изучить LUA на примерах не связанных с QUIK 2) Изучать библиотеку QLUA на простых примерах 3) Написать то, что хотите. --------------------- Уйдет примерно от 3 до 6 месяцев. Просить халяву - это тупиковый вариант.
Вот несколько возможных вариантов решений 1) Ставим внешний скрипт запуска квик через 5 минут после его отключения при выставлении заявки, выходим из квика. Через 5 минут скрипт снова запускает квик. ------------------------------- 2) В квик устанавливаем автоматическое восстановление соединения через 5 минут Скрипт на луа разрывает соединение с интернет на 30 секунд , если приходит колбек активной заявки. Через 5 минут после этого КВИК восстанавливает соединение -------------------------------- 3) После выставления заявки (прихода колбека) скрипт луа блокирует клавиатуру и мышь на 5 минут ------------------ Ну и т д
На моем сайте есть картинки работы робота, отображающие то, что Вы хотите на графиках. Все это написано на луа. И нет надобности "городить огород", сваливая все доступное в кучу. --------------------- Ученье -свет, но неученых - тьма
Владимир Ишанин пишет: Логику программы я понимаю.. Событие на установку позиции, затем переменная с датой и пока не пройдет 5 минут, нажимать на поставить заявку нельзя, но как это сделать программно, можете подсказать пожалуйста) С lua я еще дело не имел. Спасибо
Есть как минимум три варианта: 1) Найти в инете готовое решение 2) заказать разработку данного скрипта 3) научиться писать скрипты и сделать его самому -------------------------- Рассказать "как это делается " можно, но обучить это делать, лишь рассказывая, нельзя.
когда читаем историю, то есть следующий момент, не знаю учли ли Вы это терминал сначала готовить массив для передачи по DDE потом передает у меня получалось примерно так (где-то есть на форуме) : 8 секунд готовит 2 секунды передает А как у Вас получается?
Alex Alex пишет: Также в праздники сравнил скорость передачи таблицы всех сделок - примерно 250.000 записей. Через DDE - 17.3 сек, через LUA (через Event) - 164,3 сек. Сравнение разумеется некорректно из-за блоковой передаче при DDE
Начнем сначала (Если ошибаюсь, поправьте). Обычно имеем два вида передачи данных 1) Реальное время 2) накопленная история. В первом случае, принятые терминалом текущие данные ТВС сначала вызовут колбек, потом запишутся в ТВС потом поступят на DDE Т е DDE не могут передаваться раньше. DDE - это передача данных через блок памяти. ------------------------- Далее у Вас задействованы два одинаковых механизма записи в MapFile. --------------------- Не знаю как Вы реализовали передачу данных и запись Но существенные потери у Вас будут при нырянии в функции VMLua, так как там все очень сильно накручено с проверками индексами и т д -------------------------- Попробуйте сравнить время записи и чтения какой-либо переменной на LUAс временем записи и чтения ячейки памяти на CИ.
Можно ли получить исторические данные по инструменту не открывая график в QUIK ?, Можно ли получить исторические данные по инструменту не открывая график в QUIK ?
1) Поставьте так ds,err = CreateDataSource("SPBFUT", "RIZ5", INTERVAL_M15) message(err); чтобы увидеть ошибку открытия источника 2) Попробуйте закрыть график выйти из квика с сохранением и перезапустить квик снова посмотрите состояние err можно в log файл вывести ds , если нет программы вывода, возьмите у меня на сайте или любую другую
Можно ли получить исторические данные по инструменту не открывая график в QUIK ?, Можно ли получить исторические данные по инструменту не открывая график в QUIK ?
попробуйте так: --------------------------- function main() if ds==nil then ds,err = CreateDataSource("SPBFUT", "RIZ5", INTERVAL_M15) message(err); else local m=ds:Size()-1 ; local Oi,Hi,Li,Ci= ds:O(m),ds:H(m),ds:L(m),ds:C(m) local text = tostring(Oi)..'***'..tostring(Ci)..'\n' message(text); end
Alex Dronov пишет: Вы не подскажите в чем преимущество qlua относительно метода экспортировать тики qpile и потом работать с .tri/.tro любым языком? это замерялось как быстрее или зачем все эти мучения с виртуальной машиной? только этот вопрос остался. спасибо.
примерно одно и тоже, но чем сложнее алгоритм, чем больше разница.
я бы сразу перевел время в секунды и работал бы с числами, а не со строками в виде "12:15:50". Если надо точнее, то берем локальное время в миллисекундах и синхронизируем. Если сделать синхронизацию компьютера по серверу точного времени, то можно просто взять внутреннее время с погрешность 0.1 секунда и вообще проблем нет.
sam063rus пишет: удивляюсь, однако сколько в квике ошибок... и как в такой системе только торговать... )))))))))
p.s. ладно хоть она бесплатна для рядовых пользователей, а то бы эту компанию просто засудили ))
пробежавшись по форуму можно сделать вывод: они, АРКА, делают таксебе продукт исключительно на таксебе ОС для таксебе пользователей.
с претензиями на качество и оптимальность тут очевидно делать нечего. это территория лоха.
Как говорит Козьма Прудков "Бди в корень" Когда что-то делается для раздачи как бесплатное приложение, то не стоит ожидать чуда. Но замечу, что, для российского рынка, КВИК лучше всех живых решений. ---------------------------------------------------------------- Ну так уж в России заведено, чтобы не делали, но лучше, чем автомат Калашникова, не получается.
задержку нет необходимости создавать сервером QUIK. ее можно создать например маршрутизатором, либо драйвером, либо OC. Например, на своем компьютере в ОС можно уменьшить задержку отправки пакетов с 200 ms до 10 ms, но никто не мешает увеличить эту задержку скажем до 10 секунд.
Да, в нем надо кавычки >> заменить на " (особенность WP). Честно говоря, я уже и не помню подробности этого варианта. Их было много для разных задач автоматизации.
Валентин пишет: нам даже не важно время биржи. мы работаем с сервером брокера. и синхронизацию по идее надо делать с ним
Попробую объяснить неважность данной проблемы. ------------------------------------ Сразу хочу предупредить особо ретивых, я высказываю свое представление о данной проблеме на основе собственных исследований. Ниже приведена информация из расчета, что читающий ее является обычным пользователем, а не хакером или спецом в разработке софта. ---------------------------------- Рассматриваем случай работы по обычному каналу через терминал КВИК Итак начнем: 1) операционная система компа позволяет отсылать не более 4 заявок в секунду. 2) Информация с биржи приходит к нам пакетами примерно 2-4 пакета в секунду. При этом мы видим последовательное появление сделок с различным временем , в то время когда они пришли к нам в одном пакете. Т е кажется, что это реальное время, но в действительности есть систематическое запаздывание. --------------------------- Говоря образно, мы видим сегодня, то что было вчера. --------------------------- Поэтому надо учитывать тот факт, что априори информация, доступная нам всегда запаздываем на 0.2-0.5 сек. ------------------------ 3) полагаю, что сервер брокера тоже синхронизируется по серверам точного времени. Поэтому разность времени между сервером биржи и сервером брокера будет не более 0.1 сек. ----------------------------------- Но брокер может сам включить искусственно задержку трансляции данных. --------------------------------------- Кроме того, существенную задержку составляет очередь клиентов на сервер брокера. По официальным данным скорость ядра сервера биржи (будем считать и сервера брокера) примерно 1000-2000 транзакций в секунду. Если, при активном рынке, к брокеру приходит одновременного 1000 заявок на сервер, то задержка будет не менее 1 сек. Реально может быть и более.
Дополню предыдущий ответ. Если установка галочки не спасает, а необходимо еще какие либо действия, то можно запустить внешнее приложение оно может быть и на луа и на автоите. Отличие autoit от срипта на vbs или имеющихся средств автоматизации - простота создания практически любых сценариев с возможность управления приложениями через их меню.
Николай Камынин пишет: Это не всегда верно, возможна ситуация, когда стоп-заявка исполнилась, а информация о выставлении заявки еще не пришла.
В этом случае, как вы понимаете, проверять нечего. Нет же ещё заявки. Вот другая ситуация, когда информация по заявке (сделке) уже пришла, а поля order.linkedorder и stop_order.linkedorder ещё не обновились. Вот тут проблема...
А я обрабатываю данную ситуацию для обнаружения заявки , выставленной по исполненному стопу. ---------- Так по заявке или по сделке пришла информация. сделка и заявка в разных колбеках и их обработка различная Я об этом писал. У меня указанной Вами проблемы нет. Если посмотрите еще раз мое описание состояний то увидите, что их больше , чем исходной кодировке флагов состояния.