
--[[
параметры:
Procent - процент зигзага
--]]
Settings={
Name="ZIGZAGPROF",
Procent=1,
line=
{
{
Name = "cur1",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0, 0)
},
{
Name = "cur2",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0, 255)
}
}
}
function Init()
y1 = nil
y2 = nil
x1 = 1
x2 = 1
return 1
end
function OnCalculate(index)
de = Settings.Procent
delt = 0.01
vl = C(index)
if index == 1 then
y1 = vl
y2 = vl
else
if C(index) > y1*(1+de/100) and y1 < y2 then
x2 = x1
y2 = y1
x1 = index
y1 = C(index)
end
if C(index) > y1 and C(index) > y2 then
x1 = index
y1 = C(index)
end
if C(index) < y1*(1-de/100) and y1 > y2 then
x2 = x1
y2 = y1
x1 = index
y1 = C(index)
end
if C(index) < y1 and C(index) < y2 then
x1 = index
y1 = C(index)
end
end
if x1 ~= index then
curfrom = x1
curto = index
else
curfrom = x2
curto = x1
end
--[[
if curto ~= curfrom and curfrom ~= nil and curto ~= nil then
if C(curto) ~= nil and C(curfrom) ~= nil then
k = (C(curto)- C(curfrom))/(curto- curfrom)
for i = curfrom, index do
curv = i*k + C(curto) - curto*k
SetValue(i, 1, curv)
end
end
end
--]]
lev = nil
if x1 ~= x2 then
k = (C(x1)- C(x2))/(x1- x2)
maxd = 0
for i = x2, x1 do
lev = i*k + C(x1) - x1*k
if C(x2) > C(x1) and lev <= H(i)
then
if maxd < H(i) - lev then
maxd = H(i) - lev
end
--maxd = 0.5
end
if C(x2) < C(x1) and lev >= L(i)
then
if maxd > L(i) - lev then
maxd = L(i) - lev
end
--maxd = -0.5
end
end
lev = nil
--[[if x1 < index
and
(
C(x2) > C(x1) and C(x1) < C(index)
or
C(x2) < C(x1) and C(x1) > C(index)
)
then --]]
lev =
index*k + C(x1) - x1*k +
maxd
--end
--[[
map = 10
lev = 0
if index-map+1 > 0 then
for i = index-map+1, index do
lev = lev + C(i)
end
lev = lev/map
ma = lev
end
map = 30
lev2 = 0
if index-map+1 > 0 then
for i = index-map+1, index do
lev2 = lev2 + C(i)
end
lev2 = lev2/map
ma2 = lev2
end
if
C(x2) > C(x1) and C(x1) < C(index) and C(index) > lev and C(index) - C(x1) > C(index)*delt
or
C(x2) > C(x1) and C(x1) < C(index) and C(index) > lev2
then
lev = C(x1)--*(1-delt)
prev = lev
else
if
C(x2) < C(x1) and C(x1) > C(index) and C(index) < lev and C(x1) - C(index) > C(index)*delt
or
C(x2) < C(x1) and C(x1) > C(index) and C(index) < lev2
then
lev = C(x1)--*(1+delt)
prev = lev
else
lev = lev2
end
end
if
C(x1) > C(x2) and ( lev < C(index) or prev == C(x2) )
then
lev = C(x2)--*(1+delt)
prev = lev
end
if
C(x1) < C(x2) and ( lev > C(index) or prev == C(x2) )
then
lev = C(x2)--*(1-delt)
prev = lev
end
if C(x1) < C(x2) and ( lev < C(index) or prev == C(x1) )
then
lev = C(x1)
prev = lev
end
if C(x1) > C(x2) and ( lev > C(index) or prev == C(x1) )
then
lev = C(x1)
prev = lev
end
--]]
end
return lev
end
Это описание оригинала. Единственное я там какие то делал махинации с кодировкой файла чтобы он запустился.
У меня задача чтобы хеджировать портфель акций фьючерсом мини миксом. То есть шортить его.
1. Сейчас скрипт работает только лонг. Сделать такой же, только в шорт.
2. Сейчас есть настройка размера уровня, через который снова идет усреднение. Хочу чтобы еще был множитель, на который этот уровень увеличивается с каждым следующим уровнем усреднения. Каждый предыдущий на множитель. Первый 1, второй 1*1,1, третий 1*1,1*1,1, где 1,1 — множитель. Но множитель работает только на набор позиции, а на сброс всегда изначальный.
3. В лог нужно писать также размер профита накопительным итогом по всем сделкам и объем проторгованный для расчета комиссии брокера. Ну и можно ставку комиссии добавить чтобы счетать, если делаем п.4.
4. Если это не дофига займет времени, можно какую то панель вывести с параметрами. Какой следующий уровень набора, сброса, накопленный профит сегодня, за все время, объем комиссии.
5. У меня почему то он автоматом не запускается утром, приходится руками стартовать каждый раз. Думал может не успевает данные по тикерам получить, отсрочку старта ставил в минуту, но не помогло.
Прошу оценить задание с п.5 и без него.
Доработанный скрипт должен быть в открытом коде. Если кому-то нужен такой же, можете присоединиться к оплате автору доработок.
привет!
у меня в квике стояла камарилла аж с 2014 года, когда вы выложили здесь этот индикатор.
квик обновился до 8 и камарилла пропала.
это не исправить?
-- Camarilla.lua
Settings={
Name = "Camarilla",
period = 'D',
line =
{
{Name = "S5", Color = RGB(255, 0, 0), Type = 1, Width = 2},
{Name = "S4", Color = RGB(255, 165, 0), Type = 1, Width = 2},
{Name = "S3", Color = RGB(255, 255, 0), Type = 1, Width = 2},
{Name = "PP", Color = RGB(0, 255, 0), Type = 1, Width = 2},
{Name = "R3", Color = RGB(0, 191, 255), Type = 1, Width = 2},
{Name = "R4", Color = RGB(0, 0, 255), Type = 1, Width = 2},
{Name = "R5", Color = RGB(139, 0, 255), Type = 1, Width = 2},
}
}
local math_floor = math.floor
local levels = 0
local ydH, ydL, ydC, ydO = {},{},{},{}
local PP, R3, R4, R5 = 0,0,0,0
local S3, S4, S5 = 0,0,0
local delta = 0
local cl = 0
local predThisDay=0
local function dTs(t) return 100*(100*t.year+t.month)+t.day; end
local OldDay = '' -- для выделения начала торгового дня
function Init ()
local t=getDataSourceInfo()
local tt = t.interval
if tt == -3 then
message('Месячный график не обрабатывается.',1)
return
end
return 7
end
function OnCalculate (index)
local time tt=T(index); ---время из свечи
--local ThisDay=dTs(tt) -- дата в формате yyyyMMdd
local tDay=dTs(tt) -- дата в формате yyyyMMdd
local ThisDay = tDay
if Settings.period == 'W' then
ThisDay=tt.week_day -- номер недели
end
if index == 1 then
--message('First ThisDay = '..tostring(ThisDay),1)
local t=getDataSourceInfo()
--7.2.5 Функция предназначена для получения информации об источнике данных для индикатора.
local scale = getSecurityInfo(t.class_code, t.sec_code).scale -- NUMBER, Количество значащих цифр после запятой
mul = 10^scale -- возведение в степень
local tt = t.interval
if tt == -3 then tt = 'месяц'
elseif tt == -2 then tt = 'неделя'
elseif tt == -1 then tt = 'день'
else
tt = tt..' мин.'
end
--message(t.sec_code..'('..t.class_code..'), цифр после запятой: '..scale..', mul = '..mul..', дата = '..ThisDay,1)
levels = levels + 1
if ThisDay ~= OldDay then
OldDay = ThisDay
end
predThisDay = ThisDay
--
delta = H(index) - L(index)
cl = C(index)
R5 = (H(index) / L(index))*cl
calcLevels(index)
local per = 'daily'
if Settings.period == 'W' then
per = 'weekly'
end
message('Camarilla '..per..', Т = '..tt..', © xsharp.ru 20.06.2015', 1)
return
end
if Settings.period == 'W' then
if ThisDay < OldDay then -- для неделек
OldDay = OldDay + 1
if OldDay ~= ThisDay then
OldDay = ThisDay
end
levels = levels + 1
delta = ydH[levels-1] - ydL[levels-1]
cl = ydC[levels-1]
R5 = (ydH[levels-1] / ydL[levels-1])*cl
calcLevels(index)
--if index<120 then
--message('index= '..tostring(index)..', Смена недели: '..tostring(ThisDay)..', OldDay: '..tostring(OldDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
--end
predThisDay = ThisDay
else
if ThisDay ~=predThisDay then
--message('index= '..tostring(index)..', ThisDay= '..tostring(ThisDay)..', predThisDay: '..tostring(predThisDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
predThisDay = ThisDay
OldDay = OldDay + 1
end
ThisDayF(index)
end
elseif Settings.period == 'D' then
if ThisDay ~= OldDay then -- для дневок
OldDay = OldDay + 1
if OldDay ~= ThisDay then
OldDay = ThisDay
end
levels = levels + 1
delta = ydH[levels-1] - ydL[levels-1]
cl = ydC[levels-1]
R5 = (ydH[levels-1] / ydL[levels-1])*cl
calcLevels(index)
--if index<120 then
--message('index= '..tostring(index)..', Смена недели: '..tostring(ThisDay)..', OldDay: '..tostring(OldDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
--end
predThisDay = ThisDay
else
if ThisDay ~=predThisDay then
--message('index= '..tostring(index)..', ThisDay= '..tostring(ThisDay)..', predThisDay: '..tostring(predThisDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
predThisDay = ThisDay
OldDay = OldDay + 1
end
ThisDayF(index)
end
elseif Settings.period == 'H4' then
if ThisDay ~= OldDay then -- для дневок
OldDay = OldDay + 1
if OldDay ~= ThisDay then
OldDay = ThisDay
end
levels = levels + 1
delta = ydH[levels-1] - ydL[levels-1]
cl = ydC[levels-1]
R5 = (ydH[levels-1] / ydL[levels-1])*cl
calcLevels(index)
--if index<120 then
--message('index= '..tostring(index)..', Смена недели: '..tostring(ThisDay)..', OldDay: '..tostring(OldDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
--end
predThisDay = ThisDay
else
if ThisDay ~=predThisDay then
--message('index= '..tostring(index)..', ThisDay= '..tostring(ThisDay)..', predThisDay: '..tostring(predThisDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
predThisDay = ThisDay
OldDay = OldDay + 1
end
ThisDayF(index)
end
end
return S5, S4, S3, cl, R3, R4, R5
end
function round(value)
return math_floor(value*mul + 0.5) / mul
end
function ThisDayF(index)
ydC[levels] = C(index)
if H(index) > ydH[levels] then
ydH[levels] = H(index)
end
if L(index) < ydL[levels] then
ydL[levels] = L(index)
end
end
function calcLevels(index)
ydO[levels] = O(index)
ydH[levels] = H(index)
ydL[levels] = L(index)
ydC[levels] = C(index)
--
R3 = cl + delta * 1.1/4
R4 = cl + delta * 1.1/2
--
S3 = cl - delta * 1.1/4
S4 = cl - delta * 1.1/2
S5 = cl - (R5-cl)
--
R5 = round(R5)
R4 = round(R4)
R3 = round(R3)
S3 = round(S3)
S4 = round(S4)
S5 = round(S5)
end
