
Идея в том чтоб строить адаптивную среднюю. Значение адаптивной средней берем из значения какой либо средней из множества средних с разными длинами. Выбираем такую чтоб она пересекалась с текущим баром цены, но не было пересечений на количестве барах больше N предшествующих текущему. То есть выбираем среднюю, у которой не было пересечения с ценой уже давно.
--[[
вопросы к автору: https://smart-lab.ru/profile/autotrade/
Индикатор: адаптивная среднияя по пересечению средних с ценой
ищется та у которой макс период без пересеч
параметры:
cnt - колич средних
SLP - стоплосс
sign - признак показывать сигналы
prf - признак показывать профит
tar - признак тариф
--]]
Settings={
Name="ADAPT_MA_INTER_v1",
cnt=100,
SLP=2.0,
sign=0,
prf=0,
tar=0.03,
line=
{
{
Name = "cur1",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0,255)
},
{
Name = "cur2",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0,255)
},
{
Name = "TRIANGLE_DOWN",
Type =TYPE_TRIANGLE_DOWN,
Width = 5,
Color = RGB(255, 0, 0)
},
{
Name = "TRIANGLE_UP",
Type =TYPE_TRIANGLE_UP,
Width = 5,
Color = RGB(0, 0, 255)
},
{
Name = "cur5",
Type =TYPE_POINT,
Width = 5,
Color = RGB(255, 0, 255)
},
{
Name = "cur6",
Type =TYPE_POINT,
Width = 5,
Color = RGB(0, 0, 255)
},
{
Name = "cur7",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0,0)
},
{
Name = "cur8",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0,0)
}
}
}
function Init()
return 8
end
function OnCalculate(index)
--[[ --]]
cnt = Settings.cnt
if index == 1 then
sma = {{},{}}
ma = {{},{}}
sma[index] = {}
ma[index] = {}
for i = 10, cnt do
sma[index][i] = O(index)
ma[index][i] = O(index)
end
else
sma[index] = {}
ma[index] = {}
for i = 10, cnt do
sma[index][i] = sma[index-1][i] + O(index)
if i < index then
ma[index][i] = (sma[index][i] - sma[index-i][i])/i
else
ma[index][i] = O(index)
end
end
end
--intersections
if index == 1 then
intr = {{},{}}
intr[index] = {}
for i = 10, cnt do
intr[index][i] = index
end
else
intr[index] = {}
for i = 10, cnt do
intr[index][i] = intr[index-1][i]
if
ma[index][i] < O(index) and ma[index-1][i] >= O(index-1) or
ma[index][i] > O(index) and ma[index-1][i] <= O(index-1)
then
intr[index][i] = index
end
end
end
SLP = Settings.SLP
-- trades
if index == 1 then
prof = {}
pos = {}
SLV = {}
deal = {}
dealx = {}
prof[index] = 0
pos[index] = 0
SLV[index] = 0
deal[index] = 0
dealx[index] = 1
maxi = {}
maxi[index] = 10
else
prof[index] = prof[index-1]
pos[index] = pos[index-1]
SLV[index] = SLV[index-1]
deal[index] = deal[index-1]
dealx[index] = dealx[index-1]
maxi[index] = maxi[index-1]
vmax = (index - intr[index][ maxi[index] ]) / (0.5*(cnt - maxi[index]) + 1)
for i = 10, cnt do
if (index - intr[index-1][i])/(0.5*(cnt - i) + 1)
> vmax and index == intr[index][i] and
(
ma[index][maxi[index]] > O(index) and
ma[index][i] < O(index)
or
ma[index][maxi[index]] < O(index) and
ma[index][i] > O(index)
)
then
vmax = (index - intr[index-1][i])/(0.5*(cnt - i) + 1)
maxi[index] = i
end
end
if
(
ma[index][maxi[index]] < O(index) and pos[index] ~= 1
)
then -- long
pos[index] = 1
deal[index] = O(index)
dealx[index] = index
SLV[index] = SLP*O(index)/100
end
if
(
ma[index][maxi[index]] > O(index) and pos[index] ~= -1
)
then -- short
pos[index] = -1
deal[index] = O(index)
dealx[index] = index
SLV[index] = SLP*O(index)/100
end
end
--[[--]]
if deal[index] ~= 0 and pos[index] == 1 and
deal[index] - O(index) > SLV[index]--SLP*deal[index]/100
then -- cash
pos[index] = 0
deal[index] = 0
dealx[index] = 1
else
if deal[index] ~= 0 and pos[index] == -1 and
O(index) - deal[index] > SLV[index]--SLP*deal[index]/100
then -- cash
pos[index] = 0
deal[index] = 0
dealx[index] = 1
end
end
--[[
--]]
if index == Size() then
if Settings.sign == 1 then
for i = 2, Size() do
if pos[i] ~= nil and pos[i-1] ~= nil then
if pos[i-1] ~= 1 and pos[i] == 1 then
SetValue(i, 4, O(i))
else
if pos[i-1] ~= -1 and pos[i] == -1 then
SetValue(i, 3, O(i))
else
SetValue(i, 3, nil)
SetValue(i, 4, nil)
end
if pos[i] ~= pos[i-1] and pos[i] == 0 then
if pos[i-1] == 1 then
SetValue(i, 5, O(i))
else
SetValue(i, 6, O(i))
end
end
end
end
end
end
end
--[[--]]
-- profit
if Settings.prf==1 then
if pos[index-1] ~= nil then
if pos[index-1] == 1 then
prof[index] = prof[index-1] + (O(index) - O(index-1))
end
if pos[index-1] == -1 then
prof[index] = prof[index-1] + (O(index-1) - O(index))
end
if pos[index-1] == 0 then
prof[index] = prof[index-1]
end
if pos[index] ~= pos[index-1] then
if pos[index] == 0 or pos[index-1] == 0 then
prof[index] = prof[index] - Settings.tar*O(index)/100
else
prof[index] = prof[index] - 2*Settings.tar*O(index)/100
end
end
end
end
if Settings.prf==1 then
return prof[index]
else
if Settings.sign==1 then
return nil
else
return ma[index][maxi[index]]
end
end
end
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
Так его уже придумали.
Да вы что!? Не верю.
Спросите тогда у Элдера, если мне не верите.
надо протестировать.
1) брать только те где бар их пересекает.
— норм фильтр...
2) и смотреть именно эти средние доходные или убыточные при пересечении на истории.
3) в принципе можно даже сумму доходностей всех в фильтре сложить — и по ней смотреть.
а выходить получается по ДРУГИМ!)