------------------------------------------------------------------------------------------------------- --- Функция получения результатов свечей в .CSV в виде: --- <Инструмент> <Дата> <Время> <Цена_Open> <Цена_High> <Цена_Low> <Цена_Close> <Объем> --- BRN0 1 20200605 200100 42.15 42.16 42.1 42.1 2150 ------------------------------------------------------------------------------------------------------- is_run=true -- Параметры tInstr="BRN0" --код инструмента/бумаги classcode="SPBFUT" --код класса инструмента/бумаги, если нужен фондовый рынок - вводить TQBR вместо SPBFUT iNterval=INTERVAL_M1 --таймфрейм -- доступные таймфреймы указаны в справке Quik (qlua.chm в папке с quik) по поиску CreateDataSource -- пример INTERVAL_H1 corrTime=3 --Время МСК. C сервера время приходит без корректировки. pFile="w:\\temp" --путь, где будет создаваться файл cBars=10 --сколько свечей надо вывести --настройка параметров function OnInit() out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w") is_run=(out_file~=nil) ds=CreateDataSource(classcode, tInstr, iNterval ) --создаем источник данных ds:SetUpdateCallback(NewChartData) --обновление последних данных end function strText(int) local m=tostring(int) local mLen=string.len(int) if mLen==1 then Output="0" .. tostring(m) else Output=m end return Output end function main() while is_run do local Size=ds:Size() --Получение количества всех свечей в источнике данных if cBars>Size then cBars=Size-1 end for i=Size-cBars, Size, 1 do local O=ds:O(i) -- Значение цена открытия свечи local H=ds:H(i) -- Значение High для свечи local L=ds:L(i) -- Значение Low для свечи local C=ds:C(i) -- Значение Close для свечи local V=ds:V(i) -- Значение Volume для свечи local T=ds:T(i) -- Значение Time для свечи sTime=os.time(T) datetime=os.date("!*t",sTime) --вывод в файл out_file:write(tInstr..";"..tostring(iNterval)..";"..tostring(datetime.year)..tostring(strText(datetime.month))..tostring(strText(datetime.day))..";"..tostring(strText(datetime.hour + corrTime))..tostring(strText(datetime.min))..tostring(strText(datetime.sec))..";"..tostring(O)..";"..tostring(H)..";"..tostring(L)..";"..tostring©..";"..tostring(V).."\n") out_file:flush() --запись данных end out_file:close() sleep(1000) -- приостановка на 1 секунду out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w") end end
По принципу своей работы индикатор %b – это моментум- осциллятор, сходный, например, со стохастиком. Однако есть и отличия: если у стохастического осциллятора цены колеблются в интервале от 1 до 100, то у нашего индикатора цена может и выходить за эти пределы, например, значение может быть 1,15 или -0,15, что означает- цена находится выше или ниже на 15% от ширины ленты. То, что формально интервал обозначен уровнями 0 и 1, не должно вас путать – это одно и то же, но умноженное на коэффициент 100.
Но что означают, все эти нулевые или единичные уровни?
Это означает, что если:
-- -- Выполнение действий с массивами. -- local pairs = pairs local type = type module(...) --- Создать копию массива (таблицы) -- @return копию массива (таблицы) function copy(array) local copy_array = {} if type(array) ~= "table" then return array end for k, v in pairs(array) do if type(v) == "table" then copy_array[k] = copy(v) else copy_array[k] = v end end return copy_array end --- Узнать, начинается ли индексация в массиве с нуля или с единицы. -- @return 0 или 1 function base(array) if array[0] ~= nil then return 0 else return 1 end end --- Вычислить число элементов в массиве. -- @return число элементов в массиве function size(array) local n = 0 for _, _ in pairs(array) do n = n + 1 end return n end --- Проверить пустой или нет массив. -- @return true/false function isEmpty(array) for _, _ in pairs(array) do return false end return true end --- Получить первый индекс массива, где ничего не записано. Поиск начинается с 1. -- @return первый индекс массива, где ничего не записано function firstEmptyIndex(array) local i = 1 while array[i] ~= nil do i = i + 1 end return i end
Самый простой, по сути код. Но Lua выдаёт ошибку при компилировании без function main(), при том что Quik выполняет этот код без конструкции main или function. Раньше такой ошибки не было.message(«a»)
------------------------------Output------------------------------
>lua -e «io.stdout:setvbuf 'no'» «a.lua»
lua: a.lua:1: attempt to call global 'message' (a nil value)
stack traceback:
a.lua:1: in main chunk
[C]: ?
>Exit code: 1