Женя Логинов написал: Вопрос в том, будут ли данные в ленте истории стакана, если я не видел её в стакане)
Стакан, также как и таблица текущих торгов транслируется срезами, т.е. раз в период. Если заявка исполняется сразу же то вполне возможно что она не успеет попасть в стакан.
Женя Логинов написал: То есть даже для 10 бумаг нужно прописать все 10 проверок- выглядит не очень удобно. Или же есть другой способ?Спасибо
Вполне логично и правильно то что программа должна проверять поступающие ей данные, а не надеяться на пользователя. Вы же в любом случае в программе будете где то прописывать нужные Вам инструменты. Будь то таблица или просто строка со списком инструментов, но ведь будет же. Что мешает проверить есть ли входящий sec_code в этом списке?
Цитата
Женя Логинов написал: А таблица текущих параметров имёт ограничения по количеству бумаг?
Нет не имеет
Цитата
Женя Логинов написал: Можно ли в одном скрипте сочитать работу со стаканами нескольких бумаг и обращение getParamEx?
Женя Логинов написал: Описание лабораторной установки:квик версии см. выше. Через настройки получения данных отключены все рынки кроме ФОРТС, в рынке выбран только один инструмент - фьюч сбера; выбраны параметры лучшие цены спроса и предложения, и размеры спроса и предожения. Обезличенные сделки-отключены все рынки.Таким образом, думаю я исключил получение левых данных. В терминале открыт стакан по выбранному фьючерсу.В коде я задал переменные для класса и кода бумаги. И если удалось подписаться на заданный стакан, то ду вайл...
и тем не менее, просьба выполнить рекомендацию.
Цитата
Женя Логинов написал: И такой ещё вопрос. Если я хочу подписаться на полные доски опционов по двум фьючерсам, на десяток стаканов по акциям и три десятка по облигациям- в сумме может превысить порог в 200 стаканов, про который написано в мануале по квику, или это количество установлено для рабочего места,- то как мне оптимально записать подписку на все эти стаканы, проверку их в ОнКвоут- очередью?
Это максимальное количество разрешенное конкретному пользователю. Контролирует его сервер QUIK а не рабочее место. И обойти это ограничение нельзя, только если брокер установит Вам другое ограничение.
У Вас в коде нет никакой проверки на инструмент, а значит легко может попасть цена от другого инструмента, если по нему открыт стакан в терминале или его заказал другой Lua скрипт. Для решения добавьте проверку как в примере из документации
Код
function OnQuote(class, sec )
if class =="SPBFUT" and sec == "RIZ2" then
ql2 = getQuoteLevel2(class, sec)
end
end
Олег, К сожалению без кода не ясно что и как у Вас происходит, следовательно и рекомендовать что либо затруднительно. Просьба предоставить исходный код скрипта.
sav 312 написал: Если в ленте сделок просто время в секундах без привязки к дате, то этот вариант самый простой и меня устраивает.
Опять не понятно. Ощущение что мы про разные вещи говорим. Что значит с привязкой к дате? Вы боитесь что время 10:00:50 может дать результат не сегодняшней сделки а вчерашней? Или как? Если боитесь, то просто отфильтровывайте все сделки, у которых дата сделки не равна дате торгов (так фильтруются сделки вечерней сессии фортс). Все остальные сделки и так только за текущую сессию, и нет смысла проверять дату.
Олег, Понятно, на самом деле число у Вас не 113300.000000 а 113300.0000000001 (или как то так) Это особенность чисел с плавающей точкой (в википедии есть целая статья на тему) Для решения, Вам надо округлять число с заданной точностью
Андрей, Функция T возвращает таблицу, состоящую из параметров {year, month, day, week_day, hour, min, sec, ms, count}. По этому Вы видите не то что ожидаете. Для решения надо перевести таблицу в строку. например так: T(index).hour..":"..T(index).min..":"..T(index).sec
Dmitry Dimaka, Функция Get_Candle_Ex возвращает массив из линий индикатора. обратиться к нужной линии можно через Get_Collection_Item указав номер нужной линии. Пример есть в документации см "Раздел 8. Алгоритмический язык QPILE" глава "Функции для работы с графиками"
Виктор Столетов написал: Но что если шаг цены равен к примеру 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
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
Здравствуйте, В QUIK автор LUA индикатора может создавать какие-то свои собственные параметры. Просто автор индикатора создал такой параметр с названием Period. Ровно также он мог назвать его как угодно.
BlackBoar написал: Допустим я то что должно отображаться буду обновлять 2 раза в секунду, моему человеческому восприятию чаще и незачем. Судя по обсуждению можно считать что точно обновится, так?
Да верно.
Цитата
BlackBoar написал: Если тема темная то заголовки действительно рисует оконный класс и SetWindowCaption действительно форсирует отрисовкуА если тема стандартная то заголовки в компетенции венды и все как обычно.
Вы правы, скрипт тестировался на темной теме.
Цитата
sav 312 написал: На другом компе со sleep 100 работает, а с SetWindowCaption также нет.
С SetWindowCaption разобрались, см выше. А вот что делать со sleep, к сожалению затруднимся что либо порекомендовать. Пока только ясно что проблема локальная и связана с конкретным компьютером, скорей всего с процессором. Но что это может быть, к сожалению идей нет.
sav 312, Возможно терминал чем-то нагружен? К сожалению у нас догадки кончились. Проблема не воспроизводится.
Изначально же, суть в том что в терминале окна перерисовываются раз в 50мс. И если скриптом обновлять таблицу чаще, то она не успевает обновляться, в результате происходит эффект заморозки. Лечится это как уже говорили другие пользователи принудительной перерисовкой окна, либо увеличением sleep до значений больше 50.
У Вас всё нет так. Вы на каком коде экспериментируете? На том который Вы привели ранее, проблема не воспроизводится. Возможно кроме него что то еще запущено?
sav 312, Проблема в отрисовке. И SERVERTIME тут не причем, если его заменить на os.date() то симптомы будут те же. Сделайте sleep(100) тогда проблемы не будет.
Andrey Malyar написал: Так какие значения надо поставить что бы появились уровни?
Какую цифру укажите на том уровне цены и будете видеть. У Вас цена на графике видна в районе от 112100 до 114500, значит и уровень Вы увидите если укажите значение в этом диапазоне.
Evgenia написал: Помогите понять, что ещё нужно в коде поменять?
Надо поменять всю структуру кода. Он составлен абсолютно некорректно. По простому, Вы создали кучу функций внутри функции main() и нигде ни разу эти функции не вызываете. Раз нет вызова функций то и работать они естественно не будут. Во первых, создавать функции внутри main() в данном случае является лишним, вынесите их за пределы main() Во вторых, чтобы функция сработала ее надо вызвать. Исключение только функции колбеков, которые вызывает сам терминал при наступлении соответствующих условий. У Вас сейчас в коде только один колбек OnStop. В третьих, в QUIK срипты индикаторов и для остального, это разные вещи, и то что есть в индикаторах отсутствует в обычных скриптах. в связи с чем пересекать их нельзя. Функция OnCalculate это функция индикаторов, в обычном коде она не будет работать также как в индикаторах.
В итоге, чтобы перенести код с одного ПО на другое, надо изучить оба ПО и понимать как в них надо работать. Без этого перенести код не получится.
Здравствуйте, К сожалению из описания не понятно что именно не так с графиком. Если Вас не устраивает внешний вид графика "Бары" то Вы можете его поменять в свойствах графика на "Свечи"
Дмитрий Минеев, 10260 - это код клиента на фондовой секции, а не на срочной. SPBFUT000000 - это фирма срочной секции. Нельзя по фирме срочной секции получить данные по коду клиента от фондовой секции. Если по простому, откройте в терминале таблицу Купить/продать (из таблицы Клиентский портфель) и посмотрите что там написано и сделайте также.
Так по акциям, для нашего демо, строка будет следующей: result = getBuySellInfo("NC0011100000", "10260", "QJSIM", "LKOH", 0)
Ростислав Дм. Кудряшов написал: После переноса строк 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().,
Это не дает никакой новой информации, проблема и так предельно ясна, лишний раз ее показывать нет смысла.
Ростислав Дм. Кудряшов написал: В работе Quik без подключения к серверу при смене тайм-фрейма наблюдается такая аномалия, что значения котировок close() и т.п. для второго графика Settings.GraphId2 оказываются все нулевые. Это делает невозможным построение графика по двум другим сразу после смены тайм-фрейма. Для получения графика нужно открыть его диалог "Редактирование настроек графика" и нажать кнопку "OK".
RayIntraday написал: Это некие элементы рисунка, которые добавляются на график или это просто соединённые линии которые по сути есть код?
Рисуется кодом.
Цитата
RayIntraday написал: Подскажите как правильно написать код, который будет добавлять на график ежечасно прямоугольник, размером от хая до лоя, ограниченный начальной и конечной свечкой часа. Если открылся на хаях и закрылся на лоях, то отрисовывается красным, если открылся на лоях и закрылся на хаях, то соответственно зелёный.
В Lua это возможно только через механизм меток см функцию AddLabel
Evgenia, Если условие if не срабатывает, проверьте что попадает в это условие, т.е. какие значения у t[0].low, t[1].low, t[1].high, t[1].close и остальные.