Эта? if bit.band(order.flags,2) > 0 then Это недостаточное условие. Оно отображает только "снята или исполнена", а нужно еще проверять "активна или нет". Как описано здесь:
Сергей написал: Пожалуйста, обоснуйте. Чем OnTrade() в данном плане хуже OnOrder()?
Что значит "обоснуйте"? Он не хуже. Он другой, и сообщает о других событиях. Это примерно как "обоснуйте почему ноги хуже рук". OnTrade вызывается при приходе сделок(!). И только их. Неважно откуда они взялись. (может брокер за вас исполнил заявку, или маржинколл, или экспирация опционов. Неважно). А OnOrder вызвается когда есть изменения в ЗАЯВКЕ(!). Сделок может и не быть (например если заявка выставлена и тут же снята), и поэтому если нужен статус заявки, то анализировать нужно OnOrder.
Цитата
Сергей написал: OnTrade() стабильно срабатывает раньше OnOrder(), и я б не стал дожидаться ничего другого, если мне в OnTrade() сразу и скажут, что на эту заявку можно "забить", т.к. она более не существует.
OnTrade может срабатывать раньше, может позже. Колбеки - штука асинхронная. Вообще нельзя полагаться на порядок их вызова. Понять что по OnTrade "на заявку можно забить" только в том случае, если все OnTrade-ы по одной заявке (надо отслеживать номер) в сумме дали кол-во указанное в заявке. Но этого может не произойти, потому что частично исполненная заявка может быть снята, и тогда это никогда не произойдет.
Сергей написал: В документации и на форумах много разных вариантов проверки. Какой гарантирует, что заявка была на 100% filled?"Не активна" + "исполнена" почему-то не работает.Только флагами и непосредственно в OnTrade() определяется или без order.balance не обойтись?
Причем тут OnTrade? Надо узнать статус заявки? Обрабатываем OnOrder. Нас интересуют два флага: OF_ACTIVE = 0x01 OF_KILL = 0x02 По определению: первый флаг показывает активная ли заявка, второй снята или исполнена если не активна. Т.о. существует всего 3 состояния. 0х01 = активна. order.balance (если не ошибаюсь) показывает неисполненный остаток. 0х02 = неактивна, снята. order.balance показывает неисполненный остаток. 0х00 = неактивна, исполнена полностью.
OnTrade показывает статусы сделок.
Цитата
Сергей написал: "Не активна" + "исполнена" почему-то не работает.
нет написал: Но минус вот в чем: все эти значения будут верными если только, просчитывать все значения, иначе выдает неверные значения - проверено.
Достаточно рассчитать двойной период. т.е. если период RSI =14, то верные значения пойдут после 28 расчёта. инаяе говоря, чтобы рассчитать предпоследнее значение в моменте, необходимо и достаточно просчитать 29 последних значений.
Михаил Филимонов написал: Я предоставил свои данные, что бы что-то доказать, покажите Ваши.
Я не вижу смысла что-то доказывать. Я попытался объяснить. Если человек не хочет слушать/вникать, то помочь ничем не могу.
Цитата
Михаил Филимонов написал: Ваши умозаключения - просто набор фраз, я пробовал на реале - практически нет разницы onOrder и onTrade.
Наконец-то добрался до компа чтобы провести эксперимент. Ниже скриншот отражающий мои умозаключения на практике. Ниже объяснения чтобы небыло разночтений.
Из картинки можно увидеть следующее: 0. Две верхние заявки в таблице заявок не нужно учитывать, они тестовые, и отменены вручную. 1. Были поданы две транзакции на покупку по 66000 и на продажу по 65000. Строка 3 и 5 таблицы сообщений это OnTransReply. S: статус =3, транзакция исполнена. Т: время, у всех одна секунда, поэтому будем обращать внимание только на последнее поле - это микросекунды. Как можно видеть, обе транзакции прошли в одну микросекунду .895260.
2. По транзакциям были выставлены лимитные заявки с ценой заведомо хуже рыночных, т.е. фактически заявки были рыночными.
3. OnTrade (т.е. инфа по сделкам) пришел раньше чем заявки, и был вызывал по три раза для каждой сделки. В шести строках (7-12) видно номера заявок (совпадают с вызовами OnTransReply), и видно время сделок (!!!, не заявок, а сделок, хоть и численно совпадает). время равно .910880 и .910884, т.е сделки по этим заявкам прошли через
910880-895260=15620мксек (т.е. 15,620мс) и 910884-895260=15624мксек (15,624мс)
4. Наконец-то пришли заявки в OnOrder, со временем совпадающим с временем сделок, т.е. заявки были исполнены "мгновенно". И это объяснимо. Т.к. заявки с ценами заведомо хуже рыночных, они не попадают в стакан, а "бьют" в существующие, что приводит к сделкам.
Это боевое подключениие. Все цены, заявки и отметки времени реальны. Я думаю, вы можете найти эти сделки в таблице обезличенных сделок.
Что из этого кажется Вам неочевидным или ненормальным?
Михаил Филимонов написал: Не имеет значения (onOrder и onTrade) пробовал так и так - разницы почти нет,
Да сколько можно говорить, по onOrder нельзя понять время исполнения! Потому что реальное время исполнения и время вызова колбека - разное!!! Да, в хороших условиях оно близкое, но фактически время вызова и время сделки - это разное время.
Измерять время выставлена-исполнена можно только по соотв.полям в таблице заявок и таблице сделок. Ну или время в стуктуре сделки, которая приехала в вызове onTrade. Только разница этих отметок времени имеет смысл. И только потому что это время проставляет биржа. Поэтому я и говорю что нужен скриншот таблиц (как вариант конечно подойдет и текстовый вывод их же) где видно номера заявок, сделок и время выставления и исполнения. в т.ч. в мкс.
А. У вас по логину-паролю видимо. Квик джуниор с сайта арки?
Тогда надо сделать чтобы файл qcrypto.ini выглядел примерно так:[CryptoProviders] OpenSSL_Provider=1 [OpenSSL_Provider] Module=.\OpenSSL_Pr.dll IniFile=.\OpenSSL_Pr.ini [CryptoProvidersSettings] CipherCryptoProvider=OpenSSL_Provider
просто напишите ручками в qrypto.cfg пути указывающие в локальную директорию: .\pubring.txk .\secring.txk и положите файлы ключей в директорию с терминалом.
Когда вы продали акцию, ее стоимость (по цене продажи) зачислена вам на счет. Когда вы откупите обратно - ее стоимость будет вычтена.
Вероятно в результате операций ваш баланс составлял примерно
4765(тек.лимит) - 2145(тек.цена) = 2620. А цифра в строке Т1 - это расчет "на завтра", т.е. когда вы закроете позицию, то 2145 (тек.цена) будет списана, плюс какие-то еще изменения (возможно комиссия) и останется 2613.
Михаил Филимонов написал: Если посмотреть время выставления ордеров (ассинхронные ордера) и время их исполнения, то из этих данныхвообще ничго понять не возможно (время одинаковое)
Заявки рыночные? (Или по цене сильно хуже стакана?) Если да, то нормально, что выставленная заявка была мгновенно исполнена. не?
Покажите эти же таблицы, но где видно цену заявки.
И эта, время ответа колбека, в общем случае, не равно времени выставления/исполнения. Т.е. заявка может быть исполнена мгновенно, а колбек вызван через полсекунды.
Это происходит потому что время выставления/исполнения выставляется биржей, а вызов колбека зависит от потока которым присылает сервер квик в термниал, и от того насколько собственно терминал тормозит.
Понять хочу как ведётся замер. в этом куске не вижу строк выдающих логи:
Цитата
Михаил Филимонов написал: 2019.02.06 18:27:25.902 Trades 'xxxxx': cancel order #99190769 sell limit 1.00 SNGR-6.19 at 285212019.02.06 18:27:25.908 Trades 'xxxxx': accepted cancel order #99190769 sell limit 1.00 SNGR-6.19 at 28521
я нехочу наехать или оскорбить, я хочу лишь понять. Просто воплей о том что МТ работает супер быстро миллион а по факту оказывается что люди замеряют время возврата из OrderSendAsync :)
Забегая вперёд, хочу сказать что раунд-трип это не просто время ответа сервера. Это время маршрута тернимал-сервер-биржа-сервер-терминал. И 7 мс мне кажутся очень подозрительными.
Михаил Филимонов написал: Задержка между сделками - 250 - 300 мс (для сравнения , с этого же компьютера, в МТ5 - 7-8 мс)
Мне вот интересно (ну так, для себя, чисто поржать), МТ5 через 8мс отвечает - а это время когда уже выставлена заявка? Или просто когда функция выставления заявки вернулась?
И в квике 300 - это между чем и чем? Подали транзакцию - получили асинхронный ответ? Или подали - получили OnOrder?
Просто в первом случае заявки еще может не быть, во втором она точно есть.
В МТ5 также? Когда функция вернулась - уже есть заявка?
Николай Камынин написал: вообще-то Стохастик - это примитивный полосовой фильтр
Совершенно верно. Что абсолютно не противоречит следующему
Цитата
Самвел написал: Стохастик показывает текущее положение цены закрытия в диапазоне максимальных и минимальных цен за указанный период усреднения.
Причем эта формулировка сути индикатора (конкретно стохастика) пожалуй наиболее верная. В отличии от "Индикатор показывает <Силу рынка>" и им подобных.
Цитата
Самвел написал: А нужно, что бы Стохастик брал необходимые данные по Открытым Позициям.
А, собственно, что мешает открыть график открытых позиций и наложить на него стохастик?
Насколько мне известно teamviewer отлично работает по 4G. Ну это имеет смысл только если нужно контролировать робота. А если посмотреть "как там моя поза" то мобильное приложение должно стать лучшим выбором.
Это названия вкладок остались на русском, нужно их переименовать. А вообще уже тут на форуме неоднократно поднимался вопрос как подружить wine и русский quik. Решение есть и оно работает. Предлагаю поискать.
Миша написал: Улыбнулся в первых шагов - функция TRANS2QUIK_CONNECT. lpstrErrorMessage Тип: указатель на переменную типа Строка. В случае возникновения ошибки может получать сообщение о возникшей ошибке dwErrorMessageSize Тип: Long. Содержит длину строки, на которую ссылается указатель lpstrErrorMessage На какой размер сообщений следует ориентирвоваться?
Что именно смущает?Первый параметр это указатель на буфер, второй - его максимальная длина.
Максим написал: Есть ли какая-то разница между Quik Junior, скачанным с вашего сайта, и Quik, полученным от брокера? Кроме ip.cfg, конечно? https://smart-lab.ru/blog/513482.php тут говорят, что есть, но не помнят в чём.
Абсолютно ничем не отличается. Текст написанный по ссылке на смартлабе полная чушь. Если версии идентичны, и (как я вижу в каментах на СМ) даже сравнились хеши модулей, очевидно что это тот же самый квик ;)
Конечно же настройки могут быть различны. И набор плагинов да. Другой вопрос, что серверная часть демо-квика и боевого могут быть разными и настроены по-разному. Но к терминалу это никакого отношения не имеет.
Jin написал: Только начинаю осваивать данную систему и пока для меня остаётся непонятным как выставлять лимитные заявки. Что я делаю. 1) Кликаю в стакан два раза. 2) Выбираю тип (покупка или продажа) и колво 3) Указываю цену 4) Жму "Да" (галочка "Рыночная" НЕ стоит)
Попробую объяснить по-простому. 1) после клика открывается форма ввода заявки в которой стоит цена и кол-во в которую вы кликали. 2) вы меняете эти параметры на свои, видимо не очень углубляясь в текущие цены на рынке После того, как вы жмете ОК, на биржу отправляется заявка с вашими парамтерами.
При этом (будем считать что вы подаете заявку на покупку, при продаже все с точностью наоборот): 0) в таблице заявок появится заявка с указанной ценой.
1) если ваша цена больше либо равна текущей рыночной цене, то заявка будет исполнена немедленно 2) если цена меньше, то в стакане появится ваша заявка. конечно как вы ее увидите (и увидите ли вообще) зависит от настройки отображения своих заявок в стакане, но в общем случае картина примерно такая. например:
в стакане есть сл. заяки (строки в стакане) на покупку (абстрактные цены, абстрактный инструмент) 110 5 105 4 100 7 и вы подали заявку на 3 шт по цене 103. стакан станет таким. 110 5 105 4 103 3 -- ваша заявка. 100 7
3) после исполнения (в первом случае мгновенного, во втором - когда случится) в таблице сделок (!) появится запись с ценой сделки. она, в общем случае, может отличатся от цены заявки. если исполнение прошло по разным ценам (это может быть, если ваша заявка "собрала" несколько заявок в стакане), то в таблице сделок может быть несколько строк с разными ценами исполнения.
во всех случаях эти цены - это цены реальных сделок на бирже. Все вышесказанное - это про лимитные заявки. Если стоит галочка "по рынку", то заявка исполняется так, будто указанная в ней цена сильно выше текущих рыночных цен.
4) Наконец стоп-заявка это заявка с условием. Например можно выставить стоп-заявку на покупку, с условием когда текущая цена будет выше 120 (как из примера выше). Обычная лимитка в этом случае будет немедленно исполнена, потому что цена 120 "выше рынка", а стоп-заявка следит за рыночной ценой, и когда рынок вырастет до 120, то будет выставлена обычная лимитная заявка на покупку по цене 120 (ну или там как условия задать)
Стоп-заявка появляется в отдельной таблице стоп-заявок.
Цитата
Jin написал: Если правильно понимаю, в этом случае я не застрахован от проскальзываний цены, то есть при выставлении такой заявки она не отображается в стакане.
В случае, если лимитка выброшена по цене больше рыночной, либо сформирована стоп-заявкой, то да, почти всегда будет проскальзывание.
Цитата
Jin написал: Мне необходимо, чтобы заявка по указанной мною цене, появилась в стакане.
Это происходит только в случае выставления лимитной заявки, и только по цене ниже текущей рыночной цены.
-- еще раз: все вышесказанное справедливо для заявок на покупку. для заявок на продажу будет все наоборот.
Я неоднократно наблюдаю как люди, пришедшие с метатрейдера (и прочих forex-кухонь) не могут понять как все это работает, а поддержка почему-то не может внятно объяснить.
Владимир написал: Почему Вы решили, что купить по 100 выгоднее, чем по 200?
Очевидно, что по 100 выгоднее купить нежели по 200, потому что цена ниже. Если бы речь шла о "пробое на 200" или подобных ситуацих, другое дело. Тут же человек просто спросил, как ему купить по 200, когда цена 100.
Я спросил почему не купить по 100, мне никто не ответил.
Цитата
Владимир написал: Если трейдер предполагает, что пока цена находится в данный момент на уровне 100 +- Х, то в рынок заходить рано, а когда цена подойдет к 200, то можно покупать, или если цена подойдет к 50 - то можно продавать, например.
Т.е. таки речь о пробое? Когда заходит за 200, лонг, когда падает ниже 50 - шорт. Правильно понимаю?
В этом случае да, стоп-заявки решают проблему. Но, скорее всего, встать "по точной цене" не получится. Как уже было расписано выше, либо будет проскальзывание и цена будет больше, либо встанет лимитная заявка "по точной цене" которая не будет исполнена.
Дмитрий написал: 2. Сделать фильтр базовых активов. Хотелось бы в выпадающем списке базовых активов иметь возможность отображать только актуальные для меня, а не выводить всю "портянку", пока в ней найдёшь нужный много времени пройдёт.
Можно сделать проще. Вывести в "текущие торги" нужные фьючерсы, и заякорить ее с доской. Тогда при переключении контракта в доске будут выбираться соотв. опционы. Причем, емнип, при смене контракта через якорь выбирается та же серия, что и была выбрана.
Цитата
Дмитрий написал: 4. И самое главное, что хотелось бы в первую очередь, но оставил на "закуску". Возможность добавлять контракты в таблицу "Текущие торги по Опционам" путём перетаскивания мышью из "Доски опционов" (см. скриншот). Т.е. из доски опционов берём строчку в столбце CALL определённого страйк и тянем в таблицу текущих торгов, в итоге добавляется контракт Call с соответствующим страйком и датой экспирации. Тоже самое с PUT.
Виктор Севастьянов написал: Есть такой готовый код на Lua или Qpile? Спасибо.
Вроде это не сложно сделать. Где-то тут Сергей Горохов выкладывал скрипты с примером расчётов на луа. Среди них есть расчёт Б-Ш. Методом последовательных приближений несложно вычислить волу по цене.
Сергей написал: Есть ли возможность одновременного изменения таймфрейма на всех окнах графиков в одной вкладке
Лично мне и кажется, что переключатель в тулбаре как раз и должен менять настройки всех графиков на странице. А если нужно изменить настройки отдельного графика - для этого есть отдельный пункт меню.
Антон (band) написал: Цитата Imersio Arrigo написал: Так и есть. Только счётчик уменьшается по ds:Close() .похоже нет, раз
Цитата Sergey Gorokhov написал:Соответственно и отказ от подписки в одном скрипте приведет к отказу во всем терминале и во всех скриптах.
значит ds:close может нарушить работу других скриптов.
звучит как какая-то дичь. не должно такого быть чтобы отказ в одном скрипте приводил к отказу по всему остальному терминалу.
имхо должно быть так: заказ/перезаказ в рамках одного скрипта не порождает больше потоков данных, если подписка на эту сущность уже есть, просто увеличивается счетчик. Соответственно отписка счётчик уменьшает, и если он равен нулю, то тогда и только тогда подписка физически прекращается.
предлагаю проверить это экспериментально. Например двумями скриптами.
Антон (band) написал: Как раз таки по наличию ds и может знать. удаляем ds из скрипта. уменьшаем счетчик ссылок. когда он равен 0 то происходит отписка
Так и есть. Только счётчик уменьшается по ds:Close().
Михаил Е написал: В день экспирации он ещё торгуется, на срочном рынке МБ до 18:45 этого дня,
Можно делать склейку в следующий день. Т.е. 20 был экспир, мы от склейки отказались. А 21, в ручном режиме делаем замену и склейку. Тогда получается так как вы хотите, если я правильно понимаю вопрос.
Попробуйте укрупнить таймфрейм. Скажем, до часа. Кроме того, следует понимать что RTSI это индекс, он непрерывен и может быть очень длинным. Аналогично график сбербанка часовой или дневной может быть очень длинным. Но если вы смотрите фьючерс или опцион, то его история может быть короткой. Или вы пытаетесь посмотреть большую историю на мелком (1-5мин) таймфрейме.