VPM (Все сообщения пользователя)

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 21 След.
Куда все подевались?
 
nikolz,  Извините за банальность, но так сравнивают только "Х" с пальцем. Если Вы хотите провести сравнительные тесты, то нужно определим критерии по которым будут сравнивать. А сравнивать нужно хотя бы эти варианты.
Код
1. Pешение с использованием кольцевого буфера

local F = {0, 0, 0}
local index = 0
local function addElement(x)
    index = (index % 3) + 1
    F[index] = x
   return F
end
for I=1,10 do
print(addElement(I), F[1], F[2], F[3] )
end

2. Вариант. Альтернативное решение
local F = {0, 0, 0}
local function shiftArray(x)
    -- Сдвигаем элементы массива
    F[3] = F[2]
    F[2] = F[1]
    F[1] = x -- Записываем новый элемент в конец массива
    return F -- Возвращаем массив целиком (или можете возвращать только F[1], если нужно)
end

for I=1,10 do
print(shiftArray(I), F[1], F[2], F[3] )
end
А может подскажите, где я сказал, что какой то вариант лучше?
Куда все подевались?
 
nikolz,  Когда Вы голову подымите чуть выше, заметите что я поправил Ваш вариант, и для сравнения выложил альтернативное решение с использованием кольцевого буфера, даже попробовал разный порядок хранения данных.  Что лучше, почему лучше, когда какой применять, решает пользователь под свои задачи. А я лишь привожу пример про универсальный способ, и показываю его преимущества, относительно других. Но в любом случае их нужно погонять в условиях когда пропадают свечи, когда вызывается по нескольку раз на одном индексе алгоритмы и прочие радости жизни алгоритмов в квике.  
Куда все подевались?
 
Вот в этом варианте вроде работает, ну как то все сложно и сиюминутно
Код
local F = {0, 0, 0}
local index = 0
local function addElement(x)
    -- Обновляем текущий индекс с учетом кольцевого буфера
    index = (index % 3) + 1
    -- Вставляем новый элемент в текущий индекс
    F[index] = x
    
    -- Для наглядности выводим текущий массив
    local result = {}
    for i = 1, 3 do
        result[i] = F[(index - i + 3) % 3 + 1]
    end
    return result
end
Куда все подевались?
 
Nikolay,  Ну смотрите на моем примере выше при использовании двусвязной очереди, все Вами описанные задачи по сути сводятся к одному задать длину и метод извлечения, то есть ввести входные данные, которые можно менять динамически ведя дополнительные расчеты, или жестко установить. А вот что у меня получилось из примера nikolz, я в кольцевом буфере попытался поменять порядок хранения данных. Ну в общем то и не получается поменять.
Код
Куда все подевались?
 
Цитата
Nikolay написал:
Так и нет ответа, зачем сдвиги, если самое быстрое решение это перезапись элемента и расчет очередного корректного индекса.
А я не уверен что есть сдвиги, алгоритм помнит индексы, обновляет эти индексы.
Сам пример FilterSmooth(), подразумевает что можно менять длину и веса простыми способами.

Ну хорошо если знаете алгоритм, приведите пример алгоритма "самое быстрое решение это перезапись элемента и расчет очередного корректного индекса" динамически меняющего индекс, длину и веса?  
Куда все подевались?
 
nikolz,  Вот так работает
Код
local F = {0, 0, 0}
local function shiftArray(x)
    -- Сдвигаем элементы массива
    F[3] = F[2]
    F[2] = F[1]
    F[1] = x -- Записываем новый элемент в конец массива
    return F -- Возвращаем массив целиком (или можете возвращать только F[1], если нужно)
end

for I=1,10 do
print(shiftArray(I), F[1], F[2], F[3] )
end

table: 0000000002710d50   1   0   0
table: 0000000002710d50   2   1   0
table: 0000000002710d50   3   2   1
table: 0000000002710d50   4   3   2
table: 0000000002710d50   5   4   3
table: 0000000002710d50   6   5   4
table: 0000000002710d50   7   6   5
table: 0000000002710d50   8   7   6
table: 0000000002710d50   9   8   7
table: 0000000002710d50   10   9   8
>Exit code: 0    Time: 0.3958

2. Альтернативное решение с использованием кольцевого буфера

local F = {0, 0, 0}
local index = 0
local function addElement(x)
    index = (index % 3) + 1
    F[index] = x
   return F
end
for I=1,10 do
print(addElement(I), F[1], F[2], F[3] )
end

table: 00000000025a1150   1   0   0
table: 00000000025a1150   1   2   0
table: 00000000025a1150   1   2   3
table: 00000000025a1150   4   2   3
table: 00000000025a1150   4   5   3
table: 00000000025a1150   4   5   6
table: 00000000025a1150   7   5   6
table: 00000000025a1150   7   8   6
table: 00000000025a1150   7   8   9
table: 00000000025a1150   10   8   9
Куда все подевались?
 
Цитата
nikolz написал:
Мне непонятно, в чем его выгода и что же он делает. ------------------Полагаю, что есть другие вариант решения.
Цитата
VPM написал:
Классический кольцевой буфер, также известный как циклический буфер или кольцевая очередь, используется для хранения фиксированного количества последних значений в массиве.
Наверняка есть, Айдар,  выложил свой, я могу в виде класса выложить.
Цитата
nikolz написал:
Если я правильно Вас понял, то вот элементарное альтернативное решение:Кодlocal F={0,0,0}
local function shiftArray(x) local x=F[1] F[1]=F[2] F[2]=F[3] F[3]=x  return x end

Массив F имеет размер как у Вас. В нем хранится последние 3 элемента. При записи нового , первый выталкивается. Что не так? И в чем преимущество Вашего решения?  
Если Вы загрузите в SciTe это пример он не будет работать. Вот я уже попробовал
Код
local F={0,0,0} 
local function shiftArray(x) local x=F[1] F[1]=F[2] F[2]=F[3] F[3]=x  return x end
for I=1,10 do
print(shiftArray(I), F[1], F[2], F[3] )
end
ответы:
0   0   0   0
0   0   0   0
0   0   0   0
0   0   0   0
0   0   0   0
0   0   0   0
0   0   0   0
0   0   0   0
0   0   0   0
0   0   0   0
>Exit code: 0    Time: 0.4064
Куда все подевались?
 
