26

Re: Проблемы со знанием Lua

kalikazandr пишет:

динамически будет заполняться в OnParam, и заново заполняться при закрытии

Да, по OnParam. Спасибо большое за код, разберусь.

27

Re: Проблемы со знанием Lua

Да, очень полезный код.
А еще... А вот есть окно Lua с определенным перечнем бумаг, по OnParam изменяется, допустим, котировка одной из бумаг, но эта бумага в конце списка и не помещается в видимое окно таблицы, как сделать чтобы список автоматически прокрутился и сфокусировался на ней?)) Куда смотреть?)

28

Re: Проблемы со знанием Lua

Xantrax пишет:

сфокусировался на ней

С этой задачей успешно справляется функция SetSeletedRow().

29

Re: Проблемы со знанием Lua

А вот еще вопрос. Возьмем функцию getParamEx, она возвращает везде STRING, так это что, каждый раз приводить к tonumber()?
Или другими словами, какие переменные можно сравнивать, какие нет?
table  == number;
string == number...

30

Re: Проблемы со знанием Lua

каждый раз приводить. вот, я делал хелпер чтобы доставать параметры:

sec_params_fetcher = {}
setmetatable(sec_params_fetcher, {
    __call = function(__call_self, ...)
        local tbl = {}
        if select('#', ...) == 0 then 
            setmetatable(tbl, {
                __index = function(self, class_code)
                    local sec_codes = {}
                    setmetatable(sec_codes, {
                        __index  = function(self, sec_code)
                            local sec_params = __call_self(class_code, sec_code)
                            rawset(self, sec_code, sec_params)
                            return sec_params
                        end
                    })
                    rawset(self, class_code, sec_codes)
                    return sec_codes
                end
            })
        else
            local class_code, sec_code, is_cached = ...
            setmetatable(tbl, {
                __index = function(self, key)
                    local res = rawget(getmetatable(self) or {}, key)
                    if res == nil then 
                        local paramtable = getParamEx(class_code, sec_code, key)
                        if paramtable ~= nil and paramtable.result == '1' then 
                            if paramtable.param_type == '1' or paramtable.param_type == '2' or paramtable.param_type == '4' then
                                res = tonumber(paramtable.param_value)
                            elseif paramtable.param_type == '3' then
                                res = paramtable.param_image
                            elseif paramtable.param_type == '5' then
                                local t = {year = 1970, month = 1, day = 1}
                                t.hour,t.min,t.sec = string.match(paramtable.param_image, "(%d%d)%p(%d%d)%p(%d%d)") 
                                res = os.time(t)
                            elseif paramtable.param_type == '6' then
                                local d = {hour = 0, min = 0, sec = 0}
                                d.day,d.month,d.year = string.match(paramtable.param_image, "(%d*)\.(%d*)\.(%d*)")
                                res = os.time(d)
                            else
                                res = paramtable.param_image
                            end
                        end
                        if res ~= nil and self.__cached then rawset(self, key, res) end
                    end
                    return res
                end,
                SetCached = function(self, is_cached)
                    if (is_cached ~= true) then
                        for i, v in pairs(self) do rawset(self, i, nil) end
                    end
                    rawset(getmetatable(self) or {}, '__cached', (is_cached == true))
                end
            })
            tbl:SetCached(is_cached)
        end
        return tbl
    end
})

