Женя Логинов написал: Вопрос в том, будут ли данные в ленте истории стакана, если я не видел её в стакане)
Стакан, также как и таблица текущих торгов транслируется срезами, т.е. раз в период. Если заявка исполняется сразу же то вполне возможно что она не успеет попасть в стакан.
Данные из стакана котировок
Пользователь
Сообщений: Регистрация: 23.01.2015
11.12.2018 09:52:45
Цитата
Женя Логинов написал: То есть даже для 10 бумаг нужно прописать все 10 проверок- выглядит не очень удобно. Или же есть другой способ?Спасибо
Вполне логично и правильно то что программа должна проверять поступающие ей данные, а не надеяться на пользователя. Вы же в любом случае в программе будете где то прописывать нужные Вам инструменты. Будь то таблица или просто строка со списком инструментов, но ведь будет же. Что мешает проверить есть ли входящий sec_code в этом списке?
Цитата
Женя Логинов написал: А таблица текущих параметров имёт ограничения по количеству бумаг?
Нет не имеет
Цитата
Женя Логинов написал: Можно ли в одном скрипте сочитать работу со стаканами нескольких бумаг и обращение getParamEx?
Да можно.
Данные из стакана котировок
Пользователь
Сообщений: Регистрация: 23.01.2015
11.12.2018 09:11:35
Цитата
Женя Логинов написал: Описание лабораторной установки:квик версии см. выше. Через настройки получения данных отключены все рынки кроме ФОРТС, в рынке выбран только один инструмент - фьюч сбера; выбраны параметры лучшие цены спроса и предложения, и размеры спроса и предожения. Обезличенные сделки-отключены все рынки.Таким образом, думаю я исключил получение левых данных. В терминале открыт стакан по выбранному фьючерсу.В коде я задал переменные для класса и кода бумаги. И если удалось подписаться на заданный стакан, то ду вайл...
и тем не менее, просьба выполнить рекомендацию.
Цитата
Женя Логинов написал: И такой ещё вопрос. Если я хочу подписаться на полные доски опционов по двум фьючерсам, на десяток стаканов по акциям и три десятка по облигациям- в сумме может превысить порог в 200 стаканов, про который написано в мануале по квику, или это количество установлено для рабочего места,- то как мне оптимально записать подписку на все эти стаканы, проверку их в ОнКвоут- очередью?
Это максимальное количество разрешенное конкретному пользователю. Контролирует его сервер QUIK а не рабочее место. И обойти это ограничение нельзя, только если брокер установит Вам другое ограничение.
У Вас в коде нет никакой проверки на инструмент, а значит легко может попасть цена от другого инструмента, если по нему открыт стакан в терминале или его заказал другой Lua скрипт. Для решения добавьте проверку как в примере из документации
Код
function OnQuote(class, sec )
if class =="SPBFUT" and sec == "RIZ2" then
ql2 = getQuoteLevel2(class, sec)
end
end
QLUA, вопросы начинающих.
Пользователь
Сообщений: Регистрация: 23.01.2015
05.12.2018 10:33:38
Олег, К сожалению без кода не ясно что и как у Вас происходит, следовательно и рекомендовать что либо затруднительно. Просьба предоставить исходный код скрипта.
kill inactive stop order
Пользователь
Сообщений: Регистрация: 23.01.2015
04.12.2018 14:22:07
s_mike@rambler.ru, Проблема изучается. Постараемся в ближайшее время дать ответ.
QLUA, вопросы начинающих.
Пользователь
Сообщений: Регистрация: 23.01.2015
03.12.2018 10:29:38
Олег, Просьба выложить пример кода на котором воспроизводится проблема
От какого времени вести отчет для создания своего таймфрейма?
Пользователь
Сообщений: Регистрация: 23.01.2015
30.11.2018 15:58:23
Цитата
sav 312 написал: Как мое время "10:00:50" в этот формат перевести.
Только добавить текущую дату. Хотя как сказал SDL, это явно лишнее.
От какого времени вести отчет для создания своего таймфрейма?
Пользователь
Сообщений: Регистрация: 23.01.2015
30.11.2018 13:26:31
Цитата
sav 312 написал: Если в ленте сделок просто время в секундах без привязки к дате, то этот вариант самый простой и меня устраивает.
Опять не понятно. Ощущение что мы про разные вещи говорим. Что значит с привязкой к дате? Вы боитесь что время 10:00:50 может дать результат не сегодняшней сделки а вчерашней? Или как? Если боитесь, то просто отфильтровывайте все сделки, у которых дата сделки не равна дате торгов (так фильтруются сделки вечерней сессии фортс). Все остальные сделки и так только за текущую сессию, и нет смысла проверять дату.
QLUA, вопросы начинающих.
Пользователь
Сообщений: Регистрация: 23.01.2015
30.11.2018 13:14:34
Например
Код
string.format("%.0f", StopShort.yvalue)
QLUA, вопросы начинающих.
Пользователь
Сообщений: Регистрация: 23.01.2015
30.11.2018 13:11:07
Олег, Понятно, на самом деле число у Вас не 113300.000000 а 113300.0000000001 (или как то так) Это особенность чисел с плавающей точкой (в википедии есть целая статья на тему) Для решения, Вам надо округлять число с заданной точностью
От какого времени вести отчет для создания своего таймфрейма?
Пользователь
Сообщений: Регистрация: 23.01.2015
30.11.2018 13:07:58
Цитата
sav 312 написал: время в секундах от какой-то древней даты)))
Совершенно не понятно зачем это? Будет проще если Вы приведете конкретный пример, и поясните чем не устраивает предложенный вариант.
От какого времени вести отчет для создания своего таймфрейма?
Пользователь
Сообщений: Регистрация: 23.01.2015
30.11.2018 12:22:44
sav 312, Простая математика часы умножаем на 3600 + минуты умножаем на 60 + секунды
Как получить время свечи?, Анализ индикатора
Пользователь
Сообщений: Регистрация: 23.01.2015
30.11.2018 11:49:06
Андрей, Функция T возвращает таблицу, состоящую из параметров {year, month, day, week_day, hour, min, sec, ms, count}. По этому Вы видите не то что ожидаете. Для решения надо перевести таблицу в строку. например так: T(index).hour..":"..T(index).min..":"..T(index).sec
От какого времени вести отчет для создания своего таймфрейма?
Пользователь
Сообщений: Регистрация: 23.01.2015
30.11.2018 11:39:52
Цитата
sav 312 написал: Вопрос в том, как стартовое время 10.00.50 текущего дня перевести в формат POSIX.
А почему просто не перевести время в количество секунд, и потом нормально сравнивать?
Dmitry Dimaka, Функция Get_Candle_Ex возвращает массив из линий индикатора. обратиться к нужной линии можно через Get_Collection_Item указав номер нужной линии. Пример есть в документации см "Раздел 8. Алгоритмический язык QPILE" глава "Функции для работы с графиками"
Проблемы с math.random
Пользователь
Сообщений: Регистрация: 23.01.2015
28.11.2018 06:07:54
Цитата
Виктор Столетов написал: Но что если шаг цены равен к примеру 0,5? Тогда число 78.61 следовало бы округлить до 78,5, но при p=1 оно округлится до 78,6, а при p=0 до 79. Хотя это уже мои проблемы, если найду решение, то напишу.
тогда так:
Код
function roundEX(V, P)
if math.fmod(P,1) == 0 then
if (V >= 0) then return math.floor(V * (10 ^ P) + 0.5) / (10 ^ P)
else return math.ceil(V * (10 ^ P) - 0.5) / (10 ^ P) end
else
if (V >= 0) then return math.floor(V / P + 0.5) * P
else return math.ceil(V / P - 0.5) * P end
end
end
можете переделать по своему.
Проблемы с math.random
Пользователь
Сообщений: Регистрация: 23.01.2015
27.11.2018 05:53:53
Цитата
s_mike@rambler.ru написал: -------------------------------------------------------------------- -- round (number, p = 0) -- Округление до требуемого знака. -- round(123.456,-2) = 100 -- round(123.456,1) = 123.5 -- round(123.456) = 123 function math.round(value, p)
local e = 10 ^ (p or 0) return math.floor(tonumber(value) * e + 0.5) / e end
Позвольте немного скорректировать. дело в том что при округлении отрицательных чисел, эта функция может допустить ошибку. так round(-123.55,1) вернет -123.5 а должен вернуть -123.6 или round(-123.5,0) вернет -123 а должен вернуть -124
для того чтобы избежать этого, надо немного исправить функцию для случая отрицательных чисел, вот так:
Код
function math.round(value, p)
local e = 10 ^ (p or 0)
if value >= 0 then return math.floor(tonumber(value) * e + 0.5) / e
else return math.ceil(tonumber(value) * e - 0.5) / e end
end
Дневки не совпадают с биржей., Есть ли решение?
Пользователь
Сообщений: Регистрация: 23.01.2015
22.11.2018 13:52:31
Цитата
Владимир написал: Наверно, не так задал вопрос. Перефразирую его по другому. Почему в Quik начало свечек не такое, как на сайте биржи?
Потому что QUIK умеет работать далеко не с одной биржей и ориентироваться на какую-то одну биржу мы не можем.
Что означает параметр Settings.Period, Создание технического индикатора
Пользователь
Сообщений: Регистрация: 23.01.2015
20.11.2018 11:15:33
Здравствуйте, В QUIK автор LUA индикатора может создавать какие-то свои собственные параметры. Просто автор индикатора создал такой параметр с названием Period. Ровно также он мог назвать его как угодно.
Обновление пользовательской таблицы/окна
Пользователь
Сообщений: Регистрация: 23.01.2015
20.11.2018 05:24:56
Цитата
BlackBoar написал: Допустим я то что должно отображаться буду обновлять 2 раза в секунду, моему человеческому восприятию чаще и незачем. Судя по обсуждению можно считать что точно обновится, так?
Да верно.
Цитата
BlackBoar написал: Если тема темная то заголовки действительно рисует оконный класс и SetWindowCaption действительно форсирует отрисовкуА если тема стандартная то заголовки в компетенции венды и все как обычно.
Вы правы, скрипт тестировался на темной теме.
Цитата
sav 312 написал: На другом компе со sleep 100 работает, а с SetWindowCaption также нет.
С SetWindowCaption разобрались, см выше. А вот что делать со sleep, к сожалению затруднимся что либо порекомендовать. Пока только ясно что проблема локальная и связана с конкретным компьютером, скорей всего с процессором. Но что это может быть, к сожалению идей нет.
Обновление пользовательской таблицы/окна
Пользователь
Сообщений: Регистрация: 23.01.2015
19.11.2018 14:07:55
sav 312, Хотя есть идея попросить повторить на другом компьютере, если это возможно.
Обновление пользовательской таблицы/окна
Пользователь
Сообщений: Регистрация: 23.01.2015
19.11.2018 14:06:08
sav 312, Идей нет. Пришлите нам копию Вашего терминала (без ключей доступа) на адрес quiksupport@arqatech.com
Обновление пользовательской таблицы/окна
Пользователь
Сообщений: Регистрация: 23.01.2015
19.11.2018 13:10:43
Цитата
sav 312 написал: Почему со sleep не прокатывает сам не пойму.
А он в принципе работает? Т.е. если вообще написать message("begin") sleep(100500) message("end") что произойдет?
И уточните версию терминала.
Обновление пользовательской таблицы/окна
Пользователь
Сообщений: Регистрация: 23.01.2015
19.11.2018 12:33:10
sav 312, Возможно терминал чем-то нагружен? К сожалению у нас догадки кончились. Проблема не воспроизводится.
Изначально же, суть в том что в терминале окна перерисовываются раз в 50мс. И если скриптом обновлять таблицу чаще, то она не успевает обновляться, в результате происходит эффект заморозки. Лечится это как уже говорили другие пользователи принудительной перерисовкой окна, либо увеличением sleep до значений больше 50.
У Вас всё нет так. Вы на каком коде экспериментируете? На том который Вы привели ранее, проблема не воспроизводится. Возможно кроме него что то еще запущено?
Поделитесь, кто как отслеживает факт "готовности свечи"?
Пользователь
Сообщений: Регистрация: 23.01.2015
19.11.2018 10:37:10
Цитата
sav 312 написал: Подскажите, можно ли получить "open" текущей свечи, не дожидаясь ее закрытия?
Да можно.
Обновление пользовательской таблицы/окна
Пользователь
Сообщений: Регистрация: 23.01.2015
19.11.2018 10:11:08
Цитата
BlackBoar написал: Приходит в голову попробовать SetWindowPos не меняя ни размер ни положение
Это не единственный способ, можно также использовать SetWindowCaption
Обновление пользовательской таблицы/окна
Пользователь
Сообщений: Регистрация: 23.01.2015
19.11.2018 10:01:58
sav 312, К сожалению других вариантов предложить не можем.
Обновление пользовательской таблицы/окна
Пользователь
Сообщений: Регистрация: 23.01.2015
19.11.2018 09:45:21
Цитата
sav 312 написал: Проблема будет даже при sleep (1000), проверено до обращения к вам.
Нет, это не так. Проверьте еще раз внимательней.
Цитата
sav 312 написал: У меня вопрос не в том, как затормозить скрипт, а как сделать так, чтобы данные в таблице обновлялись с каждым тиком.
Вариант уже был предложен.
Обновление пользовательской таблицы/окна
Пользователь
Сообщений: Регистрация: 23.01.2015
19.11.2018 09:34:19
sav 312, Проблема в отрисовке. И SERVERTIME тут не причем, если его заменить на os.date() то симптомы будут те же. Сделайте sleep(100) тогда проблемы не будет.
Потому что, на сайте биржи начало свечки совпадает с началом вечерней сессии. А в QUIK это начало дневной сессии
Moving Averege - уровни, Построение канала на основе Moving Averege
Пользователь
Сообщений: Регистрация: 23.01.2015
19.11.2018 05:27:18
Цитата
Andrey Malyar написал: Так какие значения надо поставить что бы появились уровни?
Какую цифру укажите на том уровне цены и будете видеть. У Вас цена на графике видна в районе от 112100 до 114500, значит и уровень Вы увидите если укажите значение в этом диапазоне.
Подсобите новичку с расчетом средней по фьючерсу., Как (где) взять инфо по сделкам на фьюче за несколько дней
Пользователь
Сообщений: Регистрация: 23.01.2015
09.11.2018 09:01:02
Здравствуйте, Для срочного рынка можно использовать параметр «Эффект. цена поз.» в таблице позиций по клиентским счетам.
Если хотите самостоятельно рассчитывать параметр, тогда придется каждый день сохранять свои сделки.
--остальной код
message("PosNow="..PosNow)
if PosNow>0 then
--остальной код
Сообщение при открытии позиции
Пользователь
Сообщений: Регистрация: 23.01.2015
08.11.2018 13:20:40
Олег, Тогда проверьте что попадает в PosNow перед if. message("PosNow="..PosNow)
Сообщение при открытии позиции
Пользователь
Сообщений: Регистрация: 23.01.2015
08.11.2018 13:05:33
Олег, Добавьте sleep(1000) в цикл while is_run do скорей всего причина в этом. По остальному коду проблема у нас не воспроизводится.
Неадекватная волатильность
Пользователь
Сообщений: Регистрация: 23.01.2015
08.11.2018 07:26:08
Здравствуйте, Так транслирует биржа. К сожалению затруднимся назвать причины, возможно к торгам подключился какой-то робот, который портит картину.
переделать индикатор в робота
Пользователь
Сообщений: Регистрация: 23.01.2015
08.11.2018 05:20:26
Цитата
Evgenia написал: Помогите понять, что ещё нужно в коде поменять?
Надо поменять всю структуру кода. Он составлен абсолютно некорректно. По простому, Вы создали кучу функций внутри функции main() и нигде ни разу эти функции не вызываете. Раз нет вызова функций то и работать они естественно не будут. Во первых, создавать функции внутри main() в данном случае является лишним, вынесите их за пределы main() Во вторых, чтобы функция сработала ее надо вызвать. Исключение только функции колбеков, которые вызывает сам терминал при наступлении соответствующих условий. У Вас сейчас в коде только один колбек OnStop. В третьих, в QUIK срипты индикаторов и для остального, это разные вещи, и то что есть в индикаторах отсутствует в обычных скриптах. в связи с чем пересекать их нельзя. Функция OnCalculate это функция индикаторов, в обычном коде она не будет работать также как в индикаторах.
В итоге, чтобы перенести код с одного ПО на другое, надо изучить оба ПО и понимать как в них надо работать. Без этого перенести код не получится.
Графики, Почему графики такими странными стали (не опытный)
Пользователь
Сообщений: Регистрация: 23.01.2015
08.11.2018 05:12:40
Здравствуйте, К сожалению из описания не понятно что именно не так с графиком. Если Вас не устраивает внешний вид графика "Бары" то Вы можете его поменять в свойствах графика на "Свечи"
Функция getBuySellInfo все время возвращает nil
Пользователь
Сообщений: Регистрация: 23.01.2015
07.11.2018 05:14:53
Дмитрий Минеев, 10260 - это код клиента на фондовой секции, а не на срочной. SPBFUT000000 - это фирма срочной секции. Нельзя по фирме срочной секции получить данные по коду клиента от фондовой секции. Если по простому, откройте в терминале таблицу Купить/продать (из таблицы Клиентский портфель) и посмотрите что там написано и сделайте также.
Так по акциям, для нашего демо, строка будет следующей: result = getBuySellInfo("NC0011100000", "10260", "QJSIM", "LKOH", 0)
Рублёвый объём позиции фьючерсов с долларовыми пунктами, График рублёвой цены фьючерса по графикам фьючерса на индекс РТС и на курс доллара к рублю
Пользователь
Сообщений: Регистрация: 23.01.2015
06.11.2018 13:41:07
Цитата
Ростислав Дм. Кудряшов написал: После переноса строк local tbl1 = и tbl2 == из блока if not FirstValid ...
А зачем надо было переносить строки? Видимо перенесли строки и по этому предложенный код не работает. посмотрите как оно должно было быть
Скрытый текст
Код
-- Перемножает Close'ы графиков RI на Si
-- При запуске на загрузке Quik'а работает код предыдущей загрузки
-- с последними свойствами, полученными из кода или интерактивно.
-- При запуске старые бары графика данных сканируются дважды,
-- только если есть подключение к серверу.
-- При смене тайм-фрейма старые бары сканируются только единожды.
-- При загрузке Quik'а первый скан до подключения к серверу.
FirstValid = nil
Settings = {
Name = "_RIxSi"
,line = {
{Name = "RIxSi"
,Color = RGB(255,255,0) -- Жёлтый
,Type = TYPE_POINT
,Width = 2}
}
,GraphId1 = "RI-1" -- Перезадать оба после первой загрузки.
,GraphId2 = "Si-1" -- Сохраняются при последующих запусках.
,Factor = 2e-5
}
function Init()
return #Settings.line
end -- Init()
function CalcIt (index)
local tbl1 = getCandlesByIndex (Settings.GraphId1, 0, index-1, 1)
local tbl2 = getCandlesByIndex (Settings.GraphId2, 0, index-1, 1)
if tbl1[0].close == 0 or tbl2[0].close == 0 then
return nil -- Пропускаем бары с неполными данными.
end
local sum = tbl1[0].close * tbl2[0].close * Settings.Factor
return sum
end -- CalcIt()
function OnCalculate(index)
if index == 1 then
FirstValid = nil
end
if (0 == getNumCandles (Settings.GraphId1) or
0 == getNumCandles (Settings.GraphId2)) then
if index == 1 then
message ("GraphId error")
end
return nil
end
if not FirstValid then
local tbl1 = getCandlesByIndex (Settings.GraphId1, 0, index-1, 1)
local tbl2 = getCandlesByIndex (Settings.GraphId2, 0, index-1, 1)
if #tbl1 == 0 and #tbl2 == 0 and Size()==index then
for idx = 1, index-1 do
SetValue (idx, 1, CalcIt (idx))
end
end
if tbl1[0].close ~= 0 and tbl2[0].close ~= 0 then
FirstValid = index
local count = getNumCandles (Settings.GraphId1)
if FirstValid == count then
for idx = 1, index-1 do
SetValue (idx, 1, CalcIt (idx))
end
end
end
end
return CalcIt (index)
end -- OnCalculate()
Цитата
Ростислав Дм. Кудряшов написал: видно, что колонка второго исходного графика даёт нулевые close().,
Это не дает никакой новой информации, проблема и так предельно ясна, лишний раз ее показывать нет смысла.
Рублёвый объём позиции фьючерсов с долларовыми пунктами, График рублёвой цены фьючерса по графикам фьючерса на индекс РТС и на курс доллара к рублю
if #tbl1 == 0 and #tbl2 == 0 and Size()==index then
for idx = 1, index-1 do
SetValue (idx, 1, CalcIt (idx))
end
end
Рублёвый объём позиции фьючерсов с долларовыми пунктами, График рублёвой цены фьючерса по графикам фьючерса на индекс РТС и на курс доллара к рублю
Пользователь
Сообщений: Регистрация: 23.01.2015
06.11.2018 08:12:01
Цитата
Ростислав Дм. Кудряшов написал: В работе Quik без подключения к серверу при смене тайм-фрейма наблюдается такая аномалия, что значения котировок close() и т.п. для второго графика Settings.GraphId2 оказываются все нулевые. Это делает невозможным построение графика по двум другим сразу после смены тайм-фрейма. Для получения графика нужно открыть его диалог "Редактирование настроек графика" и нажать кнопку "OK".
Уточните версию терминала QUIK
Как рисуется прямоугольник.?, Квик, линии, фигуры, Qlua, Quik,
Пользователь
Сообщений: Регистрация: 23.01.2015
06.11.2018 06:14:37
Цитата
RayIntraday написал: Это некие элементы рисунка, которые добавляются на график или это просто соединённые линии которые по сути есть код?
Рисуется кодом.
Цитата
RayIntraday написал: Подскажите как правильно написать код, который будет добавлять на график ежечасно прямоугольник, размером от хая до лоя, ограниченный начальной и конечной свечкой часа. Если открылся на хаях и закрылся на лоях, то отрисовывается красным, если открылся на лоях и закрылся на хаях, то соответственно зелёный.
В Lua это возможно только через механизм меток см функцию AddLabel
Отображение идентификатора графика в сообщении
Пользователь
Сообщений: Регистрация: 23.01.2015
31.10.2018 06:51:54
Evgenia, Если условие if не срабатывает, проверьте что попадает в это условие, т.е. какие значения у t[0].low, t[1].low, t[1].high, t[1].close и остальные.