Николай Камынин написал: Есть такое правило на рынке - Рынок двигают рыночные цены. Т е направление рынка - это направление движения цены. Рыночная цена всегда смещает цену в стакане.
Под «рыночной ценой» вы что здесь имели ввиду?
Цитата
Николай Камынин написал: Поэтому попробуйте следить за ценой на вершине стакана.
«вершина стакана» — это где?
Цитата
Николай Камынин написал: Но если рынок не двигают большие деньги , то всегда на движение вверх будет ответное движение вниз и наоборот. это делает маркет-мейкер, ему за это деньги платят.
Кто платит деньги маркет-майкеру и как он это делает «ответные движения»? расскажите поподробнее...
Рыночная цена - это сленг, означает рыночная заявка т е заявка покупки или продажи по существующим на рынке ценам. Такая заявка всегда. это покупка по лучшей цене предложения или продажа по лучшей цене спроcа. ---------------------- Под вершиной стакана я понимаю лучшую цену предложения и лучшую цену спроса - спред (линия в стакане) между ними и есть вершина стакана. ------------------------- Маркет-мейкеру платит биржа. Сколько и за что вы можете посмотреть на сайте биржи. Упрощенно это выглядит так: Задача маркет мейкера - сужение спреда или иначе создание ликвидности (видимости торговли). Поэтому когда рыночная заявка бъет в лучшую цену - спред расширяется, маркет-мейкер (если нет никого) бьет в противоположную сторону - т е сжимает спред.
Николай Камынин написал: ошибка в итераторе next (table, index) index выходит за границу таблицы, либо таблица пустая, либо таблица не существует -------------------------------------- Можно поставить итератор внутрь проверки например так if table and #table >0 and #table>=index then --действия с итератором nex(table,index) ... end
Спасибо, понаставил такие проверки перед всеми next и for, но это к сожалению не помогло
Возможно, что ошибка возникает внутри функции библиотеки QLUA. . Можно предположить (без текста скрипта сложно гадать) что ошибка возникает при запуске скрипта, когда что-то у Вас еще не инициализировано. Попробуйте определить все начальные значения в функции init. Если скрипт не секретный, то покажите , возможно что-то будет понятно где проблема.
Андрей написал: Доброго времени суток. У меня тут вопрос, от куда (кроме таблицы всех сделок) можно получить информацию о направлении прошлой сделки (за последний тик) т.е. мне нужно знать была ли покупка или же продажа на прошлом тике. Таблица всех сделок вроде дает эту информацию, однако мне нужно сделать так, что бы не нужно было в квике открывать не какие таблицы. т.е. запустил робота, и он сам тягает эту информацию.
Есть такое правило на рынке - Рынок двигают рыночные цены. Т е направление рынка - это направление движения цены. Рыночная цена всегда смещает цену в стакане. Поэтому попробуйте следить за ценой на вершине стакана. Но если рынок не двигают большие деньги , то всегда на движение вверх будет ответное движение вниз и наоборот. это делает маркет-мейкер, ему за это деньги платят. Поэтому не заморачивайтесь особенно этим вопросом.
Пробую освоить qlua, скрипт получился уже приличного размера, но иногда стал останавливаться и в окошке "Ошибки выполнения скрипта" получаю ошибку:
Цитата
invalid key to 'next'
Вопрос, как понять откуда это приходит, т.к. ни номера строки, ни какого другого намека не выдается.
ошибка в итераторе next (table, index) index выходит за границу таблицы, либо таблица пустая, либо таблица не существует -------------------------------------- Можно поставить итератор внутрь проверки например так if table and #table >0 and #table>=index then --действия с итератором nex(table,index) ... end
Информация к размышлению для тех кто изобретает грааль. Свеча - это индикатор, который на графике строится как бы с заглядыванием вперед. поэтому на истории легко строить и обнаружители трендов и прибыльные стратегии, особенно используя индикаторы заглядывающие вперед. К таким индикаторам относятся зигзак и фрактал. поэтому не надо от скользящей средней или от арифметического среднего ждать чудес. Это самые простейшие цифровые фильтры с очень плохими фильтрующими свойствами. ------------------------- Умным -горе от ума, глупым - радость от безумья.
В квик встроена стандартная VM Lua вер 5.1 QLUA - это библиотека к LUA версии 5.1 Поэтому любые сторонние библиотеки, которые работают на LUA 5.1 будут работать в квике.
function OnCalculate(index)
high2=high1
high1=high
high=H(index)
if high1 and high2 then
vrem=(high1+high2)/2 --- или так vrem=(high+high1)/2
end
return high , high1, vrem
end
Вариант такой 1) Пишите на LUA индикатор, который отображает " перебирает построчно текстовый файл с бумагами и поочередно выбирает каждую и выводит на экран максимумы к текущему графику" 2) Пишите на AUTOIT скрипт которому первая программа передает данные отображаемой бумаги и этот скрипт выводит очередной график на экран. ------------------------- Полагаю Вам сложно будет сделать п 2) Поэтому можно упростить хотелку и выводить не график очередной бумаги, а ее название. В таком варианте все может делать скрипт на луа п 1)
Проверьте в таблице транзакций терминала QUIK нет ли ошибки при отправке транзакций. Дело в том что рыночные заявки на покупку могут быть запрещены. Если так то в таблице транзакций Вы увидите сообщение об этом. Сообщите Ваш UID чтобы мы могли проверить права.
Добрый день. ID U0120866
Не уверен, что есть ошибки, т.к. если убрать обработку ожидания while trans_Status == nil do sleep(1) end, то все работает. Получается, что если ждать когда придет OnTransReply - зависает скрипт, т.к. ответа нет. Убираю ожидание все проходит без ошибок.
Как я и говорил выше, на срочной сеции этот же код работает нормально.
Полагаю, что у Вас неправильное представление о работе с колбеками. При использовании колбеков нет надобности ждать. Колбеки для этого и создаются. Т е все события у нас асинхронные, поэтому их не надо ждать, а надо на них реагировать. Если событий нет, то система бездельничает и ничего не ждет, так как нам заранее неизвесно когда и какое событие будет. Подумайте над этим и смените логику скриптов. -------------------------- В качестве совета. Не надо делать кучу скриптов, пишите свои торговые стратегии в одном, так как все колбеки вызываются последовательно и им передается одно и тоже, то нет смысла множить копии колбеков в разных скриптах.
можно попробовать так. ============================= в main ставите однократную подписку на данные: if DS==nil then DS = CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL) end ============================== там, где используете эти данные ставите условие: if DS and DS:Size() ~= 0 then -- обработка данных end ------------------------ При этом нет надобности в каких-либо задержках, все будет работать без тормозов.
Let_it_go написал: Добрый день. Прошу дать совет. У меня два робота. У каждого своя стратегия, но каждому из них нужен минутный график фьючерса РТС. Оба робота подписываются на него с помощью колбека.
Код
function DataSource (class,sec,interval)
ds[sec] = CreateDataSource (class,sec,interval)
ds[sec]: SetUpdateCallback ( function ( .. .) mycallbackforallstocks(class,sec, .. .) end )
return ds[sec]
end
Индикаторы у них разные, поэтому расчёт индикаторов не дублируется. Тем не менее вопрос: не происходит ли двойной работы по получению графика? Если да, то как этого избежать? И стоит ли этого избегать (может быть это маленькая нагрузка, которую можно игнорировать). Спасибо
Поместите стратегии в один скрипт и Вы уменьшите размер кода и нагрузку на CPU от роботов в два раза . Зачем их вообще делать в разных скриптах, если у них 90% программы одинаковые и лишь генератор торговых сигналов разный?
Let_it_go написал: Прошу подсказать. У меня с программированием дела плохи. Еле-еле освоил Луа. Учить другие языки нет сил. Скорости КВИКа для отправки заявок мне уже не хватает. Нужен полноценный HFT. Возможно ли реализовать прямой доступ на биржу так чтобы у меня визуально всё осталось по старому: КВИК и Луа? Спасибо за ответ.
Полноценный HFT стоит очень дорого. Кроме того дорого будет стоит его обслуживание и каналы связи. Некоторую информацию об этом можно найти в инете. КВИК разрабатывался как инструмент подачи заявок брокеру. Данный форум не то место, где обсуждается HFT, здесь обсуждаются ляпы новичков и новых версий терминала QUIK.
Николай Камынин написал: Что же касается исполнения луа программы в КВИКЕ и вне его то исполняются одинаковое время так как в квике ровно таже VM Lua.
в теории одинаково. На практике нет. В терминале скрипты исполняются медленнее.
можете привести конкретные данные? На сколько процентов медленнее? Полагаю, что медленнее может быть лишь по причине того, что скрипт в квике не самостоятельная задача. Других причин не видно. Вообще-то интересно как Вам удалось функции библиотеки QLUA запустить независимо от квика?
Рекомендую проштудировать книгу Дж.Рихтер Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows В ней есть ответы на все Ваши вопросы с примерами и готовыми решениями.
Скорее всего надо переписать сам скрипт ,изменить алгоритм или переписать его на СИ как dll. Что же касается исполнения луа программы в КВИКЕ и вне его то исполняются одинаковое время так как в квике ровно таже VM Lua. Задержка может быть лишь из-за загрузки процессора либо другими приложениями либо работой самого квика в реале. -------------------- В любом случае Вы не там копаете.
Это ошибка, которую никто не ловит. как правило ошибка на уровне нативного кода или на уровне ОС. возможно что ошибка железа, например перегрев CPU, сбой памяти где находится программа пользователя и т д ------------------------------------- "О сколько нам открытий чудных готовят просвещенья дух и опыт, сын ошибок трудных.."
Николай Камынин написал: Как я понимаю, так как колбеки работают в одном потоке, то будет очередность.
Николай, читайте внимательней. Речь про колбеки в сравнении с main. Между колбеками и main очередности нет.
Цитата
Николай Камынин написал: Что есть истина?
колбеки выполняются в том порядке как они поступили в терминал QUIK. Если один колбек затормозит, то накопится очередь, которая потом исполнится в том порядке в каком они поступили.
Тогда поясните откуда колбеки поступают в терминал? Спасибо.
Sergey Gorokhov Добрый день, Уточните относительно утверждения об очередности, что ее нет. ----------------- Как я понимаю, так как колбеки работают в одном потоке, то будет очередность. Полагаю, что их очередность либо определяется порядком появления их в скрипте, либо заранее установленным порядком их обхода внутри терминала. Что есть истина? спасибо
7.2 Функции и глобальные переменные скрипта
индикатора
.. .
7.2 . 2 OnCalculate
.. .
Формат вызова:
NUMBER v1 [, NUMBER vn] OnCalculate(NUMBER index)
Параметры:
• index – индекс свечки в источнике данных. Начинается с « 1 ».
Если значение vi не определено, то функция возвращает nil в качестве значения линии на интервале index.
.. .
7.2 . 4 Функции для доступа к источнику данных
• Функции для доступа к источнику данных O, H, L, C, V, T принимают в качестве параметра
индекс свечи и возвращают соответствующее значение в формате:
NUMBER < название функции > (NUMBER index)
• Функция Size возвращает текущее количество свечек в источнике данных. Формат функции:
NUMBER Size ()
Уважаемые разработчики QUIK! Как мне кажется, большая часть пользователей, только начинающих изучать QLua, читая в документации слово "свечка", изначально для всех типов скриптов воспринимают это понятие в том смысле, как это определено для CreateDataSource. И лишь потратив впустую много времени и сил, осознают, что такое понимание "свечки" не имеет ничего общего с интервалами времени на диаграмме графика для скрипта индикатора.
Я уже неоднократно предлагал Вам не вводить пользователей в заблуждение в отношении index в OnCalculate и функции Size для скрипта индикатора, а четко указать в документации:
1. "7.2.2 OnCalculate ... • index – номер интервала на шкале времени в окне диаграммы графика, для которого необходимо вычислить значение индикатора. Начинается с «1». Если значение vi не определено, то функция должна вернуть nil в качестве значения линии на интервале index. ... При перезапуске расчета индикатора Quik вызывает OnCalculate с index = 1 вне зависимости от того, определены или нет данные для инструмента для первого интервала диаграммы графика. Можно описать ситуации, когда Quik "перезапускает" расчет индикатора.
2. "7.2.4 Функции для доступа к источнику данных • Функции для доступа к источнику данных O, H, L, C, V, T принимают в качестве параметра индекс интервала на шкале времени в окне диаграммы графика и возвращают соответствующее для времени интервала значение инструмента, если оно определено, в формате: NUMBER <название функции>(NUMBER index). Определить имеются ли данные инструмента для указанного интервала можно вызвав функцию CandleExist. Если данные инструмента для указанного интервала отсутствуют, то функции O, H, L, C, V возвращают «nil», а функция T – время указанного интервала.
• Функция Size возвращает количество интервалов на шкале времени, используемых для отображения в окне диаграммы графика, с учетом пустых интервалов."
"Интервал на шкале времени диаграммы графика" можно "обозвать" как-то по-другому, например, "временн о й интервал диаграммы графика" или как-то еще. Но надо четко развести понятия номер свечки инструмента и номер интервала.
Вы все правильно написали, за исключением одного. Вы не дали определение свечки. Прикольно то, что многие начинающие и не только не понимают и это. Все дело в том, что этим словом называют графическое изображение четырех индикаторов. Поэтому вполне логично, что в рамках вашего изложения свечка - это индикатор (даже четыре). Кроме того, индекс преобразуется во время через понятие интервал. Таким образом, в Вашем определении время это синоним индекса. ------------------------- Возможно не стоит быть столь категоричным и пытаться дать строгое и однозначное определение понятий на рынках, т к большинство которое начинает или уже нет это вообще либо не читает, либо не поймет. ---------------------- Поэтому оставьте все как есть.
Делюсь опытом. Когда я делал синхронизацию потокв в QLUA, то просто написал DLL для решения данной проблемы. В результате я получил 1) Синхронизацию различных скриптов между собой, т е я синхронизировал майн в различных скриптах. Это позволило использовать всего по одному вызову каждого колбека QLua вне зависимости от числа роботов (скриптов) Т е у меня есть один скрит для работы со стаканами один для работы с заявками и т д и куда скриптов торговых стратегий(роботов) в которые не требуется вызывать все колбеки QLUA. Вполне удобное решение, если разработчики КВИК надумают его сделать, то проблемы с синхронизацией потоков и множественными копиями колбеков исчезнут.
надо делать не парсер а интерпретатор и будет он как минимум на порядок меньше, чем 1000 строк. Если строка динамически меняется, то решение на джава не работает и единственное решение на любом языка - это интерпретатор строки.
Линии на графике являются индикаторами. Когда линия находится сильно высоко от графика, к примеру на 40% выше цены, я бы хотел её не рисовать. Должен быть пропуск, индикатор не рисуется. Но это будет не красиво, потому что КВИК попытается все же соединить последнее значение перед дыркой и первое значение после дырки. Можно ли этого избежать? Можно ли одну линию сделать разноцветной? один участок красный, другой, например, зелёный?
Алексей написал: Здравствуйте, скрипт не хочет отправлять транзакцию на сервер, скрипт запускается, работает, но нечего не происходит, запуск функции для проверки записан в OnInit код транзакции ниже
Код
function test ()
local Transaction = {
[ 'TRANS_ID' ] = tostring(trans_id), -- Номер транзакции
[ 'ACCOUNT' ] = TorShet, -- Код счета
[ 'CLASSCODE' ] = KodClass, -- Код класса
[ 'SECCODE' ] = InstrumentKod, -- Код инструмента
[ 'ACTION' ] = 'NEW_ORDER' , -- Тип транзакции ('NEW_ORDER' - новая заявка)
[ 'OPERATION' ] = 'B' , -- Операция ('B' - buy, или 'S' - sell)
[ 'TYPE' ] = 'L' , -- Тип ('L' - лимитированная, 'M' - рыночная)
[ 'QUANTITY' ] = '1' , -- Количество
[ 'PRICE' ] = tostring(tekPrice) -- Цена
}
local Res = sendTransaction (Transaction)
end
функция OnInit вызывается один раз и как правило при ее работе еще нет соединения с сервером. В этой функции надо выполнять инициализацию переменных и загрузку библиотек. ----------------------------------- Торговые действия надо исполнять либо в main либо в колбеках.
Николай Камынин написал: На графике свеча всегда отобразится на значении 00 но это отображение будет сделано в момент появления первой сделки после 00.
сие очевидно
Цитата
Николай Камынин написал: Конец свечи тоже отобразится в момент 00
а вот тут - навряд ли если времена свечей заявлены по открытию, но тогда это противоречит вашему первому параметру - по началу в 00 скорее в качестве значения Close будет последняя сделка до времени 00 начала следующей свечи
Цитата
Николай Камынин написал: Т е как я написал ранее свечи всегда отображаюся с запаздыванием но это запаздывание не показано на графиках.
показаны, но не отображаются : звучит вполне тафталогично
Цитата
Николай Камынин написал: Поэтому закрывшиеся свчи всегда точно синхронизированы на графиках по времени точно в 00.
это в случае если свечи формируются по времени окончания периода. и это уже воля авторов, как их рисовать но начинаться в 00 и заканчивать в 00, перемешивая моменты для соседних, навряд ли правильно.
Время свечи задает всемирное время. Я вообще-то не гадаю, а объясняю Вам как формируются свечи. Свеча формируется от 00 часов 00 минут 00 секунд по Гринвичу. алгоритм следующий. Время открытия свечи - оно же время закрытия всегда точно равно всемирному а квант дискретности равен тайму. Т е время свечи никаким образом не синхронизировано с временем сделок. Именно для этого и придуманы свечи чтобы уйти от тиков к реальным часам. Т е свеча это значение четырех индикаторов, взятых на интервале свечи. Цена открытия - это цена сделки которая была первой после 00 для новой свечи Цена закрытия - это цена сделки которая была последней после открытия этой свечи и до времени 00 - открытия следующей т е цена закрытия предыдущей свечи и цена открытия следующей - это цены двух различных сделок которые совершены в различное время но стоят рядом вокруг 00.
валерий написал: Если два графика расположены в двух областях одной диаграммы, то нужно ли бары обязательно синхронизировать по времени баров или можно быть уверенным, что если индексы совпадают, то и время тоже?
если брать вопрос шире, но проще, то: - бары, свечи и любые другие визуальные способы представления статистических данных - это просто способ визуализации, удобный для восприятия человеком. - у этих способов есть правила, по которым они реализуются: время начала - момент когда надо нарисовать Open, время окончания - Close, между этими событиями нарисовать Hi & Lo и т.д. В наше время в ядре биржи происходят сотни сделок в секунду, но вовсе не факт, что для начала каждой минуты во время 00.000 сек будет существовать сделка для отрисовки начала свечи в точно заданное время Поэтому любая "графика" зависит от авторов: при соблюдении правил два чарта будут синхронно нарисованы, тк они формируются по единому правилу - это теоретически. Практически возможен некий программно-аппаратный лаг при рендеринге разных оконных фреймов, который может быть микросекунды - для текущей свечи. Если в квик окно обновляется в пределах 1-0.5 сек, то это не имеет значения даже для текущей свечки и не повлияет на ваши входные данные и выходные сигналы соответственно. (При использовании индикатора-упростителя из 80-х гг прошлого века - свечи, бары и т. д.)
На графике свеча всегда отобразится на значении 00 но это отображение будет сделано в момент появления первой сделки после 00. Конец свечи тоже отобразится в момент 00 но последняя сделка при этом может быть и за полчаса до 00, если это тайм час. Т е как я написал ранее свечи всегда отображаюся с запаздыванием но это запаздывание не показано на графиках. Поэтому закрывшиеся свчи всегда точно синхронизированы на графиках по времени точно в 00.
валерий написал: Понятно, что свечи на одном графике синхронизированы. Но можно ли быть уверенным, что и индексы у свечек с одинаковым временем всегда одинаковые (тогда можно искать соответствующую свечу на втором графике по индексу, а не таймстампу)? Мало ли как Арка их считает... Хочу знать наверняка от авторов.
Если я Вас правильно понял, то речь идет о различных инструментах(бумагах) Свечи у них синхронизированы по началу тайма. Но возможно отсутствие свечи при отсутствии сделок в этом интервале для данного инструмента. Поэтому просто по номеру свечи не синхронизированы.
валерий написал: Если два графика расположены в двух областях одной диаграммы, то нужно ли бары обязательно синхронизировать по времени баров или можно быть уверенным, что если индексы совпадают, то и время тоже?
Не свосем понятно что и с чем хотите синхронизировать. На графиках свечи всегда отображаются синхронизированными , но в действительности свечи - это индикаторы экстремумов на заданном тайме. Тайм синхронизирован. Свечи это индикаторы, которые считаются всегда с запаздыванием. .
есть два варианта ускорить прием ответа. 1) отказаться от onParam 2) во всех колбеках поставить запуск новых потоков и выход из колбека В этом случае будет максимально быстро выходить из OnParam и др колбеков.
Александр Правилов написал: Николай Камынин , в этом то самая и большая проблема, в невозможности получить ответ, пока не закончится OnParam или не подождать в OnParam, к примеру через event.timer или event.pull, могу ошибаться. Ну да ладно, что-нибудь придумаю, благо для текущего алгоритма, скорость не является приоритетной.
Вы очевидно не понимаете, что это в принципе невозможно в КВИК, так как принятый ответ обрабатывается в том же потоке, где работает функция OnParam. т е ядро процессора (поток) занят этой функцией и обработка новых данных будет после ее завершения. а других потоков для обработки новых данных в КВИКЕ не выделяется т е это так сделан КВИК. Поэтому, если очень хочется, то надо отказываться от КВИК и подключаться прямо к бирже.
Александр Правилов написал: Николай Камынин ,Да дело не в таблице состояний, это не то. Этот способ режет скорость. После отправки транзакции в OnParam есть ещё код и пока этот код не выполнится, не придет ответ от OnTransReply и OnOrder, а надо получить ответы еще при выполнении кода в OnParam.
Пока исполняется OnParam никакие новые данные с сервера не могут быть обработаны. Поэтому НЕВОЗМОЖНО находясь в onParam получить ответ OnTransReply и OnOrder, Полагаю Вы это поняли. ----------------------------
Александр Правилов написал: Николай Камынин , если с кодировкой что-то не то, почему остальной код работает? Николая, подскажите кучочек кода, как перевести в состояние ожидания ответа по заявке?
Общий подход работы робота на основе событийной модели следующий. ------------------------ В начале описываете таблицу возможных состояний робота. Например у меня есть таблица состояния заявок, таблица состояния стоп-заявок ну и т д. Эти таблицы в отличии от таблиц квика содержат лишь активные заявки. ------------------------------------------- Когда посылаете заявку то пишите в конец таблицы запись о том что послали заявку в систему Когда собираетесь послать заявку то проверяете состояние последней записи в таблице состояния заявок Если там указано что заявка отправлена брокеру ( т е еще нет подтверждения что она на бирже) то пропускаете отправку новой. ----------------------------- Ну и т д
Александр Правилов написал: Николай Камынин , не согласен с вами, колбэками управлять нельзя, они приходят как приходят, посмотрите мой пример выше, как разрулить эту ситуацию?
Sergey Gorokhov , Сергей, подскажите другой момент, что то не получается получить таблицу заявок, в чем может быть ошибка?
в row=getItem("orders",i) пишет - improperly formatted XML data
Код
for i = 1 , getNumberOf ( "orders" ) do
local row = getItem ( "orders" ,i)
if row ~ = nil and row[sec_code] = = sec then
local trid,ms = killOrder(row[order_num],sec,class)
if trid ~ = nil then
tbl: SetValue (line_count_table[sec],'ÅñòüÇàÿâêà', string.format ( "Cancel" ))
tbl: SetValue (line_count_table[sec],'ÖåíàÇàÿâêè', string.format ( "0" ))
end
end
end