Добрый день. Заметил странность в работе math.ceil(). Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?
Для выставления цены с заданным количеством знаков после запятой, использую округление:
Код
function round_step_price(price, ty)
local x=0
if (ty=="sell") -- Продаем ->округлить в бОльшую сторону
x= math.ceil(price/options.price_step) * options.price_step
else -- Покупаем - округлим в меньшую сторону
x= math.floor(price/options.price_step) * options.price_step
end
return x*1
end
Задача, при шаге цены 0.1, для продаж округлять так: 1.400 ->1.4, 1.4001 ->1.5, и так же 1.50->1.5, 1.50001->1.6. Но мой код, не работает, как ожидалось.
Как вы округляете в большую/меньшую сторону, с заданным количеством десятичных знаков?
Всем привет. Сделал нейронку на LUA. Может кому пригодится:
Код
NeuralNetwork = {}
NeuralNetwork.__index = NeuralNetwork
function NeuralNetwork.new(inputs, layers, neyrons) -- Инициализация
local self = setmetatable({}, NeuralNetwork)
self.layers=layers -- слоев
self.inputs=inputs -- входов
self.neyrons=neyrons --нейронов в слое
self.k=0.5
self.e=0.01 -- Скорость обучения
self.im=0.01 -- импульс
self.traininig_count=0 --Будем считать обучения
self.w={}
self.nout={}
self.dw={}
self.delta={}
self.w[1]={}
self.nout[1]={}
self.dw[1]={}
self.delta[1]={}
local i
local l
for i = 1, self.neyrons, 1 do
self.w[1][i]={}
self.dw[1][i]={}
self.delta[1][i]={}
self.nout[1][i]={}
for ii = 1, self.inputs+1, 1 do
self.w[1][i][ii]=math.random()
self.dw[1][i][ii]=0
end
end
for l = 2, self.layers, 1 do --перебор остальных слоев
self.w[l]={}
self.dw[l]={}
self.delta[l]={}
self.nout[l]={}
for i = 1, self.neyrons, 1 do
self.w[l][i]={}
self.dw[l][i]={}
self.delta[l][i]={}
self.nout[l][i]={}
for ii = 1, self.neyrons+1, 1 do
self.w[l][i][ii]=1*math.random()
self.dw[l][i][ii]=0
end
end
end
--Выходной нейрон
self.w[self.layers+1]={}
self.dw[self.layers+1]={}
self.w[self.layers+1][1]={}
self.dw[self.layers+1][1]={}
self.delta[self.layers+1]={}
self.delta[self.layers+1][1]={}
for ii = 1, self.neyrons+1, 1 do -- +w0
self.w[self.layers+1][1][ii]=1*math.random()
self.dw[self.layers+1][1][ii]=0
end
return self
end
function NeuralNetwork.Save(self, filename)
local f,err = io.open(filename,"w")
if not f then
return false
end
f:write(table.tostring(self))
f:close()
return true
end
function NeuralNetwork.Load(self, filename)
local f,err = io.open(filename,"r")
if not f then
return false
end
local tbl = assert(load("return " .. f:read("*a")))
f:close()
for k,v in pairs(tbl()) do
if (type(v)=="table") then
self[k]=table_copy(v)
else
self[k] = v
end
end
return true
end
function NeuralNetwork.Training(self, data, res) --Одно обучение
self.traininig_count=self.traininig_count+1 -- счетчик обучений
local nres=self:Play(data) --Свой результат
self.delta[self.layers+1][1]=(res-nres) --Начинаем с выходного слоя
for tmpi = 1, self.neyrons, 1 do -- последний перед выходом слой
self.delta[self.layers][tmpi] = self.w[self.layers + 1][1][tmpi] * self.delta[self.layers + 1][1]*dsigmoda(self.nout[self.layers][tmpi], self.k)
end
for tmpl =self.layers-1, 1, -1 do -- слои
for tmpn = 1, self.neyrons, 1 do-- нейроны в слое
self.delta[tmpl][tmpn] = 0
for tmpi = 1, self.neyrons, 1 do
self.delta[tmpl][tmpn] = self.delta[tmpl][tmpn] + (self.w[tmpl + 1][tmpi][tmpn] * self.delta[tmpl + 1][tmpi])
end
self.delta[tmpl][tmpn] = self.delta[tmpl][tmpn] * dsigmoda(self.nout[tmpl][tmpn],self.k)
end
end
--Теперь правим веса
--Правим в первом/входном слое *************************** первый(0) *************************************
for tmpn = 1, self.neyrons, 1 do -- нейроны в слое
self.dw[1][tmpn][self.inputs + 1] = (self.e * self.delta[1][tmpn] * (1 - self.im)) + (self.im * self.dw[1][tmpn][self.inputs + 1])
self.w[1][tmpn][self.inputs + 1] = self.w[1][tmpn][self.inputs + 1] + self.dw[1][tmpn][self.inputs + 1]
for tmpi = 1, self.inputs, 1 do -- нейроны в слое
self.dw[1][tmpn][tmpi] = (data[tmpi] * self.e * self.delta[1][tmpn] * (1 - self.im)) + (self.im * self.dw[1][tmpn][tmpi])
self.w[1][tmpn][tmpi] = self.w[1][tmpn][tmpi] + self.dw[1][tmpn][tmpi]
end
end
--Остальные слои
for tmpl = 2, self.layers, 1 do
for tmpn = 1, self.neyrons, 1 do
self.dw[tmpl][tmpn][self.neyrons + 1] = (self.e * self.delta[tmpl][tmpn] * (1 - self.im)) + (self.im * self.dw[tmpl][tmpn][self.neyrons + 1])
self.w[tmpl][tmpn][self.neyrons + 1] = self.w[tmpl][tmpn][self.neyrons + 1] + self.dw[tmpl][tmpn][self.neyrons + 1]
for tmpi = 1, self.neyrons, 1 do --нейроны в слое
self.dw[tmpl][tmpn][tmpi] = (self.nout[tmpl-1][tmpi] * self.e * self.delta[tmpl][tmpn] * (1 - self.im)) + (self.im * self.dw[tmpl][tmpn][tmpi])
self.w[tmpl][tmpn][tmpi] = self.w[tmpl][tmpn][tmpi] + self.dw[tmpl][tmpn][tmpi]
end
end
end
-- Выходной слой из одного нейрона
self.dw[self.layers+1][1][self.neyrons + 1] = (self.e * self.delta[self.layers + 1][1] * (1 - self.im)) + (self.im * self.dw[self.layers + 1][1][self.neyrons + 1])
self.w[self.layers+1][1][self.neyrons + 1] = self.w[self.layers + 1][1][self.neyrons + 1] + self.dw[self.layers + 1][1][self.neyrons + 1]
for tmpi = 1, self.neyrons, 1 do -- нейроны в слое
self.dw[self.layers + 1][ 1][tmpi] = (self.nout[self.layers][tmpi] * self.e * self.delta[self.layers + 1][1] * (1 - self.im)) + (self.im * self.dw[self.layers + 1][1][tmpi])
self.w[self.layers + 1][1][tmpi] = self.w[self.layers + 1][1][tmpi] + self.dw[self.layers + 1][1][tmpi]
end
end
function NeuralNetwork.Play(self, tick_data) -- Принятие решения
local l
local n
local i
for l = 1, self.layers, 1 do -- проход по всем слоям, 1 - входной слой
for n = 1, self.neyrons, 1 do
local mmax
if (l==1) then --входной слой
self.nout[l][n]=1*self.w[l][n][self.inputs+1] --W0 последний
mmax=self.inputs
else
self.nout[l][n]=1*self.w[l][n][self.neyrons+1] --W0 последний
mmax=self.neyrons
end
for i = 1, mmax, 1 do
if (l==1) then --входной слой
self.nout[l][n]=self.nout[l][n]+(tick_data[i]*self.w[l][n][i]) --W0 последний
else
self.nout[l][n]=self.nout[l][n]+(self.nout[l-1][i]*self.w[l][n][i]) --W0 последний
end
end
self.nout[l][n]=sigmoda(self.nout[l][n], self.k)
end
end
--Выходной нейрон
self.nout[self.layers+1]=self.w[self.layers+1][1][self.neyrons+1] --W0
for i = 1, self.neyrons, 1 do
self.nout[self.layers+1]=self.nout[self.layers+1]+(self.nout[self.layers][i]*self.w[self.layers+1][1][i])
end
return sigmoda(self.nout[self.layers+1], self.k)
end
function dsigmoda(x, k)
local r
r = k * x * (1 - x)
return r
end
function sigmoda(x, k)
local r
r = 1 / (1 + math.exp(-x * k))
return r
end
function table_copy(originalTable)
local copyTable = {}
for k,v in pairs(originalTable) do
if (type(v)=="table") then
copyTable[k]=table_copy(v)
else
copyTable[k] = v
end
end
return copyTable
end
Пример:
Код
--Обучающие данные
local TrainingData={}
for i=1, 100, 1 do
local d1=math.random() -- Обучающие данные
local d2=math.random() -- Обучающие данные
local result=0 -- Правильный ответ
if (d1>d2) then
result=1
end
local td={d1, d2, result}
TrainingData[#TrainingData+1]=td
end
--Обучение
local nn=NeuralNetwork.new(2, 3, 3)
for age=1, 100, 1 do -- Эпохи
for i=1, #TrainingData, 1 do
local td=TrainingData[i]
nn:Training(td, td[#td])
end
end
--Проверка
local d1=math.random()
local d2=math.random()
td={d1, d2}
local result=nn:Play(td)
PrintDbgStr(d1.." "..d2.." "..result)
--Сохраним обученную нейронку
fn=getScriptPath().."\\test.nn"
nn:Save(fn)
Добрый день! Вчера, начиная с 18:20 не выставлялись заявки на срочном рынке, при этом терминал никаких ошибок не выдавал(но заявки в таблице заявок не появлялись), свечи обновлялись. sendTransaction ошибок не выдавал. OnTransReply - тоже ничего не зафиксировал, как будто заявок и не было. В 18:44 попытался выйти в деньги и выставить заявку вручную - тоже не получилось. В 19:00 посыпались ошибки "невозможно выставить заявку т.к. сессия неактивна". Брокер(Альфа-директ) сообщил, что у них всё работало штатно, проблема, вероятно, с моей стороны. Что это могло быть, и как избежать подобных ситуаций.
Посоветуйте, пожалуйста, мощный редактор для LUA. Есть что-то типа PhpStorm, чтобы можно было работать с проектом из нескольких файлов, с навигацией внутри проекта (например, переход к процедуре при нажатии на ее имя с Ctrl), с закладками и подсветкой кода? Идеально, если бы еще ошибки LUA подсвечивались.
Сейчас использую Notepad++ с плагином, но в нем нет никакой навигации.
Здравствуйте! Есть функция чтения последней свечи, которая несколько лет работала стабильно, но последнее время, раз в несколько дней выдает ошибку(хотя свечи на графике есть). Функция читает таблицу с одной последней свечой в tab2. Иногда при попытке обратиться к таблице по индексу " if (tab2[0]==nil) then " - вылетает ошибка "attempt to index a function value (local 'tab2')" Добавил проверку tab2==nil, и она в момент ошибки не срабатывает, т.е. tab2 - задана.
Код
function last_condle() -- самая последняя свеча
local tmp_max=getNumCandles(options.future.."_price")
local tab2, n1, tmpname=getCandlesByIndex(options.future.."_price", 0,tmp_max-1, 1)
-- Костыль №1
if (tab2==nil) then
say(" Ошибка 1748 - нет данных!!! - входим в режим ожидания данных tmp_max="..tmp_max)
while (tab2==nil) do
sleep(731)
tab2, n1, tmpname=getCandlesByIndex(options.future.."_price", 0,tmp_max-1, 1)
end
end
-- Костыль №2
if (tab2[0]==nil) then -- Тут иногда ошибка "attempt to index a function value (local 'tab2')"
say(" Ошибка 1739 - нет данных!!! - входим в режим ожидания данных tmp_max="..tmp_max)
while (tab2[0]==nil) do
sleep(731)
tab2, n1, tmpname=getCandlesByIndex(options.future.."_price", 0,tmp_max-1, 1)
end
end
return tab2[0]
end
Если я правильно понимаю, LUA считает что tab2 - функция? Но getCandlesByIndex не должен функий выдавать. Как это вылечить?
Здравствуйте! Нужно скопировать таблицу, так, чтобы изменения сделанные в дубликате не отображались в оригинальном экземпляре. Использую для этой цели рекурсивную функцию, но связь сохраняется.
Код
function main()
local t1={}
t1.x={}
t1.x.y=1
local t2=table_copy(t1)
t2.x.z="Hi!"
PrintDbgStr(""..t1.x.z)
end
function table_copy(originalTable)
local copyTable = {}
for k,v in pairs(originalTable) do
if (type(v)==table) then
copyTable[k]=table_copy(v)
else
copyTable[k] = v
end
end
return copyTable
end
Ночью пропадают во второй вкладке некоторые графики и таблицы (состояние счета рынка ценных бумаг, диаграммы акций) и не восстанавливаются после подключения. «Обновить» - не помогает. Помогает только перезагрузка. При этом в первой вкладке диаграммы инструментов и состояние счета срочного рынка обновляются корректно.
Quik 8.11.0.66 В настройках стоит интервал обновления данных с текущим состоянием 10с, в котировках включен "умный" заказ данных.
Здравствуйте! В рабочем скрипте раз в несколько дней возникает ошибка: Critical error ACCESS_VIOLATION in script. Quik 8.11.0.66 Номера строки с ошибкой нет. Запустить скрипт заново невозможно, без перезапуска Quik. Тот же скрип работает без ошибок на другом компьютере у другого брокера (Quik 9.2.3.15)
Последнее время все чаще в Состоянии счета отображается некорректная информация по количеству позиций. Например, сегодня скрипт на LUA купил 2 фьючерса, а в позициях отображается 4. В данный момент QUIK v. 8.8.4.3. win10. Такие же проблемы наблюдались и на более ранних версиях QUIK.
Похоже на то, что задваиваются(иногда затраиваются) совершенные сделки, либо учитываются снятые заявки… После перезапуска QUIK информация отображается корректно.
В тоже время, количество позиций getItem( в LUA) возвращает корректное.
Добрый день! Посоветуйте пожалуйста брокеров поддерживающих Quik. Надежных(в техническом плане), ну и с адекватными тарифами.
Ранее я имел негативный опыт работы с ВТБ - они заблокировали счет без объяснения. Средства смог вывести с большим гемороем. В данный момент на альфа-директе. Часто Quik отваливается(сейчас например "Удаленный хост принудительно разорвал...", а я торгую между прочим). Иногда свечи не приходят по несколько минут. а потом вываливаются кучей.
Скрипты LUA запускаю с вечера. Обнаружил, что утром, пока ноутбуком не пользуюсь (погашен экран), на скрипт LUA выделяется очень мало процессорного времени. Например, вывод 20-ти строк в файл занял 4-5 минут(!), обнаружение появления новой свечи срабатывало раз из 7-10 положенных. В итоге скрипт не выставляет своевременно заявки. После того, как я сажусь за ноутбук – всё работает корректно.
У меня Quik 7.27.2.1, windos 8.1, i7, спящий режим и режим гибернации – отключены, экранной заставки нет, есть только "погасить экран". Подскажите, как настроить, чтобы LUA скрипты не обделялись процессорным временем?
Добрый день. Только что MA(периодов 2, метод Vol Adjusted, поле цены Close) на фьючерсе сбера показал аномально-высокое значение. На 150р выше всех ближайших свечей. Фото прилагается. Это глюк?
Добрый день! Отправляю из LUA заявку на покупку фьючерса и получаю ошибку Не найдено поле "Лоты" для транзакции "Ввод заявки" по классу "FORTS: Фьючерсы" Вот код:
Коллеги, посоветуйте, пожалуйста, инструмент, который бы отображал среднее значение цены в не закрывшейся свече по принципу EMA. Т.е. была бы средняя цена всех тиков, и при этом цена последнего тика имела бы более высокий вес.
Визуально, очень похоже на то, что мне нужно - EMA с периодом 1 и с полем цены Typical. Или экспоненциальное вычисление там только для периодов 2 и более, а в рамках одной свечи простое усреднение(SMA) по всем тикам? Кто-то знает по какой формуле этот инструмент вычисляется в рамках не закрывшейся свечи?
Помогите разобраться: есть график с интервалом 5 мин, на нем два Moving Average с количеством периодов 2 и 4, оба Exponencial, поле цены Close. Нужно получить такие же (т.е. чтобы значения в одно и тоже время совпадали с MA на 5-ти минутке) на графике с интервалом 1 мин.
Простое увеличение периодов MA на минутном графике до 10 и 20 не приносит желаемого результата. Есть идеи?