-- securities parameters list (QUIK 8.1):
--
-- LONGNAME, SHORTNAME, CODE, ISINCODE, REGNUMBER, CFI_CODE, CLASSNAME, CLASS_CODE, TRADE_DATE_CODE, SEC_FACE_VALUE, SEC_FACE_UNIT, SEC_SCALE, LCURRENTPRICE,
-- SEC_PRICE_STEP, DISCOUNT1, DISCOUNT2, DISCOUNT3, SEC_COMMENT, LOTSIZE, SECTYPE, CURRENCYID, LISTLEVEL, PRIMARYDIST, QUALIFIED, ASSURED, ANONTRADE, STATUS, 
-- BID, BIDDEPTH, BIDDEPTHT, NUMBIDS, OFFER, OFFERDEPTH, OFFERDEPTHT, NUMOFFERS, OPEN, HIGH, LOW, LAST, CHANGE, QTY, TIME, VOLTODAY, VALTODAY, TRADINGSTATUS, 
-- VALUE, WAPRICE, HIGHBID, LOWOFFER, NUMTRADES, PREVPRICE, PREVWAPRICE, CLOSEPRICE, LASTCHANGE, MARKETPRICE, PRICEMAX, PRICEMIN, SELLDEPO, BUYDEPO, STEPPRICET, 
-- STEPPRICE, CLPRICE, STARTTIME, ENDTIME, MAT_DATE, DAYS_TO_MAT_DATE, OPTIONBASECLASS, R_SETTLEPRICE, OPENPCTCHANGE, STEP_IN_CURRENCY, PRICEMINUSPREVWA,  
-- SETTLEDATE, SETTLECODE, SETTLEDATE1, TRADINGPHASE, FIRST_CUR, SECOND_CUR, DPVALINDICATORBU, DPVALINDICATORSE, MARKETPRICETODAY, ISSUESIZE, PREVDATE, BASEPRICE, 
-- LCLOSEPRICE, QUOTEBASIS, ADMITTEDQUOTE, PREVADMITTEDQUOT, LASTBID, LASTOFFER, MARKETPRICE2, PREVLEGALCLOSEPR, OPENPERIODPRICE, MIN_CURR_LAST, MIN_CURR_LAST_TI, 
-- ISSUESIZEPLACED, COUNTERPRICE, PREVLOTSIZE, LOTSIZECHANGEDAT, PLANNEDTIME, AUCTPRICE, AUCTVALUE, AUCTVOLUME, AUCTNUMTRADES, IMBALANCE, MARKETVOLB, MARKETVOLS

function main()
    local sec = sec_params_fetcher()
    -- example 1:
    message('TQBR@SBER.LAST == ' .. tostring(sec.TQBR.SBER.LAST))
    message('TQBR@VTBR.LAST == ' .. tostring(sec.TQBR.VTBR.LAST))
    message('TQBR@SBER.TRADINGSTATUS == ' .. tostring(sec.TQBR.SBER.TRADINGSTATUS))
    -- example 2:
    local tqbr_sber = sec.TQBR.SBER
    message('TQBR@SBER.SHORTNAME == ' .. tostring(tqbr_sber.SHORTNAME))
    -- example 3:
    local tqbr = sec.TQBR
    message('TQBR@VTBR.STARTTIME == ' .. tostring(tqbr.VTBR.STARTTIME))
    tqbr.SBER:SetCached(true) -- enable parameter caching for SBER
    message('TQBR@SBER.SETTLEDATE == ' .. tostring(tqbr.SBER.SETTLEDATE))
    -- example 4:
    local tqbr_rosn_cached = sec_params_fetcher('TQBR', 'ROSN', true) -- enable parameter caching, getParamEx() is called only once per parameter
    message('TQBR@ROSN.SHORTNAME == ' .. tostring(tqbr_rosn_cached.SHORTNAME))
end

31

Re: Проблемы со знанием Lua

Ммм, скрипт при совпадении условий выставляет ордер, но он не всегда успевает за рынком, какие есть приемы, чтобы срипт успевал. Может быть делать отступ, ведь скрипт берет минимальную предложенную цену? Может еще что?

32

Re: Проблемы со знанием Lua

