Если на текущей активной вкладке таблицы "Карман" не будет, то команда "Копировать в карман" будет недоступной.
Да, команда активизируется если все на одной вкладке и табл сделок и сам карман Но а зачем в таком случае оставили команды по сохранению в файл заявок если их потом не подгрузить? Вообще было гораздо функциональнее. Таблиц заявок как правило несколько и на разных вкладках, например по рынкам (акции, облигации, срочный) и все это дублировать в отдельной вкладке где и карманы неудобно и лишняя нагрузка Сделайте тогда хотя бы возможность выделять группу заявок в таблице заявок с теми чтобы можно было эту группу выгрузить в Карман-1, др группу в Карман-2 по аналогии возможности выделения группы через CTRL в самом кармане
Karina Dmitrieva написал: В таблицы заявок, стоп-заявок, внебиржевых адресных/безадресных заявок добавлена новая команда "Копировать в карман".
Команда "Копировать в карман" не активна, текущая версия 12.2.1.2 Из табл Заявок есть и активны Сохранить в файл заявки из таблицы и Сохранить в файл все заявки Их табл Стоп-заявок активны Сохранить в файл стоп-заявки из табл и Сохранить в файл все стов-заявки как и было в предыдущей 11 Из Кармана в 12.2 - только Загрузить транзакции из tri-файла
Karina Dmitrieva написал: действительно, в версии Рабочего места QUIK 11.4.0 исчезла возможность переносить заявки из таблицы заявок в карман транзакций
Karina, Прошу Вас пояснить ситуацию по данной ошибке в версии 12.2 где указано что проблема устранена но во всплывающем меню из Кармана нет опции "Загрузить заявки из файла"
paluke написал: Ну так решили же проблему с ошибками
Логично Из кармана есть только "Загрузить транзакции из tri-файла" а из таблицы заявок только "Сохранить в файл заявки из таблицы"
А по моему обращению и детально описанной проблеме по работе с метками уже 4 месяца ни ответа ни привета :) Кстати там же есть ссылки на эту проблему еще десятка участников форума#s3gt_translate_tooltip_mini { display: none !important; }
Сообщаем, что нами выпущена новая версия Рабочего места QUIK - 12.2.0 в которой данная проблема устранена.
В анонсе версии 12.2 действительно указано что "Ошибка при попытке загрузить в Карман транзакций заявки из файла" исправлена Но в последней версии 12.2.1.2 во всплывающем меню из Кармана нет опций "Загрузить заявки из файла", "Загрузить стоп-заявки из файла", "Загрузить адресные/безадресные заявки из файла" которые есть в версии 11.3.4 Есть только "Загрузить транзакции из tri-файла"
Станислав написал: Увы, другой информации биржа не транслирует
Да, ММВБ параметры облигаций транслирует крайне неудовлетворительно Нашел казалось бы косвенный признак флоатеров - нулевые данные по доходности или по дюрации Но увы и тут не все однозначно, по некоторым ммвб дает доходность Например РСЭКСМБ2Р4 указана доходность а по РСЭКСМБ2Р5 нет (ноль)
Вобщем сделал отбор по нулевой доходности а те корпоративные флоатеры где биржа дает доходность пока записал в массив Таких в портфеле всего 5, не сложно и добавить если будет новая сделка Ну а с ММВБ что то спрашивать бессмысленно
Станислав написал: По названию ОФЗ можно сразу понять, к какому классу бумаг относится конкретный выпуск
Спасибо, а этот код "COMPLEXPRODUCT" как можно получить в коде скрипта ОФЗ понятно а что по корпоративным, муниципальным да и остальным "бирж.обл." как дает "SECTYPE"
Набросал черновик скрипта для построения пользовательской таблицы облигации в портфеле в соответствии с классификацией По типу эмитента: Федеральные, Субфедеральные и муниципальные, корпоративные сделал разбивку с помощью параметров функции getParamEx() "SECTYPESTATIC" и "SECTYPE" по их значениям "Облигации" >> "РФ" "суб.РФ" "мун.обл." " корп.обл." Отдельной группой сформировал массив Замещающих облигаций по признаку валюты номинала А вот дальше хотелось бы разбить по типу купона - Постоянный, Фиксированный, Плавающий и Переменный, как минимум на две группы
Буду благодарен за идеи по отличительным признакам?
Karina Dmitrieva, спасибо Неудобно конечно При большом количестве заявок по их количестве сделать перетаскивание а выделение всех не предусмотрено Придется подождать и работать на предыдущей версии 11.3
Karina Dmitrieva, Спасибо за информацию, но во-первых, найдите где доводить ее до пользователей своевременно и с пояснениями поскольку мне сейчас непонятно с какой целью это сделано и как теперь работать с новыми форматами Ну и главное - я писал о том что теперь Карман транзакций не загружает сохраненные заявки в файле из меню на Таблице заявок
На проблему работы терминала в отношении торговых функций должна быть незамедлительная реакция разработчика, а тут неделя заканчивается и хоть трава не расти !
Сохраняем файл - ПКМ на таблице заявок > Сохранить в файл заявки из таблицы В окне Карман транзакций - ПКМ Загрузить заявки из файла Результат - Ошибка Не указан номер заявки
Смотрим формат сохраненного файла и видим следующее: ,Выставлена (время),Инструмент,Операция,Цена,Кол-во,Остаток,Объем,Состояние, 1,19:47:26,Астра ао [МБ ФР: Т+: Акции],Продажа,478,25,160,160,76 520,00,Активна,
Тот же но сохраненное в 11.3.4.3 55377299185,19:47:26,Астра ао,МБ ФР: Т+: Акции,ASTR,S,L01-00000F00,LSQP ,O,478.25,0.00,160,,160,76520.00,0.00,MU0003300971,MC0003300000,,11JJDL/,Y1,11JJDL,,
Похоже не все понимают о чем речь... или не посмотрели ссылки на предыдущие обращения с аналогичной тематикой :) Причина моего обращения в техподдержку и этой темы в следующем: 1. При добавлении скрипта индикатора на график на первом проходе OnCalculate() скрипт не видит параметры настроек. Вызов OnChange() происходит между 1 и 2ым проходами Проблема известная но тем не менее... 2. Метки созданные на графике при смене инструмента не удаляются в связи с отсутствием вызова OnDestroy() перед заменой актива Это приводит к образовании новых меток по количеству переходов с актива на актив
Для детального понимания процессов я прикладываю скрипт индикатора для наблюдения за порядком расчетов и лог файл Скрипт создает единственную метку с динамически меняющимися параметрами на вновь образующемся баре Метка создается на первом тике бара с удалением предыдущей В течении бара метку можно сдвинуть в удобное место, на новом баре она займет "свое" место на HighestHigh(10) по оси Y и смещением на 3 бара влево по оси времени. В текстовый параметр запишем Close() посл свечи а в Hint номер посл бара Сам тест - добавляем скрипт индикатора и сразу же вводим идентификатор графика - смотрим DebugView
В отладчике смотрим порядок вызова функций при добавлении индикатора: Init() > OnCalculate() > OnChangeSettings() > OnCalculate() 2 > OnCalculate() 3 Первый вывод - первый проход до вызова OnChange входящие параметры скрипта недоступны, т.е. никакие расчеты этого цикла некорректны Поэтому делаем обход этого прохода Понаблюдав за меткой, отображением цены закрытия и номера бара, переместив ее в удобное место - переключаем таймфрейм - предыдущая метка удаляется и создается новая так же как на поступлении нового бара При смене таймфрейма сразу вызывается OnCalculate() без инита и без опроса параметров скрипта. Все работает корректно
Теперь переключаемся на другой инструмент (пусть из табл тек торгов) В логе видим инициализацию и цикл расчетов на новом активе Init() > OnChangeSettings() > OnCalculate() 1 Делаем выводы по порядку следования функций. Метка создается новая, к метке от предыдущего инструмента доступа нет, OnDestroy() не вызвается, метка "теряется" и доступ к ней скрипт не имеет Повторяем процедуру несколько раз и наблюдаем наслоение меток на графике и на одном и на втором инструментах см скрин test-2_переключ-инструментов.jpg Удаляем индикатор с графика Одна метка при этом остается на графике и не видна из меню пкм-удалить... Удаляется после выделения клавишей DEL Смотрим какие функции используются в коде для удаления меток Детально анализируем лог файл в DebugView Делаем выводы
Код скрипта индикатора
Код
Settings=
{
Name = "test_Example-2",
chart_ID = '' -- идентификатор графика
}
n_init = 0 -- переменная для подсчета заходов в функцию Init
n_OnCalcCount = 0 -- переменная для подсчета OnCalculate
n_OnChange = 0 -- счетчик OnChangeSettings
bars_prev = 0 -- номер посл бара
TF_prev = -4; -- таймфрейм
delay = 1.0; -- задержка в цикле рассчетов параметров для метки (параметров счета)
LastSecond = 0; -- время последнеих рассчетов
chart_tag = ''; -- идентификатор графика
label_params = {}; -- параметры метки
Label_ID = nil; -- идентификатор графика
Labels = {}; -- Массив номеров установленных меток - для контроля
function Init()
n_init = n_init + 1
PrintDbgStr("Init() = "..n_init)
n_OnCalcCount = 0
n_OnChange = 0
bar_prev = 0
TF_prev = -4 -- контроль смены таймфрейма
sec_code_prev = '' -- контроль перекл на др актив
return 1
end
function OnChangeSettings()
-- n_OnCalcCount = 0
n_OnChange = n_OnChange + 1
chart_tag = Settings.chart_ID
PrintDbgStr("OnChangeSettings() = "..n_OnChange..', n_OnCalcCount = '..n_OnCalcCount)
end
function OnDestroy()
PrintDbgStr("OnDestroy() #Labels Array "..#Labels);
if #Labels > 0 then -- Удаляет ранее установленные метки
for i=1,#Labels,1 do
local del = DelLabel(chart_tag, Labels[i]);
if del then PrintDbgStr("OnDestroy() Del id "..tostring(Labels[i])); end;
end;
end;
-- стараемся найти и удалить потерянные метки
PrintDbgStr("OnDestroy() LbDelete_2() "..LbDelete_2() .. ' labels were removed');
end
function OnCalculate(index)
-- Пропускаем первый проход между Init() и OnChangeSettings() при первичном добавлении индикатора
-- для исключения ошибки чтения параметра при первом запуске индикатора
-- Init() > OnCalculate() > OnChangeSettings() > OnCalculate() 2 > OnCalculate() 3
if n_OnChange == 0 then
while index <= Size() do
if index == Size() then PrintDbgStr('Пропускаем цикл до вызова OnChangeSettings() после Init(), index = ' .. index); end;
return
end;
end
-- предпоследний бар
if index == Size() - 1 then
PrintDbgStr('---- Begin Cycle Number '..(n_OnCalcCount+1))
DSInfo = getDataSourceInfo();
Sec_Code = DSInfo.sec_code;
if chart_tag == '' then message('OnCalculate Chart ID не указан!!!'); end;
PrintDbgStr("Seccode " .. Sec_Code ..", chart_ID = " .. chart_tag)
else
-- последняя свеча
if index == Size() then
-- раз в секунду (или больше)
if os.time() > LastSecond then -- if os.time() > LastSecond + 2*delay-1 then
LastSecond = os.time();
-- потиковое обновление (с задержкой)
label_params['TEXT'] = tostring(C(index))
label_params['HINT'] = tostring(index)
-- корректируем параметры метки
if Label_ID ~= nil and TF_prev == DSInfo.interval then
-- сохраняем прежнее положение метки если переместили в теч текущ бара)
-- при смене таймфрейма метка будет удалена и создана заново
local ly = GetLabelParams(chart_tag, Label_ID) --table or nil
if ly ~= nil then -- and ly.yvalue ~= nil
label_params['YVALUE'] = ly.yvalue
label_params['DATE'] = ly.date
label_params['TIME'] = ly.time
end;
--PrintDbgStr('index == Size() = ' .. Size() .. ', Label_ID ' .. Label_ID .. ', C(index) ' .. tostring(C(index)) )
SetLabelParams(chart_tag, Label_ID, label_params);
-- PrintDbgStr('SetLabelParams Label_ID = '..Label_ID)
end
-- первый тик нового бара или первый проход и метка еще не создавалась или смена таймфрейма
-- удаляем предыдущую и создаем новую метку с новыми координатами (метку можно смещать в удобное место...)
if bars_prev < Size() or Label_ID == nil or TF_prev ~= DSInfo.interval then
bars_prev = Size()
-- удаляем метку если она уже была и создаем новую
if Label_ID ~= nil then LbDelete() end;
Label_ID = labeldraw(chart_tag, index)
TF_prev = DSInfo.interval
end;
end -- every second
-- завершение цикла
n_OnCalcCount = n_OnCalcCount+1
--PrintDbgStr('END Cycle index == Size() ' .. Size()..', n_OnCalcCount = '..n_OnCalcCount)
end -- index == Size()
end -- if index > 1
return nil
end
function labeldraw(tag, index)
local highest = 0.0
for j = 0, 14 do
if H(index-j) > highest then highest = H(index-j) end;
end
local _t = T(index-3)
--PrintDbgStr(_t.year.._t.month.._t.day..' '.._t.hour..':'.._t.min..':'.._t.sec)
local Y = tostring(_t.year)
local m = tostring(_t.month) if #m == 1 then m = "0"..m end;
local d = tostring(_t.day) if #d == 1 then d = "0"..d end;
local hh = tostring(_t.hour) if #hh == 1 then hh = "0"..hh end;
local mm = tostring(_t.min) if #mm == 1 then mm = "0"..mm end;
local ss = '00'; -- tostring(_t.sec) if #ss == 1 then ss = "0"..ss end;
label_params['DATE'] = tonumber(Y..m..d);
label_params['TIME'] = tonumber(hh..mm..ss);
label_params['YVALUE'] = highest;
label_params['R'] = 0; -- DOUBLE Красная компонента цвета в формате RGB. Число в интервале [0;255]
label_params['G'] = 0; -- DOUBLE Зеленая компонента цвета в формате RGB. Число в интервале [0;255]
label_params['B'] = 255; -- DOUBLE Синяя компонента цвета в формате RGB. Число в интервале [0;255]
label_params['TRANSPARENCY'] = 0;
label_params['TRANSPARENT_BACKGROUND'] = 1;
label_params['FONT_FACE_NAME'] = 'Verdana';
label_params['FONT_HEIGHT'] = 12;
local label_id = AddLabel(tag, label_params) -- number
if label_id ~= nil then
Labels[#Labels+1] = label_id
PrintDbgStr('Create Label_id: '..tostring(label_id))
else
message('Don\'t create label')
end
return label_id -- number
end
---- удаление меток
-- ищем и удаляем все метки независимо как и кем установленные :)
-- функцию используем полной очистки от меток и контроля
function LbDelete_2()
-- local _labels = {}
local n = 0;
for _label_id = 1, 10000, 1 do
local L = GetLabelParams(chart_tag, _label_id )--table or nil Табл параметров метки - все значения имеют тип – STRING
if L ~= nil then
local del = DelLabel(chart_tag, _label_id)
if del == true then
n = n + 1;
PrintDbgStr('LbDelete_2() Label number '..tostring(_label_id).. ' deleted ')
end;
end
end
Label_ID = nil;
Labels = {}
return n;
end
-- Удаляет ранее установленные метки сохраненые в массиве
function LbDelete()
local n = 0
if #Labels > 0 then
for j=1,#Labels,1 do
if DelLabel(chart_tag, tonumber(Labels[j])) then
n = n + 1
PrintDbgStr("LbDelete() id "..tostring(Labels[j]) .. ' deleted')
end
end;
Labels = {};
Label_ID = nil;
end;
return n;
end;
При наложении индикатора или при периинициализации при смене инструмента графика терминал даже ни видит переменных объявленных в Settings
А увидит он идентификатор только на втором проходе Как тут метки не потерять :)
Тяжелая у вас работа парни (разработчики) За 20 лет как познакомился с этим монстром ничего не изменилось Кракозябы накапливаются и наслаиваются одни на другие
Settings=
{
Name = "Example1",
chart_ID = '' -- идентификатор графика
}
function Init()
if Settings.chart_ID == '' then message('Init() Chart ID не указан!!!') end;
return 1
end
function OnCalculate(index)
if index == Size() then
if Settings.chart_ID == '' then message('OnCalculate Chart ID не указан!!!'); end;
end
return nil
end
Такой вопрос - где и как происходит прерывание расчетов в текущем цикле OnCulculate() при смене инструмента на графике? Цикл доходит до конца или прерывается случайным образом
Цель выполнить кусок кода по удалению текущей метки которая после смены инструмента уже "потеряется"
Проблема с метками существует с древних времен - здесь и здесь и здесь и с моим участием здесь По второй ссылке - ответ Daniil Pozdnyakov типовой "К сожалению, проблему, о которой ведётся речь, воспроизвести не удалось"н Ну киньте индикатор что приводит пользователь по данной ссылке, переключите несколько раз между двумя инструментами график и увидите см файл - screen_1 Ну что еще нужно чтобы "воспроизвести" ошибку в работе терминала По ссылке обсуждения с моим участием еще в 2021 еще на версии терминала 9.3 ответ того же Daniil Pozdnyakov "Описанная в данном обращении проблема была устранена в версии 9.4.0 терминала QUIK." а проблема как была так и переходит уже несколько лет
funduk написал: На каждом I == 1 проверяете инструмент, если он не совпадает с предыдущим, удаляете метку. Т.е. удаляете после смены инструмента, не до.
Спасибо за ответ Но после смены инструмента ситуацию я только что описал - метку в коде уже не найти и соответственно не удалить Кроме того часто бывают ситуации когда пкм на графике не дает уже "Удалить - Все метки в диаграмме" Да и как после смены инструмента получить тикер предыдущего? После инита все переменные уже "обнулены" в том числе и id метка. Ну разве что в файле хранить, и постоянно сравнивать запись в файле с текущим
Никто из сообщества не откликнулся. Обращаюсь к разработчикам. Господа. Это не пожелание а вопрос некорректной работы терминала Терминал теряет метки. Создав метку на одном инструменте и переключившись на другой инструмент метка полностью теряется. Ее уже невозможно удалить ни стандартными функциями: - DelLabel(), потому что после смены инструмента id метки после переинициализации уже не существует - DelAllLabels() даже при том что chart_tag прежний эту метку уже не находит ни перебором в коде типа...
Код
local n = 0;
for _label_id = 1, 1000, 1 do
local L = GetLabelParams(chart_tag, _label_id )--table or nil
if L~= nil then
n = n + 1;
if L.hint:find("PnL")
then DelLabel(chart_tag, _label_id)
end;
end
end
В результате переключившись пару раз на другие инструменты и вернувшись на изначальный получите вот такую картинку :)
Какое решение найдут разработчики - не знаю Но ситуация требует исправления.
Возможно подключать OnDestroy() при смене инструмента, либо увязать это с параметром диаграммы - "Оставлять трендовые линии, фигуры и метки при смене инструмента"
Добрый день Вопрос поднимался еще в 2017г и был принят поддержкой :)
При смене инструмента графика OnDestroy() по прежнему не вызывается Вопрос - скажем скрипт-индикатор создает метку на графике Меняете инструмент и метка остается, причем скрипт полностью ее теряет Как ее удалить в коде скрипта перед тем как инструмент будет заменен или сохранить доступ к ней? Глобальные переменные обнулились, идентификатор метки тоже утерян
Для детального анализа возникновения описываемого Вами эффекта просим приложить данный скрипт. Можете здесь или направьте его нам на почту: quiksupport@arqatech.com со ссылкой на данную ветку форума.
Это абсурд ! Напишите сами (индикатор) скрипт в одну строчку SetLabelParams(chart_tag, Label_ID, label_params); и установите метку на график предварительно заполнив параметр label_params['HINT'] = "TEST"
Опишите, пожалуйста, более подробно Вашу ситуацию. Что Вы подразумеваете под "программной установкой"? Можете приложить скриншот для наглядности ?
Программно - значит скриптом При наведении курсора мыши на текст метки появляется "всплывающая подсказка" ( HINT ) На скрине версии 9.4 В версии 9.5 эта подсказка не появляется
Anzhelika Belokur написал: Добрый день. Описанная в данном обращении проблема будет устранена в одной из очередных версий ПО. Приносим извинения за причиненные неудобства.
Пожалуйста, сориентируйте по срокам. Пауза затянулась....
Anzhelika Belokur написал: Добрый день. Описанная в данном обращении проблема будет устранена в одной из очередных версий ПО. Приносим извинения за причиненные неудобства.
Daniil Pozdnyakov написал: Правильно понимаем, что данные скрипты Вы получили от сторонних разработчиков ?
Спасибо что откликнулись. Правильно. Я привел ссылку на разработчика
Цитата
Daniil Pozdnyakov написал: Просьба подробно описать, с какими проблемами Вы столкнулись ?
Я начал работать начиная с 8 версии и имея опыт в программировании не смог найти где и почему терминал теряет метки и и соответственно не контролирует их. Установленная скриптом (индикатором) метка после каких либо действий с графиком (смена таймфрейма, инструмента) теряется. Скрипт ее уже не может найти. Даже программное удаление DelAllLabels(chart_tag) не работает поскольку На графике пкм-Удалить-Все метки диаграммы подтверждает что метки на графике остались но найти их программно скрипт не может. Кроме того при установке индикатора на график с указанием в settings идентификатора графика проверка при инициализации в коде сразу выдает ошибку по идентификатору. Это говорит о том что терминал при инициализации индикатора не идентифицирует метку самого графика и метку указанную в настройках индикатора Возможно что проблема именно в этом. В 9 версии проблема с загрузкой метки из файла labels_params[IMAGE_PATH] = getWorkingFolder()..\\Data\\transation_Icons\\*.bmp выдает ошибку загрузки файла и соответственно метки на графике нет Причем ошибка только процессе инициализации индикатора, далее ошибки нет но и меток на графике нет Хотя "Удалить Все метки..." подтверждает их наличие на графике
Еще раз хочу подчеркнуть что код скрипта и индикатора который я предложил протестировать для меня никакой роли не играет У меня свои наработанные годами скрипты которые я просто адаптировал под Квик Попытка разобраться в переписке в отдельных фрагментах кода полагаю приведет только к путанице Поэтому я и предложил протестировать приложенный мною скрипт и индикатор с тем чтобы разработчики сами могли проверить работу терминала с метками Задача ведь не в проверке кодов а именно в проверке работы терминала
Потому что теперь функция называется table.unpack. Аж с луа 5.2.
Вообще дело то не в unpak(). Терминал теряет метки, т.е. если скрипт установил метку, то через некоторое время, после смены инструмента, тайили таймфрейма он уже не может найти свою же метку и ее невозможно даже удалить программно не говоря уже о том чтобы управлять ей, а 9.3.3. просто не выводит метку на график Я же приложил скрипт и индикатор Оба написаны очень грамотно Все кому интересно могут попробовать и суть не в функционале и его востребованности а именно как академический пример работы с метками и не только
Сергей написал: версия 9.3 выдает ошибку на использование unpack()
Потому что теперь функция называется table.unpack. Аж с луа 5.2.
Согласен, хотя на текущий момент интерпретатор поддерживает и то и другое А формально - заходим на сайт разработчика и скачиваем документацию последней версии 9.3.3 Открываем "Использование LUA в рабочем месте Quik" и видим код примера
function OnCalculate(idx) local res={} for i=1, Settings.N do res[i] = gtMA[i](idx,"C") end return unpack(res) end
Это все и говорит об уровне отношения разработчика к поддержке своего продукта и своим клиентам
Alexey Ivannikov написал: Информация получена, проблема изучается. Постараемся в ближайшее время дать ответ.
Alexey Ivannikov, Вы не ответили на мой пост о том что "версия 9.3 выдает ошибку на использование unpack()"
И главное, вопрос о том что терминал некорректно работает с метками идет несколько лет! а Вы в уже ставшем традицией тоне пишите " проблема изучается"
Я не буду публиковать здесь свои коды, а приведу как мне кажется академический пример, который можно использовать для обучения а в данном случае тестирования терминала: Пару лет назад профессиональными программистами был написан скрипт и индикатор сохранения данных по сделкам в файл с последующим их нанесением на график На текущий момент в публикации остался только скрипт https://quikluacsharp.ru/quik-qlua/kak-zapustit-qlua-lua-skript-v-terminale-quik/ По этому прикладываю весь комплект с описанием Сделки_на_Графике который сохранился у меня в закромах
Протестируйте и Вы найдете целый ряд проблем в работе терминала с метками И кстати не только с метками Окажите уважение трейдеру с многолетним стажем, который 20 лет спустя решил вспомнить о российском рынке и Вашем продукте под названием Quik
Метки и так работали некорректно во всех версиях а с 9 версии вообще перестали отображаться. При наложении индикатора на только что открытый график отображаются, после перезагрузки терминала уже нет
Обновление до рекомендованной версии 9.3 выдает ошибку на использование unpack()