задержку нет необходимости создавать сервером 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 ещё не обновились. Вот тут проблема...
А я обрабатываю данную ситуацию для обнаружения заявки , выставленной по исполненному стопу. ---------- Так по заявке или по сделке пришла информация. сделка и заявка в разных колбеках и их обработка различная Я об этом писал. У меня указанной Вами проблемы нет. Если посмотрите еще раз мое описание состояний то увидите, что их больше , чем исходной кодировке флагов состояния.
правильно Вы понимаете. Есть лишь индикация ненулевого значения. Когда ситуация такая встретится, то буду решать как ее исправлять автоматом, пока такой задачи не возникало.
Старатель пишет: Николай Камынин , и да, ваши рассуждения несостоятельны: Во-первых, продажа может осуществляться в долг, и сколько резервировать ДС - тоже не известно Во-вторых, при выставлении стоп-заявки, ДС не резервируются.
Продажа в долг рассчитывается по наличию у Вас залога. Но конкретно выполнять или не выполнять решает брокер. ------------------------------------------------- Что же касается Вашего изречения "не состоятельны", то это не доказательство , а Вы не господь,чтобы изрекать истину в последней инстанции. -------------------------------------------------- Я описал Вам возможную ситуацию. Никто Вас не заставляет ее читать или ей верить.
Если необходимо посылать несколько заявок в какой-то отрезок времени, то лучше вычислять время по модулю значения отрезка. Тогда полученное значение будет меняться от 0 до величины отрезка- 1 квант.
Старатель пишет: Отклоняется только рыночная стоп-заявка на покупку. Стоп на продажу принимается и исполняется.
Могу объяснить это следующим образом При продаже осуществляется продажа фиксированного количества , которое у Вас есть по любой цене на бирже. Т е брокер это исполнит всегда так как что продать есть, а цена указана любая. ----------------------------------------------- При покупке ситуация иная. Вы заказываете купить конкретное число по любой цене, но при ограниченном количестве Ваших денег. Т е возникает риск покупки Вам на сумму больше, чем у Вас есть. А это уже нельзя делать. Так как ситуация не предсказуемая, то в выполнении такого поручения логичнее отказать, так как исполнение стопа делает робот и заранее резервирует ваши деньги, а при цене по рынку - сколько точно надо?- неизвестно!!!
для начала синхронизируйте время компьютера с сервером точного времени например с 3.ru.pool.ntp.org поставьте например синхронизацию через час или меньше. В результате будет несинхронность локального времени относительно биржи менее секунды. Если будет желание можете исследовать несинхронность точнее.
Сейчас делаю следующим образом: если в таблице стоп-заявок не находится стопа с stop_order.order_num==order.linkedorder , то считается, что заявка выставлена в результате переноса через клиринг, в противном случае - в результате исполнения стоп-ордера.
Это не всегда верно, возможна ситуация, когда стоп-заявка исполнилась, а информация о выставлении заявки еще не пришла.
у меня на сайте (где-то давно) www.kamynin.ru есть пример на Autoit, работаю сам с подобным решением несколько лет. ----------------------------- Мне нравится делать автоматизацию на Autoit, рекомендую.
Старатель пишет: QUIK Junior v.7.0.0.289 Отправляю 4 рыночные заявки (2 обычные и 2 стоп): В результате стоп-заявка на покупку отклоняется с формулировкой "Рыночная заявка для клиентского счета запрещена": ------------------ Что происходит? UID 92812
Предположу два варианта 1) это тестовый сервер 2) рыночная цена в стопе на фьючерсах не катит. Если хотите рыночную цену на фьючах, то поставьте цену минимально допустимую (для продажи) или максимально допустимую (для покупки) И получите по рыночной цене А на неликвиде сольете весь депозит.
В качестве совета расскажу кратко свое решение для скриптов (для индикаторов решение другое). --------------------------------------- Я создаю таблицы сделок,активных заявок,активных условных заявок, транзакций. ------------------------------------- при отсылки поручения , записываем транзакцию в таблицу транзакций при приеме колбека на транзакцию удаляем из соответствующей таблицы. Таким образом , контролируем баланс транзакций. ---------------------------------- В колбеке обработки заявок я различаю три состояния, новая, активная и неактивная. -------------------------------- Активные заявки различаются как выставленные роботом или человеком и заявки выставленные при исполнении условных заявок. ---------------------------------- В неактивном состоянии заявки различаю два состояния - исполнена , отклонена ------------------------------- таблицу сделок почти не обрабатываю Просто фиксирую совершенные сделки и считаю прибыль убытки комиссии и т д --------------------------------------- Условные заявки разделяю на стоп-заявки и условные заявки, а также на заявки выставленные роботом и заявки выставленные человеком -------------------------- Перечисленные выше состояния я обрабатываю. мне не имеет значение сколько пришло колбеков Для каждого указанного состояния свой алгоритм обработки. ----------------------------- Примерно так.
поправка,следует читать: ------------- "Например, Если в этой заявке указано купить 100 лотов, а желающие продать, подают заявки по нашей или лучшей цене лишь по одному, то колбек OnTrade будет вызван минимум 100 раз."
Функции колбек вызываются при поступлении с сервера информации о каких-либо изменениях (событиях) данного типа объекта. -------------------------- Безусловно, можно изучать все возможные события и потом придумывать , что же делать в каждом случае. Процесс познания увлекателен и бесконечен. ------------------------------- Но можно делать иначе: Реагировать лишь на те события, которые нам важны для управления своими позициями. ------------------------- Колбек OnTrade - это реакция на события совершения сделок, в которых участвует заявка брокера по нашему поручению. Например, Если в этой заявке указано купить 100 лотов, а желающие купить, покупают лишь по одному, то колбек OnTrade будет вызван минимум 100 раз. ------------------------------ Поэтому в реальных сделках число вызовов данного колбека заранее неизвестно. ---------------------------------- Если нам важен лишь момент, когда заявка будет исполнена полностью, то фильтруем вызов колбека по номеру заявки и флагу ее исполнения. Ну и т д
В современном мире актуальная информация это та, которая воспринимается пользователем как достоверная. Предположим, что мы включаем телевизор, и видим бегущих и стреляющих солдат в современной форме. Что это? Новости, фантастический фильм или архив новостей? Чтобы решить этот вопрос, нам нужны дальнейшие наблюдения либо дополнительный независимый источник для сравнения информации. -------------------------------- В случае асинхронных событий которые мы получаем через квик ситуация ровто такая же. Если информация не противоречит нашему пониманию и нашим действиям то мы считаем ее актуальной. Даже, если нам "крутит кино" (термин из сленга работников кухни форекса ) наш брокер.
Imersio Arrigo пишет: Это все понятно. Мне непонятно зачем хуки вешать. Ведь данные исправно едут по дде безо всяких лишних приседаний. Интервал обновлений 10мс. Отправляется сначала таблица целиком, потом построчные изменения. ЧЯДНТ?
скажу из своего опыта, когда-то давно, до появления LUA я вешал хуки для перехвата событий в окнах и управления вводом данных через различные интерфейсы КВИК из других приложений. Например, задача получения списка инструментов, на которые подписан квик, управление параметрами графиков. автоматическое открытие стаканов и графиков ну и т д Но прогресс налицо, теперь это все в прошлом.
Хочу заметить еще следующее: ----------------------------------------- LUA удобнее тем, что через колбек приходит каждая запись таблицы сделок отдельно, в то время как в DDE пакетом. При включении квика в конце сессии, пакет DDE сначала готовится квиком, а потом пуляется всем желающим. В LUA принимаемый пакет передается в колбек построчно перед записью этой строки в таблицу всех сделок. -------------------------------- Полагаю, что даже для скальпинга луа может вполне подойти, потому что проблема будет скорее всего в скорости канала, очереди на сервере и скорости реакции ОС компа. -------------------------- Последнее время на Си делаю лишь то, чего нет в луа - это синхронизация потоков,скриптов, измерение коротких временных интервалов ну и прочие мелочи
зависит от реализации сохранения данных с использованием DDE колбек луа получает данные раньше DDE Но в целом луа будет медленнее СИ Есть свои особенности в каждом варианте Но в итоге хрен редьки не слаще.
ds = CreateDataSource ( "SPBFUT" , "RIZ5" , INTERVAL_M5)
ds: SetEmptyCallback ()
sleep ( 100 ) --ждем прокачки информации
for i = 1 ,ds: Size () do
Open = ds:O(i)
High = ds:H(i)
Low = ds:L(i)
Close = ds:C(i)
Volume = ds:V(i)
--остальной код
end
ds: Close ()
Я бы решал эту задачу несколько иначе, примерно так: --------------------------------- --эта часть кода должна быть вызвана один раз при установке связи с сервером: ds = CreateDataSource ( "SPBFUT" , "RIZ5" , INTERVAL_M5) ds: SetEmptyCallback () ----------------------------- --Далее в программе делаем так: local size_now=ds:Size() if size_old==nil or size_old>size_now then Size_old=0; Open,High,Low,Close,Volume={},{},{},{},{}; else for i = size_old,size_now-1 do local n=i+1; Open[n] = ds: (i) High[n] = ds:H(i) Low[n] = ds:L(i) Close[n] = ds:C(i) Volume[n] = ds:V(i) end end size_old=size_now -- последней свечой в массивах Open,High,Low,Close,Volume будет всегда последняя полученная с сервера свеча ----------------------------------------
Проще решать данную задачу в индикаторе. Вне зависимости от выбранного тайма графика, функция OnCalculate будет вызываться на каждый тик из таблицы всех сделок по данному инструменту. Вот и стройте свечи с любым таймом.
дополню предыдущий ответ. Надо читать параметры инструмента не в init, а в onCalculate() например так: ------------------------- function OnCalculate(k) if k==1 then --делаем инициализацию и идентификацию ... end --текущие расчеты для каждого тика ... end
Скрипт выслать не могу. Это рабочий скрипт, робота,который ноу-хау, объем большой. 9 модулей lua ( использован весь ресурс числа локальных переменных ) +своя библиотека dll на C++.
Добрый день, Например, у меня есть индикатор - параметры дня. Отображает открытие, закрытие, максимум , минимум дня. Открыто две диаграммы. --------------------------------- В одной лишь одно окно с графиком сбербанка. В этом окне все ок. На истории все отображается без проблем ------------------------------------- В другой диаграмме открыто два окна На первом несколько графиков различных инструментов на втором - тоже самое, что и на первой диаграмме - график сбербанка. Когда начинаю растягивать или сужать график во втором окне, то линии параметров дня начинают исчезать, перепрыгивать, например минимум отображается как максимум, либо минимум дня становится равным локальному минимуму, который в данный момент виден в окне графика.
Добрый день, ----------------------------- У меня написан скрипт индикатора, в котором отображается метками состояние позиции. Картинки можно увидеть на сайте www.kamynin.ru В скрипте сделано удаление всех меток в окне функция DelAllLabels(chart_tag) при размещении индикатора на графике. Если я удаляю индикатор, то метки остаются. Если загружаю индикатор снова , то метки удаляются и размещаются новые (метки обновляются). После удаления индикатора, можно удалить метки из меню опцией "Удалить все метки" ------------------------------- До вчерашнего дня я работал без вынесения окна графика на другой монитор. После вынесения на другой монитор, при загрузке индикатора снова, новые метки накладываются на старые, т е получается ИЛИ двух изображений. Удалить метки опцией "Удалить все метки" невозможно. -------------------------------
Если в одной диаграмме открываем несколько графических окон с инструментами и в одно из окон размещаем свой индикатор, то индикатор рисуется неверно Если в диаграмме лишь одно окно с этим индикатором, то все нормально. версия квик 6.17.3.6
1) Если окно с индикатором, в котором используются метки, вынести, то невозможно удалить метки, в т ч. и из меню "Удалить все метки" . версия квик 6.17.3.6 (в предыдущих тоже самое)
по-моему это ошибка не квик, а луа скрипта, либо ,в крайнем случае , луа машины. у меня так не падает, поэтому делаю вывод, что проблема в Вашем скрипте.
Viktor MMM, Удивляете Вы меня, то говорите, что не программист и тут же беретесь за WinApi. Это как не умея водить авто записаться на участие в формуле1. Вам же сказали , что сделать нельзя.
Если нельзя, но очень хочется то можно попробовать указать EXECUTION_CONDITION -Условие исполнения заявки, необязательный параметр. Со значением «FILL_OR_KILL» – немедленно или отклонить, ------------------------- Относительно перехвата заявки перехватчиками, то это Вам кажется. Очевидно Вы пришли с кухне форекса. Но там не биржевой рынок и свои законы, как в джунглях На бирже немного иначе. Скорее всего это маркет-мейкер стукает. Меняйте алгоритм.
Вы хотели продать по 67069, а биржа продала Вам по лучшей, чем Ваша цене 67075 --------------------------------------------------- Вы можете мне отдать лишнее.
Добрый день! Скажите, а можно ли с помощью луа на графике нарисовать горизонтальную линию, а потом её двигать мышкой вверх вниз... И чтобы скрипт, который её нарисовал, понимал, что линия передвинулась туда-то.
Вообще это реально средствами луа сделать без длл, корутин и прочих приблуд?
А где это Вы в LUA видели операторы для рисования чего-нибудь и без DLL?
1)Я привел выдержку из ранее действующего положение, т е вербальное описание расчета ГО до 07.09. (столбец 2 ) из Вашей ссылки. По этому описанию можно проверить правильность формул в таблице. (не проверял - лень) -------------------------------- 2) Если я правильно понял, то для новой редакции изменились лишь строки 2,5,6,9. В результате теперь убрали скидки: "при покупке выше расчетной цены или продаже ниже расчетной цены в ходе торгов скидка не предоставляется, и увеличили максимальное ГО до 3L"