Все, на праздники форум встал, ни новых тем, ни уж тем более ответов...((

33

Re: Проблемы со знанием Lua

Xantrax пишет:

Все, на праздники форум встал, ни новых тем, ни уж тем более ответов...((

вопрос не по теме, по этому и нет ответа.
каждый находит свое решение, которое его устраивает.

34

Re: Проблемы со знанием Lua

kalikazandr пишет:

вопрос не по теме, по этому и нет ответа.
каждый находит свое решение, которое его устраивает.

Смысле, что для данного вопроса нужно задать отдельную тему?
Ну, а какие вообще есть решения?
Типа:
1) доступ к компьютеру (серверу) на бирже;
2) выставление ордера с некоторым отступом;
Что еще может быть?

35

Re: Проблемы со знанием Lua

Xantrax пишет:

Смысле, что для данного вопроса нужно задать отдельную тему?

нет, это не относится к тематике этого форума.
по вашему вопросу.
нужно понимать, что любое решение имеет 2 стороны медали.
вы что-то улучшите, например скорость расчета, (с++ и ко-локация), несомненно у вас увеличится кол-во сделок, но так же увеличится кол-во отрицательных сделок, которых вы не видите в текущей реализации (qlua+quik), а минус с них может быть значительным, т.е. совсем значительным и стратегия перестанет работать.
начнете придумывать дополнительные фильтры, которые уменьшат отрицательные сделки, но уменьшат и самые лучшие положительные сделки - опять тупик и новые фильтры, которые в свою очередь уменьшат скорость расчета.
это касается любого вашего решения в т.ч. и увеличение отступа не гарантирует улучшение конечного результата.
и выбирать оптимальное решение только вам, готового решения нет, под каждую стратегию - свое уникальное решение.

36

Re: Проблемы со знанием Lua

Товарищи, подскажите, а какой оптимальное время для зацикливания функции main? sleep(1)?  sleep(100), sleep(1000)?

37 (2020-06-13 13:43:38 отредактировано Xantrax)

Re: Проблемы со знанием Lua

При отправке sendTransaction сразу же вызывается функция OnTransReply (на один sendTransaction) один OnTransReply, но могут придти и другие OnTransReply, не от нашего sendTransaction, так? Что бы понять, что сработал OnTransReply именно от нашего sendTransaction там есть поле TRANS_ID.
Если в OnTransReply не было никаких проблем (статус 3), то он должен за собой вызвать OnOrder, где по TRANS_ID мы уже можем понять, наша это заявка или нет, а также получить номер заявки (в OnTransReply номер заявки, как я уже писал не получить).
OnOrder может вызываться несколько раз, возможно изменился статус заявки, или (как пишут на форуме quik, изменились какие-то служебные поля в заявке). Так?

Не понятно как формировать это поле при работе двух ботов, номера могут пересечься.

Почитал рекомендации,

с генерацией Trans_id и UID терминала не стоит заморачиваться вообще. Есть поле brokerref(комментарий), которое делаем так:
clientcode.."//"..botname..id, нужно понимать, что коментарий составное 20-ти символьное поле и для фондовой секции арка удосужилась разделить его "//" а не "/", т.е. украла 1 символ, а для срочки вообще пофик, можно любой разделяющий символ.
botname - имя стратегии; id - что душе угодно, 1,2,3... вполне себе подойдет.
Если бот видит, что brokerref не его - вот и фильтр, на все случаи.

"Делаем так:" и куда его всовываем?
"арка удосужилась разделить его "//" а не "/", т.е. украла 1 символ", что значит украла символ, два слэша больше чем один, наоборот добавила.
Я так понимаю, brokerref это комментарий брокера, который приходит к нам в OnTransReply, и в OnOrder, кроме того, люди пишут, что если указать, что-то в комментарии, то заявка не исполняется (превышено количество символов).
Как избежать повторения поля TRANS_ID? Пока в голову приходит только функцию

math.randomseed(os.clock());
    uniq_trans_id = math.random(100, 1000000);

Как попроще сделать, чтобы не пересекались у двух скриптов TRANS_ID?

38

Re: Проблемы со знанием Lua

миллион способов. четные/нечетные числа, разные диапазоны значений - что угодно...

39

Re: Проблемы со знанием Lua

toxa пишет:

миллион способов. четные/нечетные числа, разные диапазоны значений - что угодно...

Я подумывал над тем, чтобы скрипты как-то общались друг с другом, но пока это все выглядит как-то сложно. Да, наверно разделение будет по диапазонам.

Еще вопрос. У меня Win 64. Есть такая библиотека LuaSocket, не могу ее никак подключить. Там последнее изменение 2007 годом и все под Win 32. Скажите, а как из под Lua скачать страницу сайта в строку? Как взаимодействовать с интернетом?))

40

Re: Проблемы со знанием Lua

Xantrax пишет:

Я подумывал над тем, чтобы скрипты как-то общались друг с другом, но пока это все выглядит как-то сложно.

не так и сложно. Можете воспользоваться моей либой lua share либо другой сдешней либой staticvar.

41

Re: Проблемы со знанием Lua

Товарищи, а как-то можно получить значения свечей без открытия графика по инструменту? А в частности хотелось бы получить значение индикатора Simple Moving Average.
Я так понимаю получение данных с помощью CreateDataSource возможна только при условии того, что график по инструменту открыт. А возможно ли получить значения, если график закрыт?

42 (2020-06-17 16:33:14 отредактировано Xantrax)

Re: Проблемы со знанием Lua

Xantrax пишет:

А возможно ли получить значения, если график закрыт?

Да, можно, есть функция SetEmptyCallback(). Единственное только я не понял, получение данных зависит от времени задержки (sleep(100)), потому что иногда данные не приходят...

43

Re: Проблемы со знанием Lua

можно получать данные по мере их прихода, если задать не пустой callback, тогда никаких delay не нужно.