Здравсвтуйте.
Вопрос по индикатору EMA, описанному в примере по . Все что описано работает. Но в моей задаче, я вычисляю среднюю EMA по нескольким периодам. Пример:
averEMA = (EMA(index, 3) + EMA(index, 4) + EMA(index, 5)) / 3.
Так как это функция, при расчете EMA с периодом 4 я затираю значение рассчитаной ЕМА3, на этой же итерации. А оно будет нужно на следующем баре. Код индикатора:
Результаты теста можно увидеть на скринах. В коде изменяется только строка вывода сообщения. : Одна строка содержит только ЕМА3 и она выводится корректно. И , когда выводится результата вычисления ЕМА3 и ЕМА4. И в этом случае ЕМА3 корректна только на первой итерации, дальше она считается не верно. Как такого избежать?
Вопрос по индикатору EMA, описанному в примере по . Все что описано работает. Но в моей задаче, я вычисляю среднюю EMA по нескольким периодам. Пример:
averEMA = (EMA(index, 3) + EMA(index, 4) + EMA(index, 5)) / 3.
Так как это функция, при расчете EMA с периодом 4 я затираю значение рассчитаной ЕМА3, на этой же итерации. А оно будет нужно на следующем баре. Код индикатора:
| Код |
|---|
Settings= {
Name = "averEMA",
startPeriod = 3,
endPeriod = 6,
line =
{
{
Name = "AverEMA",
Color = RGB(90, 110, 200),
Type = TYPE_LINE,
Width = 1
}
}
}
function Init()
return 1
end
function OnCalculate(index)
local s
if index == 1 then
EMA = _EMA()
line = {}
end
s = 0
for i = Settings.startPeriod, Settings.endPeriod do
local k
k = EMA(index, i)
s = s + k
end
if index <= Settings.endPeriod then
line[index] = 0
else
line[index] = s / (Settings.startPeriod - (Settings.endPeriod - 1))
end
message("---- message 1 -----")
message("EMA3 = "..tostring(EMA(index, 3)))
--message("---- message 2 -----")
--message("EMA3 = "..tostring(EMA(index, 3))..", EMA4 = "..tostring(EMA(index, 4)))
return line[index]
end
function _MA()
local cache={}
return function(iIndex, iPeriod)
local sum = 0
local p = 0
local period = iPeriod
local index = iIndex
local result = 0
local str = ""
if index == 1 then
cache = {}
end
if index < period then
cache[index] = 0
return 0
end
for i = index - period + 1, index do
sum = sum + C(i)
end
result = sum / period
cache[index] = result
return result
end
end
function _EMA()
local cache={}
local MA = _MA()
return function(ind, _p, kk)
local n = 0
local p = 0
local period = _p
local index = ind
local k = kk or 2/(period + 1)
if index == 1 then
cache = {}
end
if index <= period then
cache[index] = 0
return 0
end
if cache[index - 1] == 0
or cache[index - 1] == nil then
p = MA(index - 1, period)
else
p = cache[index - 1]
end
n = C(index) * k + (1-k)*p
cache[index] = n
return n
end
end |