Не понял про параметр с общим количеством. Но если в оборот в ТТТ добавляются еще какие-то сделки, то тогда c Volume все в порядке и можно ориентироваться только на него, не беря оборот во внимание.
Объем 12 714 425, лотность 1, цена хай 72,77, перемножаем = 925 243 261, 25. И это завышенная сумма в деньгах, т.к. весь объем посчитан по хаю. Оборот в ТТТ = почти 6 лярдов.
У меня оборот при подсчёте по объему в разы меньше оборота из ТТТ, поэтому когда я беру хай по цене, то я увеличиваю расчетное значение, но оно все равно на порядок меньше. Т.е. вопрос почему меньше, а не больше
Добрый день, отцы! Помогите, пожалуйста, разобраться с тем, как соотносится показатель Volume у свечи и оборот. Например, сегодня, у Сбера на дневной свече Volume 106604, а оборот 601,2 ляма. Т.е. 106604 лотов х 10 бумаг х 310 = 330,5 лямов. И так везде не бьётся. В приложении у финама по торгам показывается соответствующая оборотк цифра объема 1,94 млн. Причем Volume на дневной свече там 1066к, т.е. как бы 1+ млн лотов.
Пока не тестировал, т.к. ещё не реализовал. Структуру объема пока нужна как доп.фильтр, но в целом тут возможно получится и сигналы находить,. В любом случае анализ объема в моей стратегии это 50% сигнала. Понятно, что если свеча полнотелая, то тут преобладает одно направление, а если нет. И тут ведь без разницы на каком тф идёт торговля, т.е. кроме как по тикам структуру объема негде взять. Возможно это где то будет избыточной информацией, но кашу маслом не испортишь.
Изначально я так и хотел, но чисто технически нет понимания как это сделать правильно. Например можно отделить историю от текущих данных по trade_num от первого коллбека при соединении, но если они приходят блоками, то я так понимаю нет гарантии, что первый коллбек самый ранний. Тогда действительно понятнее работать только с таблицей через getitem, опрашивая циклически от последнего getnumberof до текущего. Или нет?
Код
Поэтому лучше при соединении, историю забрать из таблицы, а текущие данные получать из колбека.
Мне нужно считать структуру объема, дельту соответственно, ловить крупные сделки. Может так и надо брать данные из таблицы, запоминая последний индекс и собирая данные от него и до конца таблицы. Searchitems не вариант, он фактически проходит по всей таблице, а это долго, т к. в ней несколько млн записей, а то и десятков млн, а данные нужны в постоянном режиме. Поэтому надеялся на параллельный поток, который постоянно будет накапливать нужные данные.
Добрый день, уважаемые отцы-основатели! Помогите разобраться с поступлением данных от OnAllTrade. Действительно ли все коллбеки от этой функции срабатывают когда бы не открыл терминал, т.е. с самого начала и до текущей секунды. Пример, открыл терминал в 10, в таблицу all_trades закачались все данные, соответственно сработали коллбеки. Потом закрыл терминал и открыл его в 15 часов. При этом в таблице данные, что закачались утром уже есть, таблица дополняется данными до текущего времени, а коллбеки приходят с самого начала, т.е. с 06:59 примерно. Т.е. когда бы не открыл терминал могу ли я быть уверен, что по коллбеку OnAllTrade соберу все данные за день?
И все же нет ясного понимания. Понял так, что в таблице ОС мы видим сделки по рыночным заявкам. Но вот например идут сплошняком покупки, при этом цена снижается, хотя должна или стоять на месте или расти. Как понимать такое явление?
Доброго времени! Помогите, пожалуйста, разобраться что такое обезличенные сделки и какие требования к компу. 1. Что есть продажа и покупка в обезличенных сделках. Ведь кто-то продал, а кто-то купил, но сделки разделяются на покупки и продажи. Так что же показывается в таблице ОС в качестве покупки и продажи. 2 Возможно ли получать из таблицы сделки скажем по 30 инструментам, например акциям и какие системные требования это предъявляет к ПК? Или можно даже не пробовать и при таком подходе Квик просто будет висеть и не сможет работать в таком режиме.
И еще одно уточнение - getItems по возвращенным индексам выдает правильные строки из таблицы, но если смотреть глазами в таблицу в терминале, то не бьется на 1. Загадка.
Доброго времени, отцы! Снова ламерский вопрос, прошу прощения. Отбираю заявки с помощью SearchItems, получаю массив индексов и он не бьется с таблицей заявок на 1. Т.е., например, получаю индексы 22, 23, 25, а на самом деле это 23, 24, 26. В чем может быть проблема?
На всякий случай вот код, отбирает по этому условию верно, а индексы возвращает с ошибкой на 1
Код
t1 = SearchItems ("orders", 0, getNumberOf ("orders")-1, function(par1,par2) if par1 == "ROSN" and bit.band(tonumber(par2), 1) > 0 then
return true else return false end end , "sec_code,flags,price")
А есть где почитать и главное увидеть элементарный пример постановки коллбека в очередь, в интернете именно такого примера не нашел. Могу только предположить, что в коллбеке поступившие данные пишутся в массив, который обрабатывается в main.
Куда же сохранять информацию о сделках, заявках, если не в файл. В терминале ее на следующий день нет, а мне важно понимать когда именно возникла позиция, от этой задачи все и пошло. Могу предположить, что в какую-нибудь базу данных, но это же тоже файл.
Можно ли обойтись перебором таблиц если предположить, что в реальной ситуации более 1000 сделок в день не будет.
И самое главное по поводу таблиц, запоминания и скорости. Пока я делаю так - в текстовый файл пишу номера ордеров сделок, затем когда перебираю таблицу сделок беру в рассмотрение те номера, которых нет в файле, но таблица сделок перебирается вся.
nikolz, Nikolay спасибо отцы! Буду грызть. Но как же не использовать sleep в main? Разве тогда квик не зависнет от постоянных действий? Какой sleep можно считать долгм? 200-300 не долгий? Т.е. если коллбек приходит во время sleep, то он может быть проигнорирован main и то, что должно быть сделано в этом коллбеке сделано не будет?
И еще простейший вопрос, который сложно проверить на практике. Если заявка исполняется частями, то у каждой сделки по этой заявке будет свой trade_num?
Что касается таблиц, то с одной стороны проще, но с другой надо запоминать какие сделки уже учтены в позиции, какие новые, хоть это и не сложно сделать. Допустим скрипт остановился и нужно восстановить позиции. У меня в файле записаны позиции, потом я их обновляю через разбор таблицы сделок. Но если в течении дня потребуется несколько раз их восстановить, то без отдельной записи сделок дня невозможно будет понять, какие из них уже учтены в позиции, а какие нет.
Да, но я спрашивал несколько другой аспект. Что лучше обрабатывать для ведения позиции коллбеки или таблицы, учитывая ненадежность коллбеков? Если и то и то, то нужно это все постоянно приводить к одному, а если исходить, что первоисточник это таблица и сверяемся с ней, то зачем обрабатывать коллбек. Разве что коллбек может придти раньше обновления таблицы, но эта нано разница не играет роли.
onTransReply тоже можно в источнике посмотреть, но тут кажется дешевле коллбек обработать. Можно и с заявками и сделками тоже дешевле? Ведь по итогу дня может быть и 1000 заявок и сделок и каждый раз дергать таблицу это замедление работы? Но опять таки если все равно с таблицей нужно сверяться, не очень понятна логика.
"Запустил скрипт - просканировал сделки и убедился, что запомненная позиция корректна с точки зрения количества. " Если у нас эталон это источник данных, то тогда зачем нужны коллбеки, когда всегда можно посмотреть в таблицу сделок и снять состояние. Тем более, если мы доверяем источнику, то если запомненная позиция отличается, то что, мы ее приводим в соответствие источнику? Тогда зачем запоминать. На поверхности разница только в том, что колбеки в идеале приходят по факту изменения позиции, а смотреть нужно руками в какое-то время, как минимум перед действием (входом/выходом из позиции) при завершении работы скрипта в конце дня, чтобы зафиксировать сделки и обновить позицию. Но опять таки вопрос, зачем нагружать скрипт дерганием по коллбекам? Допустим отправку транзакции нужно фиксировать, а onTransReply обрабатывать, если вдруг ошибка. А результаты onOrder и OnTrade по идее должны отражаться в таблицах, может чуть чуть позже, но не суть. Так все же какой сакраментальный смысл в их обработке?
Спасибо за ответы, отец! разбираюсь с обработкой коллбэков по заявкам, onTransReply, onOrder, onTrade. При этом есть коллбэки на изменение позиций по деньгам и инструментам. Т.е. если у нас выставилась заявка значит изменилась позиция по деньгам, т.к. заблокировался объем, если прошла сделка, значит изменилась позиция по депо. А что если использовать эти коллбэки и смотреть в соответствующие таблицы для подбития баланса. В моих целях отслеживание коллбэков по заявкам нужно для понимания именно позиций по деньгам и инструментам, чтобы например не накупить лишнего, не превысить лимиты робота, не попасть на маржинальную позицию. Что думаете и как обстоят дела в реальности с этими коллбэками?
Отцы, с праздниками! Посоветуйте, пожалуйста, есть ли возможность в квике возможность связать сделку с позицией, а именно узнать время образования позиции? Т.е. у меня задача закрыть позицию не позднее 3 свечей от свечи, когда прошла сделка. Можно ли в квике как-то понять, что имеющаяся позиция возникла тогда-то и во столько?
По ссылке написано "учитывать, что при расчете индикаторов первые значения (1 .... Период расчета индикатора - 1)-- обычно nil"
Да, так и есть, после периода пошли значения. Но тогда вопрос зачем такой алгоритм, ведь нужно то значение если не на последней, то на предпоследней и близких свечах, а зачем нужно значение индикатора 20 или 50 свечей назад непонятно. Тем более, что все данные для расчета есть, терминал прекрасно индикатор строит. Непонятно.
Также есть вопрос по параметру Interval в функции CreateDataSource. Его типа по документации Number, т.е. числовой, при этом он передается через константы, например INTERVAL_H1. А как его передать через переменную?
Отцы, помогите, пожалуйста, разобраться с еще одним ламерским вопросом.
В блоке MAIN у меня создается источник данных (ДС): ds["NLMK"] = CreateDataSource("TQBR", "NLMK", INTERVAL_D1)
Далее мне нужно в функции обращаться к нему, но не напрямую, а присвоив его локальному дс: local dsf = ds["NLMK"], т.е. чтобы можно обращаться через dsf:C(i).
Вопрос: если так сделать, не повлечет ли это за собой то, что терминал будет обновлять кучу копий датасорсов (которые будут созданы в функциях) и это потребует ресурсов, трафика и т.п. Это и не требуется, достаточно чтобы обновлялся основной, а тот, что в функции берется для анализа исторических данных и после отработки функции он не нужен. И еще вопрос - после выполнения функции ее локальные переменные "разинициализируются" (обнуляются в памяти)? Если так, то тогда и вопрос решается сам собой.
Не совсем понимаю с практической точки зрения, т.к. ds2 может и то, что Вы пишите, но и место хранения данных тоже, т.к. туда же пишутся заказанные данные и обращаясь к ds2 эти данные можно читать. Вопрос связан с тем, что нужно ли повторно заказывать данные в ds2 если связь рвется, не закрывается ли при этом ds2, не рвется ли эта связь ds2 с сервером.
Создан источник данных ds2 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1), данные получены, обновляются. Через 10 минут происходит разрыв соединения. Еще через 10 минут соединение восстанавливается. Вопрос: данные в ds2 продолжат поступать или для этого нужно снова вызвать ds2 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1)?
Тогда все же вопрос разработчику с отсылкой к документации, которая размещена на сайте. А именно речь про SetUpdateCallback, SetEmptyCallback, эти функции работают? Не знаю правильно ли понимаю, но понимаю так, что если эти функции работают, то однажды вызвав CreateDataSource он обновляется без его повторного вызова или это не так?
Пример: после вызова ds2 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1) будет ли через минуту в ds2 новая свеча, через 5 минут 5 новых свечей или нет? Или чтобы они там появились надо снова выполнить вызов CreateDataSource? Или же эти методы обновляют только последнюю незакрытую свечу, которая уже оказалась в наборе с первым вызовом или вообще ничего не обновляется?
Заранее прошу прощения за вероятно избитую тему с CreateDataSource, но огромная просьба помочь разобраться новичку.
Нужно в течении всего дня постоянно получать данные по свечам. Где-то раньше читал, что не требуется при этом повторно вызывать CreateDataSource, а можно просто обращаться к его функциям (т.е., ds:C(index)). Или же все таки требуется? Или для того, чтобы не обращаться должен быть настроен какой-то колбек. Но пишут SetEmptyCallback уже бесполезен, SetUpdateCallback не работает с 2021 года. Т.е. нужно каждый раз в бесконечном цикле вызывать CreateDataSource? Или все таки не нужно? А если бумаг будет 200?