s_mike@rambler.ru пишет: Но если уже на то пошло, то имея на руках алгоритм работы условной стоп-заявки на сервере брокера, узнать можно. Тут сработает тейк-профит. Однако это сокровенное знание не является документированным.
Без анализа движения цены разве можно так утверждать?
Надо делать так, как надо. А как не надо - делать не надо.
Следует читать так: sam063rus, правильно я понимаю, что вас интересует количество сделок за последнюю секунду? Если так, то сбрасывайте счётчик только, когда секунды в сделке увеличиваются. Если пришла сделка с сильным запаздыванием - просто проигнорируйте её.
Надо делать так, как надо. А как не надо - делать не надо.
sam063rus, правильно я понимаю, что вас интересует количество сделок за последнюю минуту? Если так, то сбрасывайте счётчик только, когда время сделки увеличивается. Правда, и в этом случае, могут быть сбои, потому как время сделок на разных секциях может отличаться на секунды.
Надо делать так, как надо. А как не надо - делать не надо.
sam063rus пишет: я к тому, что одно дело когда они (сделки/данные) приходят для всяких таблиц и совершенно другое когда вдобавок это ещё влияет на приход коллбеков, что мне совершенно не нужно.
Ну, как бэ, да. Приход новых данных (в т.ч. и сделок) вызывает колбек. Во всех скриптах, где он (колбек) используется. Так было всегда. Если колбек не нужен в конкретном скрипте, просто игнорируйте его или не используйте функцию колбека.
Надо делать так, как надо. А как не надо - делать не надо.
Дмитрий пишет: А где об этом написано? Или это следует из того, что OnInit и колбеки выполняются в основном потоке терминала, поэтому пока не отработает OnInit ничего другое выполняться не будет?
OnInit и колбеки выполняются последовательно в основном потоке терминала, поэтому пока не отработает одна функция остальные свою работу не начнут.
Цитата
Дмитрий пишет: И, насколько я понимаю, в вашем варианте для новых свечей, которые успеют добавиться в источник данных за время от начала до конца работы цикла, колбэк уже не будет вызван никогда, т.е. они выпадут из обработки.
Где-то тут на форуме сотрудники техподдержки отвечали, что, если один колбек выполняется длительное время, то остальные колбеки встают в очередь и после завершения первого продолжают обрабатываться.
Но вот вопрос, который требует разъяснения: Поскольку колбек регистрируется после полного выполнения цикла for i = 1, ds:Size() не получится ли так, что те изменения свечей, что поступят в терминал во время этого цикла, действительно не вызовут колбека?
Поэтому я соглашусь с вами:
Цитата
Дмитрий пишет: Поэтому ds:SetUpdateCallback(GetPrice) наверное лучше поместить до цикла чтения свечей из источника данных.
Всё равно таблица Candles по старым свечам в OnInit будет заполнена до вызовов колбеков.
Надо делать так, как надо. А как не надо - делать не надо.
function OnInit(script_path)
ds = CreateDataSource(ClassCode, SecCode, Interval)
local function GetPrice(index)
Candles[index] = ds:C(index)
end
for i = 1, ds:Size() do GetPrice(i) end
ds:SetUpdateCallback(GetPrice)
end
Надо делать так, как надо. А как не надо - делать не надо.
Дмитрий пишет: По-моему, правильней было бы написать так
Да, при перепечатывании на форум "накосячил". Надо так:
Код
function OnInit(script_path)
ds = CreateDataSource(ClassCode, SecCode, Interval)
local function GetPrice(index)
Candles[i] = ds:C(i)
end
for i = 1, ds:Size() do GetPrice(index) end
ds:SetUpdateCallback(GetPrice)
end
ds должна быть объявлена до её использования в функции GetPrice
Цитата
Дмитрий пишет: Поэтому ds:SetUpdateCallback(GetPrice) наверное лучше поместить до цикла чтения свечей из источника данных.
У меня в функции GetPrice, помимо получения цены, идёт ещё расчёт значений индикатора, которые должны вычисляться по порядку.
Цитата
Дмитрий пишет: Есть еще правда ненулевая вероятность того, что пока будет выполняться циклfor i = 1, ds:Size() doс сервера успеют поступить новые свечи, которые не были учтены ранее в ds:Size().
Поэтому я и поместил всё это дело в OnInit. В этом случае колбеки будут вызываться только после выхода из функции OnInit.
Надо делать так, как надо. А как не надо - делать не надо.
Николай Камынин пишет: надо не со sleep играть, а колбек использовать.
Да, вы правы. С помощью CreateDataSource получаем уже загруженные на текущий момент данные, а в колбеке новые:
Код
function OnInit(script_path)
ds = CreateDataSource(ClassCode, SecCode, Interval)
local function GetPrice(index)
for i = 1, ds:Size() do
Candles[i] = ds:C(i)
end
end
ds:SetUpdateCallback(GetPrice)
end
Правда, чтобы между for i = 1, ds:Size() do и ds:SetUpdateCallback ничего не потерять пришлось запихать это всё в OnInit. А поскольку функция CreateDataSource работает очень медленно, при большом количестве запрашиваемых бумаг/интервалов получаем нехилую задержку на старте. :(
Цитата
sam063rus пишет: а можно поинтересоваться для чего это?
Чтобы рассчитать индикатор. Любой, даже тот что уже есть в QUIK. Мы можем поступить двумя способами:
1) Открыть график по интересующей бумаге, выставить нужный таймфрейм, наложить индикатор, задав нужные параметры. И с помощью getCandlesByIndex получать значения индикатора с графика. Ах, да, забыл: надо задать ещё идентификатор графика. При большом числе бумаг/таймфреймов/параметров индикатора эту процедуру нужно проделывать множество раз.
2) Вариант второй. Написать один раз скрипт для получения цен по любой бумаге/таймфрейму и расчёта индикатора, как функции от параметров. И применять без необходимости открывать сам график.
Если нужного индикатора в QUIK нет, то остаётся только вариант 2.
Надо делать так, как надо. А как не надо - делать не надо.
Алексей Дуванов пишет: В КВИКе есть такой баг или фича как не назови, который помогает рисовать идеально горизонтальные отрезки.
Да ладно! :) Это обязательно нужно внести в документацию.
Алексей Дуванов, я прямо слышу, как благодаря вам тысячи российских трейдеров облегчённо выдохнули: ну наконец-то мы сможем рисовать в Квике горизонтальные линии. Теперь бы им добавить прилипание к базовым точкам свечей (O,H,L,C)
Надо делать так, как надо. А как не надо - делать не надо.
Чё-то у вас всё смешалось... t[1],t[2]={},{} как были пустыми таблицами, так и остались. Ссылка не есть равенство. Если вы удалите с, то с t[1] и t[2] ничего не произойдёт.
Цитата
Николай Камынин пишет: Если нужна копия таблицы, то надо делать явно через цикл.
Т.е, достоинство Lua является её же недостатком.
Надо делать так, как надо. А как не надо - делать не надо.
ds = CreateDataSource (ClassCode, SecCode, Interval)
for i = 1, ds:Size() do -- не уверен, что тут нумерация начинается с 1, а не с 0
Candles[i] = ds:C(i)
end
А потом продолжать брать данные из колбека.
Да, я совсем забыл, что CreateDataSource возвращает таблицу data_source :)
Цитата
Дмитрий пишет: не уверен, что тут нумерация начинается с 1, а не с 0
Тут нумерация идёт с 1. Только я написал:
Код
ds = CreateDataSource (ClassCode, SecCode, Interval)
repeat sleep(1) until ds:Size() ~= 0 -- тут надо поиграть с задержкой
for i = 1, ds:Size() do
Candles[i] = ds:C(i)
end
Надо делать так, как надо. А как не надо - делать не надо.
Задача: рассчитать индикатор по данным с графика. Устанавливаем колбек CreateDataSource(ClassCode, SecCode, Interval):SetUpdateCallback(fCB). В ответ приходят данные всех свечей с графика, по которым заполняем таблицу Candles[index].
Но! Если открыт график по данной бумаге, то в колбек приходят только данные с момента установки колбека.
Решение? (getCandlesByIndex не интересует)
Надо делать так, как надо. А как не надо - делать не надо.
green_X5 пишет: Сегодня например с утра выдавал жуткие данные по инструментам с утра
Цитата
green_X5 пишет: но пожалуй нужно в скрипты ещё кучу защит от такого идиотизма брокерских серверов прописывать
Не могли бы вы подробней написать, что там жуткого выдавалась? Я, конечно, стараюсь везде ставить проверку на соответствие адекватным значениям, но вдруг чего-нить пропустил.
Надо делать так, как надо. А как не надо - делать не надо.
Michael Bulychev пишет: Выполнение функции sinsert заблокирует выполнение кода в другом потоке до окончания работы функции.
Давайте, чтобы не было разночтения сформулируем более точно. Выполнение функции sinsert заблокирует выполнение кода в другом потоке до окончания работы функции в любом случае или только при обращении из другого потока к таблице, модифицируемой sinsert? Другими словами, sinsert приостанавливает выполнение другого потока в любом случае или нет?
Надо делать так, как надо. А как не надо - делать не надо.
Michael Bulychev пишет: Для этого были сделаны потокобезопасные функции - получить доступ к таблице можно лишь после завершения их работы.
Поподробнее пожалуйста. Это значит, что при обращении к таблице из другого потока текущая операция будет приостановлена до окончания обновления таблицы?
Надо делать так, как надо. А как не надо - делать не надо.
Измените также алгоритм построения окна таблицы. А то сейчас при необходимости задать размер/положение окна оно перерисовывается минимум 3 раза (!): При вызове функции CreateWindow на экране сначала появляется окно стандартного размера в произвольном месте (1-й раз). Затем это окно изменяет свои размеры, подстраивая ширину под суммарную ширину колонок. При этом оно также изменяет своё положение (2-й раз). И 3-й раз окно перерисовывается при задании положения окна функцией SetWindowPos.
Зачем CreateWindow вырисовывает окно 2 раза? И почему нельзя задать координаты окна функцией SetWindowPos до его отображения CreateWindow?
Надо делать так, как надо. А как не надо - делать не надо.
Роман пишет: Ну вот к примеру РТС часовик свеча 14:00 14.10.2014 и 15:00 14.10.2014 - ну вот кудо Ло 1073.12 делось, и почему 10:00 10.10.2014 - опен 1078,07 а не 1081,44
Что интересно, у меня не совпадает с вашими значениями:
Zoya Vdovina пишет: Не могли бы Вы визуализировать проблему, например снять видео эффекта
Дмитрий достаточно подробно описал последовательность действий, чтобы вы могли их повторить для воспроизведения ситуации. У меня это получилось с первого раза. ;-) Zoya Vdovina, не могли бы вы визуализировать последовательность ваших действий, например снять видео эффекта и выложить на файлобменнике/в облаке, чтобы мы могли бы понять ваши ошибки и помочь вам научиться воспроизводить ситуации по чётко описанному алгоритму действий?
Надо делать так, как надо. А как не надо - делать не надо.
Я хочу сказать, что, если время на торговых площадках биржи не синхронизировано, то это - повод для судебного разбирательства. Поэтому этот вариант, как наименее вероятный я отметаю. Так что вернёмся к вопросу:
Цитата
Серж пишет: Получается сервер брокера получает сделки с задержкой, как минимум, в 2 сек по одной из площадок? Или шлюз брокера?
Как такое может быть? 2 сек задержки на сервере (шлюзе) брокера - это достаточно много.
Надо делать так, как надо. А как не надо - делать не надо.
Sergey Gorokhov пишет: На сервере, таблица всех сделок хранится в соответствии с порядком получения записей, каждой записи присваивается порядковый номер в хранилище.Ровно этот порядковый номер затем и используется на клиентском месте при отображении всех-сделок.
Т.е., вместе со сделкой на клиентское место передаётся её порядковый номер в хранилище сервера? Раннее вы писали:
Цитата
Sergey Gorokhov пишет: да нет там никакой обработки, все льется в том порядке как пришло с биржи.
Получается, что на клиентском месте в ТВС обработка всё-таки осуществляется? Но для Lua-скрипта это не имеет никакого значения. В Lua можно только самостоятельно отсортировать по номеру сделки в рамках одного класса и по времени по нескольким классам.
Надо делать так, как надо. А как не надо - делать не надо.
Sergey Gorokhov пишет: По номеру и по времени, НО в разрезе класса.
В разрезе класса достаточно сортировки по номеру сделки. Или нет? А как сортируются сделки в визуальной таблице, по разным классам? Почему в примере #7 сделка со временем 23:49:43 вклинилась в между сделками со временем 23:49:51?
Дмитрий пишет: физический номер строки, на который ссылаемся при обращении к таблице всех сделок с помощью функции getItem
В таблице Lua "all_trades" при докачке данных (если не использовать функцию "Получить заново данные по всем сделкам") новые сделки добавляются в конец таблицы. Те, что были в таблице остаются на своих местах.
Надо делать так, как надо. А как не надо - делать не надо.
В визуальной Таблице всех сделок, очевидно, сделки сортируются по номеру сделки. В этом можно наглядно убедиться заказав сначала все сделки по одной (нескольким) бумаге, а через некоторое время после заполнения ТВС заказав все сделки ещё по другой (другим) бумаге.
Надо делать так, как надо. А как не надо - делать не надо.
Ошибка будет исправлена в одной из следующих версий программы
Мне интересно, что тут можно исправить, если время "сбрасывается" при смене торговой даты, которая в свою очередь меняется при перезагрузке сервера? Не вижу никаких проблем в использовании того формата времени, что есть сейчас, наоборот даже удобство: 1) Если время > 23:50 - значит торги уже закончились 2) Если время < 09:30 - значит начался новый торговый день, но торги ещё не начались
Надо делать так, как надо. А как не надо - делать не надо.
Sergey Gorokhov пишет: Это не ошибка, так как согласно документации QTABLE_DEFAULT_COLOR работает только для SetColor
Называйте, как хотите. Но факт, что Highlight не доработана. Пусть QTABLE_DEFAULT_COLOR работает в Highlight, как в SetColor.
Цитата
Sergey Gorokhov пишет: зарегистрировали пожелание на функцию GetColor которая бы возвращала текущий цвет ячейки и шрифта.
GetColor - это, возможно, хорошо. Но было бы неплохо добавить константу, которая бы избавила от необходимости перекрашивать белый цвет в белый (или любой другой), если нужно изменить только цвет фона или текста. Что положительно скажется на производительности.
Надо делать так, как надо. А как не надо - делать не надо.
Исправьте также ошибку привязки меток исключительно к левой оси, независимо от того, к какой оси привязан график с идентификатором, для которого выставляется метка: http://forum-archive.quik.ru/forum/lua/101953/124054/
Надо делать так, как надо. А как не надо - делать не надо.
Если в качестве цвета задана константа QTABLE_DEFAULT_COLOR, то используется цвет, заданный в цветовой схеме операционной системе Windows.
Значит черный цвет задан в системе Windows
Sergey Gorokhov, вы (и часто ваши коллеги) ведёте себя непрофессионально, когда отмахиваетесь от проблем, даже не пытаясь разобраться в ситуации и выдумывая факты, которых нет.
Я так и сделал. Но вы заметили, что я нигде не писал, что цвет фона по-умолчанию задан белым цветом? Ну да ладно...
1) Исправьте ошибку: чтобы при использовании константы QTABLE_DEFAULT_COLOR для фона в функции Highlight цвет фона окрашивался в дефолтное значение 2) Добавьте константу для функций SetColor и Highlight, при использовании которой текущий цвет элемента не менялся бы. Т.е., чтобы не было необходимости запоминать текущий цвет при необходимости изменить только цвет текста или фона.
Данные доработки не являются высоко приоритетными и срочными.
Надо делать так, как надо. А как не надо - делать не надо.
Мы создали таблицу. Цвет фона при этом оставили по-умолчанию. Затем, надо подсветить текст в ячейке (или строке целиком) функцией Highlight, не меняя цвет фона. Как это сделать?
Надо делать так, как надо. А как не надо - делать не надо.