Циклы FOR, WHILE, REPEAT в QLua (lua)

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 8, среднее: 5,00 из 5)
Загрузка...

Qlua-основы
В скриптовом языке QLua есть 3 вида циклов (for, while и repeat):

1. FOR - DO - END имеет 2 типа:

-- 1-й тип:
 
   -- Цикл сделает 10 итераций, увеличивая каждый раз переменную i на 1, т.е. i будет меняться от 0 до 9,
   -- переменная i является локальной для цикла, т.е. видна только внутри него
   for i = 0, 9, 1 do
      A = A*2;
   end;
   -- Данный цикл можно было записать и без 3-го аргумента, потому что по умолчанию он равен 1
   for i = 0, 9 do
      A = A*2;
   end;
   -- Но вместо 1 можно использовать любое другое число, или выражение, результат которого является числом
   -- Например так, цикл сделает только 5 итераций и остановится, потому что в 6-й итерации i будет равна 10 (0,2,4,6,8,10), а 10 > 9
   for i = 0, 9, 2 do
      A = A*2;
   end;
   -- Здесь используется выражение, т.е. каждая итерация увеличивает переменную i на 2
   for i = 0, 9, 1+1 do
      A = A*2;
   end;
   -- Можно сделать цикл на убывание
   for i = 9, 0, -1 do
      A = A*2;
   end;
 
-- 2-й тип:
 
-- Такой вариант при каждой итерации записывает в i индекс, а в value значение элемента из массива Array, 
-- перебирая, таким образом, все элементы в массиве типа {[1] = 10, [2] = "Текст", [3] = 50}
for i,value in ipairs(Array) do
   -- здесь какой-то блок кода
end;
 
-- Такой вариант при каждой итерации записывает в key ключ, а в value значение элемента из массива Array, 
-- перебирая, таким образом, все элементы в массиве типа {red = "Красный", green = "Зеленый", blue = "синий"}
for key,value in pairs(Array) do
   -- здесь какой-то блок кода
end;

2.WHILE - DO - END

while A < 10 do
   -- здесь какой-то блок кода 
end;
-- Читается так: ПОКА выполняется условие A меньше 10 ВЫПОЛНЯТЬ(делать) блок кода КОНЕЦ

3.REPEAT - UNTIL

repeat
   -- здесь какой-то блок код
until A < 10
-- Читается так: ПОВТОРЯТЬ блок кода ДО ТОГО, пока не выполняется условие A меньше 10

Для того, чтобы досрочно выйти из любого, вышеописанного, цикла служит оператор break.
Пример использования:

for i = 0, 9, 1 do
   if i >= 2 then break; end; -- цикл завершится на 3-й итерации (0,1,2)
end;

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

Добавить комментарий

