В каком случае цена последней сделки равна 0, а в каком отсутствует?
Надо делать так, как надо. А как не надо - делать не надо.
getParamEx
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
03.03.2017 08:52:47
Цитата
Egor Zaytsev написал: Можем предложить вариант сравнивать с параметром "время последней сделки". Если цена ноль, а время последней сделки есть, то да цена ноль, если нет, то цена отсутствует.
Я спрашивал о надёжном способе. Вы можете гарантировать, что параметры "цена последней сделки" и "время последней сделки" обновляются синхронно? Т.е., когда вы проверите "время последней сделки", и оно будет присутствовать, то в "цена последней сделки" будет значение котировки?
Надо делать так, как надо. А как не надо - делать не надо.
SearchItems
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
02.03.2017 16:42:49
В таком случае хорошо иметь возможность задавать направление поиска: с начала или с конца таблицы.
Надо делать так, как надо. А как не надо - делать не надо.
Вопрос к разработчикам: Вы можете предложить надёжный способ убедиться, что getParamEx даёт действительно последнюю цену инструмента, а не её отсутствие?
Надо делать так, как надо. А как не надо - делать не надо.
Самопроизвольная остановка Lua-скриптов, при замене инструментов с истекающим сроком обращения
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
28.02.2017 16:55:49
Причина остановки скриптов, видимо в том, что используются QLua-таблицы с колбэком
Код
SetTableNotificationCallback(ID, function(t_id, msg, par1, par2) if msg == QTABLE_CLOSE then OnStop() end end)
Но это не объясняет, почему самопроизвольно закрываются QLua-таблицы.
Надо делать так, как надо. А как не надо - делать не надо.
Самопроизвольная остановка Lua-скриптов, при замене инструментов с истекающим сроком обращения
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
28.02.2017 09:12:15
При замене инструментов с истекающим сроком обращения останавливаются Lua-скрипты. Почему так происходит?
Надо делать так, как надо. А как не надо - делать не надо.
Функция NumberToRGB(number), Функция преобразовывает одно число цвета в компоненты RGB (red, green, blue)
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
23.02.2017 00:14:45
Но разработчики QUIK и тут накосячили, перепутав местами цвета. Так RGB(255, 0, 0) должен соответствовать числу 0xff0000, а по факту соответствует 0x0000ff Т.о., если подставлять число в HEX-формате получим совсем другой цвет. Можете прокомментировать данную ошибку?
Надо делать так, как надо. А как не надо - делать не надо.
Непонятные закрытия окна QUIK без каких либо ошибок и подтверждений! У кого такое тоже есть?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.02.2017 15:23:56
При перетаскивании индикатора с меткой в другое окно QUIK часто "падает".
Надо делать так, как надо. А как не надо - делать не надо.
Непонятные закрытия окна QUIK без каких либо ошибок и подтверждений! У кого такое тоже есть?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.02.2017 12:56:12
Вы не одиноки. Аварийное закрытие QUIK происходит при нажатии на кнопки "Применить", затем "ОК" в окне Редактирования настроек индикатора, работающего с меткой.
Надо делать так, как надо. А как не надо - делать не надо.
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
20.02.2017 09:18:50
Цитата
Sergey Gorokhov написал: Вы предлагаете по сути заказывать информацию, не заказывая информацию. Так нельзя. Если заказали информацию, то получили ее размер (через Size), если не заказали то ничего не получили.
Вы не правы. Я предлагаю возвращать корректную информацию. Если информацию с сервера не получили, то её размер не определён (nil). Проблема как раз в том, что в текущем виде ноль невозможно интерпретировать должным образом. В данном случае устроило бы решение в виде возврата честного нуля, тогда и только тогда, когда точно известно, что по бумаге нет сделок. Если сервер ещё ничего не прислал, то Size должен возвращать nil.
Цитата
Sergey Gorokhov написал: Если и делать что-то подобное, то вне ds, отдельной функцией, например через транзакции, тогда возможно исключить терминал.
Это уже ваше дело, как реализовывать. Главное, чтобы можно было однозначно понять, стоит ли ждать чарта по бумаге или нет.
Надо делать так, как надо. А как не надо - делать не надо.
СМС-Оповещения, СМС-Оповещения по всем сделкам.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
20.02.2017 00:18:30
Цитата
sav 312 написал: Предлагаю добавить в настройки СМС-оповещений пункт "оповещения по всем сделкам".
Уйдут месяцы на изучение потенциально целесообразности, проверку на юридические аспекты, анализ на непротиворечивость... и годы на саму реализацию. Плюс, если дождётесь, брокер должен включить у себя сервис СМС-рассылки, скорее всего за плату.
Проще уже сейчас самому реализовать необходимый функционал на Lua.
Надо делать так, как надо. А как не надо - делать не надо.
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
19.02.2017 13:19:52
Цитата
Антон Кыт. написал: всем пользователям QuikLUA был бы полезен метод датасорса ds:ServerSize() Его смысл в том, чтобы сразу узнать сколько всего баров данного таймфрейма имеется на сервере истории
Почему это пожелание проигнорировано? Поддерживаю его. Возможные возвращаемые значения: натуральное число - количество свечей на сервере истории; 0 - история по заказанному инструменту на сервере отсутствует; nil - информация о количестве свечей на сервере ещё не доступна.
Т.о., если использование цикла ожидания
Код
while ds:Size() == 0 then
небезопасно и может привести к бесконечному ожиданию, то цикл
Код
while ds:ServerSize() == nil then
в этом смысле безопасен.
Надо делать так, как надо. А как не надо - делать не надо.
Падение QUIK с 0xC0000005: Access violation
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
17.02.2017 13:12:36
philave, Попробуйте перенести работу с UI в основной поток терминала. К тому же я вижу, что вы используете luawin. Возможно, это тоже как-то влияет.
Надо делать так, как надо. А как не надо - делать не надо.
Падение QUIK с 0xC0000005: Access violation
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
16.02.2017 18:39:34
Цитата
philave написал: В итоге после пересылки кода в поддержке QUIK воспроизвести падение не смогли, но предположили, что, скорее всего, проблема из-за того, что в скрипте для GUI используется IUP.
Знакомая песня. Поддержка всегда валит вину на кого-то другого, пока не "припрёшь их к стенке". Но из собственного опыта скажу, что у меня падения происходили чаще из-за ошибок в самом QLua.
Надо делать так, как надо. А как не надо - делать не надо.
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.02.2017 10:54:04
Цитата
Sergey Gorokhov написал: И? Тут речь про 7.8, а там про 7.6.
И? Вы действительно думали, что в 7.8 эта ошибка исправлена? Какой логикой вы руководствовались?
Надо делать так, как надо. А как не надо - делать не надо.
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.02.2017 09:58:22
Цитата
Василий Петров написал: Обнаружил, что OnCalculate перебирает все свечи два раза, при этом общее количество свечей во вторую итерацию иногда меняется, иногда нет. Как такое поведение можно объяснить?
Цитата
Sergey Gorokhov написал: Что-то похожее уже чинилось, проверьте поведение на актуальной версии, сейчас доступна версия 7.7.
Цитата
Sergey Gorokhov написал: Проблема изучается. Постараемся в ближайшее время дать ответ.
Sergey Gorokhov пишет: Ошибка будет исправлена в одной из следующих версий программы.
О какой именно ошибке идёт речь?
1)
Цитата
Старатель пишет: для параметров из ТТП. На боевом сервере мс не транслируются для параметров.
2) или tDS:Close() ?
Добрый день.
Речь идет о том, что DS:Close выдает некорректные результаты.
Список ошибок к исправлению был утерян?
Надо делать так, как надо. А как не надо - делать не надо.
Импорт линий и меток на график, Автоматизация рисования уровней на графике
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.02.2017 20:59:39
Готового способа решения вашей задачи разработчиками не предусмотрено. Но с помощью встроенного языка Lua возможно сохранение / импорт меток. С линиями посложней. Но при желании и с этой задачей можно справиться. Но для этого надо изучать программирование на Lua.
Надо делать так, как надо. А как не надо - делать не надо.
Индикаторы на LUA. getCandlesByIndex отдаёт пустую таблицу.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.02.2017 18:44:38
Я не точно выразился. Конечно, порядок наложения как-то там влияет, но вот закономерность этого влияния мне установить не удалось. И после перезапуска Квика порядок обновления может быть уже совсем другим. У вас не так?
Надо делать так, как надо. А как не надо - делать не надо.
Индикаторы на LUA. getCandlesByIndex отдаёт пустую таблицу.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.02.2017 18:12:35
Цитата
s_mike@rambler.ru написал: Скорее всего дело в порядке наложения индикаторов.
Вы уверены, что порядок наложения влияет на порядок обновления? Я такой закономерности не обнаружил.
Надо делать так, как надо. А как не надо - делать не надо.
Четверть пользователей - паразитные боты )
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
12.02.2017 10:41:53
Почти половина пользователей создана для "продвижения" сайтов, типа вот: Вы бы навели что ли порядок.
Надо делать так, как надо. А как не надо - делать не надо.
Ошибка в обработке события нажатия кнопки мышки на шапку таблицы
Долго искали. А чё у коллег не спросили? Stanislav Tvorogov вон ещё полтора года назад . Вы вообще общаетесь между собой?
Надо делать так, как надо. А как не надо - делать не надо.
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
08.02.2017 11:15:26
Вопрос не в том, что выводить - это зависит от индикатора, можно и вполне осмысленное значение. Вопрос в том, как выводить, если OnCalculate не вызывается?
Надо делать так, как надо. А как не надо - делать не надо.
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
08.02.2017 10:52:16
Цитата
Sergey Gorokhov написал: Он поведет себя ровно также как если бы был только 1 график, т.к. OnCalculate привязан к конкретному источнику данных.
Опять не совсем "ровно". OnCalculate будет вызываться при изменении источника данных, к которому привязан, но индекс свечи будет передаваться с учётом всех графиков на диаграмме.
Даже не знаю, хорошо это или плохо Допустим, нам надо построить индикатор по двум графикам. И на "ведущем" графике в какой-то промежуток времени отсутствуют сделки. Тогда мы физически не сможем построить индикатор, пока не получим следующую сделку. Есть лекарство?
Надо делать так, как надо. А как не надо - делать не надо.
_sk_ написал: Потом приходит следующая сделка, а она, как оказалось, относится к предыдущей 5-минутке. Будет ли вызвана функция OnCalculate() для FEES с предыдущим значением I? Если нет, то окажется, что свеча подменилась, а мы не в курсе. Если да, то это нарушение "обновления посередине".
Вопрос о том, как поведёт себя QUIK, когда по одному инструменту уже начал рисоваться новый бар, а по другому инструменту - вдруг приходит сделка по предыдущему бару? У меня есть подозрения, что Квику без разницы когда и что он получил. Он просто нарисует, то что пришло.
Надо делать так, как надо. А как не надо - делать не надо.
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
08.02.2017 09:19:23
Цитата
Sergey Gorokhov написал: В случае если в одном окне установить график по нелеквиду и по активному инструменту, Вы увидите что OnCalculate сработает по нелеквиду и CandleExist покажет false на пропущенных свечках только, после того как на нелеквиде появится нормальное значение.
Не совсем так. OnCalculate на пустых интервалах вызывается только при пересчёте индикатора (если, например, в окне редактирования нажать "Применить" или "ОК"). В реалтайм OnCalculate на пустых интервалах не вызывается.
Надо делать так, как надо. А как не надо - делать не надо.
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
07.02.2017 15:49:21
Цитата
_sk_ написал: Я понимаю, что это очень редко бывает, но всё равно интересно.
Не так уж и редко. Каждый день.
Скрытый текст
ТВС за сегодня:
Причём порядок в ТВС будет отличаться у разных брокеров и даже на разных серверах одного брокера. Можете проверить сами:
Скрытый текст
Код
function main()
local file, err = io.open(getScriptPath() .. '\\OnAllTrade.log', 'w')
if not file then message(err, 3) return end
local alltrade1 = getItem("all_trades", 0)
for i = 1, getNumberOf("all_trades")-1 do
local datetime1 = alltrade1.datetime
local time1 = os.time(datetime1) + datetime1.mcs / 1000000
local alltrade2 = getItem("all_trades", i)
local datetime2 = alltrade2.datetime
local time2 = os.time(datetime2) + datetime2.mcs / 1000000
if time1 - time2 > 0 then
file:write('[' .. os.date("%X", time1) .. '] ' .. alltrade1.trade_num .. ' (' .. alltrade1.sec_code .. ') > [' .. os.date("%X", time2) .. '] ' .. alltrade2.trade_num .. ' (' .. alltrade2.sec_code .. ')\n')
end
alltrade1 = alltrade2
end
file:close()
end
Надо делать так, как надо. А как не надо - делать не надо.
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
07.02.2017 15:23:56
Цитата
_sk_ написал: Известно, что в данных об обезличенных сделках на фондовом и срочном рынке время задаётся разными часами, которые иногда могут разойтись на несколько миллисекунд.
Что значит "задаётся разными часами"?
Надо делать так, как надо. А как не надо - делать не надо.
or и цикл while
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
01.02.2017 18:05:03
Цитата
funjpg написал: В такой ситуации, вопрос в сторону биржи, почему она присылает 0
Биржа тут не при чём. Это QUIK косячит: когда не может получить значение параметра (например, параметр не задан в списках) он подставляет туды 0 и говорит, что result="1"
Надо делать так, как надо. А как не надо - делать не надо.
or и цикл while
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
01.02.2017 17:18:22
в то время, как на самом деле param_value = 4
Надо делать так, как надо. А как не надо - делать не надо.
or и цикл while
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
01.02.2017 17:15:34
Цитата
funjpg написал: if tonumber(tradingStatus.result) == 1 then
Такая проверка не гарантирует корректного получения данных. Вы легко можете получить
Надо делать так, как надо. А как не надо - делать не надо.
OnStop
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
01.02.2017 12:00:39
Цитата
swerg написал: ваша неправда в том, что в OnStop вы первым делом прерываете цикл в main. run = nil а после ошибочно утверждаете, что майн параллельно не работает.
Ваша неправда в том, что вы даже не проверили на то, о чём говорите. Можете переписать OnStop так:
Код
function OnStop(s)
Print('OnStop')
_sleep(3000) -- Здесь вы можете добавить некоторую работу, выполняющуюся на вашем компьютере определённое количество времени
Print('OnStop')
run = nil
return 5000
end
и убедиться, что в QUIK v.7 OnStop и main параллельно не работают.
Надо делать так, как надо. А как не надо - делать не надо.
OnStop
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
01.02.2017 09:53:53
Проверил: в v.6.16 потоки OnStop и main работали параллельно. В v.6.17 здесь уже внесли изменения. Возможно, сделано это было в благих целях: для корректной выгрузки библиотек или как-то так. Но об этом предупреждать же надо!
Надо делать так, как надо. А как не надо - делать не надо.
OnStop
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
01.02.2017 09:19:56
Nikolay Pavlov, Да, я ошибся в том, что отсчёт 5-секундного завершения скрипта всё же начинается по окончании OnStop.
Цитата
Nikolay Pavlov написал: Вы увидите, что после вызова OnStop() поток main продолжает работать
Ваша неправда: добавив в OnStop некоторые финализирующие действия, вы увидите, что пока они не будут выполнены, поток main не будет выполнять свою работу. А возобновит её после окончания работы OnStop.
Код
local run = true
local function Print(text)
PrintDbgStr(os.clock() .. ' ' .. text)
end
function main()
while run do
sleep(100)
Print('main')
end
sleep(4000)
Print('Quit')
end
function OnStop(s)
Print('OnStop')
run = nil
_sleep(3000) -- Здесь вы можете добавить некоторую работу, выполняющуюся на вашем компьютере определённое количество времени
Print('OnStop')
return 5000
end
Результат:
Цитата
31169.066 main 31169.167 main 31169.267 main 31169.368 main 31169.468 main 31169.569 main 31169.604 OnStop 31172.605 OnStop 31172.605 main 31176.607 Quit
Надо делать так, как надо. А как не надо - делать не надо.
OnStop
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
01.02.2017 01:31:47
Это верно, что во время работы колбэка OnStop работа потока main приостанавливается? Кроме того, скрипту даётся время на завершение работы, которое отсчитывается не по окончании OnStop (как это показано на вашей схеме), а от начала работы функции OnStop. Т.о., схема должна выглядеть так:
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
Ошибка при переподключении к серверу брокера
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
31.01.2017 22:42:31
Я так понимаю, что если уменьшить таймаут, то при краткосрочных обрывах связи сервер будет чаще отключать клиента.
Надо делать так, как надо. А как не надо - делать не надо.
or и цикл while
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
30.01.2017 18:58:19
Код
while not (tradingstatus == 4 or tradingstatus == 3) do
то же, что и
Код
while tradingstatus ~= 4 and tradingstatus ~= 3 do
Надо делать так, как надо. А как не надо - делать не надо.
Надо делать так, как надо. А как не надо - делать не надо.
Индикатор Jurik Moving Average в Quik, Добавить в Quik индикатор Jurik Moving Average
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
27.01.2017 17:46:01
Цитата
s_mike@rambler.ru написал: Упомянутый вами индикатор зигзаг также никогда не заглядывает в будущее, хотя перерисовывается на истории.
На истории Zig-zag рисуется уже с учётом будущих цен. Соответственно, и при тестировании на истории учитываются будущие цены. Это и есть заглядывание в будущее.
Надо делать так, как надо. А как не надо - делать не надо.
getDataSourceInfo
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
27.01.2017 17:34:02
Предлагаю модифицировать функцию getDataSourceInfo: добавить необязательный параметр: STRING Tag и сделать функцию доступной как в индикаторах так и в обычных скриптах. При задании параметра функция будет возвращать параметры графика с идентификатором Tag.
Надо делать так, как надо. А как не надо - делать не надо.
Как получить Биржевой сбор по фьючерсам и по акциям?
Sergey Gorokhov написал: Полного списка к сожалению не существует, так как биржевых площадок много и для каждой свои параметры.
Предлагаю из Lua дать доступ к чтению списка параметров, что то вроде таблицы:
Код
parameters = {
OPEN = "Цена открытия" ,
HIGH = "Максимальная цена сделки" ,
LOW = "Минимальная цена сделки" ,
LAST = "Цена последней сделки" ,
QTY = "Количество бумаг в последней сделке" ,
.. .
}
возвращаемой при запросе таблицы параметров с указанием класса:
Код
parameters = getParametersList( class_code )
Надо делать так, как надо. А как не надо - делать не надо.
ParamRequest и CreateDataSource не заказывают получение параметров Таблицы текущих торгов
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
23.01.2017 19:28:13
Цитата
Старатель написал: Sergey Gorokhov , если штатная функция при стандартной настройке ("С учетом настроек, выбранных пользователем вручную..." стандартная настройка?) работает некорректно, т.е., с ошибками, значит нужно исправлять эти ошибки.
Надо делать так, как надо. А как не надо - делать не надо.
ParamRequest и CreateDataSource не заказывают получение параметров Таблицы текущих торгов
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
23.01.2017 18:53:05
Цитата
Sergey Gorokhov написал: если настройка есть в интерфейсе она уже стандартная в любом случае.
Так и я о том же: при стандартной настройке штатные функции работают некорректно не работают.
Надо делать так, как надо. А как не надо - делать не надо.
ParamRequest и CreateDataSource не заказывают получение параметров Таблицы текущих торгов
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
23.01.2017 17:50:41
Sergey Gorokhov, если штатная функция при стандартной настройке ("С учетом настроек, выбранных пользователем вручную..." стандартная настройка?) работает некорректно, т.е., с ошибками, значит нужно исправлять эти ошибки.
Надо делать так, как надо. А как не надо - делать не надо.
Управление таблицей LUA, Вопросы и пожелания.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
23.01.2017 13:20:26
Добавьте, пожалуйста, для Lua-таблиц возможность работать в режиме связанных окон. Скажем, функцией SetLink(t_id, row, class_code, sec_code) устанавливаем, какой инструмент будет передаваться при выделении строки с номером row в связанные окна.
Надо делать так, как надо. А как не надо - делать не надо.
Как получить Биржевой сбор по фьючерсам и по акциям?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.01.2017 19:05:29
Цитата
s_mike@rambler.ru написал: уже сейчас можно получить список параметров каждого класса
Я, наверное, что-то пропустил. В какой таблице?
Надо делать так, как надо. А как не надо - делать не надо.