И еще одно уточнение - 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?