Re: Проблемы со знанием Lua
динамически будет заполняться в OnParam, и заново заполняться при закрытии
Да, по OnParam. Спасибо большое за код, разберусь.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
QUIK -> DDE → Lua: учебники, общие вопросы → Проблемы со знанием Lua
Чтобы отправить ответ, вы должны войти или зарегистрироваться
динамически будет заполняться в OnParam, и заново заполняться при закрытии
Да, по OnParam. Спасибо большое за код, разберусь.
Да, очень полезный код.
А еще... А вот есть окно Lua с определенным перечнем бумаг, по OnParam изменяется, допустим, котировка одной из бумаг, но эта бумага в конце списка и не помещается в видимое окно таблицы, как сделать чтобы список автоматически прокрутился и сфокусировался на ней?)) Куда смотреть?)
сфокусировался на ней
С этой задачей успешно справляется функция SetSeletedRow().
А вот еще вопрос. Возьмем функцию getParamEx, она возвращает везде STRING, так это что, каждый раз приводить к tonumber()?
Или другими словами, какие переменные можно сравнивать, какие нет?
table == number;
string == number...
каждый раз приводить. вот, я делал хелпер чтобы доставать параметры:
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
Ммм, скрипт при совпадении условий выставляет ордер, но он не всегда успевает за рынком, какие есть приемы, чтобы срипт успевал. Может быть делать отступ, ведь скрипт берет минимальную предложенную цену? Может еще что?
Все, на праздники форум встал, ни новых тем, ни уж тем более ответов...((
Все, на праздники форум встал, ни новых тем, ни уж тем более ответов...((
вопрос не по теме, по этому и нет ответа.
каждый находит свое решение, которое его устраивает.
вопрос не по теме, по этому и нет ответа.
каждый находит свое решение, которое его устраивает.
Смысле, что для данного вопроса нужно задать отдельную тему?
Ну, а какие вообще есть решения?
Типа:
1) доступ к компьютеру (серверу) на бирже;
2) выставление ордера с некоторым отступом;
Что еще может быть?
Смысле, что для данного вопроса нужно задать отдельную тему?
нет, это не относится к тематике этого форума.
по вашему вопросу.
нужно понимать, что любое решение имеет 2 стороны медали.
вы что-то улучшите, например скорость расчета, (с++ и ко-локация), несомненно у вас увеличится кол-во сделок, но так же увеличится кол-во отрицательных сделок, которых вы не видите в текущей реализации (qlua+quik), а минус с них может быть значительным, т.е. совсем значительным и стратегия перестанет работать.
начнете придумывать дополнительные фильтры, которые уменьшат отрицательные сделки, но уменьшат и самые лучшие положительные сделки - опять тупик и новые фильтры, которые в свою очередь уменьшат скорость расчета.
это касается любого вашего решения в т.ч. и увеличение отступа не гарантирует улучшение конечного результата.
и выбирать оптимальное решение только вам, готового решения нет, под каждую стратегию - свое уникальное решение.
Товарищи, подскажите, а какой оптимальное время для зацикливания функции main? sleep(1)? sleep(100), sleep(1000)?
При отправке 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?
миллион способов. четные/нечетные числа, разные диапазоны значений - что угодно...
миллион способов. четные/нечетные числа, разные диапазоны значений - что угодно...
Я подумывал над тем, чтобы скрипты как-то общались друг с другом, но пока это все выглядит как-то сложно. Да, наверно разделение будет по диапазонам.
Еще вопрос. У меня Win 64. Есть такая библиотека LuaSocket, не могу ее никак подключить. Там последнее изменение 2007 годом и все под Win 32. Скажите, а как из под Lua скачать страницу сайта в строку? Как взаимодействовать с интернетом?))
Я подумывал над тем, чтобы скрипты как-то общались друг с другом, но пока это все выглядит как-то сложно.
не так и сложно. Можете воспользоваться моей либой lua share либо другой сдешней либой staticvar.
Товарищи, а как-то можно получить значения свечей без открытия графика по инструменту? А в частности хотелось бы получить значение индикатора Simple Moving Average.
Я так понимаю получение данных с помощью CreateDataSource возможна только при условии того, что график по инструменту открыт. А возможно ли получить значения, если график закрыт?
А возможно ли получить значения, если график закрыт?
Да, можно, есть функция SetEmptyCallback(). Единственное только я не понял, получение данных зависит от времени задержки (sleep(100)), потому что иногда данные не приходят...
можно получать данные по мере их прихода, если задать не пустой callback, тогда никаких delay не нужно.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
QUIK -> DDE → Lua: учебники, общие вопросы → Проблемы со знанием Lua
Форум работает на PunBB, при поддержке Informer Technologies, Inc