я немного его изменил начало вот такое: -------------------------------------------------------------------- -- -- Построение спреда по нескольким инструментам: -- spread := k * price(security) + k1 * price(tag1) + k2 * price(tag2) + a. -- Можно добавлять дополнительные инструменты, модифицируя код индикатора. --
Settings = { Name = "SpreadIndicator_1", k = 1, -- коэффициент, с которым учитывается цена основного инструмента tag1 = "SberB60", -- метка графика, откуда берётся цена дополнительного инструмента 1 tag2 = "SberBD", -- метка графика, откуда берётся цена дополнительного инструмента 2 k1 = -2, -- коэффициент, с которым учитывается цена дополнительного инструмента 1 k2 = -3, -- коэффициент, с которым учитывается цена дополнительного инструмента 2 a = 0, -- свободный член line = { { Name = "Spread_1", Color = RGB(0, 0, 255), Type = TYPE_LINE, Width = 1, } } }
function Init() return 1 end --------------------------------------------------------- далее не стал писать суть вот в чём: Как видите дополнительные графики это 60 мин "SberB60" и второй Дневной "SberBD", в отдельном окне первого графика 5 минутки ниже окно я размещаю этот индикатор. Значит основным считается График 5 минутки ? Правильно я понял?
Точно! Появился такой индикатор! Спасибо! есть один уточняющий вопрос: вот - "price(security)" или ещё вот так: "local securityPrice = C(index) " это основной инструмент? какой?
вот такой пример: -- -- Построение спреда по нескольким инструментам: -- spread := k * price(security) + k1 * price(tag1) + k2 * price(tag2) + a. -- Можно добавлять дополнительные инструменты, модифицируя код индикатора. --
Settings = { Name = "SpreadIndicator", k = 1, -- коэффициент, с которым учитывается цена основного инструмента tag1 = "SberB", -- метка графика, откуда берётся цена дополнительного инструмента 1 tag2 = "SberB60", -- метка графика, откуда берётся цена дополнительного инструмента 2 k1 = -5, -- коэффициент, с которым учитывается цена дополнительного инструмента 1 k2 = -5, -- коэффициент, с которым учитывается цена дополнительного инструмента 2 a = 0, -- свободный член line = { { Name = "Spread", Color = RGB(0, 0, 255), Type = TYPE_LINE, Width = 1, } } }
function Init() return 1 end
local function getTimeCode(dt) return (dt.year * 10000 + dt.month * 100 + dt.day) * 1000000 + (dt.hour * 10000 + dt.min * 100 + dt.sec) end
--- Найти свечу, относящуюся к заданному времени или предшествующую ему, если для заданного времени нет свечи. -- @param tag строковый идентификатор графика или индикатора -- @param timeCode метка времени в формате yyyymmddhhmmss -- @return искомая свеча или nil, если свеча не найдена. local function getCandleByTimeCode(tag, timeCode) local numCandles = getNumCandles(tag) if numCandles < 2 then return nil end local lastCandle, n, _ = getCandlesByIndex(tag, 0, numCandles - 1, 1) if n ~= 1 then return nil end lastCandle = lastCandle[0] if getTimeCode(lastCandle.datetime) <= timeCode then return lastCandle end local b = numCandles - 1 local a = b - 1 local candle while true do local firstCandle, n, _ = getCandlesByIndex(tag, 0, a, 1) if n ~= 1 then return nil end firstCandle = firstCandle[0] local firstTimeCode = getTimeCode(firstCandle.datetime) if firstTimeCode == timeCode then return firstCandle elseif firstTimeCode < timeCode then candle = firstCandle break elseif a == 0 then return nil else a = math.max(0, 2 * a - b) end end while true do local c = math.floor((a + b) / 2) if c == a then return candle else local middleCandle, n, _ = getCandlesByIndex(tag, 0, c, 1) if n ~= 1 then return nil end middleCandle = middleCandle[0] local middleTimeCode = getTimeCode(middleCandle.datetime) if middleTimeCode == timeCode then return middleCandle elseif middleTimeCode < timeCode then a, candle = c, middleCandle else b = c end end end end
--- Вычислить спред. -- @param index номер свечи на графике -- @return значение спреда или nil, если оно неопределено local function getSpread(index) local timeCode = getTimeCode(T(index)) local securityPrice = C(index) if securityPrice == nil then return nil end -- Получение свечей дополнительных инструментов local candle1 = getCandleByTimeCode(Settings.tag1, timeCode) local candle2 = getCandleByTimeCode(Settings.tag2, timeCode) if candle1 == nil or candle2 == nil then return nil end -- Получение цен дополнительных инструментов local price1 = candle1.close local price2 = candle2.close if price1 == nil or price2 == nil then return nil end -- Вычисление спреда local spread = Settings.k * securityPrice + Settings.k1 * price1 + Settings.k2 * price2 + Settings.a return spread end
function OnCalculate(index) if index > 1 then local spread = getSpread(index - 1) if spread then SetValue(index - 1, 0, spread) end end return getSpread(index) end --------------------------------------------------------------- Вызывает ошибку по оператору "Color" это в 15 строчке. Пожалуйста про комментируйте. Почему ошибка?
значит одновременно у меня получится снимать данные с двух графиков ?? да да идентификатор я также пропишу во втором графики но другое название.к примеру назову "SberB5" и "SberB10" - если это так можно - одновременно из двух графиков? то прекрасно! Спасибо
появился ещё один вопрос по этой же теме: этот индикатор работает по одному идентификатором к примеру "Сбербанк". могу ли я использовать дополнительно и снимать данные с другим временным интервалом также в другой файл 2.txt???? В смысле в Вашем примере снимаются данные к примеру по 5 минутке, а можно ли добавить и ещё снимать одновременно по 10 минутке? при этом второй график рядом открыт.
--[[ ******************************************************************* Пример демонстрирует возможности получения данных с графиков и индикаторов. "Свечки" индексируются по номеру. Для исполнения также требуется наличие скрипта tpf.lua. ******************************************************************* ]]
dofile("tpf.lua")
function main( ) file = io.open("1.txt", "w+t") -- должен быть создан график или индикатор с идентификатором zzz local x = getNumCandles("Сбербанк") -- получаем количество свечек на графике local y = getLinesCount("Сбербанк") -- получаем количество линий у графика -- у некоторых индикаторов линий может быть -- больше чем одна message("total ".. x .. " candles in " ..y .. " lines", 3) for i=0,y-1 do file:write("line = ".. i .. "\n") -- получаем 10 первых свечей с каждой линии t, num, legend = getCandlesByIndex("Сбербанк", i, 0, 10) file:write("num = " .. num ..", legend = ".. legend .. "\n") for j=0,num-1 do --сохраняем каждую свечку в файл table_save( "candle["..j .. "]", file, t[j]) end end
file:close() end
Это текст известной у Вас программы индикатора в Ваших образцах Пожалуйста прокомментируйте использование это программе применительно на графике "Сбербанка" (взят для примера). Насколько я понял по ответы программы 0 Lines видимо с таким идентификатором "Сбербанк" не находит свечек.
вы упростили программу и там отсутствует запись в файл log.log или в библиотеке была функция создания файла для наполнения его. ну это не важно. я предположил, что эта библиотека как-то связана с этим. это так?