Roffild (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 2
Использование "якоря" для скрипта Lua
 
Я уже застолбил это пожелание. Ожидаю реализацию в ближайшие 10 лет...
Баги QUIK 8.13
 
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 при большом количестве функций в скрипте
 
HFT - закрытый банковский клуб и Квик там не нужен.

Для акционеров достаточно Веб-клиента.

А мы - спекулянты по фьючерсам, здесь, потому что альтернативы у Брокера нет.
Win-1251 на GitHub
 
https://github.com/Roffild/charset-github

В имени файла кодировка работает.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
 
Идея построить событийную модель в основном потоке - бред изначальным. А еще про "безопасность" заливают... ДЫРЫЩИЩЕ! Поэтому я её не использую.

Например, в MQL OnTick() не блокирует МТ5 и код может выполняться бесконечно в СВОЁМ потоке - только тики пропускает.
Баги QUIK 8.13
 
Пункты 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.
Эту функцию ДОЛЖНЫ создать программисты Квика, а не заставлять искать хаки в их тв...

Теперь это часть моей библиотеки, которая облегчает боль и страдания от QLua.

После эпичной чуши про безопасность ожидаю обвинение во "взломе Квика, подрывающее безопасность и стабильность Российской биржи" :D
Баги QUIK 8.13
 
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
 
Владимир, спасибо, что поделился с нами своей гопно-туалетной философией окружающего нас токсичного мира. Я больше не стану тебя отвлекать от миссии очищения этого форума. Да, обойдет бан тебя стороной в этом опасном деле...
Баги QUIK 8.13
 
Владимир, и много уже спустил? Если не спускать "поучения", которые тебя даже не касаются, то жизнь теряет смысл? И можно при спуске не стать "распальцованным дураком", как они? И как это распознать?
Баги QUIK 8.13
 
Цитата
Владимир написал:
Roffild, Тролль эту тему создал, лапуль.  
А ты пытаешься его изгнать? В чём ТВОЯ миссия? Или смысл жизни? Даж интересно стало.
Баги QUIK 8.13
 
Цитата
Владимир написал:
Roffild, Лапуль, кода своего я здесь приводил НЕМЕРЯНО! И кода РАБОТАЮЩЕГО, без скулежа про "плохие и непродуманные API". Покопайтесь в моих сообщениях, коль неймётся. И в третий раз повторяю: "В кодах скулящих по любому вопросу неучей я ковыряться не намерен". Сколько раз повторить, чтобы дошло?
Ну, не повторяй... Я вообще не понимаю, что тролль забыл в этой теме...
Баги QUIK 8.13
 
Anton, как раз на создании mypositions твой код и нарвется на тот баг. OnAllTrade тут не поможет и вообще о других сделках.

Роль OnAllTrade выполняет getParamEx2("SPBFUT", v.sec_code, "BID").param_value в моем коде.
Баги QUIK 8.13
 
Цитата
Владимир написал:
Roffild, Лапуль, я с раннего детства не перевариваю распальцованных дураков. Повторяю для особо одарённых: в кодах скулящих по любому вопросу неучей я ковыряться не намерен. А "гениальное решение", лапуль, надо УМЕТЬ видеть - бездарности способны разве что смотреть, как баран на новые ворота.  
Нельзя увидеть, чего нет. Покажи! Или ты даже тот код не осилил? Ах, да "в кодах скулящих по любому вопросу неучей я ковыряться не намерен"... не программист ты.

Цитата настоящего программиста: "Хватит болтать! Покажи мне код!"
Баги QUIK 8.13
 
Цитата
Владимир написал:
Roffild, Тролля в зеркале поищите. Заняться мне больше нечем, кроме как в коде очередного скулящего ковыряться. А свои проблемы со скриптом я давно решил. Все до единой.
На троллинг время ты же нашел, а на код уже нет?

Эх... быстро же слился тролль... а я уже приготовился гениальное решение проблемы увидеть.
Баги QUIK 8.13
 
Цитата
Владимир написал:
Roffild, Да неплохо бы и поучить Вас программировать. Программисты спокойно работают с любым "плохим и непродуманным API", а не скулят здесь по каждому чиху, да учат, как надо его улучшать по их доморощенным представлениям.
О, тролль проснулся... ну... давай, покажи класс! Как нужно изменить код выше?
Баги QUIK 8.13
 
Цитата
В случае  двухфакторной аутентификации сначала происходит соединение с сервером  (после чего 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
 
Цитата
Nikolay написал:
Я так понимаю это просто файл макет, чтобы он был проиндексирован LS с поддержкой аннотаций как  Lua от sumneko  (сам им пользуюсь).
Да.
QUIK QLua подстановка с описанием для редакторов Lua
 
https://github.com/Roffild/qlua-annotations

Я проверил в редакторах Lua: Visual Studio Code и PyCharm

Этот форум картинки не переваривает..

Ну, и... звездани на ГитХабе...
Баги QUIK 8.13
 
Цитата
Daniil Pozdnyakov написал:
Добрый день,

Как уже было описано выше, пожелание на добавление данного функционала уже было зарегистрировано от Вас.
В БагТрекере можно редактировать детали. А поскольку 15 пункт из косметического превратился, в невозможность найти актуальную цену для стоп-лося... пора бы "редактировать детали" и повысить приоритет.

Хотя бы ссылку на тему в БагТрекере указываете? А то это похоже на игру "Сломанный форум" с программистами Квика...
Баги QUIK 8.13
 
15. Таблица futures_client_holding не имеет цену последней сделки, да ещё обновляется раньше trades(сделки)! ппц... бот закрывает текущую сделку, но на основании ПРЕДЫДУЩЕЙ сделки. Таблица futures_client_holding должна иметь цену последней сделки. И futures_client_holding - это "Состояние счета", поэтому 15 пункт.

Цитата
15. Не Lua, а про окно "Состояние счета" вообще-то. "Баланс" - средняя цена за день. Я хочу последнюю сделку видеть.
Баги QUIK 8.13
 
Цитата
Anton написал:
Таки я посмотрел. В PythonDLL в additional dependencies ожидалось бы увидеть notelemetry.obj, чисто для феньшую. Ну хотя бы в релизном конфиге.
PythonDLL для MQL5 - интересный проект. Пока пытался добавить makemoney.obj, пофиксил PyTorch и *Boost и др. EURUSD выбесил окончательно. Никто правок не предложил.

Биржа после Форекса более предсказуема. Но QLUA - это наспех прикрученная функциональность, а не полноценная система с продуманным API. Между сервером и QLUA нет полноценного торгового контроля.
Баги QUIK 8.13
 
Э... а на этом форуме программисты есть, кроме меня? Мои доказательства здесь и на GitHub.

Цитата
s_mike@rambler.ru написал:
Это принципиальная невозможность написать такую функцию, которая бы гарантировала правильность результата.

если вам мало приведенной выше причины, по которой это невозможно, существует ещё много причин, по которым это невозможно. В частности, проверка соединения при помощи isconnected() даёт вам информацию о наличии в данный момент времени соединения с сервером брокера, но ничего не рассказывает о доступности и статусах шлюзах к разным торговым площадкам.
Я "невозможных" задач не ставлю, потому что примерно представляю, как это реализовать.
Сервер Квика уже сейчас знает, что биржа ушла на клиринг, выходные, дисконнект и т.п. - вот и пусть сообщит скрипту.

Да, и слово "гарантия" смешно к халтурному QLUA... Конечно, продукт не массовый, но от ПО для биржи с её лиардами хотелось бы большей продуманности...
Баги QUIK 8.13
 
Цитата
s_mike@rambler.ru написал:
Цитата
Roffild написал:

20. Нужна нормальная функция, которая точно ответит на "Торговля разрешена?"
 
Код
      function    isTradeAllow ()
      return   (
          isConnected  ()   =    =     1     and  
          not   ( Периоды клининга )
    )
  end      
 
нет такой функции и быть не может.

сейчас торговля разрешена, а пока вы исполняете код, который написали выше, она может быть уже запрещена.
Это уже придирки к пингу, а не 10-20 минутным интервалам и выходным, которые у МБ есть.
Баги QUIK 8.13
 
18. Сейчас График10 после График2 не поставить. Или объяснить, как "Окна-Колонками" расставляет окна? Сортировка называется.

20. Нужна нормальная функция, которая точно ответит на "Торговля разрешена?"
Код
function isTradeAllow()
    return (
        isConnected() == 1 and
        not ( Периоды клининга )
    )
end
Баги QUIK 8.13
 
18. В "Менеджере окон" нужна смена порядкового номера окна, потому что меню "Окна-Колонками" расставляет по этому порядку.

19. И редактирование размеров окна добавьте в "Менеджере окон". Можно в отдельном диалоге сделать по двойному клику.
Баги QUIK 8.13
 
Цитата
Кроме этого существуют горячие       клавиши, которые используются системой и не могут быть изменены,       например, Alt+F4 (закрытие окна) или Ctrl+F6 (переключение между       окнами).
Alt+F4 действительно нужно ловить особым способом, как и CTRL+ALT+DEL. Все остальные комбинации без проблем обрабатываются стандартным методом:
Код
RegisterHotKey(hMainWnd, 999, MOD_CONTROL, VK_F6);
Да и Ctrl+F6 не "переключает между окнами" в Винде - это уже фантазии ваших программистов.

Цитата
Касательно пункта 10. Терминал не даст возможность торговать до  подключения. Выйдет соответствующее сообщение "Not connected" в окне  сообщений (См. скриншот 1).
Это после isConnected()==1, но до "Двухфакторная аутентификация прошла успешно"? 100% баг!

Цитата
Касательно пункта 15. Могли бы уточнить, для чего Вам необходимо видеть в таблице "Состояние счёта" цену Вашей последней сделки, если её можно увидеть в таблице сделок ?
То есть, вместо дополнительно столбика мне предлагаете: еще одно мало информативное окно втиснуть между 10? Гениально! У вас для расчета "Баланса" уже инфа по сделкам получается вообще-то - просто в отдельный столбец последнюю сделку закинте.

Цитата
Касательно пункта 17. Правильно понимаем, Вы хотите, чтобы при выборе  шаблона на графике удалялись метки, рисунки и тд., а также все настройки  с индикаторами восстанавливались с нуля ?
ДА!!! В MetaTrader так и сделали уже 20 лет назад...
И в МТ5 используется формат INI для всех настроек, что позволяет точнее подобрать размеры графовых окон.

P.S.
А тут программисты Квика появляются, и только "операторы из Ростелекома"???
Баги QUIK 8.13
 
15. Не Lua, а про окно "Состояние счета" вообще-то. "Баланс" - средняя цена за день. Я хочу последнюю сделку видеть.

17. А какой смысл в шаблоне, который ничего не меняет? Старые индикаторы удаляются, новые добавляются.
Баги QUIK 8.13
 
И форум после Просмотра ББКод обрезает...
Баги QUIK 8.13
 
[QUOTE=Sfinexer]Снял якорь с таблицы стоп заявок, но полный список не вывелся, как сделать вывод всего списка что был ранее?Есть такой баг: фильтры после снятия якоря не восстанавливаются.
Баги QUIK 8.13
 
17. Шаблоны для графиков только цвета меняют. Шаблон должен график очистить и все настройки с индикаторами восстановить с 0. В МТ5 это нормально сделано, а в Квик - бред какой-то.
Баги QUIK 8.13
 
10. Странный isConnected() получается. Сейчас глянул в лог:
9:10:39 Соединение установлено
9:10:40 Введите PIN
9:10:43 MyLua started (isConnected() == 1)
9:12:35 Двухфакторная аутентификация прошла успешно

Если бы MyLua начал торговать до PIN, то словил ошибки...
Баги QUIK 8.13
 
По 15 пункту:
Цена последней сделки из ТТТ (LAST) - не то.

Цена из "Таблицы Сделок", крайняя сделка по инструменту - ВОТ ЭТО. На графике стрелками обозначаются.
Баги QUIK 8.13
 
16. В "редакторе клавиш" не весь список. Сейчас хотел сменить хоткей "Следующее окно" (CTRL+F6), но его нет в списке. И окно не переключается.
Баги QUIK 8.13
 
15. В окно "Состояние счета" нужен столбец "Цена сделки" (Цена последней сделки).
Баги QUIK 8.13
 
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
 
Эх... вспомню форумную молодость и покормлю тролля
Цитата
Владимира ;)
[QUOTE]Ну, во-первых, это не баги, а во-вторых, при чём здесь "программирование на Lua"? Все эти "пробелом ставить галку" - это интерфейс юзера.
Мне влом разделять тему на две.

Цитата
И нафига Вам isConnected? В жизни ни разу не проверял![QUOTE]Антоха? Ни единого разрыва! :D

[QUOTE]А Unicode на кой? [QUOTE]Современный стандарт IDE.

[QUOTE]Ну и, наконец, а на кой вообще нужен TRANS_ID, если он не уникальный?
Отличать заявки первого скрипта от второго или для дополнительной информации.
Баги QUIK 8.13
 
Баги 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 аналогичного параметра:
Код
Идентификатор эксперта. Позволяет организовать аналитическую обработку торговых ордеров. Каждый эксперт может выставлять свой собственный идентификатор при отправке торгового запроса
Страницы: Пред. 1 2
Наверх