Sergey Gorokhov пишет: Я честно сам не готов дать объяснение в технологических терминах, но суть такая, что есть установленный минимальный размер пакета. в него влезает некоторое количество информации, если информации меньше чем размер пакета, то она попадает в буфер в котором в течении некоторого времени ждет дополнения, пока размер пакета не будет полным. Если по истечении этого времени новые данные не поступят то пакет отправляется не полным. Какой это промежуток времени и какой размер пакета зависит от настроек, в том числе и от настроек на Вашей сетевой карте.
Что-то подсказывает мне, что настройки сетевой карты на клиенте играют незначительную роль в данном случае, т.к. данные, в т.ч. все сделки, приходят пачками с сервера изначально. Я прав?
Надо делать так, как надо. А как не надо - делать не надо.
Michael Bulychev пишет: Согласитесь, что пример немного не жизненный?
Я что-то не понял, с чем вы спорите? Вы можете привести "жизненный пример", когда использование потокобезопасной функции в одном скрипте "никак не влияет" на другие скрипты?
Надо делать так, как надо. А как не надо - делать не надо.
Michael Bulychev пишет: Для чего мы завели такие функции и чего они позволяют избежать я уже объяснял. В Вашем примере использование ssort совершенно не к месту. Используйте просто sort.
Вы, наверное, не поняли: это псевдокод. Таким образом, я показал вам, что утверждение
У меня такое ощущение, что это я вам рассказываю, как работает ваш программный продукт. Хотя наоборот было бы гораздо эффективней.
Скрипт 1:
Скрытый текст
Код
local bRun, sTime = true
local sClassCode, sSecCode = "QJSIM", "SBER"
function main()
while bRun do
PrintDbgStr("main1")
sleep(1000)
end
end
function OnStop()
bRun = nil return 0
end
function OnParam(class_code, sec_code)
if not bRun then return end
if sec_code ~= sSecCode or class_code ~= sClassCode then return end
local Time = getParamEx(class_code, sec_code, 'TIME').param_image
if Time ~= sTime then
PrintDbgStr("1: "..Time)
sTime = Time
end
end
Скрипт 2:
Скрытый текст
Код
local bRun, sTime
local sClassCode, sSecCode = "QJSIM", "SBER"
function main()
local t, n = {}, 5000000
for i = 1, n do t[i] = n - i end
PrintDbgStr("start")
bRun = true
table.ssort(t)
PrintDbgStr("end")
while bRun do sleep(100) end
end
function OnStop()
bRun = nil return 0
end
function OnParam(class_code, sec_code)
if not bRun then return end
if sec_code ~= sSecCode or class_code ~= sClassCode then return end
local Time = getParamEx(class_code, sec_code, 'TIME').param_image
if Time ~= sTime then
PrintDbgStr("2: "..Time)
sTime = Time
end
end
Запускаем - делаем выводы.
Надо делать так, как надо. А как не надо - делать не надо.
Michael Bulychev, мне кажется или вы потеряли основную мысль обсуждения?
Цитата
Старатель пишет: С колбеками, вроде, понятно: если в колбеке одного скрипта вызывается потокобезопасная функция, то работа основного потока QUIK и дополнительного main этого скрипта "замораживается" на время выполнения функции. А если потокобезопасная функция вызывается в main, окажет ли это влияние на потоки других скриптов?
Надо делать так, как надо. А как не надо - делать не надо.
Но пока выполняется потокобезопасная функция основной поток терминала "заморожен", информация с сервера не поступает, колбеки не вызываются. Это вы называете "никак не влияет"?
Надо делать так, как надо. А как не надо - делать не надо.
swerg пишет: почему масштаб вы именно такой сделали, а не крупнее/мельче? я про формальный признак, а не "мне так удобно"
В данном случае, масштаб я выбрал по признаку "мне так удобно". Но можно сделать, например, таким образом, чтобы, в границы диаграммы попадал индикатор за крайние 20 свечей. Вы можете предложить свой вариант.
Надо делать так, как надо. А как не надо - делать не надо.
С колбеками, вроде, понятно: если в колбеке одного скрипта вызывается потокобезопасная функция, то работа основного потока QUIK и дополнительного main этого скрипта "замораживается" на время выполнения функции. А если потокобезопасная функция вызывается в main, окажет ли это влияние на потоки других скриптов?
Надо делать так, как надо. А как не надо - делать не надо.
Zoya Vdovina пишет: 1) Никак.В терминал приезжает весь список кодов клиентов. 2) Правильно ли мы понимаем, что Вы хотите в форме ввода заявки выбирать Торговый счёт и что бы по торговому счёту подставлялся нужный клиентский код?
Пусть "приезжает" весь список кодов, я что, против? Я просто хочу, чтобы в поле "Код Клиента" вываливался не весь доступный список кодов (а иногда и старых), а только тех, что соответствуют выбранному Торговому Счёту. Если в QUIK нет чёткого соответствия Код Клиента - Торговый Счёт (хотя, как же нет, когда есть такая настройка "Указывать счет депо по коду клиента"), то сделайте настройку через ini-файл:
Код
Торговй_Счёт=Список_Кодов_Клиентов
Надо делать так, как надо. А как не надо - делать не надо.
Задача: Есть робот, торгующий по индикатору, рассчитываемому на основе графика цены. Нужно сделать контроль данных с графика на случай "потери" части свечей сервером (такое иногда случается). Кто как контролирует этот процесс? Или все полагаются на "авось"?
Надо делать так, как надо. А как не надо - делать не надо.
биржа уже транслирует предельные границы цен на фондовом рынке. Осталось выяснить, как узнать эти границы? Сотрудники ARQA могут помочь в этом вопросе?
Надо делать так, как надо. А как не надо - делать не надо.
Alexey Ivannikov пишет: Ошибка, описанная в старттопике - есть диагностика сервера QUIK, не торговой системы. Брокер сам по собственному усмотрению может устанавливать ограничения цен в заявках, и диагностическое сообщение будет именно таким, как описал автор темы.
Тогда тем более не понятно, почему нельзя узнать диапазон цен, установленных брокером на сервере?
Цитата
Alexey Ivannikov пишет: А это уже биржевое сообщение, означающее что Вы не попали в ценовой диапазон торговой системы.
Цитата
Старатель пишет: Какой параметр ТТП показывает это значение?
Короче, каким образом, можно узнать диапазон допустимых цен?
Надо делать так, как надо. А как не надо - делать не надо.
Как сделать, чтобы в окне ввода заявки в поле "Код клиента" отображались только те коды, которые соответствуют выбранному торговому счёту? И как сделать, чтобы, если выбранному торговому счёту соответствует только один код клиента, то этот код автоматически подставлялся в соответствующее поле?
Надо делать так, как надо. А как не надо - делать не надо.
Alexey Ivannikov пишет: Такого параметра не предусмотрено. Данное сообщение появляется тогда, когда цена не попадает в диапазон, установленный брокером, не биржей
А это чьё сообщение?
Цитата
ОШИБКА: (579) Для выбранного финансового инструмента цена должна быть не меньше 63.85
Какой параметр ТТП показывает это значение?
Цитата
geradigger пишет: 1. Возможности новой версии 1. Параметры «Макс/Мин возможная цена» на фондовом рынке. Добавлена возможность трансляции параметров «Максимально возможная цена» и «Минимально возможная цена» на всех возможных режимах торгов фондового рынка."
Это возможности новой версии чего? У меня в списках нет таких параметров для фондового рынка.
Надо делать так, как надо. А как не надо - делать не надо.
Добрый день. Сделайте функцию "интеллектуального автомасштабирования" по оси Y графика с наложенным индикатором таким образом, чтобы в область диаграммы попадал график цены и правая часть индикатора. Чтобы было понятно:
Скрытый текст
По центру - текущая реализация автомасштабирования - график цены слишком сильно сжат. Справа - график масштабирован таким образом, чтобы в области диаграммы были видны график цены и правая часть индикатора
Надо делать так, как надо. А как не надо - делать не надо.
Дмитрий пишет: В итоге в (отдельном) окне с индикатором отображается шкала по вертикали от 9 до 24 и все первые 8 значений индикатора не видны.
Описанная ошибка будет исправлена в одной из ближайших версий программы.
А я предлагаю добавить отдельную опцию для индикаторов "Автоматически масштабировать" - иногда требуется видеть только близкие к цене значения индикатора, а далёкие от графика цены - не важны.
Надо делать так, как надо. А как не надо - делать не надо.
Дмитрий пишет: Можно в начале работы получить время самой первой и второй свечи
Да, спасибо. Для моей задачи (отслеживание изменения таймфрейма на втором графике) можно запомнить время первых двух свечей с помощью getCandlesByIndex. Если время любой свечи изменилось - значит изменён таймфрейм. Правда есть вероятность, что при изменении таймфрейма время свечей не изменится. Но она не велика.
Надо делать так, как надо. А как не надо - делать не надо.
Я думал об этом... Довольно не надёжное решение, к тому же слишком затратное, если нужно мониторить, не изменился ли таймфрейм.
Задача стоит следующая: построить индикатор, рассчитанный по значениям с графика 1) на который индикатор наложен 2) и с другого, заданного идентификатором tag
Так вот, при изменении таймфрейма второго графика индикатор должен автоматически пересчитаться.
Надо делать так, как надо. А как не надо - делать не надо.
Sergey Gorokhov пишет: Раз в период, с биржи приезжает кучка параметров. Эта кучка отправляется от сервера клиенту. Клиент в свою очередь, обновляет только те данные которые приехали, а те которые не приехали оставляет в предыдущем значении. раз в промежуток между срезами были изменения, то биржа отправит эту самую кучку.
Биржа отправляет всем брокерам одинаковые параметры? Т.е. временные "срезы" для всех брокеров одни?
Надо делать так, как надо. А как не надо - делать не надо.
Дмитрий пишет: добавить в функцию OnParam(STRING class_code, STRING sec_code) еще один параметр, сообщающий, изменение значений каких именно параметров ТТП привело к вызову этой функции
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
А пока данное пожелание не реализовано, разумно ли вместо OnParam использовать функции CreateDataSource и SetUpdateCallback на каждый из отслеживаемых параметров? Не окажет ли это негативного влияния на производительность?
Надо делать так, как надо. А как не надо - делать не надо.
Старатель пишет: Переключился на тиковый интервал: секунды появились. Но милисекунды не транслируются.
А теперь переключитесь с демо спотана демо фортс или на боевые торги.
Я имел ввиду для параметров из ТТП. На боевом сервере мс не транслируются для параметров.
Ещё такой вопрос.
Код
function main()
tDS = CreateDataSource('QJSIM', 'SBER', INTERVAL_M1)
tDS:SetUpdateCallback(function(nIndex) end)
message('[main] '..tostring((tDS:Close())), 2)
end
Результат: [main] true
Код
local bRun, tDS = true
function OnStop()
bRun = nil
end
function main()
tDS = CreateDataSource('QJSIM', 'SBER', INTERVAL_M1)
tDS:SetUpdateCallback(function(nIndex) end)
while bRun do sleep(200) end
message('[main] '..tostring((tDS:Close())), 2)
end
Результат: [main] nil
Код
local bRun, tDS = true
function OnStop()
message('[OnStop] '..tostring((tDS:Close())), 2)
bRun = nil
end
function main()
tDS = CreateDataSource('QJSIM', 'SBER', INTERVAL_M1)
tDS:SetUpdateCallback(function(nIndex) end)
while bRun do sleep(200) end
end
Результат: [OnStop] nil
Код
local bRun, tDS = true
function OnStop()
message('[OnStop] '..tostring((tDS:Close())), 2)
bRun = nil
end
function main()
tDS = CreateDataSource('QJSIM', 'SBER', INTERVAL_M1)
tDS:SetUpdateCallback(function(nIndex) end)
while bRun do sleep(200) end
message('[main] '..tostring((tDS:Close())), 2)
end
Результат: [OnStop] nil [main] false
Можете объяснить результаты?
Надо делать так, как надо. А как не надо - делать не надо.