Я уже застолбил это пожелание. Ожидаю реализацию в ближайшие 10 лет...
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
13.12.2021 16:52:23
22. Доработки по индикаторам. Какой вообще смысл в OnChangeSettings? В МТ5 просто перегружают индикатор с новыми настройками. В Квике тоже нужен перегруз индикатора и Init() всегда вернет нужное количество линий. Перегруз для связанного графика уже есть.
Нужны Settings.hideline, чтобы пользователь не мог изменить им параметры. Вот пример модифицированного индикатора: когда пользователь задает количество линий Settings.Count и параметры только для первой, но применяются параметры для всех остальных линий.
Код
Settings = {
Name = "Levels_TEST",
Step = 50,
Count = 10,
IsBoolean = false, -- БАГ: В настройках этот тип не меняется!
line = {}, -- БАГ: без этой строки индикатор не появляется в списке!
hideline = {}, -- В настройках не отображаются
}
Settings.line = {
{
Name = "Line1",
Type = TYPE_POINT,
Color = RGB(55, 55, 55),
Width = 2
}
}
function Init()
-- Можно вынести этот код за Init() и результат будет тот же.
LINES = Settings.Count
Settings.hideline = {} -- сброс, чтобы актуальные параметры сгенерировать
for x = 2, LINES, 1 do
Settings.hideline[x] = { -- LineERROR: здесь line[x] было (ошибка ниже)
Name = "Line" .. tostring(x),
Type = Settings.line[1].Type,
Color = Settings.line[1].Color,
Width = Settings.line[1].Width
}
end
LINES = #Settings.line + #Settings.hideline
-- А какой смысл возвращать другое значение?
-- В МТ5 тут статус Инит, который может быть ошибкой.
-- Но, количество линий? Где логика?
-- Если превысить, то добавятся линии с случайным цветом...
return LINES
end
function OnChangeSettings()
-- Юзер сменил Settings.Count ?
Init()
-- Function OnChangeSettings: LineERROR: attempt to index a nil value (field 'line')
-- ИЗМЕНЕНИЙ НЕТ! Линии не добавились и не покрасились.
-- Очередная наспех сделанная кривая функция...
end
function OnCalculate(index)
local start = O(index)
if start == nil then
return nil
end
if MINSTEP == nil then
local info = getDataSourceInfo()
MINSTEP = getSecurityInfo(info.class_code, info.sec_code).min_price_step
FIRST = (math.tointeger(LINES / 2) + 1) * Settings.Step * MINSTEP
end
local result = {}
start = start - ((math.tointeger(math.ceil(start / MINSTEP)) % Settings.Step) * MINSTEP) + FIRST
for x = 1, LINES, 1 do
table.insert(result, start - (x * Settings.Step * MINSTEP))
end
return table.unpack(result)
end
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 04.10.2021
08.12.2021 13:17:52
HFT - закрытый банковский клуб и Квик там не нужен.
Для акционеров достаточно Веб-клиента.
А мы - спекулянты по фьючерсам, здесь, потому что альтернативы у Брокера нет.
Win-1251 на GitHub
Пользователь
Сообщений: Регистрация: 04.10.2021
08.12.2021 12:31:15
В имени файла кодировка работает.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 04.10.2021
07.12.2021 13:34:24
Идея построить событийную модель в основном потоке - бред изначальным. А еще про "безопасность" заливают... ДЫРЫЩИЩЕ! Поэтому я её не использую.
Например, в MQL OnTick() не блокирует МТ5 и код может выполняться бесконечно в СВОЁМ потоке - только тики пропускает.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
06.12.2021 11:56:53
Пункты 10 и 20.
Код
---@class roffild
---@field ISTRADINGALLOWED_SECONDS number Секунд в ожидании обезличиной сделки (по умолчанию = 3)
local roffild = {
ISTRADINGALLOWED_SECONDS = 3,
}
---`isConnected() == 1` ещё ДО ввода PIN при Двухфакторной аутентификации.
---Обход бага через `getInfoParam("LASTRECORDTIME")`.
---@param seconds? number Секунд для ожидания (по умолчанию = 3 = `ISTRADINGALLOWED_SECONDS`)
---@return boolean
function roffild.isTradingAllowed(seconds)
if isConnected() == 1 then
local lastrecordtime = getInfoParam("LASTRECORDTIME")
local servertime = getInfoParam("SERVERTIME") -- время с часовым поясом сервера (секунды локальные)
if
not (lastrecordtime == nil or lastrecordtime == "")
and not (servertime == nil or servertime == "")
then
-- convertDateOrTimeToUnix из-за ":" не работает
local fixlastrecordtime = os.sysdate()
fixlastrecordtime.hour = tonumber(string.sub(lastrecordtime, 0, -7))
fixlastrecordtime.min = tonumber(string.sub(lastrecordtime, -5, -4))
fixlastrecordtime.sec = tonumber(string.sub(lastrecordtime, -2))
if -- clearing
fixlastrecordtime.hour < 7
or (fixlastrecordtime.hour == 14 and fixlastrecordtime.min < 5)
or (fixlastrecordtime.hour == 18 and fixlastrecordtime.min >= 45)
or (fixlastrecordtime.hour == 19 and fixlastrecordtime.min < 5)
or (fixlastrecordtime.hour == 23 and fixlastrecordtime.min >= 50)
then
return false
end
local fixservertime = os.sysdate()
fixservertime.hour = tonumber(string.sub(servertime, 0, -7))
fixservertime.min = tonumber(string.sub(servertime, -5, -4))
fixservertime.sec = tonumber(string.sub(servertime, -2))
return (math.abs(os.time(fixservertime) - os.time(fixlastrecordtime)) <=
(seconds or roffild.ISTRADINGALLOWED_SECONDS))
end
end
return false
end
return roffild
Ееееееее!.. Я смог создать 100% определитель статуса глобальной торговли! Функция прошла проверки Двухфакторной аутентификации, выходного дня, смены часового пояса и clearing. Эту функцию ДОЛЖНЫ создать программисты Квика, а не заставлять искать хаки в их тв...
После ожидаю обвинение во "взломе Квика, подрывающее безопасность и стабильность Российской биржи" :D
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
03.12.2021 16:42:26
21. Попытался обойти баг isConnected()==1 через OnAllTrade(). Щаз! Это же кривой QLua! OnAllTrade() НЕ вызывается, если "Таблица обезличенных сделок" НЕ открыта. И если ТОЗ случайно закрыть, то OnAllTrade() НЕ вызывается. Квику пофиг даже на галку в Настройках. QLua не может даже о статусе ТОЗ сообщить.
Код
---@class roffild
---@field LAST_TIME_ANONYMIZED_DEAL qluaDateTime Время последней обезличенной сделки
---@field ISTRADINGALLOWED_SECONDS number Секунд в ожидании обезличиной сделки (по умолчанию = 3)
local roffild = {
LAST_TIME_ANONYMIZED_DEAL = os.sysdate(),
ISTRADINGALLOWED_SECONDS = 3,
}
roffild.LAST_TIME_ANONYMIZED_DEAL.hour = 0 -- для начальной разницы времени
---Функция должна вызываться в `OnAllTrade()`, когда она переопределена.
function roffild.OnAllTrade(alltrade)
---@type qluaDateTime
roffild.LAST_TIME_ANONYMIZED_DEAL = alltrade.datetime
end
function OnAllTrade(alltrade)
roffild.OnAllTrade(alltrade)
end
---`isConnected() == 1` ещё ДО ввода PIN при Двухфакторной аутентификации. Обход бага через `OnAllTrade()`. \
--- \
---**ЗАВИСИТ от интенсивности "Таблица обезличенных сделок".**
---@param seconds? number Секунд в ожидании обезличиной сделки (по умолчанию = 3 = `ISTRADINGALLOWED_SECONDS`)
---@return boolean
function roffild.isTradingAllowed(seconds)
return (isConnected() == 1
and (os.time(os.sysdate()) - os.time(roffild.LAST_TIME_ANONYMIZED_DEAL)) <= (seconds or roffild.ISTRADINGALLOWED_SECONDS))
end
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
26.11.2021 10:00:02
Владимир, спасибо, что поделился с нами своей гопно-туалетной философией окружающего нас токсичного мира. Я больше не стану тебя отвлекать от миссии очищения этого форума. Да, обойдет бан тебя стороной в этом опасном деле...
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
25.11.2021 21:45:25
Владимир, и много уже спустил? Если не спускать "поучения", которые тебя даже не касаются, то жизнь теряет смысл? И можно при спуске не стать "распальцованным дураком", как они? И как это распознать?
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
25.11.2021 20:11:08
Цитата
Владимир написал: , Тролль эту тему создал, лапуль.
А ты пытаешься его изгнать? В чём ТВОЯ миссия? Или смысл жизни? Даж интересно стало.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
25.11.2021 20:02:19
Цитата
Владимир написал: , Лапуль, кода своего я здесь приводил НЕМЕРЯНО! И кода РАБОТАЮЩЕГО, без скулежа про "плохие и непродуманные API". Покопайтесь в моих сообщениях, коль неймётся. И в третий раз повторяю: "В кодах скулящих по любому вопросу неучей я ковыряться не намерен". Сколько раз повторить, чтобы дошло?
Ну, не повторяй... Я вообще не понимаю, что тролль забыл в этой теме...
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
25.11.2021 19:38:24
Anton, как раз на создании mypositions твой код и нарвется на тот баг. OnAllTrade тут не поможет и вообще о других сделках.
Роль OnAllTrade выполняет getParamEx2("SPBFUT", v.sec_code, "BID").param_value в моем коде.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
25.11.2021 19:30:11
Цитата
Владимир написал: , Лапуль, я с раннего детства не перевариваю распальцованных дураков. Повторяю для особо одарённых: в кодах скулящих по любому вопросу неучей я ковыряться не намерен. А "гениальное решение", лапуль, надо УМЕТЬ видеть - бездарности способны разве что смотреть, как баран на новые ворота.
Нельзя увидеть, чего нет. Покажи! Или ты даже тот код не осилил? Ах, да "в кодах скулящих по любому вопросу неучей я ковыряться не намерен"... не программист ты.
Цитата настоящего программиста: "Хватит болтать! Покажи мне код!"
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
25.11.2021 15:28:09
Цитата
Владимир написал: , Тролля в зеркале поищите. Заняться мне больше нечем, кроме как в коде очередного скулящего ковыряться. А свои проблемы со скриптом я давно решил. Все до единой.
На троллинг время ты же нашел, а на код уже нет?
Эх... быстро же слился тролль... а я уже приготовился гениальное решение проблемы увидеть.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
25.11.2021 14:06:19
Цитата
Владимир написал: , Да неплохо бы и поучить Вас программировать. Программисты спокойно работают с любым "плохим и непродуманным API", а не скулят здесь по каждому чиху, да учат, как надо его улучшать по их доморощенным представлениям.
О, тролль проснулся... ну... давай, покажи класс! Как нужно изменить код выше?
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
25.11.2021 11:43:01
Цитата
В случае двухфакторной аутентификации сначала происходит соединение с сервером (после чего isConnected начинает возвращать 1), а потом сервер инициирует запрос у терминала второго фактора, при этом терминал не знает в момент соединения (да и не должен из соображения безопасности знать), будет ли у него запрашиваться второй фактор, или же нет.
Терминал ДОЛЖЕН знать, что будет второй фактор, потому что это еще СТАДИЯ ПОДКЛЮЧЕНИЯ. Инфа о том, что будет второй фактор или нет, не является секретной, потому что второй фактор ИДЕТ ПО УМОЛЧАНИЮ. Вообщем, кто-то накосячил с статусом второго фактора, а вместо фикса получаем бред про безопасность.
QLua - часть QUIK, а не совершенно левая абстракция. Поэтому довод про безопасность Квика внутри самого Квика... Вы баги исправляйте, а не сценарии для Нолана сочиняйте.
Цитата
В качестве выхода из ситуация мы рекомендуем писать Lua-скрипт так... Правильно Вас понимаем, что Вы хотите повысить приоритет пожелания, потому что Ваш бот анализирует таблицу "Состояние счёта", а не таблицу сделок ?
Э... похоже программисты для ARQA Technologies - это как Дотеры для остальных...
Программисты работают с API, которое вы им предоставляете. Хватит учить меня программировать! Когда плохое и непродуманное API, то надо его улучшать, а не "мы рекомендуем писать Lua-скрипт так".
Код
-- Закрытие по stoploss реальных позиций.
for k, v in pairs(getTable("futures_client_holding")) do
k = nil
if v.totalnet == nil or v.totalnet == 0 then
-- continues --
else
k = initSymbol(v.sec_code)
end
if k then
open = v.avrposnprice
for k1, v1 in pairs(getDeals(1, nil, nil, v.sec_code, nil, v.trdaccid)) do
-- В futures_client_holding нет реальной цены последней сделки
open = v1.price
-- БАГ: Только вот из-за рассихрона таблиц, в Сделках цена тоже может быть НЕ ПОСЛЕДНЯЯ!
end
LASTTRANS = nil
if v.totalnet > 0 then
close = tonumber(getParamEx2("SPBFUT", v.sec_code, "BID").param_value)
if close == nil or close == 0.0 then
-- continues --
message("No data!")
elseif close <= (open - k.stoploss) then
log:write("buy close "..tostring(close).." "..tostring(open).." "..tostring(open-close).."\n")
LASTTRANS = sendOrder(createOrder("SPBFUT", v.sec_code, v.trdaccid, nil,
true, close - k.depth, math.abs(v.totalnet)))
end
else
close = tonumber(getParamEx2("SPBFUT", v.sec_code, "OFFER").param_value)
if close == nil or close == 0.0 then
-- continues --
message("No data!")
elseif close >= (open + k.stoploss) then
log:write("sell close "..tostring(close).." "..tostring(open).." "..tostring(open-close).."\n")
LASTTRANS = sendOrder(createOrder("SPBFUT", v.sec_code, v.trdaccid, nil,
false, close + k.depth, math.abs(v.totalnet)))
end
end
if waitTrans(LASTTRANS) then
goto continues
end
end
end
QUIK QLua подстановка с описанием для редакторов Lua
Пользователь
Сообщений: Регистрация: 04.10.2021
24.11.2021 20:05:25
Цитата
Nikolay написал: Я так понимаю это просто файл макет, чтобы он был проиндексирован LS с поддержкой аннотаций как (сам им пользуюсь).
Да.
QUIK QLua подстановка с описанием для редакторов Lua
Пользователь
Сообщений: Регистрация: 04.10.2021
24.11.2021 19:50:47
Я проверил в редакторах Lua: Visual Studio Code и PyCharm
Как уже было описано выше, пожелание на добавление данного функционала уже было зарегистрировано от Вас.
В БагТрекере можно редактировать детали. А поскольку 15 пункт из косметического превратился, в невозможность найти актуальную цену для стоп-лося... пора бы "редактировать детали" и повысить приоритет.
Хотя бы ссылку на тему в БагТрекере указываете? А то это похоже на игру "Сломанный форум" с программистами Квика...
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
16.11.2021 12:34:05
15. Таблица futures_client_holding не имеет цену последней сделки, да ещё обновляется раньше trades(сделки)! ппц... бот закрывает текущую сделку, но на основании ПРЕДЫДУЩЕЙ сделки. Таблица futures_client_holding должна иметь цену последней сделки. И futures_client_holding - это "Состояние счета", поэтому 15 пункт.
Цитата
15. Не Lua, а про окно "Состояние счета" вообще-то. "Баланс" - средняя цена за день. Я хочу последнюю сделку видеть.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
15.11.2021 13:47:49
Цитата
Anton написал: Таки я посмотрел. В PythonDLL в additional dependencies ожидалось бы увидеть notelemetry.obj, чисто для феньшую. Ну хотя бы в релизном конфиге.
PythonDLL для MQL5 - интересный проект. Пока пытался добавить makemoney.obj, пофиксил PyTorch и *Boost и др. EURUSD выбесил окончательно. Никто правок не предложил.
Биржа после Форекса более предсказуема. Но QLUA - это наспех прикрученная функциональность, а не полноценная система с продуманным API. Между сервером и QLUA нет полноценного торгового контроля.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
13.11.2021 20:25:16
Э... а на этом форуме программисты есть, кроме меня? и на GitHub.
Цитата
s_mike@rambler.ru написал: Это принципиальная невозможность написать такую функцию, которая бы гарантировала правильность результата.
если вам мало приведенной выше причины, по которой это невозможно, существует ещё много причин, по которым это невозможно. В частности, проверка соединения при помощи isconnected() даёт вам информацию о наличии в данный момент времени соединения с сервером брокера, но ничего не рассказывает о доступности и статусах шлюзах к разным торговым площадкам.
Я "невозможных" задач не ставлю, потому что примерно представляю, как это реализовать. Сервер Квика уже сейчас знает, что биржа ушла на клиринг, выходные, дисконнект и т.п. - вот и пусть сообщит скрипту.
Да, и слово "гарантия" смешно к халтурному QLUA... Конечно, продукт не массовый, но от ПО для биржи с её лиардами хотелось бы большей продуманности...
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
13.11.2021 15:49:59
Цитата
написал:
Цитата
написал:
20. Нужна нормальная функция, которая точно ответит на "Торговля разрешена?"
Код
function isTradeAllow ()
return (
isConnected () = = 1 and
not ( Периоды клининга )
)
end
нет такой функции и быть не может.
сейчас торговля разрешена, а пока вы исполняете код, который написали выше, она может быть уже запрещена.
Это уже придирки к пингу, а не 10-20 минутным интервалам и выходным, которые у МБ есть.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
13.11.2021 13:42:20
18. Сейчас График10 после График2 не поставить. Или объяснить, как "Окна-Колонками" расставляет окна? Сортировка называется.
20. Нужна нормальная функция, которая точно ответит на "Торговля разрешена?"
Код
function isTradeAllow()
return (
isConnected() == 1 and
not ( Периоды клининга )
)
end
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
10.11.2021 10:14:55
18. В "Менеджере окон" нужна смена порядкового номера окна, потому что меню "Окна-Колонками" расставляет по этому порядку.
19. И редактирование размеров окна добавьте в "Менеджере окон". Можно в отдельном диалоге сделать по двойному клику.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
01.11.2021 15:46:49
Цитата
Кроме этого существуют горячие клавиши, которые используются системой и не могут быть изменены, например, Alt+F4 (закрытие окна) или Ctrl+F6 (переключение между окнами).
Alt+F4 действительно нужно ловить особым способом, как и CTRL+ALT+DEL. Все остальные комбинации без проблем обрабатываются стандартным методом:
Да и Ctrl+F6 не "переключает между окнами" в Винде - это уже фантазии ваших программистов.
Цитата
Касательно пункта 10. Терминал не даст возможность торговать до подключения. Выйдет соответствующее сообщение "Not connected" в окне сообщений (См. скриншот 1).
Это после isConnected()==1, но до "Двухфакторная аутентификация прошла успешно"? 100% баг!
Цитата
Касательно пункта 15. Могли бы уточнить, для чего Вам необходимо видеть в таблице "Состояние счёта" цену Вашей последней сделки, если её можно увидеть в таблице сделок ?
То есть, вместо дополнительно столбика мне предлагаете: еще одно мало информативное окно втиснуть между 10? Гениально! У вас для расчета "Баланса" уже инфа по сделкам получается вообще-то - просто в отдельный столбец последнюю сделку закинте.
Цитата
Касательно пункта 17. Правильно понимаем, Вы хотите, чтобы при выборе шаблона на графике удалялись метки, рисунки и тд., а также все настройки с индикаторами восстанавливались с нуля ?
ДА!!! В MetaTrader так и сделали уже 20 лет назад... И в МТ5 используется формат INI для всех настроек, что позволяет точнее подобрать размеры графовых окон.
P.S. А тут программисты Квика появляются, и только "операторы из Ростелекома"???
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
26.10.2021 10:21:33
15. Не Lua, а про окно "Состояние счета" вообще-то. "Баланс" - средняя цена за день. Я хочу последнюю сделку видеть.
17. А какой смысл в шаблоне, который ничего не меняет? Старые индикаторы удаляются, новые добавляются.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
22.10.2021 17:48:43
И форум после Просмотра ББКод обрезает...
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
22.10.2021 17:46:06
[QUOTE=Sfinexer]Снял якорь с таблицы стоп заявок, но полный список не вывелся, как сделать вывод всего списка что был ранее?Есть такой баг: фильтры после снятия якоря не восстанавливаются.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
22.10.2021 17:38:09
17. Шаблоны для графиков только цвета меняют. Шаблон должен график очистить и все настройки с индикаторами восстановить с 0. В МТ5 это нормально сделано, а в Квик - бред какой-то.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
22.10.2021 09:58:15
10. Странный isConnected() получается. Сейчас глянул в лог: 9:10:39 Соединение установлено 9:10:40 Введите PIN 9:10:43 MyLua started (isConnected() == 1) 9:12:35 Двухфакторная аутентификация прошла успешно
Если бы MyLua начал торговать до PIN, то словил ошибки...
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
19.10.2021 14:02:16
По 15 пункту: Цена последней сделки из ТТТ (LAST) - не то.
Цена из "Таблицы Сделок", крайняя сделка по инструменту - ВОТ ЭТО. На графике стрелками обозначаются.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
18.10.2021 11:33:45
16. В "редакторе клавиш" не весь список. Сейчас хотел сменить хоткей "Следующее окно" (CTRL+F6), но его нет в списке. И окно не переключается.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
12.10.2021 12:25:47
15. В окно "Состояние счета" нужен столбец "Цена сделки" (Цена последней сделки).
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
10.10.2021 17:20:54
1. Нет хоткея для показа Lua-скриптов.
2. Unicode.
2. Якоря нет у стоп-заявок и сделок. Логика, как у обычных заявок. Связь, вроде, по инструменту. Простой копи-паст. Может еще есть таблицы с Инструментами, но нет якоря...
3. И Lua-таблицу можно по инструменту связать... Специальная колонка заполняется соответствующими данными - вот и связь.
4. Кстати, в окне "параметров индикатора" нет выбора для Lua-значений false/true и пришлось заменить на число.
5. В окне Lua-скриптов под "Остановить" добавить галку "Перезапуск после ошибки" - "Автоматический перезапуск скрипта через 30сек после завершения из-за ошибки."
7. Нужна панель с индикаторами запущенных скриптов. Зеленый квадрат с числом - количество запущенных скриптов. Красный квадрат с числом - количество остановленных скриптов. По панельки можно будет определить: упал скрипт по ошибке или пашет.
8. Из-за невозможности поставить галку "Рыночная" пробелом, пришлось искать "Смена операции клавишей Пробел". Топорно сделано. Лучше нейтральные PgUp/PgDown (правая рука) и ~ (левая рука) под это пустить. Можно в качестве дополнительной возможности - будет из чего выбрать.
9. Возвращаемое значение из OnCalculate() должно быть table. Ну, да... чё-то где-то про table.unpack() проскакивало... Но можно заставить QUIK обрабатывать оба варианта возврата, а не напоминать о костыле Lua. На примере из 1 поста я показал, что это возможно. Языки с динамическими типами заставляют все варианты обрабатывать.
10. isConnected() == nil возможно! Тут явно "гонка потоков". Этот баг отловить непросто. Чтоб 100% избежать бага нужно стартовать скрипты когда все загрузилось. "Окно подключения" появляется после отрисовки графиков на старых данных - вот на этом этапе нужно стартовать скрипты, но не раньше. А может причина проще: забыли переменную в isConnected() инициализировать 0 и она периодически попадает на "грязную память".
11. Настройка умного заказа данных включена. Если в Настройки=>"Получение данных" снять галку "Запрашивать данные раз в … сек.", то ParamRequest() вернет true, но данные не придут. И getParamEx() вернет 0 или старое значение. Проблема именно с переключением галки "Запрашивать данные раз в … сек.". Я эту галку сначала снял, потому что неправильно понял описание, и долго не понимал, почему 0 возвращается.
12. Ошибка о нехватки средств на срочном рынке вылезает из-за расчета ГО мин/макс цены для рыночной заявки. QUIK считает "рыночное" ГО для +500 пунктов, вылезает за лимит и не отправляет заявку на сервер. По стакану достаточно +20 пунктов с запасом на VTB и на ГО депо хватает. Пример: Депо=1000р (чтоб впритык было) VBZ1=5500 с ГО=820р Если заявить на покупку 1 VBZ1 по 5520(5500+20), то все исполнится. Если заявить на покупку 1 VBZ1 по "Рыночной"(5500+500=6000), то "Нехватка средств по лимитам клиента." == "нет денег на ГО".
13. Добавьте "Trans_ID должен быть уникальным только при импорте транзакций из файла. При отправке транзакции из Lua-скрипта, его значение может быть каким угодно, так как оно используется только для синхронизации внутри самого скрипта (если таковая требуется)." в доку sendTransaction(), а то на форуме запутались с уникальностью TRANS_ID. Еще большую неразбериху с TRANS_ID вносит запрет, что он обязателен для Lua-скрипта. Можно снять этот запрет.
10. А теперь с OnTransReply(): С сентября у Сбербанка начались проблемы с соединением. Паровозик раньше ехал стабильно, а сейчас часто стоит. Дисконнекты участились. И как в таких условиях ждать OnTransReply()? Надежнее мониторить таблицу заявок для 100% статуса. И если заявка уже принята сервером, то логично ожидать с номером 0 (означает, что до МБ не добралась) даже после дисконнекта. Такие заявки должны хранится сервером не более часа. По таким заявкам проще сделать цикл ожидания. А еще из-за особенности поточности Lua-скриптов, событийная модель - ненадежное решение. sendTransactionSync() должно решить проблему Lua-программистов, но решать заморочки с плохим соединением придется уже вам.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
04.10.2021 19:33:51
Эх... вспомню форумную молодость и покормлю тролля
Цитата
Владимира ;) [QUOTE]Ну, во-первых, это не баги, а во-вторых, при чём здесь "программирование на Lua"? Все эти "пробелом ставить галку" - это интерфейс юзера.
Мне влом разделять тему на две.
Цитата
И нафига Вам isConnected? В жизни ни разу не проверял![QUOTE]Антоха? Ни единого разрыва! :D
[QUOTE]А Unicode на кой? [QUOTE]Современный стандарт IDE.
[QUOTE]Ну и, наконец, а на кой вообще нужен TRANS_ID, если он не уникальный?
Отличать заявки первого скрипта от второго или для дополнительной информации.
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 04.10.2021
04.10.2021 16:49:31
Баги QUIK 8.13: * Нет хоткея для показа Lua-скриптов. * У окна стоп-заявок нет якоря, хотя у обычных заявок он есть. * Сделки тоже без якоря. * Если в Настройки=>"Получение данных" снять галку "Запрашивать данные раз в … сек.", то ParamRequest() вернет true, но данные не придут. * Забавно, но "Смена операции клавишей Пробел" не позволяет пробелом ставить галку, например, "Рыночная". * Нужна панель с индикаторами (с значками) запущенных скриптов. * Ошибка о нехватки средств на срочном рынке вылезает из-за расчета ГО мин/макс цены для рыночной заявки. QUIK считает "рыночное" ГО для +500 пунктов и вылезает за лимит без отправки заявки на сервер, когда по стакану достаточно +20 пунктов с запасом на VTB и на ГО депо хватает.
Код
Ошибка создания заявки. [GW][332] "Нехватка средств по лимитам клиента.".
* "Ошибку создания заявки" sendTransaction() не возвращает, как ошибку. Да, эту ошибку нельзя заблокировать! В заявках тоже пусто! Только OnTransReply() её ловит на позднем этапе. Вообще все транзакции с статусом==4 можно через sendTransaction() вернуть, а не беспокоить пользователя. Ну превысил в скрипте QTY... ну, верните ошибку скрипту! Юзер тут причем?
* Нужна sendTransactionSync() с гарантированным возвратом последнего trans_reply: - ошибка (БЕЗ ПОКАЗА ОШИБКИ ЮЗЕРУ) - заявка в очереди (PUT_IN_QUEUE) - заявка исполнена или отклонена (FILL_OR_KILL и KILL_BALANCE)
* isConnected() == nil возможно! Похоже это происходит когда QUIK при запуске сразу стартует Lua-скрипт, но функция isConnected() еще не прошла иницилизацию. Я не вижу другого объяснения, почему этот цикл иногда при старте не срабатывает:
Код
function main()
ISRUN = true
while ISRUN and isConnected() == 0 do
sleep(1000)
end
-- код
end
* Нужна галка на авто-перезапуск скрипта, потому при неожиданном разрыве некоторые функции могут вернуть nil и убить скрипт. В Lua нет try-catch. Например:
Код
local minstep = getSecurityInfo("SPBFUT", sec_code).min_price_step
* В 2021г без Unicode?! Сам Unicode по BOM определяется. И давно уже научились отличать Win-1251 от UTF-8. Сам файл можно в любой кодировки читать, а компилировать в Win-1251, если это так важно.
* Возвращаемое значение из OnCalculate() должно быть table, а сейчас такой бред:
Код
function OnCalculate(index)
-- код
return r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],r[9],r[10],r[11],r[12],r[13],r[14],r[15],r[16],r[17],r[18],r[19],r[20],r[21],r[22],r[23]
end
А вот такой код обрабатывает оба варианта возврата:
Код
function OnCalculate(index)
local result
result = {7, 9}
return result[1], result[2], result
end
function main()
str = "R: "
for k, v in pairs({OnCalculate()}) do
if type(v) == "table" then
for k0, v0 in pairs(v) do
str = str.." tbl "..tostring(k0).."="..tostring(v0)
end
else
str = str.." "..tostring(k).."="..tostring(v)
end
end
message(str)
end
И хватит распространять миф об уникальности TRANS_ID. Он почему-то должен быть объявлен, хотя Таблица Заявок утверждает, что nil тоже норм. А уникальным он точно может не быть - просто дополнительное число для фильтрации заявок. Описание в MQL5 аналогичного параметра:
Код
Идентификатор эксперта. Позволяет организовать аналитическую обработку торговых ордеров. Каждый эксперт может выставлять свой собственный идентификатор при отправке торгового запроса