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

Автор записи: kalikazandr

Облегченная версия индикатора, определяет локальные макс/мин цены на графике. Надеюсь, индикатор станет полезен для ваших торговых алгоритмов.

жми

в версии 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/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