Цитата
Nikolay написал:
Прежде чем кидать примеры, необходимо понимать зачем и как это будет использоваться.
Так именно это я и отношу в не достаток такого подхода
Цитата
VPM написал:
Я привел пример, с указанием на недостатки - для кольцевого буфера, извлечение данных зависит от конкретного сценария использования и потребностей, и указал на лучший подход
По сложности не намного сложней описанного Вами подхода, класс удобен, в моем примере (посчитал) аж 5 экземпляров очередей, различного размера, размер легко меняется, как и направление то есть динамичен структуру можно менять в процессе эксплуатации , универсальность (действует принцип по образу и подобию создаются экземпляры)
Динамичность позволяет менять структуру в процессе эксплуатации, например при поиске оптимальных параметров. Универсальность один раз разобрался и забыл.
Да и потом я не настаиваю что это единственный подход, я говорю что это удобно.
Куда все подевались?
 
Судите сами вот тот же пример. Изменение класса Ehlers.ChannelPDF, чтобы использовать двусвязную очередь для кольцевого буфера.
Код
local Queue = require("QueueClass")  -- класс Queue сохранен в файле QueueClass.lua

Ehlers.ChannelPDF = {}
Ehlers.ChannelPDF.__index = Ehlers.ChannelPDF
function Ehlers.ChannelPDF.new(FSettings, ds)
    local self = setmetatable({}, Ehlers.ChannelPDF)
    
    self.FSettings = FSettings or {}
    self.ds = ds
    self.P = FSettings.period or 4
    self.up = FSettings.up or 1.0
    self.dw = FSettings.dw or -1.0
    
    self.I1 = 0
    self.hh, self.ll = 0, 0
    
    self.Lead = Queue.new()
    
    self:initialize()
    
    return self
end
function Ehlers.ChannelPDF:initialize()
    self.fTransformFisher = self:TransformFisher()
    self.fTransformIFisher = self:TransformIFisher()
    
    self.fFilterSmooth = self:FilterSmooth()
    self.fFilterLead = self:FilterLead()
    
    self.I1 = 0
    self.Lead = Queue.new()
end

function Ehlers.ChannelPDF:FilterSmooth()
    local F = Queue.new()
    return function(I, x)
        if I == 1 then
            F = Queue.new()
            for _ = 1, 3 do F:push_right(0) end
        end
        F:pop_left()
        F:push_right(x)
        local y = 2 * F[1] + F[2] - F[3]
        y = y and (y >= 1 and 0.999 or y <= -1 and -0.999 or x) or y
        return y
    end
end

Называть наверно следует, кольцевая очередь, используется для хранения фиксированного количества последних значений в массиве
Куда все подевались?
 
nikolz,  Ну Вы в своем амплуа, целую повесть я тут написал
Цитата
VPM написал:
Расписал подробно для общего понимания вопроса
Это моя реализация (частный случай но показательный) как можно использовать
Цитата
VPM написал:
Классический кольцевой буфер, также известный как циклический буфер или кольцевая очередь, используется для хранения фиксированного количества последних значений в массиве.
Айдар,  попросил мой вариант
Цитата
Айдар написал:
Выложи пожалуйста свой вариант кольцевого буфера, мне тоже он был нужен, вот что через gpt получилось (может кому-то нужно):
Я привел пример, с указанием на недостатки - для кольцевого буфера, извлечение данных зависит от конкретного сценария использования и потребностей, и указал на лучший подход
Цитата
VPM написал:
Но есть подход лучше - использовать двусвязную очередь для реализации кольцевого буфера!
двусвязную очередь мы ранее обсуждали этому вопросу посвящалась целая ветка. Могу сказать как использую, у меня это модуль - класс, подгрузил в начале алгоритма
local Queue = require("QueueClass") и делаешь необходимое количество экземпляров определенной длины, определённой направленности, такие как FIFO, LIFO, или извлечение по произвольному условию. В моем примере local ChannelPDF={} это три экземпляра разной длины массивы. И это удобно! А что нужно доказывать я не понимаю. Здесь на мой взгляд просто нужно пользуетесь, не нужно не пользуетесь. Повторюсь вот модуль
Код
-- класс двусвязной очереди:

local Queue = {}
Queue.__index = Queue
function Queue.new()
    return setmetatable({first = 0, last = -1}, Queue)
end
function Queue:push_left(value)
    local first = self.first - 1
    self.first = first
    self[first] = value
end
function Queue:pop_left()
    local first = self.first
    if first > self.last then error("queue is empty") end
    local value = self[first]
    self[first] = nil  -- to allow garbage collection
    self.first = first + 1
    return value
end
function Queue:push_right(value)
    local last = self.last + 1
    self.last = last
    self[last] = value
end
function Queue:pop_right()
    local last = self.last
    if self.first > last then error("queue is empty") end
    local value = self[last]
    self[last] = nil  -- to allow garbage collection
    self.last = last - 1
    return value
end
return Queue
Куда все подевались?
 
Классический кольцевой буфер, также известный как циклический буфер или кольцевая очередь, используется для хранения фиксированного количества последних значений в массиве.
Кольцевой буфер реализован в виде массива фиксированного размера (в данном случае из трех элементов) и индекса, который отслеживает текущее положение для записи нового значения. Когда индекс достигает конца массива, он обнуляется, что позволяет использовать массив циклически.
Инициализация: В начале работы буфер заполняется нулями, и индекс указывается на первый элемент.
Обновление:
  - При каждом вызове функции новое значение записывается в текущий индекс буфера.
  - После записи индекс обновляется. Если индекс достигает конца массива, он обнуляется (возвращается к началу массива)
