Облегченная версия индикатора, определяет локальные макс/мин цены на графике. Надеюсь, индикатор станет полезен для ваших торговых алгоритмов.
в версии quik 8.7 имеется баг с настройками индикатора, проверялось на версии 8.13
Индикатор
--C:/QUIK/LuaIndicators/extr.lua dofile(getWorkingFolder() .. "\\LuaIndicators\\Include\\myExtr.lua") Settings = {} Settings.Name = "*extr" Settings.nDepth = 3000 --[[для определения стартового бара]] Settings.nMinHL = 0 --[[минимальное движение цены для определения экстремума]] 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 нужен параметр nMinHL > 0",3) end local depth = tonumber(Settings.nDepth) or Size() local s = Size() - depth oi = s < 1 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 |
--C:/QUIK/LuaIndicators/extr.lua dofile(getWorkingFolder() .. "\\LuaIndicators\\Include\\myExtr.lua") Settings = {} Settings.Name = "*extr" Settings.nDepth = 3000 --[[для определения стартового бара]] Settings.nMinHL = 0 --[[минимальное движение цены для определения экстремума]] 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 нужен параметр nMinHL > 0",3) end local depth = tonumber(Settings.nDepth) or Size() local s = Size() - depth oi = s < 1 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
Модуль индикатора
--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 |
--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