1. Сначала придумываем идею.
Ну, например, у нас будет какая-то загадочная кривая пересекаться с ценой и таким образом будет давать сигнал на покупку или продажу.
Делаем для нее функцию: my_function
Пример скрипта:
--[[
Название индикатора на русском для справки
--]]
Settings={
Name="my_ind",
prf=0, -- =1 - показать профит
sign=0, -- =1 - показать сигнал
SLP = 1.0, -- стоплосс
tar = 0.03, -- тариф %
Param=10, -- Параметр индикатора
line=
{
{
Name = "cur1",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0, 0)
},
{
Name = "cur2",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0, 0)
},
{
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)
}
}
}
function my_function(index)
val = math.random(Settings.Param) - Settings.Param/2
val = O(index) + val
return val
end
function Init()
return 6
end
function OnCalculate(index)
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
value = {}
value[index] = O(index)
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]
value[index] = my_function(index)
if
pos[index] ~= 1 and
O(index) > value[index] and
O(index-1) <= value[index-1] and
dealx[index] ~= index
then -- long
pos[index] = 1
deal[index] = O(index)
dealx[index] = index
SLV[index] = SLP*O(index)/100
else
if
pos[index] ~= -1 and
O(index) < value[index] and
O(index-1) >= value[index-1] and
dealx[index] ~= index
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]
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]
then -- cash
pos[index] = 0
deal[index] = 0
dealx[index] = 1
end
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
return prof[index]
else
if Settings.sign == 1 then
return value[index]
else
return nil
end
end
end
В первой области ставим значение парамеnра sign = 1 для отображения сигналов:
Дорабатываем индикатор до того чтоб он показал нормальную доходность.
Доходность можно вывести в отдельной области указав параметр prf=1:
В результате получаем картинку типа такой:
В данном случае функция генерит случайное значение от -5 до +5 и прибавляет к текущей цене. Идея бредовая, но для сравнения работы в офлайне и онлайне нужно придумывать другую функцию.
2. Чтоб проверить как работает индикатор в онлайн, выбираем таймфрейм 1 минута, минимальные параметры, чтоб часто срабатывал и ждем пока не набегут сигналы. потом нажимаем правой клавишей «Скопировать». Окно копируется и индикатор за всю эту историю перестраивается как бы делает расчет в офлайне. И смотрим, совпадают ли сигналы в первом окне и в новом. Если совпадают то в офлайне он работает как в онлайне, чего нам и нужно.
Другой вариант когда функция рассчитывает среднее значение, длина = 100, так же в индикатор уже внедрен функциона по стоплоссу:
--[[
Название индикатора на русском для справки
--]]
Settings={
Name="my_ind",
prf=0, -- =1 - показать профит
sign=0, -- =1 - показать сигнал
SLP = 1.0, -- стоплосс
tar = 0.03, -- тариф %
Param=100, -- Параметр индикатора
line=
{
{
Name = "cur1",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0, 0)
},
{
Name = "cur2",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0, 0)
},
{
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)
}
}
}
function my_function(index)
if index == 1 then
ma = {}
mas = {}
ma[index] = nil
mas[index] = O(index)
else
mas[index] = mas[index-1] + O(index)
ma[index] = nil
end
if index > Settings.Param and Settings.Param ~= 0 then
ma[index] = (mas[index] - mas[index - Settings.Param])/Settings.Param
end
return ma[index]
end
function Init()
return 6
end
function OnCalculate(index)
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
value = {}
value[index] = my_function(index)
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]
value[index] = my_function(index)
if value[index-1] ~= nil then
if
O(index) > value[index] and
O(index-1) <= value[index-1] and
dealx[index] ~= index and
(
(
O(index) < deal[index] or
O(index) > deal[index] + SLV[index]
) and pos[index] == -1
or
pos[index] == 0
)
then -- long
pos[index] = 1
deal[index] = O(index)
dealx[index] = index
SLV[index] = SLP*O(index)/100
else
if
O(index) < value[index] and
O(index-1) >= value[index-1] and
dealx[index] ~= index and
(
(
O(index) > deal[index] or
O(index) < deal[index] - SLV[index]
) and pos[index] == 1
or
pos[index] == 0
)
then -- short
pos[index] = -1
deal[index] = O(index)
dealx[index] = index
SLV[index] = SLP*O(index)/100
end
end
end
if deal[index] ~= 0 and pos[index] == 1 and
deal[index] - O(index) > SLV[index]
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]
then -- cash
pos[index] = 0
deal[index] = 0
dealx[index] = 1
end
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
return prof[index]
else
if Settings.sign == 1 then
return value[index]
else
return nil
end
end
end
Получаем такой индикатор:
В индикаторе так же используется такой параметр как тариф, что приближает к реальным условиям торгов.
Мой телеграм: https://t.me/autotradering