Обработка данных: Для выполнения вычислений используются значения из буфера.
Именно здесь появляются не удобство применения классического кольцевого буфера!
То есть, значения записываются 1,2,3, и снова 1,2,3, ...

Пример реализации методов с использованием кольцевого буфера:
Кольцевой буфер в классе `Ehlers.ChannelPDF` используется для хранения последних трех значений, которые обновляются при каждом новом баре.
Буфер работает по принципу FIFO, где новое значение заменяет самое старое значение, и обеспечивается циклический доступ к элементам массива
Код
-- Метод FilterSmooth
local ChannelPDF={}
function ChannelPDF:FilterSmooth()
    local F = {0, 0, 0}  -- кольцевой буфер на 3 элемента
    local index = 1
    local start = true
    return function(I, x)
        if I == 1 or start then
            F = {0, 0, 0} -- Инициализация значений
            index = 1 -- Инициализация индекса
            start = false
        end
        F[index] = x -- Обновление (новое значение)
        local y = F[index] + 2 * F[(index - 1 - 1) % 3 + 1] + F[(index - 2 - 1) % 3 + 1]
        y = y and (y >= 1 and 0.999 or y <= -1 and -0.999 or x) or y
        index = index % 3 + 1 -- Обновление индекса
        return y
    end
end
Циклическая запись данных и последовательная индексация свечей, приводит к сложностям (по крайней мере для меня) при получении данных из буфера и их последующей обработкой в формулах.
Для небольших задач пойдет. Но есть подход лучше - использовать двусвязную очередь для реализации кольцевого буфера!
Расписал подробно для общего понимания вопроса.  
Куда все подевались?
 
Ну господа, на Вас не угодить!  :smile:
Форум конечно не про Марс и не про жизнь на МОЕХ, форум про глюки, которыми радуют разработчики.
Данная веточка же про возможности организации алгоритмической торговли, не смотря ни на какие глюки, с помощью языка луа, по крайней мере так ее воспринимаю.
Позволю себе не согласиться, что все уже обсудили, у меня вопросов больше, чем ответов начиная от технологических, и заканчивая стратегиями.
Согласен gpt простые вопросы помогает решать. Но сколько копий сломано, пока разобрался с кольцевым буфером, возможно для кого то просто и понятно,
но у меня это заняло "вагон и маленькую тележку" времени. А ведь прием классный для работы с памятью. Возможно снова велосипед, но вспомнил, про двухфакторную очередь (которую выкладывал), на ее основе реализовал буфер (надо наверно выложить, может кому с экономит то самое время, которое сможет потратить на зарабатывание своих миллионов).
Лето, отпуска конечно ликвидность упала, протолкнуть объемы сложно, тут и самое время обсудить стратегии капитал менеджмента.
Индикатор insidebar, Написать индикатор
 
Посмотрите внимательней вы пропустили строку

local string_upper,string_sub=string.upper,string.sub;

поставьте перед функцией function Value(I,VType,ds)
Индикатор insidebar, Написать индикатор
 
Цитата
Skyrider50 написал:
VPM, все так, но нет. lua 5.4.1
В квике: система - настройки - основные - луа скрипты, вообще то хотя я и пишу в среде 5.4 но тут нет ничего такого что не воспроизвёл бы даже луа 5.1
Индикатор insidebar, Написать индикатор
 
Что в списке было удобно и быстро находить измените имя индикатора например так
Settings.Name = "1Structure";
это будет самописные блокировать в группу а Ваш поиск будет всегда с одного знака начинаться, просто удобно.
Индикатор insidebar, Написать индикатор
 
В блокноте это ANSI
Индикатор insidebar, Написать индикатор
 
Нужен формат 1251, воспользуйтесь стандартным блокнотом, скопируйте и сохраните в этом формате, проверь настройки квик там поставьте lua 5.4  
Индикатор insidebar, Написать индикатор
 
Да действительно, вот исправленный проверил у себя, пробуйте
local string_upper,string_sub=string.upper,string.sub;
function Value(I,VType,ds)
   
   local Out = nil
   local 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 == "X" then --DateTime
Out = (T and T(I)) or (ds and ds:T(I))
elseif VType == "A" then --Any
if ds then Out = ds[I] end
end
return Out
end
function Structure()
   local I1 = 0
   local Structura = 0

   return function(I, FS, ds)
       I = I or 1
       ds = ds or nil
       FS = FS or {}
       local p = FS.persent or 4 -- %
       local wid = FS.wid or 0

       local o0 = Value(I, 'O', ds) or 0
       local c0 = Value(I, 'C', ds) or o0
       local h0 = Value(I, 'H', ds) or c0
       local l0 = Value(I, 'L', ds) or c0

       if I == 1 then
           I1 = 0
           Structura = 0
       end

       local flag = h0 and l0 and c0 and o0 or false

       local o1 = I > 1 and Value(I-1, 'O', ds) or o0
       local c1 = I > 1 and Value(I-1, 'C', ds) or c0
       local h1 = I > 1 and Value(I-1, 'H', ds) or h0
       local l1 = I > 1 and Value(I-1, 'L', ds) or l0
       local flag1 = I > 1 and flag and h1 and l1 or false

       local h2 = I > 2 and Value(I-2, 'H', ds) or h1
       local l2 = I > 2 and Value(I-2, 'L', ds) or l1
       local flag2 = I > 2 and h2 and l2 and flag1 and flag or false

       local newbar = I > I1

       -- Определение типов баров
       local up_bar1 = flag2 and h1 > h2 and l1 >= l2 or false
       local down_bar1 = flag2 and l1 < l2 and h1 <= h2 or false
       local inbar1 = flag2 and h1 <= h2 and l1 >= l2 or false
       local outbar1 = flag2 and h1 > h2 and l1 < l2 or false
       local outbar_up1 = outbar1 and c1 > o1 or false
       local outbar_down1 = outbar1 and c1 <= o1 or false

       local outbar0 = flag1 and h0 > h1 and l0 < l1 or false
       local outbar_up0 = outbar0 and c0 > o0 or false
       local outbar_down0 = outbar0 and c0 < o0 or false
       local up_bar0 = flag1 and h0 > h1 and l0 >= l1 or false
       local down_bar0 = flag1 and l0 < l1 and h0 <= h1 or false
       local inbar0 = flag1 and h0 < h1 and l0 > l1 or false

       local event = newbar and (outbar0 or up_bar0 or down_bar0) or false

       local struc = (outbar_up0 or up_bar0) and 1 or (outbar_down0 or down_bar0) and -1 or 0
       local structura = Structura
       Structura = (newbar or event) and Structura + struc or structura

       I1 = I
if newbar and inbar1 then SetValue(I-1,1,l1 ) end
if newbar and outbar1 then SetValue(I-1,2,h1 ) end
       --return newbar and inbar1 and li or nil, newbar and outbar1 and h1 or nil
  end
end

Settings={};
Settings.Name = "Structure";

local f;
function Init()

f=Structure();
Settings.line = {
{Name = "InBar",Color = RGB(0, 0, 255), Type = TYPE_POINT, Width = 3},
{Name = "OutBar",Color = RGB(255, 0, 255), Type = TYPE_POINT, Width = 3},
};
return #Settings.line;
end
function OnCalculate(index)
return f( index,Settings )
end
Индикатор insidebar, Написать индикатор
 
Все таки напутал, нужно заменить строку
return newbar and inbar1 or nil, newbar and outbar1 or nil
на
return newbar and inbar1 and l1 or nil, newbar and outbar1 and h1 or nil

Должен выводить точки в момент появления новой свечи
Индикатор insidebar, Написать индикатор
 
Код
Попробуйте так, должен выводить внутренний бар и внешний бар поглощения. надеюсь ничего не напутал, давно не пользуюсь, но это самый простой и понятный вариант.

function Structure()
    local I1 = 0
    local Structura = 0

    return function(I, FS, ds)
        I = I or 1
        ds = ds or nil
        FS = FS or {}
        local p = FS.persent or 4 -- %
        local wid = FS.wid or 0

        local o0 = Value(I, 'O', ds) or 0
        local c0 = Value(I, 'C', ds) or o0
        local h0 = Value(I, 'H', ds) or c0
        local l0 = Value(I, 'L', ds) or c0

        if I == 1 then
            I1 = 0
            Structura = 0
        end

        local flag = h0 and l0 and c0 and o0 or false

        local o1 = I > 1 and Value(I-1, 'O', ds) or o0
        local c1 = I > 1 and Value(I-1, 'C', ds) or c0
        local h1 = I > 1 and Value(I-1, 'H', ds) or h0
        local l1 = I > 1 and Value(I-1, 'L', ds) or l0
        local flag1 = I > 1 and flag and h1 and l1 or false

        local h2 = I > 2 and Value(I-2, 'H', ds) or h1
        local l2 = I > 2 and Value(I-2, 'L', ds) or l1
        local flag2 = I > 2 and h2 and l2 and flag1 and flag or false

        local newbar = I > I1

        -- Определение типов баров
        local up_bar1 = flag2 and h1 > h2 and l1 >= l2 or false
        local down_bar1 = flag2 and l1 < l2 and h1 <= h2 or false
        local inbar1 = flag2 and h1 <= h2 and l1 >= l2 or false
        local outbar1 = flag2 and h1 > h2 and l1 < l2 or false
        local outbar_up1 = outbar1 and c1 > o1 or false
        local outbar_down1 = outbar1 and c1 <= o1 or false

        local outbar0 = flag1 and h0 > h1 and l0 < l1 or false
        local outbar_up0 = outbar0 and c0 > o0 or false
        local outbar_down0 = outbar0 and c0 < o0 or false
        local up_bar0 = flag1 and h0 > h1 and l0 >= l1 or false
        local down_bar0 = flag1 and l0 < l1 and h0 <= h1 or false
        local inbar0 = flag1 and h0 < h1 and l0 > l1 or false

        local event = newbar and (outbar0 or up_bar0 or down_bar0) or false

        local struc = (outbar_up0 or up_bar0) and 1 or (outbar_down0 or down_bar0) and -1 or 0
        local structura = Structura
        Structura = (newbar or event) and Structura + struc or structura

        I1 = I

        return newbar and inbar1 or nil, newbar and outbar1 or nil
   end
end

Settings={};
Settings.Name = "Structure";

local f;
function Init()

f=Structure();
Settings.line = {
{Name = "InBar",Color = RGB(0, 0, 255), Type = TYPE_POINT, Width = 2},
{Name = "OutBar",Color = RGB(255, 0, 255), Type = TYPE_HISTOGRAM, Width = 2},
};
return #Settings.line;

end
function OnCalculate(index)
return f( index,Settings )
end
   
Индикатор insidebar, Написать индикатор
 
Попробуйте такой
Код
function Cached.Structure()
    local I1 = 0
    local Structura = 0

    return function(I, FS, ds)
        I = I or 1
        ds = ds or nil
        FS = FS or {}
        local p = FS.persent or 4 -- %
        local wid = FS.wid or 0

        local o0 = Value(I, 'O', ds) or 0
        local c0 = Value(I, 'C', ds) or o0
        local h0 = Value(I, 'H', ds) or c0
        local l0 = Value(I, 'L', ds) or c0

        if I == 1 then
            I1 = 0
            Structura = 0
        end

        local flag = h0 and l0 and c0 and o0 or false

        local o1 = I > 1 and Value(I-1, 'O', ds) or o0
        local c1 = I > 1 and Value(I-1, 'C', ds) or c0
        local h1 = I > 1 and Value(I-1, 'H', ds) or h0
        local l1 = I > 1 and Value(I-1, 'L', ds) or l0
        local flag1 = I > 1 and flag and h1 and l1 or false

        local h2 = I > 2 and Value(I-2, 'H', ds) or h1
        local l2 = I > 2 and Value(I-2, 'L', ds) or l1
        local flag2 = I > 2 and h2 and l2 and flag1 and flag or false

        local newbar = I > I1

        -- Определение типов баров
        local up_bar1 = flag2 and h1 > h2 and l1 >= l2 or false
        local down_bar1 = flag2 and l1 < l2 and h1 <= h2 or false
        local inbar1 = flag2 and h1 <= h2 and l1 >= l2 or false
        local outbar1 = flag2 and h1 > h2 and l1 < l2 or false
        local outbar_up1 = outbar1 and c1 > o1 or false
        local outbar_down1 = outbar1 and c1 <= o1 or false

        local outbar0 = flag1 and h0 > h1 and l0 < l1 or false
        local outbar_up0 = outbar0 and c0 > o0 or false
        local outbar_down0 = outbar0 and c0 < o0 or false
        local up_bar0 = flag1 and h0 > h1 and l0 >= l1 or false
        local down_bar0 = flag1 and l0 < l1 and h0 <= h1 or false
        local inbar0 = flag1 and h0 < h1 and l0 > l1 or false

        local event = newbar and (outbar0 or up_bar0 or down_bar0) or false

        local struc = (outbar_up0 or up_bar0) and 1 or (outbar_down0 or down_bar0) and -1 or 0
        local structura = Structura
        Structura = (newbar or event) and Structura + struc or structura

        I1 = I

        if wid == 0 then
            return Structura
        end
        return struc
    end
end
Тикер в индикаторе.
 
Kolossi,  Насчет родственных связей Вы со своей бабушкой пообщайтесь.
Код
function BALVAN() 
       
          local Price={}
 
 return function (I, FSettings, ds)

    local ds=ds
    local FSettings=(FSettings or {})
    local P=(FSettings.period or 9)
    local v_t=(FSettings.v_t or 'C')  
    --------------------------------

    if I == 1 then 

       Price={};  

       local info=getDataSourceInfo(); 

       if info then
               interval,symbol,class = info.interval,info.sec_code,info.class_code
               local sec_info = getSecurityInfo(class_code, sec_code)
       end
    end
 end 
end

Вернули коды и получайте что нужно, не понятно в чем проблема! В примере выше возвращает short_name - короткое имя.
Тикер в индикаторе.
 
Цитата
Kolossi написал:
Споткнулся тут о проблему: в скрипте индикатора нужно обрабатывать свечи для бумаги прошедшей сплит по правилам, отличным от правил обработки других инструментов. Как в скрипте индикатора можно получить наименование тикера обрабатываемой свечи?
Разве существуют универсальные правила обработки сплитов? Причины сплитов могут быть различны: Увеличение ликвидности, Улучшение имиджа, Изменение структуры капитала.
Я столкнулся с неоходимость приведения к общему массштабу.
Цитата
Kolossi написал:
Как в скрипте индикатора можно получить наименование тикера обрабатываемой свечи?
Нужно использовать функцию getSecurityInfo для получения информации о тикере. Вот пример:

local function getTicker(class_code, sec_code)
   local sec_info = getSecurityInfo(class_code, sec_code)
   if sec_info ~= nil then
       return sec_info.short_name
   else
       return nil
   end
end
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Вроде нашел, Логнормальное распределение приращений цен. Предполагается, что приращения логарифмических цен (логарифмические доходности) распределены нормально. Это означает, что если цены актива P(t) следуют логнормальному распределению, то логарифм цен ln(P(t)) следует нормальному распределению. Это предположение основано на наблюдениях, что логарифмы цен часто лучше подходят для нормального распределения  и что цены акций и других финансовых активов не могут быть отрицательными. И здесь нужно вспомнить, не столь далекие события ценообразованию нефти, когда к товару добавляли премию.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Логарифм применяют не просто так, а в связи с концепцией непрерывно начисляемой доходностью и логнормальным распределением приращений цен.
Наверняка при моделировании будет удобней пользовать концепцией непрерывно начисляемой доходностей, не совсем уверен что нужно применять при анализе работы торговой системы, и уж точно не стоит отражать в финансовых отчетах?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
nikolz,  Подобные аргументы слышны на этом форуме, чуть ли не через пост. Вы напрасно обижаетесь, назвать подобное ахиней, согласитесь относительно мягко, здесь ни статьи не помогут ни Шекспир.
Цитата
nikolz написал:
'Математически логарифмирование заменяет умножение сложением"
--------
тогда исходя из этого правила
получается, что  2*2=2*log(2)
Круто!
1) Одно из основных фундаментальных свойств логарифмов заключается в том, что они заменяют умножение сложением, нет здесь ни какого моего правила - это свойство логарифмов, возможно забыли?
                           ln(a⋅b)=ln(a)+ln(b)
Это свойство позволяет заменить умножение сложением, что особенно удобно при  анализе временных рядов.
2) Где в Вашем примере хоть что то напоминает операцию сложения  2*2=2*log(2) , вообще что этим хотели сказать???
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Цитата
VPM написал:
Отсутствие  строгой терминологии привносит свою лепту и путаницу.
Т.к. это не точная наука, то есть некая девиация. Но все же зарубежные термины уже давно устоялись, рынок там давно живет. Вот когда начинают творческим переводом заниматься, то и возникает путаница.
Справедливости ради, почти все приходит не из русскоязычного сегмента, так что и не стоит пытаться что-то искать по-русски - это будет творческое переосмысление. Правда всегда можно уйти в область обработки сигналов, мат. теории. рядов. Там уже достаточно отечественных материалов по теме.
Но ведь и слег не добавляет точности, волатильность широко вошла в обиход, и под этим названием скрываются несколько смыслов, так как расчеты различны. Один из способов это расчет стандартного отклонения,  если  вместо волатильности произнесли стандартное отклонение, то ту появляется смыслы, сигма, нулевая средняя, нормальное распределение с вероятностями исходов. Родной язык позволяет эти смыслы поддерживать, ну к примеру русский язык строится от корня, корень несет смысл, что уже по себе существенно (отклонился, уклонился приклонился...). В то время как применяя термин на иностранном, он превращается в некую новую переменную, теряя или привнося новые смыслы. Так что и переосмысление бывает полезным. Но лучше с оригинала самому.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Посмотрел внимательней. Нет все таки есть существенная неточность в моих суждениях. В своих расчетах (использую абсолютные значения), расчеты в статье (применяют натуральный логарифм цены), а это более чем существенное отличие. Хотя даже не знаю что лучше использовать, ведь в стать тоже делается допущение "Когда доходность мала, например, всего несколько процентов, мы имеем: г ≈ Ln (1 + г)", когда делаешь расчет с горизонтом год и один день?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Nikolay,  Спасибо, пробежал бегло, ну в общем тоже известный подход, расчет исторической волатильности, терминология несколько отличается а смысл один, у себя я так и считаю терминология другая, 1) в случае моделирования сделки; 2) при оценки результатов торговой стратегии если достаточно статистики. Отсутствие  строгой терминологии привносит свою лепту и путаницу. Для себя, установил как бы два термина, Доходность - это % приращения, а HPR - когда средняя = 1, это удобно, позволяет переходить из одно системы в другую измеряю по сути одно и тоже используя разные размерности.
HPR = Р2/Р1; относительная доходность = Р2 / Р1 - 1; доходность% = ( Р2 / Р1 - 1) * 100
Сейчас поясню, минмаксная нормировка дает нам размерность [0,1] , где 0 предел (самое маленькое значение), 1 предел (самое большое значение), умножая на 100 уже в процентах, делая перевод [-1,0,1] средняя = 0, получили осциллятор с нормальным распределением. Надеюсь ни кого не запутал?  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Достаточно вспомнить любой расчет волатильности.
Не понял, о каком расчете Вы говорите?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Не очень понятно зачем писать очевидные вещи. Логарифмы как способ изменить шкалу используются очень-очень давно. И финансах в частности. Достаточно вспомнить любой расчет волатильности.
Америку то и не открываю, лишь на поминаю эти очевидные вещи, тем кто их подзабыл, в том числе и себе, для чего все это нужно. Если посмотреть алгоритмы столь именитых здесь программистов, то думаю 90% этих алгоритмов не учитывают обстоятельство со размерности. Нет когда робот работает с одним инструментом то и ладно, а когда портфель, то есть проблема. Именно это обстоятельство я озвучил. А подробно, на мой взгляд полезно, не все кто пишет подкованы как Вы, да и просто вспомнить.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
nikolz написал:
Не хватает примеров  
Вот на первую в скидку взял из букваря по финансовой математике.

Экспоненциальный рост описывается дифференциальным уравнением: dx/dt=kx, Решение этого дифференциального уравнения — экспонента x=ae^kt.
примером экспоненциального роста являются, сложные проценты, Общая сумма, которую получит вкладчик, при расчёте по сложному проценту будет равна  x*(1+a)^n,
Где x — начальная сумма вложенных средств,  a — годовая процентная ставка, n— срок вклада в годах.

При вкладе по ставке s% годовых, после первого года хранения капитал составил бы x плюс s% от неё, то есть возрос бы в (1+s/100)  раза. На второй год s% рассчитывались бы уже не от одной копейки, а от величины, большей её в (1 + s/100) раза. И, в свою очередь, данная величина увеличилась бы тоже за год в (1 + s/100) раза. Значит, по сравнению с первичной суммой вклад К году N первичный вклад вырос бы до величины в n раз больше первоначальной. (1 + s/100)^n

В применении к ежемесячной капитализации формула сложного процента имеет вид: (1 + s/100)^m/12,
где   x — начальная сумма вклада,  s — годовая ставка в процентах,  m — срок вклада в месяцах.

Разве ни чего не напоминает? И таких примеров Вы сами сколько угодно найдете, все дело в прикладном характере.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
nikolz,  Для того чтоб читать, нужно научиться читать
Цитата
VPM написал:
log(b)-log(a)=log(b/a), разница логарифмов двух цен a и b = логарифму относительного приращения b/a, то есть логарифму доходности.
А нести всякую "ахинею", ну Вам то уж не к лицу.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Хотел остановиться на освещении этой проблематики, так как собственно решение озвучено, но есть некая не досказанность. Сама десятичная система счисления, обладает фрактальными свойствами, благодаря их само подобной структуре и итеративным процессам.
0,1,2...9
10,11,12...19
Что само по себе при использовании функции доходности (отношение) уже может приводить не к однозначной оценке, когда цены находится в разных разрядах, нет, доходность которая поднимается с 10 до 11, эквивалентна доходности которая выросла со 100 до 110. Проблема возникает когда инвестор отвечает на вопрос "на сколько цены изменились за интервал времени".

В финансовой математике обычно расчеты ведут в процентах (доходность). Приращение цены в процентах обычно считается как (P2-P1)/P1, однако, данный способ имеет этот недостаток, т.е. если цена уменьшилась на 5%, а затем увеличилась на 5% мы не получим первоначальное значение. И здесь на помощь приходит оценка относительного изменения цен за период (интервал) времени.

Логарифм цены позволяет уйти от этого искажения, связанного с абсолютными значениями цены и перейти к относительной оценке.
Для инвестора имеет значение не столько, сколько стоит в настоящий момент инструмент, а на(во) сколько произошло относительное изменение цен за период (интервал) времени. Здесь смысл логарифма нужно озвучить: "инвесторы и трейдеры мыслят в терминологии «выросло в х раз», и не важно от каких уровней. Чтобы уровнять рост в х раз от разных уровней и используют логарифм".

Логарифмированные ценовые ряды обладают свойствами log(b)-log(a)=log(b/a), разница логарифмов двух цен a и b = логарифму относительного приращения b/a, то есть логарифму доходности.
Математически логарифмирование заменяет умножение сложением, то есть с помощью логарифма можно суммировать доходности за разные промежутки времени, функции роста изменяет свой темп (характер) от экспонетциального на линейный. Ну и еще одно, с точки зрения теории случайных процессов, логарифмы приращений цен Гауссовы (нормальны).
Чем пользоваться, как пользоваться решайте сами, надеюсь и любители попкорна чуть-чуть вспомнили финансовую математику, хороших алгоритмов.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
nikolz,  Термин на рынок подтянули за долго до моего появления на этом рынке, Билл Вильямс целую книжку выпустил, есть индикаторы. Позволяющие оценивать ее. Ни чего нового здесь нет. Графики ценового временного ряда на различных временных интервалах (минутные, часовые, дневные, недельные графики) помогает увидеть, как паттерны повторяются на разных временных масштабах. Вложенность мелкого тайм фрейма в старший, именно это свойство я имел ввиду.
Почему мои алгоритмы должны чем то отличаться? Ни чего нового все давно известно, разве входные данные. Проблема которую я описал возникла в алгоритме рассчитывающем функцию роста, входными данными которой являются hpr, но Nikolay,  прав нужно уйти в один масштаб, торговать пунктиками, тогда и оценка эффективности становится на место, логарифмическая школа скорее больше подходит для инвестиционных горизонтов, а с горизонтом 1 день - пунктики. Хотя подниму старое по экспериментирую и то и другое.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Можно уже пункты отнормировать, чтобы цифры были близкие, как это делают при подготовке данных для моделей, например.
Поясните.

Вообще я про универсальный подход, который можно применять в своих алгоритмах не задумываясь, о разрядности чисел.
Вот это я использую, но чаще забываю
Код
-- Функция для нормализации цен
local function normalize_prices(prices, step)
    local normalized_prices = {}
    for i, price in ipairs(prices) do
        normalized_prices[i] = price / step
    end
    return normalized_prices
end
Отлично работают еще способы приведения к нормальному распределению, но хочется универсальности.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
TGB,  Вот именно об этом мое сообщение, что не корректны такие сравнения. :shock:  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Nikolay,  Я просто подумал что, за то время когда я последний раз открывал букварь по математике, человечество могло что - то придумать нового, новые подходы.
Поиск ни чего не дал, да и поисковики последнее время странно себя ведут, впечатление что идет не поиск, а навязывание какого то мнения в вперемежку с рекламой.
Нет нормализация как способ приведения данных к единому масштабу, мне конечно известен использую, от логарифмической шкалы отказался, теперь уже не могу сказать почему.
Но ведь есть инструменты котируемые к примеру 10000 и втб котировка 0.022957, разве тут уже чисто арифметически нет проблемы?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
nikolz,  Ни чего нового. Фрактальность, концепция, используется для описания сложных объектов (процессов), которые имеют повторяющуюся структуру на разных масштабах.
В контексте анализа временных рядов, проблема сравнения данных разных масштабов имеет значение для корректного анализа и принятия решений.
Классическая задача демонстрирующая данную проблематику, измерение длины береговой линии на разных масштабах (можно на гугл картах по экспериментировать).

TGB,  Ну очень остроумно, чтобы Вас хотя бы начали понимать окружающие, научитесь мысли формировать понятно, а предложений я жду от Вас, или страна напрасно Вас учила?.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Всем добрый день!
И вот оно, торговая программа нашла себе все таки проблематику. Проблема лежит в прямой плоскости озвученной в заголовке данной ветки - системе принятия решений.
В чем смысл, если двумя словами то в масштабах, проблема чисто на мой взгляд математическая, давно известная человечеству, да и мне, просто откладывал ее решения на потом, видимо настал тот потом.
Дело в том, что я в своих программах использую такой показатель как HPR (Holding Period Return) представляет собой изменение актива за определенный период времени - отношение. То есть отвечает на вопрос "как ты ко мне относишься". В таком подходе, во всей своей красе, возникает маcштаб или фрактальность, всё б ни чего когда котировки цены разных инструментов одинаковы или близки.

Но программа засекает их уже, ну к примеру
актив GD (золото) котируется значениями pricce[1] = 2349.3 pricce[2] = 2349.6 шаг изменения 0.1,
и есть другой BR (нефть) котируется значениями pricce[1] = 77.33 pricce[2] = 77.49, шаг изменения 0.01,
необходимо найти их отношения и сравнить изменения для принятия решений, и вот он во все красе масштаб.
В первом случае ни одного сигнала, во втором на ура вылетают.

Кто незнаком с проблематикой, хорошо описана в работах Мандельброта. Вот я и подумал наверняка кто - то уже решал эту задачу.
Первое что приходит: нормализация к диапазону [0, 1], логарифмическое преобразование - лог доходности, приведение к общему масштабу, ну даже тяжело представить с чего тут начать.
В общем если кто занимался, будем признательны, думаю все сообществом.
Что изменилось в 11.1.1.11, что перестали приходить данные по CreateDataSource?
 
попробуйте так DataSource:Size() и проверьте константу INTERVAL_H1
Сложный индикатор с сохранением его данных для каждой свечи
 
nikolz,  Можно и читать иногда даже удобней, только нужно помнить, что пользоваться нужно небольшим количеством открытых окон для небольшого количества тикеров. Так ка все это дело приводи к замедлению терминала, а при большой нагрузке и к зависаниям. Здесь нужно добавить что организация алгоритма через замыкание позволяет один и тот - же скрипт использовать как в индукторах, так и в потоке main() что избавляет от избыточного кода.  
Сложный индикатор с сохранением его данных для каждой свечи
 
VelikiyTrader,  Для Вашей задачи удобней писать индикатор через замыкание, где вычисления происходят в анонимной области, а не обходимые таблиц сохраняете между вызовами, почему лучше писать не буду на форуме много обсуждалось, да и разработчики предлагают этот вариант.

