Дмитрий Киреев, вот тебе исправленная (если заменятся кавычки поправь):
--[[
Адаптивная среднияя, задается минимаьный период,
на котором не может быть больше одного пересечения с ценой
--]]
Settings = {
Name = "*AdapMAv1",
per = 30, — [ период поиска пересечений ]
sign = 0, -- [ 1 = показывать сигналы Buy/Sell ]
line = {
{Name=«MA», Type=TYPE_LINE, Width=1, Color=RGB(128,192,222)},
{Name=«Buy», Type=_G.TYPE_TRIANGLE_UP, Width=3, Color=RGB(0,200,0)},
{Name=«Sell», Type=_G.TYPE_TRIANGLE_DOWN, Width=3, Color=RGB(255,50,50)}
}
}
local cachedN, cachedPer = nil, nil
local arrMA, arrBuy, arrSell
local function rebuild(N, per)
arrMA, arrBuy, arrSell = {}, {}, {}
— [ накопительная сумма Open ]
local sumO = {}
for i = 1, N do
sumO[i] = (sumO[i-1] or 0) + (O(i) or 0)
end
— [ кэш SMA(p) для всех p = 20, 25, ..., 100 ]
local smaCache = {}
for p = 20, 100, 5 do
local arr = {}
for i = p, N do
arr[i] = (sumO[i] — (sumO[i-p] or 0)) / p
end
smaCache[p] = arr
end
local prevMA = nil
local pos = 0
for index = 1, N do
— [ выбор адаптивного периода pi ]
local pi = per
if index > per then
for p = 20, 100, 5 do
local smaP = smaCache[p]
local cnt = 0
if index > p + per + 2 then
for i = index — 1, index — per, -1 do
local y = smaP[i]
local y1 = smaP[i-1]
local oi = O(i)
local oi1 = O(i-1)
if y and y1 and oi and oi1 then
if (oi > y and oi1 <= y1) or (oi < y and oi1 >= y1) then
cnt = cnt + 1
end
end
end
end
if cnt < 2 then
pi = p
break
end
end
end
— [ MA с текущим pi ]
local ma
if index >= pi then
ma = (sumO[index] — (sumO[index-pi] or 0)) / pi
elseif prevMA then
ma = prevMA
else
ma = O(index) or 0
end
arrMA[index] = ma
— [ направление MA ]
local newPos = 0
if prevMA then
if ma > prevMA then newPos = 1
elseif ma < prevMA then newPos = -1
end
end
— [ сигналы на смене направления ]
if pos ~= 1 and newPos == 1 then
arrBuy[index] = ma
end
if pos ~= -1 and newPos == -1 then
arrSell[index] = ma
end
prevMA = ma
pos = newPos
end
end
function Init()
cachedN, cachedPer = nil, nil
arrMA, arrBuy, arrSell = {}, {}, {}
return 3
end
function OnCalculate(i)
local N = Size()
local per = tonumber(Settings.per) or 30
local sign = tonumber(Settings.sign) or 0
if cachedN ~= N or cachedPer ~= per then
cachedN, cachedPer = N, per
rebuild(N, per)
end
if not arrMA or i < 1 or i > N then
return nil, nil, nil
end
— [ линия 1: MA ]
local line1 = arrMA[i]
— [ линии 2-3: сигналы Buy/Sell ]
local line2, line3 = nil, nil
if sign == 1 then
line2 = arrBuy[i]
line3 = arrSell[i]
end
1. Ниже 2125 пока не пойдёт.
2. График терминала сместить от правой шкалы влево на 5 и более периодов для перспективы взгляда, шоб не упираться лбом в стену…
Даж по теханализу делал неправильно. После начала основного движения вниз и закрытия имбаланса часовой свечи цена скорректировалась вверх УЖЕ ПРОТИВ ТЕБЯ. Тебе надо не торопиться со входом (лучше пропусти этот и жди следующий сетап) — ЖДИ ЗАВЕРШЕНИЯ МАНИПУЛЯЦИИ (а близ экстремумов они обязательны) и тогда уже заходи!