Избранное трейдера OnlyHuman

— Складывает Value графиков GraphId1 и GraphId2
— При запуске на загрузке Quik'а работает код предыдущей загрузки
— с последними свойствами, полученными из кода или интерактивно.
— При запуске старые бары графика данных сканируются дважды,
— только если есть подключение к серверу.
— При смене тайм-фрейма старые бары сканируются только единожды.
— При загрузке Quik'а первый скан до подключения к серверу.
CandlesOK = true
Settings = { — После смены тайм-фрейма нужно интерактивное подтверждение
Name = "_Add"
,GraphId1 = «Tag-1» — Перезадать оба после первой загрузки.
,GraphId2 = «Tag-2» — Сохраняются при последующих запусках.
,Factor1 = 1 — Для GraphId1
,Factor2 = 1 — Для GraphId2
,Base1 = 0 — Для GraphId1
,Base2 = 0 — Для GraphId2
,Value = «close»
,line = { — Исчезает прогррамный доступ после 1-го интерактивного изменения
{Name = «close»
,Color = RGB(255,255,0) — Жёлтый
,Type = TYPE_HISTOGRAM — POINT, LINE, DASH, DOT, HISTOGRAM,
,Width = 2} — TRIANGLE_UP, TRIANGLE_DOWN.
}
}
function Init()
local s = «Indicator _Add:»
if 0 == getNumCandles (Settings.GraphId1) then
CandlesOK = false
s = s .."\n invalid GraphId1"
end
if 0 == getNumCandles (Settings.GraphId2) then
CandlesOK = false
s = s .."\n invalid GraphId2"
end
if not CandlesOK then message (s) end
return #Settings.line
end — Init()
function OnCalculate (index)
if index == 1 then
CandlesOK = true
if 0 == getNumCandles (Settings.GraphId1) or
0 == getNumCandles (Settings.GraphId2) then
CandlesOK = false
end
--[[message («Settings.Value »… tostring (Settings.Value)
.."\nSettings.line "… tostring (Settings.line)
.."\nCandlesOK "… tostring (CandlesOK))--]]
if Settings.Value ~= «open» and Settings.Value ~= «high» and
Settings.Value ~= «low» and Settings.Value ~= «close» then
Settings.Value = «close»
message («Indicator _Add: Value must be open/high/low/close»)
end
end
if not CandlesOK then return nil end
local candle1 = (getCandlesByIndex (Settings.GraphId1, 0, index-1, 1))[0]
local candle2 = (getCandlesByIndex (Settings.GraphId2, 0, index-1, 1))[0]
local val1 = candle1[Settings.Value]
local val2 = candle2[Settings.Value]
— Результат return res == 0 and nil or res всегда 0 при res == 0
if val1 == 0 or val2 == 0 then return nil end
return (val1 + Settings.Base1) * Settings.Factor1
+ (val2 + Settings.Base2) * Settings.Factor2
end — OnCalculate()
import requests
import datetime
import pathlib
SECIDs = ["GAZP", "BANEP", "LKOH"]
DISK = "E"
for SECID in SECIDs:
from_date = "2020-05-04"
to_date = "2005-01-03"
while str(to_date) != from_date:
to_date = str(to_date)
to_date = to_date.split('-')
a = datetime.date(int(to_date[0]), int(to_date[1]), int(to_date[2]))
b = datetime.timedelta(days=140)
to_date = a + b
pathlib.Path("{}:/{}/{}".format(DISK, "Database_MOEX", SECID)).mkdir(parents=True, exist_ok=True)
filename = SECID + "_" + str(to_date) + ".csv"
with requests.get("http://iss.moex.com/iss/history/engines/stock/markets/shares/boards/tqbr/securities/{}.csv?date={}".format(SECID, to_date)) as response:
with open("{}:/Database_MOEX/{}/{}".format(DISK, SECID, filename), 'wb') as f:
for chunk in response.iter_content():
f.write(chunk)Для начала пройдемся по его плюсам и минусам. Самый главный минус, что этот парсер качает только определенный период, который уникален для каждой акции, судя по всему для увеличения этого периода надо кинуть бирже на лапу:), и то что информация предоставляется за день, теперь перейдем к плюсам: можно выкачивать историю за определенный период для нескольких инструментов сразу (их количество ограничивается лишь количеством инструментов на мосбиржи), есть возможность назначать диск для сохранения информации, быстрота выгрузки данных.
Как-то писал, что не стоит хранить деньги в товарах. Повторюсь. Комодитиз могут случайно оказаться лучше инфляции, но закономерно они почти всегда хуже. Ставка на товары это и есть, в конечном счете, ставка на инфляцию. Неважно, что в коробке – золото, нефть, металлы, древние и ценные ништяки. Усредненный апсайд здесь только размер инфляции, минус спред, комиссии, черные лебеди, мошенники и т.д. Нет хорошего способа сделать это – фьючерс, етф, металлический счет, физические предметы – все сравнительно плохие, каждый по-своему.
Но если упорствовать в ассет алокейшн, то хочется сделать ставочки на все клеточки. И хоть что-то поставить на клетку «товары». Но я сказал – куда ни плюнь, все плохо. Но выход есть.
Функционально этой ставкой будет покупка антиинфляционных облигаций, «типсов», как говорят в США. У нас это ОФЗ ИН 52001 и 52002.
Да, это называется «облигация». Но по сути это ближе, например, к золоту, чем к нормальному долговому активу.

