Космонавт написал: А торговать из колбека тоже можно? Отсылать лимитки при выполнении условий (цена, индикатор).
Конечно.
Цитата
Космонавт написал: Цену последней сделки откуда лучше брать: из колбека в DataSourse или всё же из таблицы всех сделок?
Смотря для чего "лучше". Я обычно беру из getParamEx(class_code, sec_code, 'last') в OnParam, если нет необходимости обрабатывать все сделки.
Надо делать так, как надо. А как не надо - делать не надо.
Почему медленно работает код
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
02.12.2016 19:12:45
Цитата
Николай Камынин написал: Расчет надо делать в колбеках. либо в майн по флагу из колбека.
+ Перебор бумаг в цикле while is_run do лишний. В том же SetUpdateCallback можно сделать весь "не сложный анализ".
Надо делать так, как надо. А как не надо - делать не надо.
Почему медленно работает код
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
02.12.2016 17:38:14
Цитата
Космонавт написал: Ведь при каждом новом таймф-фрейме таблицу придётся таки обновлять и запихивать в её поля новый набор свечек. То есть раз в таймфрейм полный пересчёт делать всё же придётся.
А кто мешает сохранять свечи и индикатор в таблицу в зависимости от таймфрейма? Как-то так:
Код
ds[SecCode][Interval] = CreateDataSource(ClassCode, SecCode, Interval)
local function GetPrice(index)
Candles[SecCode][Interval] = ds[SecCode][Interval]
Indicator[SecCode][Interval][index] = func( ... )
end
for i = 1, ds:Size() do GetPrice(i) end
ds:SetUpdateCallback(GetPrice)
Надо делать так, как надо. А как не надо - делать не надо.
Почему медленно работает код
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
02.12.2016 16:26:51
Цитата
Космонавт написал: 3. Рационально ли составлен код?
Нет. Пересчитывать значение индикатора имеет смысл только при обновлении последней свечи. А вы пытаетесь его пересчитывать каждую мс. Какой в этом смысл, если цена не изменилась? Расчёт индикатора лучше вставить в SetUpdateCallback() и сохранять значения в глобальной таблице.
Надо делать так, как надо. А как не надо - делать не надо.
Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.11.2016 10:56:41
Цитата
Egor Zaytsev написал: 2. Здесь больше подойдет функция CreateDataSource
CreateDataSource не доступна в индикаторах. Поэтому работать с другим таймфреймом можно только через getCandlesByIndex
Цитата
Виктор Столетов написал: 3. Как отслеживать появление нового бара?
При появлении нового бара в OnCalculate(index) будет увеличиваться индекс свечи
Цитата
Виктор Столетов написал: А что если в какой-то момент самые старые бары будут обрезаны и Size() уменьшится?
Тогда OnCalculate начнётся с первого индекса.
Цитата
Виктор Столетов написал: Вы говорите, что индекс свечи начинается c 0 и в руководстве написано то же самое. Но если в OnCalculate(index) написать PrintDbgStr("index=" .. index), то в окне Debugview выведет index от 1 до Size(). Вроде получается, что самая старая свеча имеет индекс 1.
Да, там у них путаница (видимо разные люди писали куски кода): в OnCalculate в индикаторах индекс начинается с единицы, а в getCandlesByIndex - с нуля.
Надо делать так, как надо. А как не надо - делать не надо.
Почему скрипты в QUIK выполняются дольше
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
27.11.2016 23:29:52
Вопрос разработчикам: верно ли, что в QUIK, как таковой, многопоточности нет? Да, есть два потока: основной и main. Но в каждый момент времени работают команды только из одного потока. Просто происходит переключение между потоками на уровне ОС. Так?
Надо делать так, как надо. А как не надо - делать не надо.
table.s*
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
22.11.2016 11:49:06
Сами по себе Lua-функция table.remove/table.insert тормозные, когда дело касается добавления/удаления в начале (середине) большой таблицы
Надо делать так, как надо. А как не надо - делать не надо.
Использование функции os.execute без показа окна windows cmd
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
19.11.2016 10:01:04
Цитата
Sergey Denegin написал: Подскажите, а разве при этом само ДОС окно у вас запускается минимизированным?
Нет. Команда start помогает ДОС-окну закрыться до завершения приложения program.exe. Но ключ /MIN не помогает: ДОС-окно всё-равно мелькает на экране.
Надо делать так, как надо. А как не надо - делать не надо.
Пароль на скрипты, Запуск и остановка скриптов строго по паролю
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
03.11.2016 21:52:28
Цитата
Sergey Gorokhov написал: Да, но к сожалению это пожелание было отклонено.
Вобще-то я предложил другое: дать доступ к уже реализованной настройке с клиентского места. Т.е., это другое предложение. Мне оно, как бы, не надо. Дарю идею sav 312, если пропихнёте.
Надо делать так, как надо. А как не надо - делать не надо.
Пароль на скрипты, Запуск и остановка скриптов строго по паролю
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
03.11.2016 21:36:27
Цитата
sav 312 написал: Сегодня разговаривал с Брокером (Сбербанк), так вот все, что Вы написали, настроить у него нельзя, полагаю, что чисто технически это сделать реально, но делать они этого не будут.
Возможно, чтобы использовать этот функционал, нужно вносить какие-нибудь правки в регламент. А возиться ради одного клиента они не хотят. Вот если бы на эту услугу был бы спрос...
Цитата
sav 312 написал: Предлагаю вернуться к паролю на скрипты
Ну не будет у вас это работать локально, поймите. То, что вы просите - бессмысленно. Если вы сейчас не можете удержаться, чтобы не остановить скрипт. То завтра вы точно так же запустите QUIK без скриптов, и никакой пароль не поможет.
Цитата
sav 312 написал: или встроенному риск-менеджеру (из 2 пунктов).
А вот это уже разумно. Я вижу это так: изменение настроек риск-менеджера производится локально с рабочего места QUIK самим пользователем (для этого ему надо дать права на эту операцию) и активирует уже давно реализованный на сервере . Но не реалтайм, а после перезагрузки дилерской библиотеки, т.е. на следующий день. sav 312, Sergey Gorokhov, попробуйте договориться
Надо делать так, как надо. А как не надо - делать не надо.
Что с оператором "if"?, Он не умеет сравнивать дробные числа?
Это не надёжный способ сравнения чисел, т.к. при математических операциях над числами с плавающей точкой появляются разряды, которые tostring не опускает.
В примере стоит изменить шаг и сравнение с tostring перестаёт работать:
Код
function ff1(dp)
for i = -8.8, -0.8, 0.1 do
if tostring(dp) == tostring(i) then print(dp) end
end
end
ff1(-0.8)
Надо делать так, как надо. А как не надо - делать не надо.
Что с оператором "if"?, Он не умеет сравнивать дробные числа?
function ff1(dp)
for i = -8.8, -0.8 do
if dp == i then print(dp) end
end
end
for param, value in pairs({-8.8, -7.8, -6.8, -5.8, -4.8, -3.8, -2.8, -1.8, -0.8}) do
ff1(value)
end
Надо делать так, как надо. А как не надо - делать не надо.
getFuturesHolding()
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
31.10.2016 14:16:55
Egor Zaytsev, Речь по таблицу "futures_client_holding", к которой обращается функция getFuturesHolding(). Повнимательней!
Надо делать так, как надо. А как не надо - делать не надо.
getFuturesHolding()
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
31.10.2016 11:14:48
Цитата
Egor Zaytsev написал: Просьба уточнить, пожелание от Вас или просто цитата?
На ваше усмотрение. Это касается всех функций: когда в функцию передаются параметры, хочется знать их смысл (ну, так, чтобы программирование было более осмысленным). А попробуйте в руководстве найти описание параметров form_id, acc_id, pos_type
Старатель написал: Т.е., на стороне брокера есть настройка, автоматически блокирующая возможность торговли при достижении заданного лимита потерь?
Автоматом блокирует.
Значит такая настройка уже есть. Это настройка самого сервера или нужен дополнительный модуль? Где можно ознакомиться с данной возможностью подробнее? Как она работает?
Надо делать так, как надо. А как не надо - делать не надо.
Пароль на скрипты, Запуск и остановка скриптов строго по паролю
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
28.10.2016 14:30:50
Цитата
Sergey Gorokhov написал: У брокера есть возможность заблокировать торговлю пользователю. Не через CoLibri. Но с помощью нее он может понять что нужно заблокировать. Таким образом она полностью отвечает Вашему запросу.
Как он там может понять, остаётся за скобками...
Цитата
Sergey Gorokhov написал: Нигде не говорилось что Colibri решает задачу контроля дневного лимита потерь (о чем говорит sav 312,)
Тогда не понятно, какую из запрашиваемых задач решает CoLibri, если она и не контролирует и не блокирует?
Цитата
Sergey Gorokhov написал: Задача решается настройками на стороне брокера.
Т.е., на стороне брокера есть настройка, автоматически блокирующая возможность торговли при достижении заданного лимита потерь? Или хотя бы сигнализирующая об этом? А брокер пусть бежит и вручную блокирует клиента. А на завтра надо бы ещё не забыть разблокировать... Тогда эта услуга должна быть очень востребованной, чтобы брокер так напрягался
В любом случае, как само предложение автора топика, так и отмазы тех.поддержки порадовали
Надо делать так, как надо. А как не надо - делать не надо.
Пароль на скрипты, Запуск и остановка скриптов строго по паролю
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
28.10.2016 12:34:52
Цитата
sav 312 написал: Дневной лимит потерь (запрет торговли после превышения ранее заданной просадки по счету).
Цитата
Sergey Gorokhov написал: У брокера есть возможность заблокировать торговлю пользователю. Не через CoLibri. Но с помощью нее он может понять что нужно заблокировать.
Мне, конечно, не нужна такая настройка. Но, справедливости ради, хочу уточнить, Colibri разве позволяет отслеживать дневной лимит потерь?
Надо делать так, как надо. А как не надо - делать не надо.
depo_limit.currentbal в лотах на демо
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
28.10.2016 11:16:17
Цитата
Stanislav Tvorogov написал: Настройка устанавливается на торговую фирму. Она может как совпадать так и различаться на каждой из фирм.
Речь по trade_accounts.firmid?
Надо делать так, как надо. А как не надо - делать не надо.
depo_limit.currentbal в лотах на демо
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
28.10.2016 09:11:59
Как эта настройка вообще устанавливается? Своя для каждой секции или как?
Надо делать так, как надо. А как не надо - делать не надо.
Рассчитать среднюю стоимость позиции
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
27.10.2016 20:43:31
Как быть?
Надо делать так, как надо. А как не надо - делать не надо.
На валютной секции учет также может вестись как в лотах, так и в штуках?
Надо делать так, как надо. А как не надо - делать не надо.
Рассчитать среднюю стоимость позиции
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
27.10.2016 19:39:32
Если рассчитывать среднюю стоимость позиции по прошедшим сделкам, возникает вопрос: Может ли колбэк по сделке прийти позже колбэка OnDepoLimit или OnFuturesClientHolding?
Надо делать так, как надо. А как не надо - делать не надо.
проблема со стаканом
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
27.10.2016 10:25:14
Stanislav Tvorogov, ничего никуда отправлять не нужно. Эффект вполне воспроизводится на любом рабочем месте при подключении как к боевому, так и демо серверу с дефолтными настройками (удалены все dat, log, ini файлы). А проблема заключается в том, что активация кнопок завязана на обновление таблицы котировок после того как отобразится своя заявка в стакане. На следующее обновление таблицы, карл. Поэкспериментируйте на неликвидной бумаге, и вы увидите, что кнопки "Снять выделенную заявку" и "Заменить выделенную заявку" никогда не активируются в стакане. Только если второй раз кликнуть по своей заявке. Более того, после снятия заявки той же кнопкой "Снять выделенную заявку" кнопки не перестают быть активными. Специально для вас: поиграйте с "Химпром ап" на демке. Если же вы будете настаивать, что у вас де не воспроизводится, выложите сюда видео, как вы воспроизводили. Я не верю, что вы что-то делали вообще.
Stanislav Tvorogov, я сделал за вас всю работу! Вам осталось только отправить моё сообщение программистам, чтобы они поправили в коде: сделали активацию/деактивацию кнопок одновременно с отображением/снятием своей заявки в стакане.
Надо делать так, как надо. А как не надо - делать не надо.
проблема со стаканом
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
26.10.2016 16:19:58
Цитата
Stanislav Tvorogov написал: Просьба проверить, что в QUIK выставлены оптимальные настройки получения данных:
Какие из настроек влияют на эффект активации кнопок при том, что заявка отобразилась в таблице котировок?
Надо делать так, как надо. А как не надо - делать не надо.
Отступ от правого края, Нет нормально отступа от края
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
25.10.2016 18:03:18
Надо делать так, как надо. А как не надо - делать не надо.
проблема со стаканом
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
24.10.2016 13:33:45
В v.7.5 при выставлении заявки из стакана кнопки "Снять выделенную заявку" и "Заменить выделенную заявку" на панели активируются с большим временным лагом.
Надо делать так, как надо. А как не надо - делать не надо.
Накопленный купонный доход, Возможности системы QUIK для анализа и учета
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
24.10.2016 12:42:10
Можно написать на Lua скрипт, который будет каждый день пересчитывать ваш НКД.
Надо делать так, как надо. А как не надо - делать не надо.
depo_limit.currentbal в лотах на демо
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
23.10.2016 13:21:55
Как отображаются неполные лоты в портфелях у брокеров с настройкой отображения лимитов в лотах?
Надо делать так, как надо. А как не надо - делать не надо.
Пароль на скрипты, Запуск и остановка скриптов строго по паролю
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
22.10.2016 17:33:13
Цитата
sav 312 написал: В моем случае, пароль от скрипта после всех настроек, будет находиться не у меня. Тоже самое будет сделано и с учетной записью на винде (квик снести не смогу).
Вам рассказать как запустить QUIK без скриптов и без переустановки квика? Тут правильно написали: в вашем случае поможет только риск-менеджер на сервере. А все эти локальные защиты/блокировки при желании обходятся/отключаются.
Надо делать так, как надо. А как не надо - делать не надо.
Не могу получить данные с графика, не могу получить данные с графика
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.10.2016 11:23:38
Цитата
тот самый написал: Со своей же стороны - приму к сведению проверять абсолютно ВСЕ данные приходящие с биржи на валидность (к слову..и до этого проверял)
"Абсолютно ВСЕ" данные проверить в QUIK невозможно. Так, в нельзя проверить на наличие пропусков в ТВС или на графиках. Если только сверять с ещё одним источником данных.
Надо делать так, как надо. А как не надо - делать не надо.
Не могу получить данные с графика, не могу получить данные с графика
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
19.10.2016 21:16:46
Цитата
Sergey Gorokhov написал: Узнать время закрытия можно только по таблице обезличенных сделок.
Это как?
Надо делать так, как надо. А как не надо - делать не надо.
Почему скрипты в QUIK выполняются дольше
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
17.10.2016 19:00:12
Цитата
swerg написал: Двухпоточность рабатает отлично. Поток main() не мешает основному потоку А время - понятные накладные расходы.
Разве что не мешает... Пока не задействуешь потокобезопасные функции QLua. Но в моём понимании "отличная работа" многопоточного приложения - это когда на многоядерном ЦП несколько параллельно работающих задач выполняются быстрее, чем те же несколько задач, выполняемых последовательно. А по факту в QUIK накладные расходы слишком высоки.
Надо делать так, как надо. А как не надо - делать не надо.
Почему скрипты в QUIK выполняются дольше
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
17.10.2016 11:38:46
Мда... Двухпоточность в QLua работает действительно неэффективно: Вот сейчас запустил одновременно три скрипта в QUIK. Общее время работы составило 12.9 сек, что больше, чем при последовательном их запуске через консоль (3.5+3.5+3.6=10.6 сек). Таким образом, выигрыша в производительности от многопоточной схемы работы в QUIK, действительно, не наблюдается. Единственный плюс - то, что интерфейс не зависает при работе длительных циклов в main.
Надо делать так, как надо. А как не надо - делать не надо.
Почему скрипты в QUIK выполняются дольше
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
16.10.2016 13:12:29
В среде QUIK скрипты выполняются в несколько раз дольше, чем в командной строке. Вот такой скрипт
Код
function main()
print = message or print
local abs = math.abs
local t = os.clock()
for i = 1, 100000000 do abs(-1234.56789) end
t = os.clock() - t
print(string.format('%0.1f', t))
end
if not message then main() end
в командной строке выполняется 3.5 сек, в QUIK - 8.8 сек. В 2.5 раза дольше! Почему так?
PS: ЦП: 2 ядра, 4 логических процессора.
Надо делать так, как надо. А как не надо - делать не надо.
Zoya Skvorcova написал: Не было встречного предложения-заявка отверглась. Такая ситуация могла произойти не только, при выставлнии рыночной по исполнению стопа, но и просто с обычной заявкой с признаком рыночная на Срочном рынке.
Zoya Skvorcova, вы не правы. При отсутствии встречного предложения/спроса заявка просто снимается, а не отклоняется ТС.
Надо делать так, как надо. А как не надо - делать не надо.
depo_limit.currentbal в лотах на демо
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.10.2016 18:05:29
Есть бумага. Она не принадлежит к конкретному классу TQBR или SMAL: это одна и та же бумага. Поэтому получать количество в depo_limits нужно в штуках. А при необходимости пересчитывать в лоты в зависимости от лотности нужного вам класса.
Надо делать так, как надо. А как не надо - делать не надо.
Не пойму о какой копии идёт речь? У вас в скрипте создаётся только одна таблица. Если вы имели ввиду, что копия создаётся после повторного запуска скрипта, то это буде таблица уже с новым идентификатором. Всё же хотелось бы узнать, в каких случаях таблица может быть не создана, кроме мной?
Что касается документации, то неплохо добавить в неё следующую информацию: ,
Надо делать так, как надо. А как не надо - делать не надо.
СПРАВКА ПО QLUA. ВЫЧИТКА (Версия 7.4)
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
10.10.2016 20:39:51
Цитата
Stanislav Tvorogov написал: Функция возвращает 0 во всех остальных случаях, в которых таблица не была создана, за исключением указания значений, отличных от NUMBER.
Я как раз хотел от вас услышать, в каких случаях таблица может быть не создана.
Старатель написал: Если окно с указанным id было ранее создано и не закрыто, то CreateWindow вернёт 0.
В случае, если окно таблицы уже было открыто, будет создана его копия.
Вы уверены?
Надо делать так, как надо. А как не надо - делать не надо.
СПРАВКА ПО QLUA. ВЫЧИТКА (Версия 7.4)
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
09.10.2016 12:02:45
Цитата
Старатель написал: В каких случаях (кроме некорректно заданного идентификатора) функция может вернуть 0?
Если окно с указанным id было ранее создано и не закрыто, то CreateWindow вернёт 0. Есть ещё варианты?
Надо делать так, как надо. А как не надо - делать не надо.
СПРАВКА ПО QLUA. ВЫЧИТКА (Версия 7.4)
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
09.10.2016 11:56:17
Цитата
CreateWindow Функция создает окно таблицы с идентификатором «t_id». Функция возвращает «1» при успешном создании окна, иначе – «0».
В каких случаях (кроме некорректно заданного идентификатора) функция может вернуть 0?
Надо делать так, как надо. А как не надо - делать не надо.
проблема со стаканом
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
06.10.2016 13:08:34
В v.7.4 минимальную ширину стакана увеличили со 128px до 136px. Чем обусловлено такое решение?
Надо делать так, как надо. А как не надо - делать не надо.
Что быстрее - DataStore или GetCandlesByIndex?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
30.09.2016 10:47:20
Индикаторы все равно рассчитываются так или иначе: в роботе или самим квиком. Но в случае getCandlesByIndex ресурсы тратятся ещё и на отображение графика и индикатора, что более ресурсоёмко, чем просто вычисление.
Надо делать так, как надо. А как не надо - делать не надо.
Копирование значения ячейки в таблице
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
26.09.2016 19:04:37
Добрый день. Добавьте пункт меню "Копировать ячейку" (для копирования кодов бумаг, ISIN и пр.)
Надо делать так, как надо. А как не надо - делать не надо.
СПРАВКА ПО QLUA. ВЫЧИТКА (Версия 7.4)
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
23.09.2016 21:53:03
Цитата
Stanislav Tvorogov написал: Внесистемные сделки также присутствуют в потоке обезличенных сделок и OnAllTrade должен на них сработать.
Надо делать так, как надо. А как не надо - делать не надо.
коды событий поворотов колеса мыши SetTableNotificationCallback
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
23.09.2016 16:29:04
Цитата
Старатель написал: Зарегистрируйте пожелание, чтобы функция GetCell возвращала значения ячеек из нулевой строки (названия колонок).
Надо делать так, как надо. А как не надо - делать не надо.
Теоретическая разница получения данных CreateDataSource+SetUpdateCallback или getNumCandles()+getCandlesByIndex(), В чем разница получения данных 1 способом и 2 способом
Николай Камынин написал: CreateDataSource+SetUpdateCallback - получаем данный в момент прихода их с сервера, т е до помещения в хранилище в терминале.
в этом я сильно сомневаюсь. Всё, что сыпется с сервера - сериализуется на жёстком диске.
Практически было установлено, что сначала вызывается колбэк в момент получения данных, и лишь затем эти данные сбрасываются в хранилище на диске.
Цитата
Владимир Б****ов написал: Т.е если таймфрейм установлен в 3 минуты - то получение данных ~ 1 раз в 3 минуты
Нет, в течение 3-х минут свеча может обновиться несколько раз. В этом вы можете убедиться просто понаблюдав за последней свечой на 3-минутном графике. И на каждое изменение вы будете получать колбэк.
Надо делать так, как надо. А как не надо - делать не надо.