Как получить Биржевой сбор по фьючерсам и по акциям?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.01.2017 17:01:19
Цитата
Sergey Gorokhov написал: Полного списка к сожалению не существует, так как биржевых площадок много и для каждой свои параметры.
Предлагаю из Lua дать доступ к чтению списка параметров, что то вроде таблицы:
Код
parameters = {
OPEN = "Цена открытия",
HIGH = "Максимальная цена сделки",
LOW = "Минимальная цена сделки",
LAST = "Цена последней сделки",
QTY = "Количество бумаг в последней сделке",
...
}
возвращаемой при запросе таблицы параметров с указанием класса:
Код
parameters = getParametersList( class_code )
Надо делать так, как надо. А как не надо - делать не надо.
Баг - стоимость шага цены
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.01.2017 16:46:04
Цитата
Egor Zaytsev написал: Мы зарегистрировали пожелание, чтобы в дальнейшем было одно поле.
Давайте уже сейчас определимся, какой параметр использовать в скриптах. А то так втихаря уберёте один параметр, и скрипты перестанут работать.
Надо делать так, как надо. А как не надо - делать не надо.
ParamRequest и CreateDataSource не заказывают получение параметров Таблицы текущих торгов
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.01.2017 12:26:03
Не то название настройки скопировал... Ну почему нельзя отредактировать сообщение? Правильно так:
Если в настройках получения данных стоит галка "С учетом настроек, выбранных пользователем вручную через пункт меню Система/Заказ данных/Поток котировок...", то ни ParamRequest ни CreateDataSource не могут заказать получение параметров Таблицы текущих торгов с сервера. При этом они радостно сигнализируют об успехе. Нужно изменить такое поведение.
Надо делать так, как надо. А как не надо - делать не надо.
ParamRequest и CreateDataSource не заказывают получение параметров Таблицы текущих торгов
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.01.2017 12:16:40
Если в настройках получения данных стоит галка "Исходя из настроек открытых пользователем таблиц", то ни ParamRequest ни CreateDataSource не могут заказать получение параметров Таблицы текущих торгов с сервера. При этом они радостно сигнализируют об успехе. Нужно изменить такое поведение.
Надо делать так, как надо. А как не надо - делать не надо.
Экспорт по DDE в LibreOffice Calc, Как настроить экспорт?
1.3 Разделитель CSV формата теперь можно не указывать. Будет использоваться системная настройка Windows
Как вы определили системную настройку Windows?
Надо делать так, как надо. А как не надо - делать не надо.
Опять массив :)
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
20.01.2017 01:23:34
Код
function table.transform(tab)
local ntab = {}
for k, v in pairs(tab) do ntab[v] = k end
return ntab
end
ticker = {}
ticker["SBER"]= 3
ticker["LKOH"]= 2
ticker["GAZP"]= 1
for k, v in ipairs(table.transform(ticker)) do
print(v, k)
end
Надо делать так, как надо. А как не надо - делать не надо.
OnParam даёт время события с точностью до секунд. Поэтому можете хоть песочными часами время синхронизировать ))
Надо делать так, как надо. А как не надо - делать не надо.
Вызов getDataSourceInfo() из Init() в Lua индикаторах
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
16.01.2017 13:59:26
Цитата
Алексей написал: Не прослеживается единообразия в логике вызовов Init() со стороны Quik: при исходном добавлении индикатора на график, Init() вызывается до привязки к источнику данных, а при замене инструмента Init(), почему-то, вызывается уже после привязки к новому инструменту.
При добавлении индикатора сразу указывается Источник данных. Поэтому описанное поведение больше похоже на ошибку в логике.
Надо делать так, как надо. А как не надо - делать не надо.
Здесь нет задержки. По оси y отложена цена инструмента из пришедшего колбэка. Что касается задержки, то вы никакими супер-атомными часами не получите время задержки для OnParam в QUIK. Вы ведь не серьёзно про часы-то?
Цитата
Николай Камынин написал: Как Вы узнали что в OnParam нет лучшей цены?
На график в OnParam выведены только изменения по LAST.
Надо делать так, как надо. А как не надо - делать не надо.
Таблица с помощью Qlua, Таблица с помощью Qlua
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.01.2017 15:25:50
К сожалению, я не знаю как вам помочь. Ваш код с исправленным p_classcode_94:
Надо делать так, как надо. А как не надо - делать не надо.
Таблица с помощью Qlua, Таблица с помощью Qlua
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.01.2017 15:15:01
Скрытый текст
Цитата
Optimus1 Optimus1 написал: 1)Стиратель не нужно пожалуйста поспешных выводов, с моей стороны это не более чем ошибка при копировании из блокнота
Optimus1 Optimus1, ну так и приводите полный рабочий код того скрипта, на котором у вас возникает проблема, в удобочитаемом виде,
Скрытый текст
а не состряпаную из кусков разных программ портянку, где пустых строк больше, чем полезного кода. Вам самому-то удобно это читать? Но я думаю, что вы уже поняли, что инкремент работает, как надо.
Надо делать так, как надо. А как не надо - делать не надо.
Таблица с помощью Qlua, Таблица с помощью Qlua
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.01.2017 14:28:22
Sergey Gorokhov, по-моему товарищ вас тролит, предлагая явно неработающий код (при этом утверждает, что чё-то там выводится) и отвлекая от РАБОТЫ. У вас ведь есть чем заняться? Ошибок-то в терминале полно! Надо исправлять.
Optimus1 Optimus1 написал: function OnQuote(class_code, sec_code) if class_code==p_classcode_94 and sec_code==p_seccode_94 then --94)SBER
Тут не может ничего выводиться по определению. Авто явно ммм... говорит неправду.
Надо делать так, как надо. А как не надо - делать не надо.
Таблица с помощью Qlua, Таблица с помощью Qlua
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.01.2017 12:29:00
На форуме есть тэг [CODE], чтобы никто не ломал глаза, читая ваш код.
Надо делать так, как надо. А как не надо - делать не надо.
Ошибка при автоматическом масштабировании графиков по вертикали
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.01.2017 12:12:02
Цитата
Alexey Ivannikov написал: Если у Вас есть что посоветовать - пожалуйста.
1. Самый простой вариант:
Цитата
quikscalp написал: Значения индикаторов следует исключить из учёта при автоматическом масштабировании графиков, как это сделано для цен заявок и позиций.
2. Вариант посложнее: Масштабировать график таким образом, чтобы в видимую область попадало последнее значение индикатора. Т.е., автомасштабировать с учётом последней точки индикатора.
Надо делать так, как надо. А как не надо - делать не надо.
Ошибка при автоматическом масштабировании графиков по вертикали
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.01.2017 10:02:03
Alexey Ivannikov, вы сами-то пробовали то, что советуете? Зачем нужен, например, Bollinger Bands без привязки к оси цен?
Надо делать так, как надо. А как не надо - делать не надо.
Таблица с помощью Qlua, Таблица с помощью Qlua
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.01.2017 09:59:10
Здесь OnQuote выполняется только для одного инструмента:
Надо делать так, как надо. А как не надо - делать не надо.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
12.01.2017 23:14:08
Чтобы узнать, кто пришёл раньше, атомные часы не нужны. Есть такое понятие, как точка отсчёта.
Скрытый текст
По оси х отложено время получения колбэка (в мс) с момента начала отсчёта. В OnParam - только параметр LAST, никаких стаканОв. Данные с боевого сервера - незадолго до окончания торгов.
Надо делать так, как надо. А как не надо - делать не надо.
Ядра процессора
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
11.01.2017 09:22:24
*Хотя, если все вычисления производятся в колбэках, а в main - пустой цикл, то для каждого Квика достаточно двух ядер.
Надо делать так, как надо. А как не надо - делать не надо.
Ядра процессора
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
11.01.2017 09:03:59
Цитата
Старатель написал: Для максимальной производительности количество ядер должно быть не менее, <количества запущенных роботов + 1> (если QUIK один).
Хотя, если все вычисления производятся в колбэках, то для каждого Квика достаточно двух ядер. Здесь большую роль играет частота процессора.
Надо делать так, как надо. А как не надо - делать не надо.
Ядра процессора
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
10.01.2017 15:12:58
Для максимальной производительности количество ядер должно быть не менее, <количества запущенных роботов + 1> (если QUIK один). Если это условие соблюдено и частоты процессоров в обоих случаях одинаковы, то потери в производительности быть не должно. Но есть технология Turbo Boost, которая может изменить расклад. Не знаю работает ли она на виртуалках.
Что касается памяти, то тут немного сложнее. Дело в том, что Windows часть данных выгружает в swap-файл на HDD или SSD (даже если памяти полно). Чем меньше ОЗУ, тем больше данных будет выгружено в swap, а операции чтения/записи на HDD во много раз более затратны, чем с ОЗУ. Поэтому оперативной памяти в Windows много не бывает )) Если же комп будет часто "свопиться", то потеря в производительности может быть очень существенной.
Надо делать так, как надо. А как не надо - делать не надо.
измерить скорость выставления заявки
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
10.01.2017 10:57:01
Не все брокеры обновили сервер, поддерживающий версию 7.6
Надо делать так, как надо. А как не надо - делать не надо.
Кто как решил вопрос уведомления о сделках?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
10.01.2017 01:05:24
Как изменить timeout? Пробовал и так:
Код
TIMEOUT = 100
и так:
Код
local sock = socket.tcp()
sock:settimeout(100)
Изменений никаких.
Надо делать так, как надо. А как не надо - делать не надо.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
09.01.2017 12:34:22
Надо делать так, как надо. А как не надо - делать не надо.
два робота в одном квике
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
07.01.2017 13:27:39
Космонавт, Никто не сможет дать вам точный ответ, какой вариант будет достаточным и необходимым конкретно в вашем случае. Поскольку вы и сами то толком не знаете, была ли необходимость что-то усложнять. А мы и подавно этого не знаем. Тов. swerg задаёт вам правильные вопросы, прислушайтесь к ним.
Цитата
Космонавт написал: 3 решение самое сложное (я сейчас им пользуюсь). Две виртуалки, в каждой из которой сидит свой КВИК со своим роботом. Но и тут Старатель опровергает преимущества, но толком не объясняет почему.
Старатель не опровергает, по той же причине: вы и сами не можете , что вы хотите этим улучшить и за счёт чего. А я не могу знать, может, в вашем случае этот вариант даст какие-то преимущества.
Надо делать так, как надо. А как не надо - делать не надо.
два робота в одном квике
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
06.01.2017 22:27:02
Космонавт, Как я полагаю параллельного получения колбэков с одного сервера QUIK не добиться (разработчики меня поправят, если ошибаюсь) даже на нескольких терминалах. Значит, то что вы можете ускорить - это исполнение кода самого колбэка, если он у вас действительно медленно работает. Добиться этого можно либо увеличением частоты процессора либо распараллеливанием исполнения по разным потокам (при наличии ресурсов). Но не внутри одного квика, а в разных терминалах.
Надо делать так, как надо. А как не надо - делать не надо.
Старатель написал: Ведь информация через сетевой интерфейс будет поступать не параллельно.
Но вы бы действительно двигались дальше, если бы сделали , выяснили, что вас не устраивает и какую именно скорость хотите увеличить.
Надо делать так, как надо. А как не надо - делать не надо.
два робота в одном квике
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
06.01.2017 21:32:06
Цитата
Николай Камынин написал: Чтобы колбеки исполнялись параллельно надо внутри колбеков открывать потоки. А луче (я делал именно так) колбеки выносить в отдельные скрипты. В резлутате будет вообще-то, для каждого колбека будет свой поток.
Только выполняться каждый из параллельных потоков будет , чем при последовательном исполнении. Отсюда - выигрыш в скорости от параллельного исполнения колбэков под вопросом.
Надо делать так, как надо. А как не надо - делать не надо.
два робота в одном квике
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
06.01.2017 21:25:08
Цитата
Космонавт написал: Не понял последний вопрос. Что вас смутило? Обе виртуалки арендую у UltraVDS, Брокер один, сервер у него один.
Чем две виртуалки, по вашему, лучше двух терминалов внутри одной виртуалки (с равным суммарным количеством ядер и ОЗУ)?
Надо делать так, как надо. А как не надо - делать не надо.
два робота в одном квике
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
06.01.2017 17:18:09
Цитата
Космонавт написал: Уже арендовал вторую, теперь ммвб-шный робот на одной виртуалке, фортс-робот на второй. Процессора хватает, памяти хватает, скорость интернета немыслимо хороша. Как оценить скорость срабатывания колбеков и понять выиграл я в скорости или равнозначно?
Обе виртуалки стоят на одном физическом сервере с одним сетевым интерфейсом? Оба квика подключены к одному серверу QUIK? За счёт чего предполагается получить "выигрыш я в скорости"?
Надо делать так, как надо. А как не надо - делать не надо.
два робота в одном квике
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
02.01.2017 13:58:42
Цитата
swerg написал: Потому что колбеки будут работать параллельно.
Точно? Ведь информация через сетевой интерфейс будет поступать не параллельно.
Надо делать так, как надо. А как не надо - делать не надо.
три таймфрейма
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
30.12.2016 14:23:08
Я изначальный вопрос не понял. Функция mycallbackforallstocks может быть одна. Но CreateDataSource(class,sec,interval):SetUpdateCallback нужно задавать для каждого таймфрейма.
Надо делать так, как надо. А как не надо - делать не надо.
три таймфрейма
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
30.12.2016 13:40:56
Цитата
Космонавт написал: Будет ли один колбек обновлять три DataSource?
А как вы сами думаете? Будет обновляться DataSource с заданным тайм-фреймом: CreateDataSource(class,sec,interval)
Надо делать так, как надо. А как не надо - делать не надо.
Тэйк-профит: старые песни о защитном спрэде, Возможные сюрпризы при совершении сделки по тэйк-профиту
Надо делать так, как надо. А как не надо - делать не надо.
Кто как решил вопрос уведомления о сделках?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.12.2016 20:16:09
Цитата
SDL написал: Качаем модуль LuaSec: Проект: Бинарники можно взять тут: . Нужны 2 файла - ssl.dll и ssl.lua. Использует библиотеки OpenSSL libeay32.dll и ssleay32.dll. Скачать, если нет, и не забыть обеспечить к ним доступ - через окружение (PATH) или можно кинуть в папку с QUIK.
Цитата
vgi написал: Есть хорошая обёртка для отправки писем lua-sendmail: Ей потребуется luasec, который в уже собранном виде можно взять из ссылки из третьего поста вот такого топика:
При отправке первого письма из скрипта с gmail.com приходит ответ "closed". Второе и последующие письма отправленные, из того же скрипта (причём, первым может быть и mail.ru) уходят нормально. Кто-нибудь сталкивался с таким? Как лечить?
Надо делать так, как надо. А как не надо - делать не надо.
получение параметров индикатора, обращение к line
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
25.12.2016 21:38:12
Цитата
Борис Гудылин написал: Затем пошел второй перерасчет индикатора (сейчас это, как бы, норма)
Когда два, а когда и три раза индикаторы пересчитываются. Вот код:
Скрытый текст
Код
Settings = {
Name = "Учимся считать",
Param = 0,
line = {{Name = 'Test'}}
}
message('[Body] Param=' .. Settings.Param )
function Init()
message('[Init] Param=' .. Settings.Param)
return 1
end
n = 0
function OnCalculate(index)
if index == 1 then
n = n + 1
message('[OnCalculate] ' .. tostring(index) .. ': Param=' .. Settings.Param .. '; расчёт ' .. n)
end
return nil
end
Чтобы задать сразу параметры индикатора, дабы избежать лишних пересчётов, делаю следующее: открываю "Редактирование настроек графика" -> Добавить -> Выбираю индикатор -> Добавить Далее в свойствах индикатора меняю значение параметра -> OK Не тут-то было. Вот результат:
Скрытый текст
Как видно, индикатор рассчитывается три раза (!), причём первый расчёт идёт со старым значением, но уже после нажатия на кнопку OK.
Предложения:
1. Исправьте ошибку с лишними пересчётами индикаторов при их добавлении или изменении.
2. Дайте доступ к чтению свойств линий из OnCalculate
Надо делать так, как надо. А как не надо - делать не надо.
Вполне резонный вопрос. Эта настройка влияет не на конкретный индикатор, а на всю область диаграммы.
Надо делать так, как надо. А как не надо - делать не надо.
автоматизация стопа
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
22.12.2016 10:06:25
Можно написать скрипт на для этих целей.
Надо делать так, как надо. А как не надо - делать не надо.
Временный интервал в виде кнопок, как сделать?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.12.2016 15:43:22
Цитата
Stanislav Tvorogov написал: реализация пожелания признана потенциально целесообразной
Как бы хуже не стало... Не знаю, что там признано целесообразным, но если вместо одного выпадающего списка на панели появятся 17 кнопок, то не вижу ничего хорошего.
Надо делать так, как надо. А как не надо - делать не надо.
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
21.12.2016 10:09:14
Цитата
Антон Кыт. написал: Чтобы это определить, всем пользователям QuikLUA был бы полезен метод датасорса ds:ServerSize() Его смысл в том, чтобы сразу узнать сколько всего баров данного таймфрейма имеется на сервере истории?
Антон Кыт. написал: метод датасорса ds:ServerSize()
Он и сейчас есть ds:Size()
Так ли это?
Надо делать так, как надо. А как не надо - делать не надо.
Временный интервал в виде кнопок, как сделать?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
19.12.2016 09:24:50
Кнопки будут занимать много места. Выпадающий список экономит место на панели.
Надо делать так, как надо. А как не надо - делать не надо.
setmetatable
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
18.12.2016 10:20:02
Понял, спасибо!
Код
s = setmetatable({}, {__index = function(t, i)
local result = i * i
t[i] = result
return result
end})
Надо делать так, как надо. А как не надо - делать не надо.
setmetatable
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
17.12.2016 21:55:55
А как это использовать? У меня не кэширует:
Код
s = setmetatable({}, { __index = function(t, i)
local result = print('Считаем...') or i * i
t = result
return result
end})
print(tostring(s[3]))
print(tostring(s[3]))
Результат:
Цитата
Считаем... 9 Считаем... 9
Надо делать так, как надо. А как не надо - делать не надо.
setmetatable
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
17.12.2016 14:32:04
Цитата
s_mike@rambler.ru написал: s = setmetatable( {}, function(t,i) local result = (считаем что-то) t[i] = result return result end)
Цитата
bad argument #2 to 'setmetatable' (nil or table expected)
Но я понял, что для моей задачи (кэширование только одного элемента таблицы) вариант будет лучше.
Надо делать так, как надо. А как не надо - делать не надо.
setmetatable
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.12.2016 23:52:42
Код
function func(v)
return v * v
end
s = {
f = function(v)
local r = s.r
if not r then
r = func(v)
s.r = r
end
return r
end
}
print(tostring(s.f(3)))
print(tostring(s.f(3)))
Функция s.f() запоминает вычисленное значение и при повторном обращении возвращает раннее вычисленное значение. Можно ли описать её через setmetatable? PS: возвращать она должна раннее сохранённое значение, независимо от переданного аргумента при повторном вызове.
Надо делать так, как надо. А как не надо - делать не надо.
Цена сделки вне лимита, Как избавиться от данной ошибки?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
12.12.2016 23:19:31
В Квике все получаемые параметры из терминала надо проверять не только на nil, но и на ноль:
Код
local last_price = getParamEx(classcode, seccode, "LAST").param_value
if last_price == nil then
-- Ошибка получения цены последней сделки
elseif last_price == 0 then
-- отправляем гневное сообщение в адрес разработчиков
else
-- работаем дальше
end
Уверен, что такая же беда при вычислении
Код
exit_price = price + stop_level_2000 + sl
Надо делать так, как надо. А как не надо - делать не надо.
AddColumn
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
12.12.2016 12:51:59
Цитата
width – ширина в условных единицах.
Что это за условные единицы такие? Они привязаны к шрифту? Если да, то каким образом?
Надо делать так, как надо. А как не надо - делать не надо.
Сделки с вечерней сессии FORTS
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
10.12.2016 18:17:22
Здравствуйте.
Как в коде определить, относится ли вечерняя сделка к текущей торговой сессии?
Надо делать так, как надо. А как не надо - делать не надо.
Редактирование настроек при добавлении индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
09.12.2016 10:14:03
Куда пропало окно с настройками при первичном добавлении индикатора?
Надо делать так, как надо. А как не надо - делать не надо.
Проблема с функцией SetSelectedRow()
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
07.12.2016 01:12:59
Цитата
Andrei2016 написал: почему срабатывание функции SetSelectedRow() не приводит к каким-либо визуальным изменениям в указываемой таблице?
Возможно, потому, что при нажатии на левую клавишу мыши срабатывают сразу три события: QTABLE_LBUTTONDOWN, QTABLE_SELCHANGED, QTABLE_LBUTTONUP Т.е., событие QTABLE_SELCHANGED возвращает выделение на нажатую строку после вашей функции funcCallback. Попробуйте так:
Код
if (msg == QTABLE_LBUTTONUP) then
local r = SetSelectedRow(t_id, 12)
Надо делать так, как надо. А как не надо - делать не надо.