Функция предназначена для получения информации о свечках по идентификатору (заказ данных для построения графика плагин не осуществляет, поэтому для успешного доступа нужный график должен быть открыт).
Формат вызова:
TABLE t, NUMBER n, STRING l getCandlesByIndex (STRING tag, NUMBER line, NUMBER first_candle, NUMBER count)
Параметры:
tag – строковый идентификатор графика или индикатора,
line – номер линии графика или индикатора. Первая линия имеет номер 0,
first_candle – индекс первой свечки. Первая (самая левая) свечка имеет индекс 0,
Поскольку QUIK показывает сделки только за текущую сессию, пришлось сделать пару скриптов.
Один - "летописец", ведет историю сделок. При остановке скрипта, разрыве связи с сервером или закрытии терминала добавляет ещё не учтённые сделки в текстовый файл. Всё остальное время он просто ждет.
Второй скрипт реализован как индикатор, выводящий на график метки сделок. Если несколько сделок подряд, одного направления и по одинаковой цене приходятся на одну и ту же свечу, то метки этих сделок объединяются с добавлением значка "плюс", а во всплывающей подсказке указывается, когда и сколько лотов добавилось.
В начало файла History можно скопировать сделки из отчета брокера [Меню > Расширения > Отчёты > Отчёт по всем сделкам клиента], чтобы увидеть на графике свои прошлые сделки (проверено на брокерах ВТБ и Сбер).
Есть опция показа сделок по уже исполненным фьючерсам (для практикующих склейку графиков).
Для быстрой смены инструмента можно подключить график к таблице "Текущие торги".
Attention! Индикатор удаляет ВСЕ метки с графика, на котором установлен. В демоверсии глубина истории ограничена 16-ю сделками.
Подскажите Как сделать в Квике( 9.2.3.15) на Lua вывод окна, с которого будет управляться робот?, Подскажите Как сделать в Квике( 9.2.3.15) на Lua вывод окна, с которого будет управляться робот?
Похоже, iss.moex ввела ограничение на количество запросов без паузы между ними. Качал свечки. Без паузы — 9 запросов, и "Recv failure: Connection was rese". C таймаутом 8 сек. - качает столько, сколько нужно.
function OnParam(class, sec)
if class == "SPBFUT" and (sec == Tr[1].sec or sec == Tr[2].sec) then
local sessn = (getParamEx("SPBFUT",sec,"TRADINGSTATUS").param_image == "открыта")
if sessn and (cond & 0x0080 == 0x0080) then
cond = cond & 0xFF7F -- Сброс "Сессия стоп".
SetColor(tw_id, 5, -1, -1, -1, -1, -1)
elseif not sessn and cond & 0x0080 == 0 then
cond = cond | 0x0080 -- "Сессия стоп".
SetColor(tw_id, 5, -1, yellow, -1, -1, -1)
end
end
end
Очень долгий пересчет клиентского портфеля (секунд 10)., Один из Квиков на компьютере зависает на 10 секунд при нажатии F5 на таблице Клиентский портфель. Если в настройках стоит галка "Обновлять через 15 секунд", то 10 секунд висит а пять работает.
Ziveleos написал: Не знаю как у Вас, возможно это зависит от брокера, в моем QUIKe от ВТБ, в таблице "Текущие торги" ГО указан на первом уровне лимита концентрации.(КПУР) Сравните ГО здесь: https://www.moex.com/ru/contract.aspx?code=Si-6.25
в том то и дело..В таблице всё указано верно,как и должно быть..А при выставлении заявки-уже другое(завышенное)
Вы написали:
Цитата
в таблице"текущие торги" так же соответствует категории КСУР
Не знаю как у Вас, возможно это зависит от брокера, в моем QUIKe от ВТБ, в таблице "Текущие торги" ГО указан на первом уровне лимита концентрации.(КПУР) Сравните ГО здесь: https://www.moex.com/ru/contract.aspx?code=Si-6.25
Igor_User написал: Есть ли какие-нибудь ещё способы определить строку, из-за которой эта ошибка произошла?
message("OK") и дихотомия. Ставим message в середине скрипта, если выскочило "OK", значит, ошибка дальше. Нет - до него. Делим проблемный кусок дальше. И т.д.
Глушкова Екатерина, шорт заработал, но в 10-й версии, в таблице "Купить/продать" по-прежнему, кроме "D long" и "D short", одни нули. Данные в таблице "Параметры рыночных рисков [ЦК]" отображаются.
Vasiliy написал: Это на Lua в Квике, без библиотек?
На qlua, без библиотек. Фрагмент скрипта работающий с окном:
Скрытый текст
Код
local function MainWindow()
limValue = "Market"
red = RGB(255,180,180)
local green = RGB(180,255,180)
yellow = RGB(230,230,0)
local function event_callback(mw_id, msg, row, col)
local function SetLimit()
limValue = string.format("%d ps", indLmPs)
SetColor(mw_id, 3, 4, -1, -1, -1, -1)
SetColor(mw_id, 2, 3, -1, -1, -1, -1)
end
if msg == QTABLE_CLOSE then
w_top, w_left, w_bottom, w_right = GetWindowRect(mw_id)
DestroyTable(x2_id)
DestroyTable(mw_id)
sleep(300)
OnStop()
end
if msg == QTABLE_LBUTTONDBLCLK then
if row == 1 and col == 1 then -- Стоп меньше на 10.
indStPrc = indStPrc - 0.8
elseif row == 1 and col == 4 then -- Стоп больше на 10.
indStPrc = indStPrc + 0.8
elseif row == 2 and col == 1 then -- Лимит меньше на 10.
indLmPs = indLmPs - 8
elseif row == 2 and col == 3 then -- Лимит ноль.
indLmPs = 0
SetLimit()
elseif row == 2 and col == 4 then -- Лимит больше на 10.
indLmPs = indLmPs + 8
end
end
if msg == QTABLE_LBUTTONUP then
if row == 1 and col == 1 then -- Стоп меньше.
indStPrc = indStPrc - 0.1
elseif row == 1 and col == 4 then -- Стоп больше.
indStPrc = indStPrc + 0.1
elseif row == 2 and col == 1 then -- Лимит. меньше.
indLmPs = indLmPs - 1
SetLimit()
elseif row == 2 and col == 4 then -- Лимит больше.
indLmPs = indLmPs + 1
SetLimit()
elseif row == 3 and col == 2 then -- Пауза
sPause = true
SetColor(mw_id, 3, 2, red, -1, red, -1)
SetColor(mw_id, 3, 3, -1, -1, -1, -1)
elseif row == 3 and col == 3 then -- Плей.
sPause = false
SetColor(mw_id, 3, 3, green, -1, green, -1)
SetColor(mw_id, 3, 2, -1, -1, -1, -1)
elseif row == 3 and col == 1 then -- х2
x2key = true
elseif row == 3 and col == 4 then -- Маркет/лимит.
if limValue == "Market" then
SetLimit()
else
limValue = "Market"
SetColor(mw_id, 3, 4, yellow, -1, yellow, -1)
SetColor(mw_id, 2, 3, -1, RGB(0,0,255), -1, RGB(0,0,255))
end
end
SetCell(mw_id, 1, 3, string.format("%.1f %%", indStPrc))
SetCell(mw_id, 2, 3, tostring(limValue))
end
end
mw_id = AllocTable()
-- Создание колонок.
local n = 1
local function NewColumn(hd,wt)
AddColumn(mw_id, n, hd, true, QTABLE_STRING_TYPE, wt)
n = n + 1
end
NewColumn("-",4)
NewColumn("Цена",9)
NewColumn("Отступ",9)
NewColumn("+",4)
CreateWindow(mw_id)
SetWindowPos(mw_id, w_left, w_top, (w_right - w_left), (w_bottom - w_top))
SetWindowCaption(mw_id, "Лонжа")
-- Заполнение строк таблицы.
local function FillRow(...)
local row = InsertRow(mw_id, -1)
for n,v in ipairs{...} do
SetCell(mw_id, row, n, tostring(v))
end
end
FillRow("<","Стоп:",string.format("%.1f %%",indStPrc)," >")
FillRow("<","Лимит:",limValue," >")
FillRow("x2"," I I"," >>","M")
SetColor(mw_id, 3, 3, green, -1, green, -1)
SetColor(mw_id, 2, 3, -1, RGB(0,0,255), -1, RGB(0,0,255))
SetColor(mw_id, 3, 4, yellow, -1, yellow, -1)
SetColor(mw_id, 3, 1, -1, -1, -1, -1)
SetTableNotificationCallback(mw_id, event_callback)
end
_LEV_ написал: На ДЕМО QUIK 12.2.0.37 при ручной продаже акции в шорт - выдает сообщение "Данный инструмент запрещен для операции шорт"
Такая же картина в 10 и 11 версиях, шортить "Юниор" не дает ничего. При этом, в 10-ой версии, в таблице "Купить/продать" одни нули, а в 11-ой, в таблице "Позиции по инструментам" тикеры повторяются дважды, с датой расчетов сегодня и завтра.
function main()
file = io.open(getScriptPath().."\\Карман.tri", "a+") -- Файл транзакций
tri = file:read("*a")
if not tri:match("%[") then
for rec in tri:gmatch("[^\n]+") do
rec = rec:gsub(";","\n")
rec = rec:gsub("([%g ]+)="," ['%1'] =")
rec = rec:gsub("=([%g ]*)","= '%1',")
rec = rec:gsub(",\n$","")
rec = "\ntransaction = {\n"..rec.."\n }\n"
file:write(rec)
end
end
file:flush()
file:close()
end
Использование: 1) Сохранить содержимое "Кармана транзакций" в файл Карман.tri 2) Запустить скрипт. 3) Забрать результат в том же файле.
У меня проще. Выставил заявку - автоматом стоп-лосс. Точнее половина «Тейк-профит и стоп-лимит». Приоритет у позиции. Опция удвоения, на отскок/пробой. Простой, как кувалда.
2.5. Таблицы (стр.36) "Вы можете рассматривать таблицу как динамически выделяемый объект; ваша программа работает только со ссылками (указателями) на них. Lua никогда не прибегает к скрытому копированию или созданию новых таблиц."