Bank of America повысил 18-месячную цель по золоту до уровня 3000 $. Цель была повышена с уровня 2000 $, пишет Bloomberg.
Это на 50% выше, чем исторический рекорд в 2011. Такую рекомендацию банк выдал в своём отчете под названием «The Fed can’t print gold».
На текущих уровнях я снова покупаю золото.

________________
telegram: renat_vv

--[[
индикатор:
канал на последнем зигзаге
индикатор строит канал по зигзагу, показывает слом тренда при выходе цены за границы канала
параметры:
Procent - величина зигзага в %
k - коэффизиент ширины канала
Ext - =0-канал стоится по средним =1-канал стоится по экстремуму
--]]
Settings=
{
Name = "Zigzag_channel_inc", -- название индикатора
Procent=5, -- величина зигзага в %
k=2, -- коэффизиент ширины канала
Ext=1, -- =0-канал стоится по средним =1-канал стоится по экстремуму
shif=0,
line=
{
{
Name = "zigzagline",
Type =TYPE_LINE,
Width = 1,
Color = RGB(120,90, 140)
},
{
Name = "cur1",
Type =TYPE_LINE,
Width = 1,
Color = RGB(0,0, 0)
},
{
Name = "cur2",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,200, 200)
},
{
Name = "cur3",
Type =TYPE_LINE,
Width = 2,
Color = RGB(200,200, 0)
},
{
Name = "cur4",
Type =TYPE_LINE,
Width = 1,
Color = RGB(0,0, 0)
},
{
Name = "cur5",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0, 255)
},
{
Name = "cur6",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0, 0)
},
{
Name = "cur7",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0, 0)
},
{
Name = "cur8",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0, 0)
},
{
Name = "cur9",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0, 0)
},
{
Name = "cur10",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0, 0)
},
{
Name = "cur11",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0, 0)
},
{
Name = "cur12",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0, 0)
}
}
}
function Init()
y1 = nil
y2 = nil
y3 = nil
y4 = nil
x1 = 1
x2 = 1
x3 = 1
x4 = 1
oldindex = 1
a_01 = 0
b_01 = 0
a_02 = 0
b_02 = 0
vminus_01 = 0
vplus_01 = 0
vminus_02 = 0
vplus_02 = 0
vFrom_01 = 1
vTo_01 = 1
vFrom_02 = 1
vTo_02 = 1
vminus = 0
vplus = 0
vminus_n = 0
vplus_n = 0
ret = 0
last_ind = 1
v1=nil
v2=nil
v3=nil
v4=nil
v5=nil
v6=nil
v7=nil
v8=nil
v9=nil
v10=nil
v11=nil
v12=nil
v13=nil
return 13
end
function recalcline(num, index, rec)
if index == Size()-sh and rec == 0 then
for i = 1, index do
if m == 1 then
SetValue(i, 3, nil)
SetValue(i, 4, nil)
end
if m == 2 then
SetValue(i, 6, nil)
SetValue(i, 7, nil)
end
end
end
if index == Size()-sh or rec == 1 then
if num == 1 then
vFrom = 0 --[[ --]]
vTo = 0
if x3 < x2 then
vFrom = x3
vTo = x2
else
vFrom = x2
vTo = x3
end
end
if num == 2 then
vFrom = 0
vTo = 0
if x1 < x2 then
vFrom = x1
vTo = x2
else
vFrom = x2
vTo = x1
end
end
if vFrom < 1 then
vFrom = 1
end
a1 = 0
a2 = 0
a3 = 0
a4 = 0
n = 0
a = 0
b = 0
for i = vFrom, vTo do
n=n+1
a1 = a1+i*C(i)
a2 = a2+i
a3 = a3+C(i)
a4 = a4+i*i
end
if((n*a4 - a2*a2) ~= 0) then
-- if oldindex ~= Size() then
a = (n*a1 - a2*a3)/(n*a4 - a2*a2)
b = (a3 - a*a2)/n
vminus = 0
vplus = 0
vminus_n = 0
vplus_n = 0
for i = vFrom, index do
y = a*i + b
if C(i) < y and i <= vTo then
if ex == 0 then
vminus = vminus + y - C(i)
vminus_n = vminus_n + 1
else
if i == vFrom then
vminus = 0
end
if y-C(i) > vminus then
vminus = y-C(i)
end
end
end
if C(i) > y and i <= vTo then
if ex == 0 then
vplus = vplus + C(i) - y
vplus_n = vplus_n + 1
else
if i == vFrom then
vplus = 0
end
if C(i)-y > vplus then
vplus = C(i)-y
end
end
end
m = 0
if C(vTo) > C(vFrom) and y < C(vTo)+0.1*(C(vTo)-C(vFrom)) and y > C(vFrom)-0.1*(C(vTo)-C(vFrom)) then
m = 1
end
if C(vTo) < C(vFrom) and y < C(vFrom)+0.1*(C(vFrom)-C(vTo)) and y > C(vTo)-0.1*(C(vFrom)-C(vTo)) then
m = 1
end
if m == 1 then
--SetValue(i, 2, y)
end
end
--end
if ex == 0 then
if vminus_n ~= 0 then
vminus = kk*vminus/vminus_n
end
if vplus_n ~= 0 then
vplus = kk*vplus/vplus_n
end
end
end
if num == 1 then
a_01 = a
b_01 = b
vminus_01 = vminus
vplus_01 = vplus
vFrom_01 = vFrom
vTo_01 = vTo
end
if num == 2 then
a_02 = a
b_02 = b
vminus_02 = vminus
vplus_02 = vplus
vFrom_02 = vFrom
vTo_02 = vTo
end
return 1
end
return 0
end
function levels(x, y, num, index, rec)
if y ~= nil and x ~= 1 and (index ==Size() or rec==1) then
for i = 1, index do
if i >= x then
SetValue(i, num, y)
else
SetValue(i, num, nil)
end
end
end
end
function inclevels(x_1, y_1, x_2, y_2, y_3, index, num, rec)
if y_2 ~= nil and x_2 ~= 1 and (index ==Size() or rec==1) then
need = 1
for i = x_2+1, x_1-1 do
y = ((y_2 - y_1)*i - x_1*y_2 + x_2*y_1 )/(x_2-x_1)
if (y_1 < y_3 and C(i) < y ) or (y_1 > y_3 and C(i) > y ) then
need = 0
break
end
end
--need = 1
if need == 1 then
for i = x_2, index do
y = ((y_2 - y_1)*i - x_1*y_2 + x_2*y_1 )/(x_2-x_1)
if i >= x_2 then
if i > x_1 and (C(Size())*1.3 < y or C(Size())*0.7 > y) then
SetValue(i, num, nil)
else
SetValue(i, num, y)
end
else
SetValue(i, num, nil)
end
end
end
end
end
function OnCalculate(index)
de = Settings.Procent
kk = Settings.k
ex = Settings.Ext
sh = Settings.shif
v1=nil
v2=nil
v3=nil
v4=nil
v5=nil
v6=nil
v7=nil
v8=nil
v9=nil
v10=nil
v11=nil
v12=nil
if index > Size()-sh then
--return nil, nil, nil, nil, nil, nil, nil
return v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11 , v12, v13
end
vl = C(index)
if index == 1 then
y1 = vl
y2 = vl
else
if C(index) > y1*(1+de/100) and y1 < y2 then
x4 = x3
x3 = x2
x2 = x1
y4 = y3
y3 = y2
y2 = y1
x1 = index
y1 = C(index)
ret = recalcline(1, index, 0)
ret = recalcline(2, index, 0)
levels(x1, y1, 8, index, 0)
levels(x2, y2, 9, index, 0)
levels(x3, y3, 10, index, 0)
levels(x4, y4, 11, index, 0)
inclevels(x1, y1, x3, y3, y2, index, 12, 0)
inclevels(x2, y2, x4, y4, y3, index, 13, 0)
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
x4 = x3
x3 = x2
x2 = x1
y4 = y3
y3 = y2
y2 = y1
x1 = index
y1 = C(index)
ret = recalcline(1, index, 0)
ret = recalcline(2, index, 0)
levels(x1, y1, 8, index, 0)
levels(x2, y2, 9, index, 0)
levels(x3, y3, 10, index, 0)
levels(x4, y4, 11, index, 0)
inclevels(x1, y1, x3, y3, y2, index, 12, 0)
inclevels(x2, y2, x4, y4, y3, index, 13, 0)
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
--]]
if index == Size()-sh and ret == 0 then
ret = recalcline(1, index, 1)
ret = recalcline(2, index, 1)
levels(x1, y1, 8, index, 1)
levels(x2, y2, 9, index, 1)
levels(x3, y3, 10, index, 1)
levels(x4, y4, 11, index, 1)
inclevels(x1, y1, x3, y3, y2, index, 12, 1)
inclevels(x2, y2, x4, y4, y3, index, 13, 1)
end
if index == Size()-sh then --- and index ~= last_ind
if vTo_01 - vFrom_01 > 500 then
vFrom_01 = vTo_01-500
end
for i = vFrom_01, index do
y = a_01*i + b_01 + vplus_01
m = 0
if C(vTo_01) > C(vFrom_01) and y < C(vTo_01)+0.3*(C(vTo_01)-C(vFrom_01)) and y > C(vFrom_01)-0.3*(C(vTo_01)-C(vFrom_01)) then
m = 1
end
if C(vTo_01) < C(vFrom_01) and y < C(vFrom_01)+0.3*(C(vFrom_01)-C(vTo_01)) and y > C(vTo_01)-0.3*(C(vFrom_01)-C(vTo_01)) then
m = 1
end
if m == 1 then
SetValue(i, 3, y)
if i == index then
v3 = y
end
end
y = a_01*i + b_01 - vminus_01
m = 0
if C(vTo_01) > C(vFrom_01) and y < C(vTo_01)+0.3*(C(vTo_01)-C(vFrom_01)) and y > C(vFrom_01)-0.3*(C(vTo_01)-C(vFrom_01)) then
m = 1
end
if C(vTo_01) < C(vFrom_01) and y < C(vFrom_01)+0.3*(C(vFrom_01)-C(vTo_01)) and y > C(vTo_01)-0.3*(C(vFrom_01)-C(vTo_01)) then
m = 1
end
if m == 1 then
SetValue(i, 4, y)
if i == index then
v4 = y
end
end
end
if vTo_02 - vFrom_02 > 500 then
vFrom_02 = vTo_02-500
end
for i = vFrom_02, index do
y = a_02*i + b_02 + vplus_02
m = 0
if C(vTo_02) > C(vFrom_02) and y < C(vTo_02)+0.1*(C(vTo_02)-C(vFrom_02)) and y > C(vFrom_02)-0.1*(C(vTo_02)-C(vFrom_02)) then
m = 1
end
if C(vTo_02) < C(vFrom_02) and y < C(vFrom_02)+0.1*(C(vFrom_02)-C(vTo_02)) and y > C(vTo_02)-0.1*(C(vFrom_02)-C(vTo_02)) then
m = 1
end
if m == 1 then
SetValue(i, 6, y)
if i == index then
v6 = y
end
end
y = a_02*i + b_02 - vminus_02
m = 0
if C(vTo_02) > C(vFrom_02) and y < C(vTo_02)+0.1*(C(vTo_02)-C(vFrom_02)) and y > C(vFrom_02)-0.1*(C(vTo_02)-C(vFrom_02)) then
m = 1
end
if C(vTo_02) < C(vFrom_02) and y < C(vFrom_02)+0.1*(C(vFrom_02)-C(vTo_02)) and y > C(vTo_02)-0.1*(C(vFrom_02)-C(vTo_02)) then
m = 1
end
if m == 1 then
SetValue(i, 7, y)
if i == index then
v7 = y
end
end
end
last_ind = index
end
return v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11 , v12, v13
endВсем привет.
Все кто давно пользуется терминалом Квик – знают, что со временем он начинает «подтормаживать», долго загружаться, медленно переключаться между вкладками, а в особо тяжёлых случаях проводить заявки с задержкой. А это уже чревато потерей реальных денег….
В этой статье мы рассмотрим простые действия для ускорения работы Квика, которые нужно проводить регулярно, как сервисное обслуживание в автомобиле. А чтобы был спортивный интерес – проведем замер скорости загрузки терминала.
Поехали!
Итак – включаем секундомер и делаем первоначальные замеры:
Результат времени загрузки до появления окна загрузить новую версию
1 минута 21 секунда.
Ну что ж…. За работу:
1-е что мы сделаем удалим лог файл, который больше всего влияет на загрузку. Переходим в папку с Квиком


