Долго об яснять. Так у них устроена ЕДП. Это часть настроек админки. Программа BO Client кажется. Пониженное ГО делалось бы через маржинальность фьюча. Но речь не об этом. Тут беседа уплыла в сторону от вопроса который меня интересует
Sergey Gorokhov написал: Космонавт , Ваш вопрос в чем? Как отправить транзакцию через брокерский API или как брокер эту транзакцию обработает? Вам уже три человека сказало что эти вопросы надо решать не здесь а с Вашим брокером. Касаемо советов, для начала просто объясните ему суть проблемы.
Сергей, вы лидируете в рейтинге бесполезных ответов.
П.С. брокер об яснял что эта проблема решится если они сделают фьючерсы маржинальными, но такое решение не принято, поэтому приходится так выкручиваться.
У моего брокера есть необычная странность. Если я сегодня поторговал акциями с плечом, внутри дня вошёл и вышел, ночевал в кэше, на следующий день я всё равно не смогу торговать через КВИК фьючерсами. Будет ошибка Превышен лимит. В брокере мне объяснили, что это из за Т+2. На следующий день по Т+2 у меня нет денег, - они "в пути". В то же время, торговать через брокерскую платформу (веб-терминал) можно и через API можно. Поэтому вопрос. Как мне отправлять транзакции через АПИ брокера. Вот исходные данные. 1. У меня робот на луа. Он делает анализ. 2. При наличии сигнала нужно отправить транзакцию через АПИ
Вот коды, которые предлагает брокер: Там есть примеры для Browser / PHP / PHYTON
Отлично что есть примеры, но я не могу понять что мне с ними делать. Нужен какой то дополнительный софт? Нужно ли ставить платформу для питона или пхп? Прошу подсказать для чайника что делать чтобы отсылать эти приказы. Спасибо
На своём низком уровне понимания я разобрался. Получилось так:
Код
function main()
dofile ("C:\\Program Files (x86)\\Lua\\5.1\\lua\\RSI.lua")
while is_run do
stime=getSTime()
if stime==nil then stime=0 end
sleep (1)
if stime>100000 and stime<184000 then --не считаем вне сессии
func = RSI()
for sec in string.gmatch(ticker_list,"%a+") do
local rsi_count={}
ds = CreateDataSource(class, sec, INTERVAL_M5)
sleep (1000)
num_candles=ds:Size()
for i=1,num_candles do
rsi_count[i]=func(i, {Period=14, VType="Typical"}, ds)
end
indicator[sec].rsi_0 = rsi_count[num_candles]
indicator[sec].rsi_1 = rsi_count[num_candles-1]
indicator[sec].rsi_2 = rsi_count[num_candles-2]
и так далее
что самое противное (и не понятное), в нижеприведённом виде не работает! Ниже попытка считать не все бары, а только 50 последних.
Код
num_candles=ds:Size()
for i=num_candles-50,num_candles do
rsi_count[i]=func(i, {Period=14, VType="Typical"}, ds)
end
И ещё не понятно, рационально ли рассчитывать RSI в колбеке SetUpdateCallback? Я хочу запрашивать обновлённый RSI довольно редко - раз в секунду, скорость не нужна. С этой точки зрения, правильно ли помещать CreateDataSource внутри main в цикле перебора бумаг? Спасибо за советы.
а как обратиться к конкретному бару? Скажем последнему или предпоследнему? из вашего кода получается что переменная a постоянно будет менять значение, так как идёт перебор i-элемента
Добрый день. В базе кодов есть индикатор RSI написанный разработчиками. У меня не получается вызвать его обычным способом. Спотыкается на строчке внутри индикатора:
Код
val_Up[I] = (val_Up[I-1] * (P-1) + Up[I]) / P
Вызываю так:
Код
DataSource("TQBR","RASP",INTERVAL_M5)
local num_candles=ds:Size()
func=RSI()
local a=func(num_candles, {Period=12, VType="Typical", round=7}, ds)
Вот сам индикатор. Спасибо за подсказки.
Код
Settings = {
Name = "*RSI (Relative Strength Index)",
round = "off",
Period = 14,
VType = "Close", --Open, High, Low, Close, Volume, Median, Typical, Weighted, Difference
line = {{
Name = "RSI",
Type = TYPE_LINE,
Color = RGB(255, 0, 0)
}
}
}
function Init()
func = RSI()
return #Settings.line
end
function OnCalculate(Index)
return func(Index, Settings)
end
function RSI() --Relative Strength I("RSI")
local Up = {}
local Down = {}
local val_Up = {}
local val_Down = {}
return function (I, Fsettings, ds)
local Out = nil
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 14)
local VT = (Fsettings.VType or "Close")
local R = (Fsettings.round or "off")
if I == 1 then
Up[I] = 0
Down[I] = 0
end
if I>1 then
local Val = Value(I,VT,ds)
local ValPrev = Value(I-1,VT,ds)
if ValPrev < Val then
Up[I] = Val - ValPrev
else
Up[I] = 0
end
if ValPrev > Val then
Down[I] = ValPrev - Val
else
Down[I] = 0
end
if (I == P) or (I == P+1) then
local sumU = 0
local sumD = 0
for i = I-P+1, I do
sumU = sumU + Up[i]
sumD = sumD + Down[i]
end
val_Up[I] = sumU/P
val_Down[I] = sumD/P
end
if I > P+1 then
val_Up[I] = (val_Up[I-1] * (P-1) + Up[I]) / P
val_Down[I] = (val_Down[I-1] * (P-1) + Down[I]) / P
end
if I >= P then
Out = 100 / (1 + (val_Down[I] / val_Up[I]))
return rounding(Out, R)
end
end
end
end
function rounding(num, round)
if round and string.upper(round)== "ON" then round=0 end
if num and tonumber(round) then
local mult = 10^round
if num >= 0 then return math.floor(num * mult + 0.5) / mult
else return math.ceil(num * mult - 0.5) / mult end
else return num end
end
function Value(I,VType,ds)
local Out = nil
VType=(VType and string.upper(string.sub(VType,1,1))) or "A"
if VType == "O" then --Open
Out = (O and O(I)) or (ds and ds:O(I))
elseif VType == "H" then --High
Out = (H and H(I)) or (ds and ds:H(I))
elseif VType == "L" then --Low
Out = (L and L(I)) or (ds and ds:L(I))
elseif VType == "C" then --Close
Out = (C and C(I)) or (ds and ds:C(I))
elseif VType == "V" then --Volume
Out = (V and V(I)) or (ds and ds:V(I))
elseif VType == "M" then --Median
Out = ((Value(I,"H",ds) + Value(I,"L",ds)) / 2)
elseif VType == "T" then --Typical
Out = ((Value(I,"M",ds) * 2 + Value(I,"C",ds))/3)
elseif VType == "W" then --Weighted
Out = ((Value(I,"T",ds) * 3 + Value(I,"O",ds))/4)
elseif VType == "D" then --Difference
Out = (Value(I,"H",ds) - Value(I,"L",ds))
elseif VType == "A" then --Any
if ds then Out = ds[I] else Out = nil end
end
return Out
end
Уж простите за странный вопрос. Можно ли писать на Луа роботов для Плазы? Увы, я кроме Луа ничего не знаю... А то корявое что я умею писать на Луа - далось с огромным трудом. Учить Си++, Джаву и Си# для меня долго... Спасибо за ответ.
function mycallbackforallstocks(class,sec,index)
расчёт логики, трудоёмкий процесс анализа
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
пока считается логика, успевает прийти ещё одна сделка по другому инструменту. Или по этому же инструменту. Обработается ли она? Или будет пропущена и забыта?
Космонавт написал: Грамотно ли будет local num_candles превратить в local num_candles[sec]. Ведь возникают риски, что две сделки про разным акциям произойдут одновременно, и с этой переменной произойдёт каша, на неё будут претендовать две акции. или я заблуждаюсь?
У Вас переменная num_candles и так заполняется в зависимости от бумаги. То есть никакой каши не произойдет.
Разве Дата Сорс с колбеком не многопоточны? Если многопоточны, то запросто может быть ситуация с одновременными сделками по разным бумагам. Тогда эта переменная понадобится двум акциям одновременно.
local num_candles=ds[sec]:Size()
if index==num_candles then
func = BB()
line_10[sec],_,line_3[sec]=func(num_candles,...............)
end
Я работаю с множеством акций, по каждой создаётся свой поток ds[sec]. Грамотно ли будет local num_candles превратить в local num_candles[sec]. Ведь возникают риски, что две сделки про разным акциям произойдут одновременно, и с этой переменной произойдёт каша, на неё будут претендовать две акции. или я заблуждаюсь?
Добрый день. Из документации не понятно как работать с функцией OnConnected. Хочу чтобы она писала в глобальную переменную true если квик онлайн и false если не в сети. Увы, руководство пользователя не даёт понимания как это сделать.
Подскажите пожалуйста, что срабатывает быстрее при условии использования колбеков: Цена последней сделки в 1. ДатаСорс 2. Текущая таблица 3. Таблица обезличенных сделок Лучший бид-аск в 1. Стакане 2. Текущая таблица?
Sergey Gorokhov написал: Космонавт , Еще раз, сейчас важно не то как себя ведет робот, а то реально записи в таблице есть или нет. Если до запуска робота они есть, то в роботе колбек не сработает. Если нет, то робот их закажет и сработает колбек. Другой вопрос, а должны ли они вообще там быть до торгов. Это уже зависит от того что это за данные. Если пятничные, значит Вы подключились к серверу до смены торговой сессии. Хотя это странно, обычно брокера меняют торговую сессию гораздо раньше чем за пол часа до торгов. И я все еще надеюсь что интервал у Вас тиковый. Хотя и на этот вопрос ответа не последовало.
12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,675 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,707 BANE Я в колбеке 12/05/16 09:45:42,707 BANE Я в колбеке
Утро. Полчаса до старта торгов. Запускаю робота. Опять безумные логи и постоянное срабатывание колбека. почему? КВИК само собой висит
Цитата
12/05/16 09:31:07,405 AFKS при запуске нет цены последней сделки number 12/05/16 09:31:07,718 AFKS готова!!! 12/05/16 09:31:07,718 AFLT при запуске нет цены последней сделки number 12/05/16 09:31:07,733 AFLT готова!!! 12/05/16 09:31:07,733 AKRN при запуске нет цены последней сделки number 12/05/16 09:31:07,749 AKRN готова!!! 12/05/16 09:31:07,749 ALRS при запуске нет цены последней сделки number 12/05/16 09:31:07,780 ALRS готова!!! 12/05/16 09:31:07,780 BANE при запуске нет цены последней сделки number 12/05/16 09:31:07,796 BANE готова!!! 12/05/16 09:31:07,796 BANEP при запуске нет цены последней сделки number 12/05/16 09:31:07,811 BANEP готова!!! 12/05/16 09:31:07,811 CHMF при запуске нет цены последней сделки number 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,827 CHMF готова!!! 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,874 BANEP Я в колбеке 12/05/16 09:31:07,874 BANEP Я в колбеке
и так до бесконечности...
Код вкратце:
Код
function mycallbackforallstocks(class,sec,index)
toLog (log, sec.." я в колбеке")
func = BB()
local num_candles=ds[sec]:Size()
line_10[sec],_,line_3[sec]=func(num_candles, {Period=60, Metod = "SMA", VType="Typical", round=4, Shift=7}, ds[sec])
tbl:Highlight(line_count_table[sec],'SECURITY',WHITE,RED,1000)
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
function main()
while getSTime()==nil do sleep (10000) end
dofile(getWorkingFolder().."\\LuaIndicators\\BB.lua")
for sec in string.gmatch(ticker_list,"%a+") do
line_count=line_count+1
line_count_table[sec]=line_count
line=tbl:AddLine()
tbl:SetValue(line_count_table[sec],'SECURITY', sec)
lot[sec]=getParamEx(class,sec,"lotsize").param_value
step[sec]=getParamEx(class,sec,"SEC_PRICE_STEP").param_value
line_10[sec]=0
line_3[sec]=0
last_price[sec]=tonumber(getParamEx(class,sec,"last").param_value)
if last_price[sec]==0 or last_price[sec]==nil then
last_price[sec]=tonumber(getParamEx(class,sec,"prevprice").param_value)
toLog (log, sec.." при запуске нет цены последней сделки "..type(last_price[sec]))
end
tablebid = getParamEx(class, sec, "bid") --получаем таблицу "bid"
bid_best[sec]=tonumber(toPrice(sec, tablebid.param_value)) --из таблицы берЄм значение
tableoffer = getParamEx(class, sec, "offer") --получаем таблицу "offer"
offer_best[sec]=tonumber(toPrice(sec, tableoffer.param_value)) --из таблицы берЄм значение
local path=require"pl.path"
if path.exists ("C:\\trash3\\ap"..sec..".log")==false then
status_container ("C:\\trash3\\ap"..sec..".log", "sleep") --создаёт кто то один
end
DataSource(class,sec,interval)
sleep (10)
toLog (log, sec.." готова!!!")
func = BB()
local num_candles=ds[sec]:Size()
line_10[sec],_,line_3[sec]=func(num_candles, {Period=12, Metod = "SMA", VType="Typical", round=4, Shift=2}, ds[sec])
end
while is_run do
stime=getSTime()
if stime==nil then
stime=0
sleep (1)
end
if stime>100000 and stime<184005 then --не считаем вне сессии
for sec in string.gmatch(ticker_list,"%a+") do
................................. и так далее.
1. Все сделки в КВИК уже давно прогружены. 2. Запускается скрипт. 3. Вышеупомянутая функция mycallbackforallstocks перебирает каждую сделку из таблицы обезличенных сделок. 4. Это занимает 40 минут. Квик в это время нежизнеспособен - висит.
Господа программисты, если не сложно, скажите пару слов по теме моего вопроса. Для вас эта проблема не сложная и легко решается, а у меня пропал вечер, я не мог по нормальному тестировать свой код. Дайте пожалуйста совет как быть.
Constantin,вопрос в другом. 1. Почему все тики (с самого начала) начали обрабатываться в субботу? К моменту запуска робота Таблица всех сделок уже давно прогрузилась! 2. Нет ли рисков, что это произойдёт в будний день? 3. Как этого избегать?
Субботний вечер. Тестирую функцию DataSourse с колбеком. Робот работает по 40 акциям. Колбек SetUpdatCallback начинает обрабатывать все то ли свечки, то ли тики, и на полчаса вешает квик. В рабочее время - в пятницу днём - такого не было, всё работало как надо. Почему? И как с этим бороться?
Вот мои функции:
Код
function mycallbackforallstocks(class,sec,index)
toLog (log, sec)
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
Да, это скорее всего был квант. Я уже разобрался. Как советовал Старатель, засунул расчёт индикатора в колбек и сразу получил желаемые космические скорости внутри цикла перебора бумаг. П.С. Индикатор по прежнему считает все свечки.
Космонавт написал: 3. Рационально ли составлен код?
Нет. Пересчитывать значение индикатора имеет смысл только при обновлении последней свечи. А вы пытаетесь его пересчитывать каждую мс. Какой в этом смысл, если цена не изменилась? Расчёт индикатора лучше вставить в SetUpdateCallback() и сохранять значения в глобальной таблице.
покажите пожалуйста на примере. Задача не тривиальная. Ведь при каждом новом таймф-фрейме таблицу придётся таки обновлять и запихивать в её поля новый набор свечек. То есть раз в таймфрейм полный пересчёт делать всё же придётся.
Добрый день. Два дня мучился, осваивал работу через DataSourse. Заработало. Но код работает в 5 раз медленнее, чем когда я получал данные индикатора через идентификатор.
Прошу подсказать почему. Вот код. Боллинджер считается внутри файла BB.lua, который выложили разработчики вот здесь: ftp://ftp.quik.ru/public/INDICATORS.zip
Код
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetEmptyCallback ()
return ds[sec]
end
function main()
dofile(getWorkingFolder().."\\LuaIndicators\\BB.lua")
for sec in string.gmatch(ticker_list,"%a+") do
DataSource(class,sec,interval)
end
while is_run do
stime=getSTime()
if stime==nil then stime=0 end
if stime>100000 and stime<184005 then --не считаем вне сессии
for sec in string.gmatch(ticker_list,"%a+") do
toLog (log, sec)
toLog (log, "1")
func = BB()
toLog (log, "2")
local num_candles=ds[sec]:Size()
toLog (log, "3")
line_10,_,line_3=func(num_candles, {Period=12, Metod = "SMA", VType="Typical", round=4, Shift=2}, ds[sec])
toLog (log, "4")
-- tbl:SetValue(line_count_table[sec],'BB_middle', line_10)
-- tbl:SetValue(line_count_table[sec],'BB_lower', line_3)
--sleep (1)
дальше не сложный анализ.
end
А теперь - самое интересное. Места с задержками. Где скорость как у ласточки я не трогал, подсветил только места задержек:
То есть задержка то есть, то нету. Она равна 15 миллисекунд. И она бывает не только между 3 и 4, но и на разных участках кода. Вот например между 1 и 2 шагом.
function mycallbackforallstocks(class,sec,index)
-- Теперь в колбеке нам доступны код и класс инструмента
message(class .. " " .. security,1)
-- Также доступны все параметры, которые приходят с колбеком из терминала
xxx = index
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
функция mycallbackforallstocks похоже для моих целей - лишняя. Как написать строчку
interval = INTERVAL_M1
ticker_list = "AFKS,AFLT,AKRN,ALRS,AVAZP,BANE,BANEP,CHMF,DIXY,FEES,GAZP,GCHE,GMKN,GRAZ,HYDR,IRAO,KMAZ,LKOH,LNTA,LSRG,MAGN,MFON,MGNT,MOEX,MSNG,MSRS,MSTT,MTLR,MTLRP,MTSS,MVID,NLMK,NMTP,NVTK,OGKB,PHOR,PIKK,PLZL,POLY,PRTK,RASP,ROSN,RSTI,RSTIP,RTKM,RTKMP,RUALR,SBER,SBERP,SIBN,SNGS,SNGSP,SVAV,TATN,TATNP,TGKA,TRMK,TRNFP,UPRO,URKA,VTBR,VZRZ,VZRZP,YNDX"
class="TQBR"
ds={}
is_run = true
function mycallbackforallstocks(class,sec,index)
-- Теперь в колбеке нам доступны код и класс инструмента
message(class .. " " .. security,1)
-- Также доступны все параметры, которые приходят с колбеком из терминала
xxx = index
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
function main()
dofile(getWorkingFolder().."\\LuaIndicators\\MA.lua")
for sec in string.gmatch(ticker_list,"%a+") do
DataSource(class,sec,interval)
end
while is_run do
for sec in string.gmatch(ticker_list,"%a+") do
func = MA()
ma_out=func(ds[sec]:Size(), {Period=3, Metod = "EMA", VType="Close", round=2}, ds[sec])
end
end
end
MA.lua - это файл любезно выложенный разработчиками. Строчка 83: