1 (2021-12-10 17:48:03 отредактировано kalikazandr)

Тема: Индикатор экстремум

Индикатор определяет локальные макс/мин цены на графике.
https://i.ibb.co/HKHjQPH/extr.png


При добавлении индикатора снимаем галку
https://i.ibb.co/vjCK6LP/1.png

[+]Код индикатора extr.lua
--C:/QUIK/LuaIndicators/extr.lua
dofile(getWorkingFolder() .. "\\LuaIndicators\\Include\\myExtr.lua")
Settings = {}
Settings.Name = "*extr"
Settings.nDepth = 3000 --[[для определения стартового бара, если 0, то все]]
Settings.nMinHL = 0.0 --[[расстояние, кот. должна пройти цена, для определения H/L]]
Settings.line =
{
    {
        Name = "TRIANGLE_UP",
        Type = TYPE_TRIANGLE_UP,
        Color = RGB(255, 0, 0),
        Width = 4
    },
    {
        Name = "TRIANGLE_DOWN",
        Type = TYPE_TRIANGLE_DOWN,
        Color = RGB(0, 255, 0),
        Width = 4
    }
}

function Init()
    extr = myExtr()
    return 2
end

local oi, min_hl
function OnCalculate(index)
    
    if index == 1 then
        min_hl = tonumber(Settings.nMinHL)
        
        if min_hl and min_hl <= 0 then min_hl = nil end
        if not min_hl then return message("Индикатору extr\nнужен параметр nMinHL > 0",3) end
        
        local s = Size() - Settings.nDepth
        oi = (s < 1 or Settings.nDepth == 0) and 1 or s
        extr(oi, min_hl, index)
    end
    --[[считает только что закрывшийся бар, в текущем активном не считает]]
    if not min_hl or index <= oi then return end
    
    extr(oi, min_hl, index)
    oi = index
end
[+]Код модуля myExtr.lua
--C:/QUIK/LuaIndicators/Include/myExtr.lua
function myExtr()
    local HH, LL, mH, mL, imH, imL 
    local function SetL(oH, oL, oi, min_hl)
        if oH > mH then
            mH, imH = oH, oi
            if not LL then
                if oH - mL >= min_hl then
                    LL = mL
                    SetValue(imL, 1, LL)
                    mL, imL = oL, oi
                    HH = nil
                end
            else
                mL, imL = oL, oi
            end
            if HH and oH >= HH then HH = nil end
        end
    end
    local function SetH(oH, oL, oi, min_hl)
        if oL < mL then
            mL, imL = oL, oi
            if not HH then
                if mH - oL >= min_hl then
                    HH = mH
                    SetValue(imH, 2, HH)
                    mH, imH = oH, oi
                    LL = nil
                end
            else
                mH, imH = oH, oi
            end
            if LL and oL <= LL then LL = nil end
        end
    end
    return function (oi, min_hl, i)
        if i <= oi then
            mH, mL = H(oi), L(oi)
            imH, imL = oi, oi
            HH, LL = nil, nil
            return
        end
        
        local oH, oL = H(oi), L(oi)
        if imL < imH then
            SetL(oH, oL, oi, min_hl)
            SetH(oH, oL, oi, min_hl)
        else
            SetH(oH, oL, oi, min_hl)
            SetL(oH, oL, oi, min_hl)
        end
    end
end

2

Re: Индикатор экстремум

kalikazandr пишет:

Индикатор определяет локальные макс/мин цены на графике.

Интересная штука.
Два вопроса:
- Почему бы не запихнуть модуль в сам индикатор, будет одним файлом, это удобнее.
- Какие преимущества даёт индикатор, если экстремумы и так видны, если немного сжать график?

3

Re: Индикатор экстремум

RRR пишет:

Два вопроса:
- Почему бы не запихнуть модуль в сам индикатор, будет одним файлом, это удобнее.
- Какие преимущества даёт индикатор, если экстремумы и так видны, если немного сжать график?

-модуль практичнее и не виден загрузчику индикаторов, можно сделать несколько версий модулей, а несколько версий индикатора будут в списке доступных индикаторов;
-глазу видны все экстремумы, в т.ч. "шум", который фильтруется минимальным движением цены nMinHL. Индикатор можно использовать в качестве советника или самостоятельного торгового алгоритма, а "глаз" - максимум полуавтомат.

4

Re: Индикатор экстремум

kalikazandr, просьба:
Сделайте снова картинку и выложите где-то. А то текущая, увы, уже не отображается.