Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?, Как вы округляете в большую/меньшую сторону, с заданным количеством десятичных знаков?
Пользователь
Сообщений: Регистрация: 19.10.2015
12.02.2024 14:28:37
Добрый день. Заметил странность в работе 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, Нейронная сеть на LUA
Пользователь
Сообщений: Регистрация: 19.10.2015
26.11.2022 14:39:50
Всем привет. Сделал нейронку на 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)
Задержка в выставлении заявок.
Пользователь
Сообщений: Регистрация: 19.10.2015
06.04.2022 10:35:28
Добрый день! Вчера, начиная с 18:20 не выставлялись заявки на срочном рынке, при этом терминал никаких ошибок не выдавал(но заявки в таблице заявок не появлялись), свечи обновлялись. sendTransaction ошибок не выдавал. OnTransReply - тоже ничего не зафиксировал, как будто заявок и не было. В 18:44 попытался выйти в деньги и выставить заявку вручную - тоже не получилось. В 19:00 посыпались ошибки "невозможно выставить заявку т.к. сессия неактивна". Брокер(Альфа-директ) сообщил, что у них всё работало штатно, проблема, вероятно, с моей стороны. Что это могло быть, и как избежать подобных ситуаций.
Редактор для LUA
Пользователь
Сообщений: Регистрация: 19.10.2015
02.01.2022 14:17:32
Здравствуйте!
Посоветуйте, пожалуйста, мощный редактор для LUA. Есть что-то типа PhpStorm, чтобы можно было работать с проектом из нескольких файлов, с навигацией внутри проекта (например, переход к процедуре при нажатии на ее имя с Ctrl), с закладками и подсветкой кода? Идеально, если бы еще ошибки LUA подсвечивались.
Сейчас использую Notepad++ с плагином, но в нем нет никакой навигации.
Ошибка attempt to index a function value при обращении к таблице из getCandlesByIndex
Пользователь
Сообщений: Регистрация: 19.10.2015
10.12.2021 15:45:46
Здравствуйте! Есть функция чтения последней свечи, которая несколько лет работала стабильно, но последнее время, раз в несколько дней выдает ошибку(хотя свечи на графике есть). Функция читает таблицу с одной последней свечой в 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 не должен функий выдавать. Как это вылечить?
LUA 5.4.1
Копирование таблиц
Пользователь
Сообщений: Регистрация: 19.10.2015
04.12.2021 22:26:43
Здравствуйте! Нужно скопировать таблицу, так, чтобы изменения сделанные в дубликате не отображались в оригинальном экземпляре. Использую для этой цели рекурсивную функцию, но связь сохраняется.
Код
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
Результат "Hi!". Я обескуражен.
Пропадают диаграммы и состояние счета
Пользователь
Сообщений: Регистрация: 19.10.2015
02.12.2021 13:22:34
Ночью пропадают во второй вкладке некоторые графики и таблицы (состояние счета рынка ценных бумаг, диаграммы акций) и не восстанавливаются после подключения. «Обновить» - не помогает. Помогает только перезагрузка. При этом в первой вкладке диаграммы инструментов и состояние счета срочного рынка обновляются корректно.
Quik 8.11.0.66 В настройках стоит интервал обновления данных с текущим состоянием 10с, в котировках включен "умный" заказ данных.
Как исправить?
Critical error ACCESS_VIOLATION in script...
Пользователь
Сообщений: Регистрация: 19.10.2015
29.11.2021 16:51:21
Здравствуйте! В рабочем скрипте раз в несколько дней возникает ошибка: Critical error ACCESS_VIOLATION in script. Quik 8.11.0.66 Номера строки с ошибкой нет. Запустить скрипт заново невозможно, без перезапуска Quik. Тот же скрип работает без ошибок на другом компьютере у другого брокера (Quik 9.2.3.15)
Как узнать источник ошибки, и как ее исправить?
Некорректные данные в Состоянии счета, Похоже на задвоение позиций по некоторым сделкам
Пользователь
Сообщений: Регистрация: 19.10.2015
11.02.2021 13:33:14
Здравствуйте!
Последнее время все чаще в Состоянии счета отображается некорректная информация по количеству позиций. Например, сегодня скрипт на LUA купил 2 фьючерса, а в позициях отображается 4. В данный момент QUIK v. 8.8.4.3. win10. Такие же проблемы наблюдались и на более ранних версиях QUIK.
Похоже на то, что задваиваются(иногда затраиваются) совершенные сделки, либо учитываются снятые заявки… После перезапуска QUIK информация отображается корректно.
В тоже время, количество позиций getItem( в LUA) возвращает корректное.
При сравнении двух вещественный чисел скрипт дал неверный результат:
Первое число x1 – получено из свечи графика (.high) второе вычислено.
Оба числа одинаковые 55.3, однако при сравнении срабатывает ветка else.
if (x1<=x2) then
...
else
...
end
Так же, неправильно работают варианты:
if (x1>x2) then (условие срабатывает, хотя числа равны)
if (x1*1<=x2*1) then (Условие не срабатывает)
Вариант с целыми числами if (x1*10<=x2*10) – работает корректно.
В большинстве случаев такой проблемы не наблюдается.
Если x1 и x2 задать самостоятельно local x1=55.3 и local x2=55.3 то логика работает корректно.
Что это за ошибка и как от нее обезопаситься? Все переводить в целые и работать в целых?
Брокеры работающие с Quik, Посоветуйте брокера с Quik
Пользователь
Сообщений: Регистрация: 19.10.2015
29.10.2020 15:52:32
Добрый день! Посоветуйте пожалуйста брокеров поддерживающих Quik. Надежных(в техническом плане), ну и с адекватными тарифами.
Ранее я имел негативный опыт работы с ВТБ - они заблокировали счет без объяснения. Средства смог вывести с большим гемороем. В данный момент на альфа-директе. Часто Quik отваливается(сейчас например "Удаленный хост принудительно разорвал...", а я торгую между прочим). Иногда свечи не приходят по несколько минут. а потом вываливаются кучей.
LUA скрипты выполняются очень медленно если не пользоваться ноутбуком, При погашенном экране выделяется мало процессорного времени
Пользователь
Сообщений: Регистрация: 19.10.2015
20.05.2020 23:45:03
Здравствуйте.
Скрипты LUA запускаю с вечера. Обнаружил, что утром, пока ноутбуком не пользуюсь (погашен экран), на скрипт LUA выделяется очень мало процессорного времени. Например, вывод 20-ти строк в файл занял 4-5 минут(!), обнаружение появления новой свечи срабатывало раз из 7-10 положенных. В итоге скрипт не выставляет своевременно заявки. После того, как я сажусь за ноутбук – всё работает корректно.
У меня Quik 7.27.2.1, windos 8.1, i7, спящий режим и режим гибернации – отключены, экранной заставки нет, есть только "погасить экран". Подскажите, как настроить, чтобы LUA скрипты не обделялись процессорным временем?
Странное поведение Moving Average, Завышенное значение
Пользователь
Сообщений: Регистрация: 19.10.2015
01.04.2020 18:47:33
Добрый день. Только что MA(периодов 2, метод Vol Adjusted, поле цены Close) на фьючерсе сбера показал аномально-высокое значение. На 150р выше всех ближайших свечей. Фото прилагается. Это глюк?
Не найдено поле "лоты"
Пользователь
Сообщений: Регистрация: 19.10.2015
15.01.2020 11:22:21
Добрый день! Отправляю из LUA заявку на покупку фьючерса и получаю ошибку Не найдено поле "Лоты" для транзакции "Ввод заявки" по классу "FORTS: Фьючерсы" Вот код:
Коллеги, помогите разобраться с расчетом комиссий на МБ, например, на SBRF-3.20
По данным с сайта МБ: Сбор за регистрацию сделки*, руб. - 1,74, Сбор за скальперскую сделку*, руб. - 0,87руб.
Это сбор за сделку с каждым фьючерсом? Т.е. если я сразу покупаю 10 фьючерсов, то комиссия составит 10*1,74 руб. ?
Скальперскими сделками считаются пары сделок купил/продал в течении дня?
Например если я в течении дня купил 3 раза по 2 фьючерса и продал 1 раз 4 фьючерса (т.е. 2 осталось), то какую комиссия за этот день я заплачу?
EMA внутри свечи, Нужно EMA по тиковым значением в незавершенной свече
Пользователь
Сообщений: Регистрация: 19.10.2015
04.12.2019 13:26:45
Здравствуйте!
Коллеги, посоветуйте, пожалуйста, инструмент, который бы отображал среднее значение цены в не закрывшейся свече по принципу EMA. Т.е. была бы средняя цена всех тиков, и при этом цена последнего тика имела бы более высокий вес.
Визуально, очень похоже на то, что мне нужно - EMA с периодом 1 и с полем цены Typical. Или экспоненциальное вычисление там только для периодов 2 и более, а в рамках одной свечи простое усреднение(SMA) по всем тикам? Кто-то знает по какой формуле этот инструмент вычисляется в рамках не закрывшейся свечи?
Moving Average продублировать из 5мин в 1мин, Нужно добиться одинаковых графиков ma на разных интервалах
Пользователь
Сообщений: Регистрация: 19.10.2015
02.12.2019 23:31:16
Здравствуйте, коллеги.
Помогите разобраться: есть график с интервалом 5 мин, на нем два Moving Average с количеством периодов 2 и 4, оба Exponencial, поле цены Close. Нужно получить такие же (т.е. чтобы значения в одно и тоже время совпадали с MA на 5-ти минутке) на графике с интервалом 1 мин.
Простое увеличение периодов MA на минутном графике до 10 и 20 не приносит желаемого результата. Есть идеи?