Избранное трейдера Алексей
Исправлена печать повторных пробоев одного того же экстремума.
По просьбам играющих 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()