Хочется на график вывести красоту типа "Отметка цены"(хвост понравился) и подвигать ее через SetLabelParams() - 1.jpg берем график Si тег графика = "jbd"
Код
Setup = {
class = "SPBFUT",
sec = "SiH2"
}
local tostring__ = tostring
function tostring(x)
return tostring__(math.tointeger(x) or x)
end
function metka(pos, price)
local h,m,t = string.match(getInfoParam("SERVERTIME"),"(%d%d)%p(%d%d)%p(%d%d)")
local time_pos = h..m..t
local d,m,y = string.match(getInfoParam("TRADEDATE"),"(%d%d)%p(%d%d)%p(%d%d%d%d)")
local date_pos = y..m..d
label_params = {
TEXT = tostring(price),
IMAGE_PATH = "",
ALIGNMENT = "LEFT",
YVALUE = price,
DATE = date_pos,
TIME = time_pos,
R = 80,
G = 80,
B = 180,
TRANSPARENCY = 0,
TRANSPARENT_BACKGROUND = 1,
FONT_FACE_NAME = "Arial",
FONT_HEIGHT = 10,
HINT = tostring(pos)
}
return label_params
end
function main()
local curp = getParamEx2(Setup.class, Setup.sec, "LAST").param_value+0
up_label_id = AddLabel("jbd", metka("UP", curp+100))
dwn_label_id = AddLabel("jbd", metka("DWN", curp-100))
SetLabelParams("jbd", up_label_id, metka("UP", curp+100))
SetLabelParams("jbd", dwn_label_id, metka("DWN", curp-100))
end
получаем 2.jpg. Это обычная метка без хвоста. Вопрос можно ли хвост приделать как у "Отметка цены". Пока нашел такой вариант... Кидаем на график парочку "Отметка цены" и перебором находим их.
Код
Setup = {
class = "SPBFUT",
sec = "SiH2"
}
local tostring__ = tostring
function tostring(x)
return tostring__(math.tointeger(x) or x)
end
function metka(pos, price)
local h,m,t = string.match(getInfoParam("SERVERTIME"),"(%d%d)%p(%d%d)%p(%d%d)")
local time_pos = h..m..t
local d,m,y = string.match(getInfoParam("TRADEDATE"),"(%d%d)%p(%d%d)%p(%d%d%d%d)")
local date_pos = y..m..d
label_params = {
TEXT = tostring(price),
IMAGE_PATH = "",
ALIGNMENT = "LEFT",
YVALUE = price,
DATE = date_pos,
TIME = time_pos,
R = 80,
G = 80,
B = 180,
TRANSPARENCY = 0,
TRANSPARENT_BACKGROUND = 1,
FONT_FACE_NAME = "Arial",
FONT_HEIGHT = 10,
HINT = tostring(pos)
}
return label_params
end
function search_metka(idmetka, inum)
local q = GetLabelParams(idmetka, inum)
if q ~= nil then
return inum
end
return -1
end
function main()
local curp = getParamEx2(Setup.class, Setup.sec, "LAST").param_value+0
up_label_id = -1
dwn_label_id = -1
local q = 0
for i = 0, 100, 1 do
q = search_metka("jbd", i)
if q ~= -1 then
if up_label_id < 0 then
up_label_id = q
elseif dwn_label_id < 0 then
dwn_label_id = q
break
end
end
end
SetLabelParams("jbd", up_label_id, metka("UP", curp+100))
SetLabelParams("jbd", dwn_label_id, metka("DWN", curp-100))
end
1. Запускаю все отлично 2. Делаю подобрать ширину столбцов и ширина столбцов вместе с названием подгоняется не по названию столбцов, а по содержимому ячеек. Вариант подгонки ширины столбцов по содержимому ячеек это неплохо, но можно ли как то сделать подгонку по названию столбцов ?
1) Открываем график ставим ему идентификатор getCandlesByIndex() - показывает 3677 свечей 2) Ставим в "Диаграмма" -> "Диапазон данных" -> Ставим последние 500 интервалов и ставим фильтр времени "10:00 - 18:40" getCandlesByIndex() - 3677 То есть getCandlesByIndex() просто тупо выводит все свечи и никак не фильтруется ? Ежели так то можно как-то добавить фильтрацию от "Диаграмма" -> "Диапазон данных".
-- Закрасить ячейку по номеру строки и имени столбца
function QTable:SetColor(row, name, b_color, f_color, sel_b_color, sel_f_color)
local t={}
local col_ind = self.columns[name].id
if col_ind == nil then
return nil
end
t = SetColor(self.t_id, row, col_ind, b_color, f_color, sel_b_color, sel_f_color)
return t
end
-- Функция для подсветки выбранного диапазона ячеек цветом фона
-- и цветом текста в течении указанного времени с плавным «затуханием»
function QTable:Highlight(row, name, b_color, f_color, timeout)
local t={}
local col_ind = self.columns[name].id
if col_ind == nil then
return nil
end
t = Highlight(self.t_id, row, col_ind, b_color, f_color, timeout)
return t
end
Вроде решил проблему ... В документации: SetCell(String, Integer, Integer, String) - запись значения в таблицу по указанным номерам столбца и строки 4 аргумента передаются Идем в Файл quik_table_wrapper.lua: смотрим
Код
-- Установить значение в ячейке
function QTable:SetValue(row, col_name, data)
local col_ind = self.columns[col_name].id or nil
if col_ind == nil then
return false
end
-- если для столбца задана функция форматирования, то она используется
local ff = self.columns[col_name].format_function
if type(ff) == "function" then
-- в качестве строкового представления используется
-- результат выполнения функции форматирования
SetCell(self.t_id, row, col_ind, ff(data), data)_____________________<опа 5! аргументов, а не 4
return true
else
SetCell(self.t_id, row, col_ind, tostring(data), data)_____________________<опа 5! аргументов, а не 4
end
end
Сделал SetCell(self.t_id, row, col_ind, tostring(data)) глюк исчез
SetCell(t.t_id, row, 1, "time") <- спасибо заработало(я забыл что с 1 надо было начинать) НО t:SetValue(row,"time","ai") <- Не работает то есть в таблице ничего не показывает. Такое чувство что t:SetValue() не работает QTABLE_STRING_TYPE, потому что числа(QTABLE_DOUBLE_TYPE) выводятся
Для VALTODAY и иже подобных ... Транслирует ли брокер с биржи эти данные(НЕ В МОМЕНТЕ,А ИМЕННО ИСТОРИЮ например неделю назад) ? Нет? Значит нет ... Чтобы это понять делаем следующее: 1) Создать Окно -> Текущие торги -> Выбираем что надо например "оборот" выбираем любой инструмент наиболее ликвидный си или ртс. 2) В таблице переходим в колонку "оборот" и правой кнопкой выбираем сделать график по "обороту" 3) В созданном графике меняем таймфрейм на дневки(например) и смотрим строится ли график по дням. 4) Если строится то ставим свой идентификатор для графика и считываем его getCandlesByIndex("vasya", X1, X2,X3) ИЛИ CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1, "VALTODAY") 5) Если в графике только тек. день и все ... значит данные не транслируются от брокера или с биржи. Точнее их и нет видать :). Значит делаем скрипт который пишет данные по инструменту в файл ... ждем пару недель и т.д.
вместо dofile (getScriptPath() .. "\\quik_table_wrapper.lua") dofile (getScriptPath() .. "\\ntime.lua") лучше сделать так Допустим квик находится "c:\quik" в этой папке создаете папку например "scripts" dofile (getWorkingFolder() .. "\\scripts\\quik_table_wrapper.lua") dofile (getWorkingFolder() .. "\\scripts\\ntime.lua") P.S. у меня в квик 7.27 getScriptPath() выставлен в "c:\quik", а у вас вообще не выставлен. кстати спецы где эту папку прописать ?
скрипт у меня находится в папке c!Quik!scripts Из "Руководство пользователя Интерпретатора языка Lua" взял методом copy&paste 2 файла: quik_table_wrapper.lua и ntime.lua. Файл table_object.lua обрезал до https://pastebin.com/TrMfSzrH Запуск и ... таблица пустая а вот этот код(в ссылке строки 43-53) выдает 2 и 4 а должен 1 и 3
row = t:AddLine()
if SetCell(t.t_id, row, 0, "time") == true then
message("1")
else
message("2")
end
if t:SetValue(row,"ai","ai") == true then
message("3")
else
message("4")
end
SetCell(): Функция возвращает «true» в случае успешного завершения, иначе – «false».
1) Нашел формулу в интернете 0.02* курс ЦБР*фьюч RTS. Смотрел спецификации не нашел этой формулы,решил работать через квик. 2) Нашел в квике " стоимость шага цены"(12.56008) + "стоимость шага цены в валюте"(0.2) . Что делать с ними не понял. Например фюч ртс 156730 сколько это в руб(формула). так и не понял.
Беру график цены одного инструмента в стакане и правой кнопкой делаю график ... потом добавляю цену другого инструмента прям на этот график... Один график привязан к левой шкале графику другой к правой... Вопрос ! Может ли индикатор вытащить С() для 1 графика и второго(при том что 2-3 и т.д. инструментов рисуются в одной области) и как это сделать ? Пример: Выбираю rts стакан делаю построить график .. добавляю к нему график в эту же зону рисования например si. И накидываю индикатор... как он может ловить O,H,L,C,T для каждого инструмента и строить свой график
Поставил терминал от брокера (в нем есть преднастроенный info.wnd с графиками, таблицами и т.д.). В таблице "котировки фьючерсов" удаляю все и делаю один инструмент rts9-19. Сохраняю info.wnd. Оставляю терминал включ. на пару недель(иногда комп перезагружаю) и захожу на вкладку и вижу что rts9-19 уже не один ... P.S. пробовал удалять все графики, все вкладки и таблицы и делал одну эту таблицу и один график + стакан и через пару дней опять левые инструменты набежали... Квик 7.27.2.1 Кстати и год и 2 назад(тогда были другие версии квика) такая же проблема ... вот решился описать эту проблему.
В разработчике стратегий выбрал например купленый стрэдл. Факт. показывает одну прибыльность(тету вег и т.д.) по сценарию1 значения другие ... Вот картинка
1) Может ли луа-скрипт перезагружаться от сессии к сессии ??? то есть запускаться как бы с нуля ? 2) как обьяснить такую картинку(ID транзакции 1,2,3 а дальше пусто - что(кто) это???) http://s017.radikal.ru/i434/1603/f4/b158e3bbe6ad.png. Причем по скрипту это должно было в 19-00 - 19-20 но никак в 20-52 !!! Я допускаю лишь то что скрипт как бы заново запустился ... Да судя по схеме(если просто посчитать, а в теории должно быть 3 купленных си) у меня должен быть 0 !!!фьючей в 20-52,но по таблице портфель 3 си проданных фьюча(на момент 22-20) и маржа меняется. Че-то видать совсем нето с терминалом 6.17
Николай Камынин написал: 1) а это что за библилотека?require ('math') 2) поставьте slep больше от 200
- чтоб вызывать math.abs math.modf и т.д. она не влияет - ставил и 350 400 500 все бестолку после 500-1500 изменений на си6-16(и не только на нем) висит терминал ... решил по другому индюк пишет в файл значения, а скрипт читает значения из файла ... P.S. просто я понимаю что в 7.1 этого нету и вся бы проблема решилась бы ... но в бд Открытие почему-то версия обновления зависла на 6.17 и время на бодание чтоб обновить версию уйдет немерянно ...
Quik 6.17.3.6 Берем график любой, например si-6.16, накидываем(можно в новом окне) индикатор MACD(указываем в нем идентификатор например siq10 + включил опцию показ посл. значение) Временной интервал взял 10 минутки(не обязательно) Запускаем DebugView чтоб видеть PrintDbgStr Дальше Lua->Доступные скрипты и запускаем ниже описанную программу и получаем след. картинку: - В районе строк в DebugView = 500-1500 вывод в DebugView - останавливается - quik терминал наглухо зависает Перезагрузка терминала, компа роли не играет ... терминал виснет наглухо Естественно и без DebugView терминал виснет Я так вижу проблема в getNumCandles и getCandlesByIndex
function PrintDbgStr2(pds) PrintDbgStr(''..pds) end
function main()
t_info =AllocTable() AddColumn (t_info , 1, "T", true, QTABLE_STRING_TYPE,80) CreateWindow(t_info) for i=1,MAX_T_INFO do InsertRow(t_info , -1) end
while not_stopped do sleep(50) local t,n,l local smz = getNumCandles(tag) or 0 if smz > 2 then t,n,l = getCandlesByIndex(tag,0,smz-2,1) t1,n1,l1 = getCandlesByIndex(tag,0,smz-1,1) end
Почему графики в квик распечатываются ч/белыми ? ... тот же пайнт(любые в нем цветные картинки) печатает цветом(то есть дрова работают и в настройках дров разрешена печать цветом)...
Alex пишет: вы имеете полное право не соглашаться. попробую развернуть: 1) что касается денег правительства - вот пример http://www.rosalab.ru/ эта РОСА объявляла о банкротстве в прошлом году, а тут такой сюрпиз - санкции и на тебе, люди вовремя сориентировались и присасались, смотрите мол импортозамещаем. гляньте на список их продуктов. и почти все они теперь платные.
А кто сказал что будет бесплатно? Вопрос тут в том что таже ОС(Винда) амеровская будь она русской или китайской Вы думаете она ДОЛЖНА быть бесплатной ? Другое дело если импортзамещенные аналоги при худших характеристиках стоят столько же сколько или даже больше чем дяди Сэмовского аналога ...
Серж пишет: Что возвращает sendTransaction(trans)?
Спасибо Серж! Проблема решена ! sendTransaction() - говорил о неправильном идентификаторе ... в общем оказалось что заявки вручную удаляются с TRANS_ID = "1"
dimka пишет: 2) Если выполняется OnOrder() остальные On...()
Колбеки в LUA работают в одном потоке. пока один колбек занят остальные ждут. Именно поэтому мы не рекомендуем выполнять в колбеках какие-либо тяжелый манипуляции.
SetTableNotificationCallback() - я так понимаю устанавливает тоже колбэк на события в таблице ? Значит получается отрабатывая колбэк нажатия кнопки мыши - kill_all_order() ... OnOrder() не сработает или я неправильно понял?
Во 2) пункте общий вопрос имелся ввиду "Во время любого On...() может ли он прерватся новым On...() или отработается текущий On...() до конца и затем другие On...() последовательно из очереди будут отработаны. И кстати эта очередь есть или пришел On...() отработать не смог - выкидываем"
Кратенько: Нужно снять все заявки ... Нажимаем левую кнопку мыши и через установленный обработчик(методом SetTableNotificationCallback) на это нажатие выполянем kill_all_order() ... также установлен OnOrder()...OnTrade()
-- убираем 1 заявку function kill_order(atri) local trans = { ["ACTION"] = "KILL_ORDER", ....тыр-тыр } local res = sendTransaction(trans) end
local function fnorder(psecode,pflags) if psecode ~= sec then return false end if bit.band(pflags, 1)~=0 then return true end end
-- убираем все заявки function kill_all_order() local t1 = SearchItems("orders", 0, getNumberOf("orders") +1, fnorder,"sec_code,flags") if t1 ~= nil then for i = 1, #t1, 1 do atri = getItem("orders", t1[i]) kill_order(atri) end end end
Вопрос! 1) Во время работы kill_all_order() будут срабатывать OnOrder(),OnTrade() ? 2) Если выполняется OnOrder() остальные On...() ждут последовательно в очереди или пришло событие начинаем отрабатывать ? 3) Нельзя ли это осветить в документации ?
Egor Zaytsev пишет: "Добрый день. Т.е все тоже самое, что описано мною выше, но только для всех серверов указанных в пункте Связь/Доступные соединения ?"
Да именно так ... но пинговать постоянно все серваки не надо ... Достаточно в "просмотр доступных соединений" к пунктам "Описание соединения", "IP-адресс","Порт", "Ключ сервера" добавить пункт "пинг" ... и только в этом диалоге делать пинговку всех серваков.
Раньше серваки одного брокера(их у него не меньше 4) мог пинговать для уменьшения лага ... терь пинги брокер блокирует ... Добавьте в квик возможность пинговки серваков хотя бы через меню списка серверов ....