Циклы FOR, WHILE, REPEAT в QLua (lua): 75 комментариев

  1. Здраствуйте, решил создавать игры на луа, вообще не получается. Можете мне помочь написать? мне нужно сделать так, что бы скрипт выполнялся один раз и не повторялся, или какой цикл надо удалить? local msgs = {
    "Welcome In Ohio!",
    "But...",
    "How did you get here??",
    "Ok you have to get out here.",
    "I will help you",
    "I advise you to always be ready for danger",
    "Like this.",

    }

    while true do
    for i = 1, #msgs do
    Spawn(function()
    while script.Parent.TextTransparency >= 0 and wait() do
    script.Parent.TextTransparency = script.Parent.TextTransparency - 0.1
    end
    end)
    for j = 1, #msgs[i] do
    script.Parent.Text = string.sub(msgs[i], 1, j)
    wait()
    end
    wait(3)
    while script.Parent.TextTransparency <= 1 and wait() do
    script.Parent.TextTransparency = script.Parent.TextTransparency + 0.1
    end
    end

    end

  2. Добрый день, уважаемые языковеды! Прошу не кидать в меня тапками, я только начал изучать язык.
    Помогите пожалуйста с созданием бесконечного цикла функции. Двое суток читал и пробовал, ничего не вышло. Вот, к примеру есть функция:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    stopped = false
    function OnStop()
    stopped = true
    return 5000
    end
    GREEN = 0
    DOJE = 0
    RED = 0
    function main()
    kol_vo = getNumCandles ('SRH15MIN')
    SRH15MIN, SiN, SiName = getCandlesByIndex ('SRH15MIN',0 ,0 ,kol_vo)
    for i = 100, SiN -100, 10 do
    H = SRH15MIN [i].high
    L = SRH15MIN [i].low
    O = SRH15MIN [i].open
    C = SRH15MIN [i].close
    if O  C then
    	RED = RED + 1
    end
    end
    message('GREEN = '..GREEN..
    		' \nDOJE = '..DOJE..
    		' \nRED = '..RED)	
    end

    Я хотел сделать ее бесконечной, с паузой в 30 секунд. Пробовал разные циклы (for, while и repeat)
    Не выходит каменный цветок :\ Помогите, прошу!

    1. Здравствуйте. Шорткоды lua-lua лучше не использовать.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      
      --doji.lua
      local tag = 'SRH15MIN' --такой идентификатор графика - не универсальное решение
      local exitflag
       
      local tools = {
      --минимальные значения движения в пунктах
      	HL = 300, --размер бара
      	OC = 100, --тело бара
      --бар ростовый GREEN
      	gHC =  50, -- H - C
      	gHO = 100, -- H - O
      	gOL =  50, -- O - L
      	gCL = 100, -- C - L
      --бар падающий RED (зеркалочка)
      	rHC = 100,
      	rHO =  50,
      	rOL = 100,
      	rCL =  50,
      --O == C
      	grHC = 100,
      	grOL = 100,
      }
       
      local doji_pattern = {
      --тут пишите любой алгоритм определяющий паттерн
      --совпадение может быть > 100% 
      	GREEN = {
      		HC = function(O, H, L, C) return (H - C)/tools.gHC end ,
      		HO = function(O, H, L, C) return (H - O)/tools.gHO end ,
      		OL = function(O, H, L, C) return (O - L)/tools.gOL end ,
      		CL = function(O, H, L, C) return (C - L)/tools.gCL end ,
      	},
      	RED = {
      		HC = function(O, H, L, C) return (H - C)/tools.rHC end ,
      		HO = function(O, H, L, C) return (H - O)/tools.rHO end ,
      		OL = function(O, H, L, C) return (O - L)/tools.rOL end ,
      		CL = function(O, H, L, C) return (C - L)/tools.rCL end ,
      	},
      	GR = {
      		HC = function(O, H, L, C) return (H - C)/tools.grHC end ,
      		OL = function(O, H, L, C) return (O - L)/tools.grOL end ,
      	}
      }
      function doji_pattern.get(bar)
      	local O, H, L, C = bar.open, bar.high, bar.low, bar.close
      	if O == 0 or H == 0 or L == 0 or C == 0 then return -1 end --попробовать получить бар заново
      	if H - L < tools.HL or math.abs(O - C)  C then
      		doji_type = "Green"
      		for k, v in pairs(doji_pattern.GREEN) do
      			res = res + v(O, H, L, C)
      		end
      	elseif C > O then
      		doji_type = "Red"
      		for k, v in pairs(doji_pattern.RED) do
      			res = res + v(O, H, L, C)
      		end
      	else
      		for k, v in pairs(doji_pattern.GR) do
      			res = res + v(O, H, L, C)
      		end
      		return math.floor(res*0.5) * 100, "GR"
      	end
      	return math.floor(res/4) * 100, doji_type
      end
       
      function main()
      	local old_count, count = 0, 0
      	repeat sleep(10)
      		old_count = getNumCandles(tag) - 1
      	until old_count > 0 or exitflag
       
      	if exitflag then return end
       
      	local Msg, Type, t, n, l
      	while not exitflag do --вот это бесконечный цикл
       
      		count = getNumCandles(tag)
      		if count > old_count then
       
      			t, n, l = getCandlesByIndex (tag, 0, count - 2, 1) --смотрим 1 бар, который только закрылся
      			Msg, Type = doji_pattern.get(t[0])
      			if Msg >= 0 then
       
      				message("doji: " .. os.date("%X %x", os.time(t[0].datetime)) .. "\n" ..
      				"Type: " .. (Type or "none") .. "\n" ..
      				"Coincidence: " .. Msg .."%", 2)
      				old_count = count
      			end --иначе, пробуем просмотреть бар снова, т.к. один из параметров O,H,L,C == 0
      		end
      	end
       
      end
      function OnStop()
      	exitflag = true
      end
  3. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    function SaveTable(Table, FilePath)
     
       local Lines = {}
       local level = 0
     
       function Rec(a)
          local first = true 
          level = level + 1  
          local s = '' for i=1,level do s = '   '..s end
          for key, val in pairs(a) do         
             if not first then Lines[#Lines] = Lines[#Lines]..',' end
             local k = '[\''..key..'\']'
             if type(key) == 'number' then k = '['..key..']' end
             if type(val) ~= 'table' then 
                if type(val) == 'string' then
                   val = '\''..val..'\''
                else
                   val = tostring(val)
                end
                table.insert(Lines, s..k..'='..val)
                first = false
             else            
                table.insert(Lines, s..k..'={')
                first = false
                Rec(val)            
                table.insert(Lines, s..'}')
                level = level - 1
             end
          end      
       end   
     
       table.insert(Lines, 'local a = {')
       Rec(Table)   
       table.insert(Lines, '}')
       table.insert(Lines, 'return a')
     
       local f = io.open(FilePath, 'w')   
       for i=1,#Lines do
          f:write(Lines[i]..'\n') 
          f:flush() 
       end
       f:close()
    end
    -- Загружает таблицу из файла
    function LoadTable(FilePath)
       local func, err = loadfile(FilePath)
       --local func require(FilePath)
        if not func then
          --message('Ошибка загрузки таблицы из файла: '..err)
     
          return nil
        else
     
          return func()
        end
    end

    Добрый день коллеги! Подскажите пожалуйста в чем дело почему функция загрузки не подгружает таблицу из файла.. если она многоуровневая типа a ={b={},c={},d={}}? Если одиночная то нормально грузит, вывод по той же функции SaveTable(Table, FilePath), размер около 35 кб, но как только добавляю вторую таблицу перестает подгружать в локальную переменную и выдает ошибку local params nil

      1. это не решение проблемы, у вас есть table.save и table.load для сохранения и чтения таблиц любой вложенности в одном файле.
        единственная проблема это функция io.read, отчего-то она не читает большие файлы и действительно есть смысл большую таблицу хранить в нескольких файлах, например: SBER_03_M5.log, где 03 это месяц, а M5 - таймфрейм

        1. А как сделать в один файл, все уже перепробовал что знаю все равно не грузится как только добавляю вложенную таблицу и размер не имеет значения, подгружается только одна таблица

          1. сохраняется и считывается в лучшем виде.

            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            18
            19
            20
            21
            22
            23
            24
            25
            26
            27
            28
            29
            30
            31
            32
            33
            34
            35
            36
            37
            38
            39
            40
            41
            42
            43
            44
            45
            46
            47
            48
            49
            50
            51
            52
            53
            54
            55
            56
            57
            58
            59
            60
            61
            62
            63
            
            local tag = "Si" --идентификатор графика
            local path = getScriptPath() .. "\\test.log"
             
            function table.val_to_str(v)
                if "string" == type(v) then
                    v = string.gsub(v, "\n", "\\n")
                    if string.match(string.gsub(v,"[^'\"]",""), '^"+$') then
                        return "'" .. v .. "'"
                    end
                    return '"' .. string.gsub(v,'"', '\\"') .. '"'
                end
                return "table" == type(v) and table.tostring(v) or tostring(v)
            end
            function table.key_to_str(k)
                if "string" == type(k) and string.match(k, "^[_%a][_%a%d]*$") then
                    return k
                end
                return "[" .. table.val_to_str(k) .. "]"
            end
            function table.tostring(tbl)
                if type(tbl)~='table' then return table.val_to_str(tbl) end
                local result, done = {}, {}
                for k, v in ipairs(tbl) do
                    table.insert(result, table.val_to_str(v))
                    done[k] = true
                end
                for k, v in pairs(tbl) do
                    if not done[k] then
                        table.insert(result, table.key_to_str(k) .. "=" .. table.val_to_str(v))
                    end
                end
                return "{" .. table.concat(result, ",") .. "}"
            end
            function table.load(fname)
                local f, err = io.open(fname, "r")
                if f == nil then return {} end
                local fn, err = loadstring("return "..f:read("*a"))
                f:close()
                if type(fn) == "function" then
                    local succ, res = pcall(fn)
                    if succ and type(res) == "table" then return res end
                end
                return {}
            end
            function table.save(fname, tbl)
                local f, err = io.open(fname, "w")
                if f ~= nil then
                    f:write(table.tostring(tbl))
                    f:close()
                end
            end
             
            function main()
            	os.remove(path)
             
            	local t, n, l = getCandlesByIndex(tag, 0, 1, getNumCandles(tag))
            	table.save(path, t)
             
            	local t1 = table.load(path)
            	local n1 = #t1
            	local bar = t1[n1]
            	message("len_t1 = " .. tostring(n1) .. "\nclose = " .. tostring(bar.close), 2)
            end
  4. Господа! Всем доброго..! Подскажите, есть ли способ через For нарисовать наклонную линию (например, от Н(indx) текущей свечки до, скажем , кокой-то свечки из таблички фракталов до этого). После этого продолжать такую линию с тем же наклоном. При этом такую линию перерисовывать каждый раз, когда H(indx) новой текущей свечи будет больше ? Хочется получить ровную линию под углом.

      1. А как же тогда будет выглядеть такой цикл, чтобы получилась прямая линия (в Квике, наверно только точками получится) под наклоном? И чтобы она перерисовывалась только, когда цена коснулась или пересекла эту прямую?

  5. Таблица имеет вид:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    
    [1]={[0]={
             ['low']=64745,
             ['doesExist']=1,
             ['close']=64749,
             ['datetime']={
                ['ms']=0,
                ['year']=2019,
                ['day']=11,
                ['week_day']=5,
                ['month']=10,
                ['sec']=0,
                ['hour']=10,
                ['min']=49
             },
             ['high']=64760,
             ['open']=64759,
             ['volume']=1082
          },
          [2]={
             ['low']=64744,
             ['doesExist']=1,
             ['close']=64752,
             ['datetime']={
                ['ms']=0,
                ['year']=2019,
                ['day']=11,
                ['week_day']=5,
                ['month']=10,
                ['sec']=0,
                ['hour']=10,
                ['min']=51
             },
             ['high']=64754,
             ['open']=64744,
             ['volume']=1743
          },
          [3]={
             ['low']=64749,
             ['doesExist']=1,
             ['close']=64752,
             ['datetime']={
                ['ms']=0,
                ['year']=2019,
                ['day']=11,
                ['week_day']=5,
                ['month']=10,
                ['sec']=0,
                ['hour']=10,
                ['min']=52
             },
             ['high']=64761,
             ['open']=64752,
             ['volume']=1122
          },

    Может выводить ее в файл а потом читать ?

    1. это вопрос? если да, то вот так:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      
      function table.val_to_str(v)
          if "string" == type(v) then
              v = string.gsub(v, "\n", "\\n")
              if string.match(string.gsub(v,"[^'\"]",""), '^"+$') then
                  return "'" .. v .. "'"
              end
              return '"' .. string.gsub(v,'"', '\\"') .. '"'
          end
          return "table" == type(v) and table.tostring(v) or tostring(v)
      end
      function table.key_to_str(k)
          if "string" == type(k) and string.match(k, "^[_%a][_%a%d]*$") then
              return k
          end
          return "[" .. table.val_to_str(k) .. "]"
      end
      function table.tostring(tbl)
          if type(tbl)~='table' then return table.val_to_str(tbl) end
          local result, done = {}, {}
          for k, v in ipairs(tbl) do
              table.insert(result, table.val_to_str(v))
              done[k] = true
          end
          for k, v in pairs(tbl) do
              if not done[k] then
                  table.insert(result, table.key_to_str(k) .. "=" .. table.val_to_str(v))
              end
          end
          return "{" .. table.concat(result, ",") .. "}"
      end
      function table.load(fname)
          local f, err = io.open(fname, "r")
          if f == nil then return {} end
          local fn, err = loadstring("return "..f:read("*a"))
          f:close()
          if type(fn) == "function" then
              local succ, res = pcall(fn)
              if succ and type(res) == "table" then return res end
          end
          return {}
      end
      function table.save(fname, tbl)
          local f, err = io.open(fname, "w")
          if f ~= nil then
              f:write(table.tostring(tbl))
              f:close()
          end
      end

      сохранить:
      table.save(yourtable, "table.dat")
      загрузить:
      res, yourtable = table.load("table.dat")

  6. Подскажите пожалуйста есть какой то способ посмотреть таблицу один раз за один проход расчета скрипта и сравнить значения всех нужных полей 100 свечей с одним значением?
    -- получаем таблицу параметров 100 свечей

    1
    2
    3
    4
    5
    6
    
    local tab = getCandles(ident, 100, offset)
    for i = #tab, 1, -1 do
    if last == tab[1][i].high or last == tab[1][i].low  then
    -- что то делаем
    end
    end

    Скрипт тормозит и расчитывает очень долго

    1. Не совсем понятно, что делает функция getCandles.
      Если используете не документированные функции, то нужно ее представить на обозрение. А то вопрос у вас ни о чем.
      Если подумать, что tab имеет ту структуру, которая в первом посте, (хотя она какая-то рваная) то цикл для обхода tab будет таким:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      
      local function calculate(tab, last)
        local result = 0
        local function calc_j(bar)
          if not bar or bar.high == 0 or bar.low == 0 then return 0 end
          if last ~= bar.high and last ~= bar.low  then return 0 end
          -- что то делаем
          return bar.volume
        end
       
        local function calc_i(t)
          local res = 0
          if not t then return res end
          for j = #t, 1, -1 do
            res = res + calc_j(t[j])
          end
          return res
        end
        for i = 1, #tab, 1, -1 do
          result = result + calc_i(tab[i])
        end
        return result
      end
       
      local tab = getCandles(ident, 100, offset) or {}
      local last = 64000
      local volume_summ = calculate(tab, last)
      1. А на счет медленно это сколько? час, минута?
        Все зависит от размера tab, которую возвращает getCandles, может там 1 мио вложенных свечных графиков по 100 баров?
        или "-- что то делаем" содержит ожидающие циклы?
        С вашими 3-мя строками кода, послать бы вас лесом по хорошему.

        1. Здравствуйте, спасибо за функцию, попробую прикрутить, Нет не час но в момент прохода примерно сек 20 и скрипт в это время зависает в этом месте, да эта функция получения данных по идентефикатору 100 последних свеч, ничего особенного, а если таких циклов будет несколько то все конец, таблица да кусок, нет смысла размещать остальные такие же

  7. Если поставить условие if (indx == Size()) then end , то ошибка attempt to compare number with nil пропадает, но расчёт тогда производится только в указанное время, а надо, чтобы при загрузке или смене инструмента в любое время

  8. Всем привет! Подскажите причину происхождения ошибки в теле цикла for "attempt to compare number with nil" при осуществлении индикатором расчётов .

    LUA
    if tt.hour == h and tt.min == m then
    t_table = tt
    HIGH = H(indx)
    LOW = L(indx)

    for i = 0, inter-1 do
    if H(indx-i) > HIGH then
    HIGH = H(indx-i);
    end
    if L(indx-i) < LOW then
    LOW = L(indx-i);
    end
    end

    /LUA

    1. В данном куске кода многие переменные не описаны, так что буду догадываться.
      Когда indx = 1 Запускается цикл for
      В первой итерации переменная i = 0, значит indx-i ( где 1-0 ) Дает в условии H(1) то есть high первого бара.
      Во второй итерации переменная i уже равна 1, а значит indx-i ( где 1-1 ) дает в условии H(0), то есть high нулевого бара, такого бара на графике нет, вот тут то и появляется nil
      Далее во всех итерациях запрашивается high не существующих баров -1 -2 -3 ... Сколько итераций в цикле не известно, потому что в этом коде не указано значение переменной inter

      1. Добрый день, Павел! Тогда скажите, как же тогда индикатор работает, если баров не существует, ведь рассчитывается значение правильно Если же добавить условие if (indx == Size()) then end , то ошибка пропадает. Период для М5 для нахождение экстремумов вчерашнего дня и созерцания их в дне сегодняшнем от начала времён.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        
        Settings= {
        Name = "*HIGH-LOW_YESTERDAY",
        period = 162,
        line =
         
        {
        	{
        		Name = "HIGH",
        		Color = RGB(255, 255, 255),
        		Type = TYPE_LINE,
        		Width = 3,
         
        	},
        	{
        		Name = "LOW",
        		Color = RGB(255, 255, 255),
        		Type = TYPE_LINE,
        		Width = 3,
         
        	},
        }
         
        }
         
        function Init()
        return #Settings.line
        end
         
        		local inter = Settings.period
        		local t_table = {}
        		local HIGH
        		local LOW
         
         
        function OnCalculate(indx)
         
        	local tt = T(indx)
         
          if (indx == Size()) then
         
        	if tt.hour == 23
        	and	tt.min == 45
        	then
        		t_table = tt
         
        		HIGH = H(indx)
        		LOW = L(indx)
         
        					for i = 0, inter-1 do
        						if H(indx-i) > HIGH then
        						HIGH = H(indx-i);
        						end
        						if L(indx-i) < LOW then
        						LOW = L(indx-i);
        						end
        					end
        						for i = 1, indx do
        						SetValue(i, 1, HIGH);
        						SetValue(i, 2, LOW);
        						end
         
        	end
         
           end
         
        	return HIGH, LOW
        end
      2. Предыдущий не работает всё время,а только в указанное, а вот этот работает всегда, но выдаёт ошибку

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        
        Settings= {
        Name = "*HIGH-LOW_RGB",
        period = 162,
        line =
         
        {
        	{
        		Name = "HIGH",
        		Color = RGB(255, 255, 255),
        		Type = TYPE_LINE,
        		Width = 3,
         
        	},
        	{
        		Name = "LOW",
        		Color = RGB(255, 255, 255),
        		Type = TYPE_LINE,
        		Width = 3,
         
        	},
        }
         
        }
         
        function Init()
        return #Settings.line
        end
         
        		local inter = Settings.period
        		local t_table = {}
        		local HIGH
        		local LOW
         
         
        function OnCalculate(indx)
         
         
         
        	local tt = T(indx)
         
         
         
        		if tt.hour == 23 and tt.min == 45 then
        			t_table = tt
        			HIGH = H(indx)
        			LOW = L(indx)
         
         
        					for i = 0, inter-1 do
        						if H(indx-i) > HIGH then
        						HIGH = H(indx-i);
        						end
        						if L(indx-i) < LOW then
        						LOW = L(indx-i);
        						end
        					end
        						for i = 1, indx do
        						SetValue(i, 1, HIGH);
        						SetValue(i, 2, LOW);
        						end
        		end
         
        	return HIGH, LOW
        end
        1. Вот Вы и отвечаете на свой вопрос. Потому что он работает не все время.
          В варианте где есть if (indx == Size()) then вычисления идут только тогда, когда indx = Size(), а это значит что indx равен количеству баров на графике. У Вас график содержит 1 бар или тысячи? скорее всего тысячи.
          Предположим что на графике 3000 баров, значит когда indx равен 3000, только в этом случае выполняется вычисления, а дальше...
          Запускается цикл for
          первая итерация, переменная i = 0 переменная indx = 3000 Вы запрашиваете H(3000-0)
          вторая итерация, переменная i = 1 переменная indx = 3000 Вы запрашиваете H(3000-1)
          третья итерация, переменная i = 2 переменная indx = 3000 Вы запрашиваете H(3000-2)
          Вот и работает Ваш код нормально, потому что бары с индексами 3000, 2999, 2998 реально существуют на графике, по этому и ошибки нет.
          Но у Вас еще условие стоит что вычисления нужно выполнять только тогда, когда последний бар имеет время 23:45, в остальное время вычисления не выполняются.