Избранное трейдера Алексей

по

Индикатор пробоя. В Quik'е можно всё (почти). Исправление

Исправлена печать повторных пробоев одного того же экстремума.
По просьбам играющих smart-lab.ru/vopros/703796.php
В Quik'е нельзя только предсказывать будущее.
Индикатор Breakout рисует на графике котировок точки пробоя для экстремумов заданного числа Num баров. Для последнего интервала Num баров показывает уровни экстремумов.
Значение Num и признак Print печати сообщений на пробои можно поменять через параметры индикатора.

Чтобы в Quik'е использовать этот индикатор, поместите нижеследующий код в текстовый файл Breakout.lua, а сам этот файл в подкаталог LuaIndicators в том каталоге Quik'а, где лежит файл info.exe.
Чтобы метки пробоев были виднее, индикатор следует поместить после графика котировок. Эти метки позволят на глазок определить прибыльность пробойной стратегии.

-- Ростислав Дмитриевич Кудряшов, СПб, 2021
-- Индикатор Breakout для Quik: min и max Num баров
Settings = {
  Name  = "_Breakout"
 ,line = {
    {Name = "Min"
    ,Color = RGB (255,0,0)
    ,Type = TYPE_LINE
    ,Width = 1}
   ,{Name = "Max"
    ,Color = RGB (0,255,0)
    ,Type = TYPE_LINE
    ,Width = 1}
   ,{Name = "Lwr"
    ,Color = RGB (255,255,0) -- Жёлтый
    ,Type = TYPE_TRIANGLE_DOWN
    ,Width = 1}
   ,{Name = "Upr"
    ,Color = RGB (0,128,255) -- Тёмно-Голубой
    ,Type = TYPE_TRIANGLE_UP
    ,Width = 1}
  }
 ,Num = 10
 ,Print = 1 -- или 0
}
Scan = 0 -- При загрузке Quik сканирует 1 раз

function Init()
  return #Settings.line
end

function OnChangeSettings()
  Scan = 0
end

function OnCalculate (index)
  local n, mn, mx, ini, fin, upr, lwr, printFlag
  n = Settings.Num
  if n < 1 or index <= n then
    if index == 1 then
      Scan = Scan + 1
      SetRangeValue (3, 1, Size(), nil)
      SetRangeValue (4, 1, Size(), nil)
    end
    return nil
  end
  mn = math.huge
  mx = -math.huge
  ini = index - n
  fin = index - 1
  for i = ini, fin do
    mn = math.min (mn, L(i) or mn)
    mx = math.max (mx, H(i) or mx)
  end
  printFlag = Settings.Print > 0 and index == Size() and Scan > 1
  lwr = GetValue (index, 3)
  upr = GetValue (index, 4)
  if not lwr and L(index) and L(index) < mn then
    if printFlag then
      message (Settings.Name ..": Dn ".. mn)
    end
    lwr = mn
  end
  if not upr and H(index) and H(index) > mx then
    if printFlag then
      message (Settings.Name ..": Up ".. mx)
    end
    upr = mx
  end
  if index == Size() then
    SetValue (ini-1, 1, nil)
    SetValue (ini-1, 2, nil)
    SetRangeValue (1, ini, fin, mn)
    SetRangeValue (2, ini, fin, mx)
  else
    mn, mx = nil
  end
  return mn, mx, lwr, upr
end -- OnCalculate()

....все тэги
UPDONW
Новый дизайн