Вот пример расчета средней, удачи.
Код
calcMean()
    
    local Price = {} -- Инициализируем для хранения таблицу
    local Mean = {}
    
    return function (I, FSettings, ds)
        I = I or 1
        ds = ds or nil
        FSettings = FSettings or {}
        local v_t = FSettings.v_t or 'C'
        local P = FSettings.period or 9
        local max_cache_size = FSettings.max_cache_size or 5 -- Максимальный размер кэша для Mean[I]
      local x = FSettings.x or nil
        
        local p0 = x or (Value(I, v_t, ds) or 0)
        Price[I] = p0 -- сохраняем
        
        if I == 1 then 
            Price[I] = p0
            Mean[I] = p0
        end
        
        -- Освобождаем память от старых значений Price[I]
        if I > P then
            Price[I-P] = nil
        end
        
        local sum = 0
        local n = math.min(I, P) -- Ограничиваем количество значений для усреднения
        for i = n, 1, -1 do
            sum = sum + Price[I-i+1] -- Берем только последние P значений
        end
        
        local mean = sum / n or p0
        Mean[I] = mean
        
        -- Освобождаем память от старых значений Mean[I]
        if #Mean > max_cache_size then
            table.remove(Mean, 1)
        end
        
        return mean
    end
end
SciTE
 
nikolz,  Спасибо, только не понятно где переключаете, и где и как подключается путь к исполняемому файлу луа разных версий?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
В продолжении темы асинхронности, собрал не большой пример для себя, такую "напоминалочку"  Вот код:
Код
-- 1) Запуск программы main в потоке терминала QUIK

-- 2) Запуск сопрограммы в потоке терминала main
local working = true -- Флаг для продолжения цикла
function Robot()

  local events = {} -- Таблица для хранения событий
  local routine = coroutine.create(function()-- Создание сопрограммы для отслеживания событий
    
    while working do -- Отслеживание событий и создание итераций
      
      -- ... (реализация отслеживания событий)
      local conect = coroutine.create(function()-- реализация отслеживания события соединения с сервером
          while working do 
            local event_conect = math.random(1,10) -- print("event_conect",event_conect)
            -- Добавление события в таблицу
            --table.insert(events, { event }) -- Добавляем данные события
            
            -- Если соединение установлено делаю Паузу до следующей итерации, Если нет соединение ждем.
            if event_conect >= 5 then coroutine.yield() else print("No conect?",event_conect) end
          end
      end)
      coroutine.resume(conect)
      -- ... (реализация отслеживания событий)
      local WorkTime = coroutine.create(function()-- реализация отслеживания события Рабочего времени
          while working do
            local event_WorkTime = math.random(1,10)
            --print("event_WorkTime",event_WorkTime)
            -- Добавление события в таблицу
            --table.insert(events, { event }) -- Добавляем данные события
            -- Пауза для отслеживания новых событий
            if event_conect >= 5 then coroutine.yield() else print("No WorkTime?",event_conect) end
          end
      end)
      coroutine.resume(WorkTime)
      
      -- реализация создания итераций для получения рыночной информации и ее обработки
      local event = math.random(1,10) print("event",event)
      -- Добавление события в таблицу
      table.insert(events, { event }) -- Добавляем данные события
      -- Пауза для отслеживания новых рыночных событий
      coroutine.yield()
    end
    
  end)
  
  -- Запуск сопрограммы coroutine.resume(routine)
  
  while working do -- Главный цикл для обработки событий (поток main)
    
    coroutine.resume(routine)-- Заход в сопрограмму для отслеживания событий
    if coroutine.status(routine) == "dead" then -- Проверка статуса сопрограммы
      print("Robot routine finished")
      break 
    end
    for _, event in ipairs(events) do-- Обработка событий из таблицы
      -- ... (реализация обработки событий)
      print("event",event[#event],#event)
      if event[#event] >= 5 then print("Buy") else print("Sell")  end
    end
    events = {} -- Очистка таблицы событий

    -- Заход в сопрограмму для дальнейшего отслеживания событий
    --coroutine.resume(routine)
    
  end
  working = false
end
Пример рабочий для этого добавлены случайные входа - это просто некий макет. Запуск функции Robot - print( Robot() ) в среде луа, запустит бесконечный цикл имитируя работу сопрограммы  в потоке main() запущенного в терминала QUIK. В чем смысл данного примера: Можно просто в main() написать логику работы программы и последовательно исполнять код. Данный код  демонстрирует асинхронный подход к воспроизведению кода программы. Сопрограмма запускается до основного цикла main() выполняется необходимая работа идет приостановка, выполняется работа в цикле main() по окончании идет возврат в сопрограмму, добавлены для примера еще 2 ниточки отслеживающие соединение и рабочее время  для примера. Хотел подробней описать, но смысла особого нет, сложно просто без запуска разобраться. Кому интересен подход запустит, и где нужно добавит комментариев.  Почему это лучше лучше почитать букварь. Всем хорошего кода.
SciTE
 
nikolz,  Я не совсем корректно выразился
Цитата
VPM написал:
nikolz,  А код scite полностью покажите.  
Имеется в виду строки, где вызываются разные версии Lua, в моем варианте это
command.go.*.lua;*.macro=dofile $(FilePath)
command.go.subsystem.*.lua;*.macro=3
SciTE
 
nikolz,  А код scite полностью покажите.  
SciTE
 
Цитата
Nikolay написал:
Но есть стандартная инструкция  https://code.visualstudio.com/docs/getstarted/locales Надо просто установить необходимый Language Pack.
Спасибо!
SciTE
 
Lua 5.1 - ответ внутреннего

>lua -e "io.stdout:setvbuf 'no'" "Безымянный0.lua"    
Lua 5.4  -ответ внешнего
>Exit code: 0    Time: 0.1171

Но это в коде опубликованном выше. Этот вариант подходит, нужно с кодировкой разобраться в консоль выводов "кракозябры" идут во втором варианте.
SciTE
 
nikolz,  print(_VERSION)
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 21 След.
Наверх