
-------------------------------------------------------------------------------------------------------
--- Функция получения результатов свечей в .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