Сергей (Автор тем)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?, Как вы округляете в большую/меньшую сторону, с заданным количеством десятичных знаков?
 
Добрый день.
Заметил странность в работе 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
 
Всем привет.
Сделал нейронку на 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
 

Здравствуйте!

Посоветуйте, пожалуйста, мощный редактор для LUA. Есть что-то типа PhpStorm, чтобы можно было работать  с проектом из нескольких файлов, с навигацией внутри проекта (например, переход к процедуре при нажатии на ее имя с Ctrl), с закладками и подсветкой кода? Идеально, если бы еще ошибки LUA подсвечивались.

Сейчас использую Notepad++ с плагином, но в нем нет никакой навигации.

Ошибка attempt to index a function value при обращении к таблице из getCandlesByIndex
 
Здравствуйте!
Есть функция чтения последней свечи, которая несколько лет работала стабильно, но последнее время, раз в несколько дней выдает ошибку(хотя свечи на графике есть).
Функция читает таблицу с одной последней свечой в 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
Копирование таблиц
 
Здравствуйте!
Нужно скопировать таблицу, так, чтобы изменения сделанные в дубликате не отображались в оригинальном экземпляре.
Использую для этой цели рекурсивную функцию, но связь сохраняется.
Код
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!". Я обескуражен.
Пропадают диаграммы и состояние счета
 

Ночью пропадают во второй вкладке некоторые графики и таблицы (состояние счета рынка ценных бумаг, диаграммы акций) и не восстанавливаются после подключения. «Обновить» - не помогает. Помогает только перезагрузка. При этом в первой вкладке диаграммы инструментов и состояние счета срочного рынка обновляются корректно.

Quik 8.11.0.66 В настройках стоит интервал обновления данных с текущим состоянием 10с, в котировках включен "умный" заказ данных.

Как исправить?

Critical error ACCESS_VIOLATION in script...
 
Здравствуйте!
В рабочем скрипте раз в несколько дней возникает ошибка: 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) возвращает корректное.

Сравнение вещественных чисел., (55.3 < 55.3) - верно!
 

Здравствуйте.

При сравнении двух вещественный чисел скрипт дал неверный результат:

Первое число 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
 
Добрый день!
Посоветуйте пожалуйста брокеров поддерживающих Quik. Надежных(в техническом плане), ну и с адекватными тарифами.

Ранее я имел негативный опыт работы с ВТБ - они заблокировали счет без объяснения. Средства смог вывести с большим гемороем.
В данный момент на альфа-директе. Часто Quik отваливается(сейчас например "Удаленный хост принудительно разорвал...", а я торгую между прочим). Иногда свечи не приходят по несколько минут. а потом вываливаются кучей.  
LUA скрипты выполняются очень медленно если не пользоваться ноутбуком, При погашенном экране выделяется мало процессорного времени
 

Здравствуйте.

Скрипты LUA запускаю с вечера. Обнаружил, что утром, пока ноутбуком не пользуюсь (погашен экран), на скрипт LUA выделяется очень мало процессорного времени. Например, вывод 20-ти строк в файл занял 4-5 минут(!), обнаружение появления новой свечи срабатывало раз из 7-10 положенных. В итоге скрипт не выставляет своевременно заявки. После того, как я сажусь за ноутбук – всё работает корректно.

У меня Quik 7.27.2.1,   windos 8.1, i7, спящий режим и режим гибернации – отключены, экранной заставки нет, есть только "погасить экран". Подскажите, как настроить, чтобы LUA скрипты не обделялись процессорным временем?

Странное поведение Moving Average, Завышенное значение
 
Добрый день.
Только что MA(периодов 2, метод Vol Adjusted, поле цены Close) на фьючерсе сбера показал аномально-высокое значение. На 150р выше всех ближайших свечей. Фото прилагается. Это глюк?
Не найдено поле "лоты"
 
Добрый день!
Отправляю из LUA заявку на покупку фьючерса и получаю ошибку  Не найдено поле "Лоты" для транзакции "Ввод заявки" по классу "FORTS: Фьючерсы"
Вот код:
Код
local order_s1=
      {
         ["TRANS_ID"] = tostring(7733113),
         ["CLASSCODE"] = class_code,
         ["ACTION"] = "Ввод заявки",
         ["Класс"] = classcode,
         ["Инструмент"] = sec_code,
         ["Торговый счет"] = acoount,
         ["Тип"] = "Лимитная",
         ["К/П"] = "Купля",  --купля
         ["Цена"] = tostring(p),
         ["Лоты"] = tostring(q),
         ["Условие исполнения"] = "Поставить в очередь"
      }
   local err=sendTransaction(order_s1)

Подскажите пожалуйста, что не так?
Как рассчитывается комиссия на фьючерсы?, Нюансы.
 

Коллеги, помогите разобраться с расчетом комиссий на МБ, например, на SBRF-3.20

По данным с сайта МБ: Сбор за регистрацию сделки*, руб.  - 1,74, Сбор за скальперскую сделку*, руб. - 0,87руб.

Это сбор за сделку с каждым фьючерсом? Т.е. если я сразу покупаю 10 фьючерсов, то комиссия составит 10*1,74 руб. ?

Скальперскими сделками считаются пары сделок купил/продал в течении дня?

Например если я в течении дня купил 3 раза по 2 фьючерса и продал 1 раз 4 фьючерса (т.е. 2 осталось), то какую комиссия за этот день я заплачу?

EMA внутри свечи, Нужно EMA по тиковым значением в незавершенной свече
 

Здравствуйте!

Коллеги, посоветуйте, пожалуйста, инструмент, который бы отображал среднее значение цены в не закрывшейся свече по принципу EMA. Т.е. была бы средняя цена всех тиков, и при этом цена последнего тика имела бы более высокий вес.

Визуально, очень похоже на то, что мне нужно - EMA с периодом 1 и с полем цены Typical. Или экспоненциальное вычисление там только для периодов 2 и более, а в рамках одной свечи простое усреднение(SMA) по всем тикам? Кто-то знает по какой формуле этот инструмент вычисляется в рамках не закрывшейся свечи?

Moving Average продублировать из 5мин в 1мин, Нужно добиться одинаковых графиков ma на разных интервалах
 

Здравствуйте, коллеги.

Помогите разобраться: есть график с интервалом 5 мин, на нем два Moving Average с количеством периодов 2 и 4, оба Exponencial, поле цены Close. Нужно получить такие же (т.е. чтобы значения в одно и тоже время совпадали с MA на 5-ти минутке) на графике с интервалом 1 мин.


Простое увеличение периодов MA на минутном графике до 10 и 20 не приносит желаемого
результата. Есть идеи?
Страницы: 1
Наверх