OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
07.10.2025 13:26:58
, Если написать не можете, не важно по какой причине, верните человеку деньги и признайтесь, что не умеете.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
07.10.2025 13:24:40
, Вы продали Роману не работающий скрипт. Вместо того, чтобы переписать его, Вы переводите стрелки на QUIK. -------------------- Я написал Роману скрипт, который делает ровно тоже самое, что и Ваш и никуда не вываливается. ------------------------ Из беседы с романом предположу, что Вы еще и ошибаетесь в самом алгоритме построения индикаторов с большим периодом на меньших интервалах.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Проблема НЕ в индикаторе, который рисует линию с графика бОльшего таймфрейма. Вы неправильно поняли Романа.
Индикатору. у которого проблема не нужен другой график, он на текущем ТФ рассчитывает бары бОльшего ТФ и по ним считает МА. А сама проблема в функции SetValue, которая перерисовывает крайний час (с его начала) в текущем времени при любом изменении текущей цены, т.к. какого .... при обновлении ОИ видимо идет пересчет всего графика и подставляется номер бара начала часа из прошлого и дальше не обновляется. В коде ошибки нет, там все прозрачно, час сменился - номер бара запомнился. При нажатии ПРИМЕНИТЬ в настройках индикатора, все сразу становится нормально.
Я все понzл. Написал индикатор ровно такой же, которому не нужен другой график, он на текущем ТФ рассчитывает бары бОльшего ТФ и по ним считает МА. и ничего не ломает. Свой скрипт отправил Роману.
Скрипт ничего не ломает, это ОИ ломает нумерацию баров в функции OnCalculate и это не лечится. у меня такие же красивые картинки, как у вас, достаточно нажать 1 раз ПРИМЕНИТЬ.
Вот картинки с номерами баров ДО ПРИМЕНИТЬ и ПОСЛЕ ПРИМЕНИТЬ. Там где 2 числа - это день сменился на графике.
Т.е. в данном примере OnCalculate вызвался на баре 3194, а потом сразу на 3449
Есл у вас скрипт не ломается то в чем проблема. У Романа ваш скрипт не работает когда он добавляет график открытого интереса. ------------------------ Я ничего не понял из вашего рассказа про нумерацию. У меня такой проблемы нет и не было. ------------------- Так как проблема лишь у Вас то причина не в КВИКЕ, а в Вашем написании скрипта.
Multiframe MA, Добавьте индикатор
Пользователь
Сообщений: Регистрация: 30.01.2015
06.10.2025 15:11:19
Добавил параметры дня( открытие закрытие, локальные максимум и минимум дня)
Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе
Пользователь
Сообщений: Регистрация: 30.01.2015
06.10.2025 13:44:54
Корутина в луа - это функция, для которой создается отдельный state. Поэтому при выходе из корутины стейт не занимается другими функциями, а следовательно состояние корутины сохраняется и ее выполнение можно продолжить там, где вышли. --------------------- Но так как корутина выполняется в потоке VMLua, то она выполняется последовательно как и обычные функции луа.
Multiframe MA, Добавьте индикатор
Пользователь
Сообщений: Регистрация: 30.01.2015
06.10.2025 13:36:40
Индикатор на Lua отображает на графике с интервалом 1 мин три графика с интервалами 60,30 и 10 минут. (интервалы можно настроить)
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
06.10.2025 11:50:42
OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
06.10.2025 11:49:26
Написал ровно такой же , но который ничего не ломает.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Проблема НЕ в индикаторе, который рисует линию с графика бОльшего таймфрейма. Вы неправильно поняли Романа.
Индикатору. у которого проблема не нужен другой график, он на текущем ТФ рассчитывает бары бОльшего ТФ и по ним считает МА. А сама проблема в функции SetValue, которая перерисовывает крайний час (с его начала) в текущем времени при любом изменении текущей цены, т.к. какого .... при обновлении ОИ видимо идет пересчет всего графика и подставляется номер бара начала часа из прошлого и дальше не обновляется. В коде ошибки нет, там все прозрачно, час сменился - номер бара запомнился. При нажатии ПРИМЕНИТЬ в настройках индикатора, все сразу становится нормально.
Я все понzл. Написал индикатор ровно такой же, которому не нужен другой график, он на текущем ТФ рассчитывает бары бОльшего ТФ и по ним считает МА. и ничего не ломает. Свой скрипт отправил Роману.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
05.10.2025 11:40:22
теперь добавим открытый интерес
ничего не ломается
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
04.10.2025 17:48:44
Вот результат тестового скрипта. Индикатор может быть любой из встроенных в QUIK.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
04.10.2025 13:53:03
Возможно напишу скрипт, который позволяет любой индикатор с большим интервалом отобразить на графике цены с меньшим интервалом.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
04.10.2025 13:43:22
Цитата
Roman Koledin написал: ПРОСТО напишите бабки заплочу - дайте отрытый код
Будет время , напишу , покажу здесь результат.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
04.10.2025 08:33:30
пардон, не правильно понял. На меньшем интервале рисуется индикатор с большего интервала. Верно?
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
04.10.2025 08:10:12
Сомневаюсь, что виноват QUIK. Но без текста индикатора сложно сказать где ошибка автора. Правильно понимаю, что Вы хотите на графике с интервалом 1 час отобразить мувинг с интервалом 1 минута? Потом добавляете график OI с интервалом 1 минута на этот же график с интервалом 1 час?
индикатор на Lua
Пользователь
Сообщений: Регистрация: 30.01.2015
23.09.2025 18:58:02
Индикатор определяет максимум и минимум на заданном периоде и отображает среднее значение. Алгоритм оптимизировал для ускорения вычислений. Выкладываю для всех желающих:
Код
Settings = {Name = "*Kijun-sen",kijun_period = 6,}
function OnCalculate(i)
Hi=H(i) or H1; Li=L(i) or L1; x1=x;
if i1>i then
ma=Hi; mi=Li; jma=i; jmi=i;
end
if Hi and Li then
local j=i-Settings.kijun_period; if j<1 then j=1; end
if j>jma or j>jmi then
ma=Hi; mi=Li; jma=i; jmi=i;
while i>j do
Hi,Li=H(j),L(j)
if Hi and Hi>ma then ma = Hi jma=j; end
if Li and Li<mi then mi =Li jmi=j;end
j=j+1
end
else
if Hi>ma then ma=Hi; jma=i; end
if mi>Li then mi=Li; jmi=i; end
end
x=(ma + mi)/2; H1,L1,i1=Hi,Li,i;
end
return x1
end
function OnChangeSettings()
i1=0;jma=0; jmi=0; H1=0; L1=0;ma=0;mi=0;
end
function Init()
OnChangeSettings()
Settings.line = {{ Name=Settings.Name, Color=RGB(32,255,128), Type=TYPE_LINE, Width = 2,}}
return #Settings.line end
это мой вариант модификации этого алгоритма .
Код
Settings = {Name = "*ind_nk",period = 6,}
function OnCalculate(i)
Hi=H(i) or H1; Li=L(i) or L1;
Oi=O(i) or O1; Ci=C(i) or C1;
if i1>i then
ma=Hi; mi=Li; jma=i; jmi=i;
end
if Hi and Li and i1~=i then
local j=i-Settings.period; if j<1 then j=1; end
if j>jma or j>jmi then
ma=Hi; mi=Li; jma=i; jmi=i;
while i>j do
Hi,Li=H(j),L(j)
if Hi and Hi>ma then ma = Hi jma=j; end
if Li and Li<mi then mi =Li jmi=j;end
j=j+1
end
else
if Hi>ma then ma=Hi; jma=i; end
if mi>Li then mi=Li; jmi=i;
end
if x then
local z=2*Li-Hi; if Li>x and Ci>Oi then mi=z; jmi=i; end
z=2*Hi-Li; if x>Hi and Oi>Ci then ma=z; jma=i; end
end
end
if ma and mi then x=(ma + mi)/2; end
H1,L1,O1,C1,i1=Hi,Li,Oi,Ci,i;
end
return x
end
function OnChangeSettings()
i1=0;jma=0; jmi=0; H1=0; L1=0;ma=0;mi=0;
end
function Init()
OnChangeSettings()
Settings.line = {{ Name=Settings.Name, Color=RGB(255,255,255), Type=TYPE_LINE, Width = 2,}}
return #Settings.line end
Если нравится, можете сказать "спасибо".
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
23.09.2025 18:45:39
Оптимизировал алгоритм вычислений, чтобы считал быстрее. Выкладываю для всех желающих:
Код
Settings = {Name = "*Kijun-sen",kijun_period = 6,}
function OnCalculate(i)
Hi=H(i) or H1; Li=L(i) or L1; x1=x;
if i1>i then
ma=Hi; mi=Li; jma=i; jmi=i;
end
if Hi and Li then
local j=i-Settings.kijun_period; if j<1 then j=1; end
if j>jma or j>jmi then
ma=Hi; mi=Li; jma=i; jmi=i;
while i>j do
Hi,Li=H(j),L(j)
if Hi and Hi>ma then ma = Hi jma=j; end
if Li and Li<mi then mi =Li jmi=j;end
j=j+1
end
else
if Hi>ma then ma=Hi; jma=i; end
if mi>Li then mi=Li; jmi=i; end
end
x=(ma + mi)/2; H1,L1,i1=Hi,Li,i;
end
return x1
end
function OnChangeSettings()
i1=0;jma=0; jmi=0; H1=0; L1=0;ma=0;mi=0;
end
function Init()
OnChangeSettings()
Settings.line = {{ Name=Settings.Name, Color=RGB(32,255,128), Type=TYPE_LINE, Width = 2,}}
return #Settings.line end
Если нравится, можете сказать "спасибо".
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
22.09.2025 12:42:45
пардон, последний вариант считает иначе, поэтому остается этот:
Код
Settings = {
Name = "*Kijun-sen",
kijun_period = 15,
line = {{
Name = "Kijun-sen",
Color = RGB(255,255,255),
Type = TYPE_LINE,
Width = 2,
}}
}
function Init() return 1 end
function OnCalculate(i)
local Hi,Li=H(i),L(i);
if Hi and Li then
local j=i-Settings.kijun_period; if j<1 then j=1; end
max=Hi; min=Li;
while i>j do
Hi,Li=H(j),L(j)
if Hi and Hi>max then max = Hi end
if Li and Li<min then min =Li end
j=j+1 end
x=(max + min)/2;
end
return x
end
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
22.09.2025 12:34:07
Оптимизированный вариант обычный, считает тоже самое, но быстрее:
Код
Settings = {
Name = "*Kijun-sen",
kijun_period = 15,
line = {{
Name = "Kijun-sen",
Color = RGB(255,255,255),
Type = TYPE_LINE,
Width = 2,
}}
}
function Init() return 1 end
function OnCalculate(i)
local Hi,Li=H(i),L(i);
if Hi and Li then
if max==nil then max=Hi end
if min==nil then min=Li end
if Hi>max or min>Li then
local j=i-Settings.kijun_period; if j<1 then j=1; end
max=Hi; min=Li;
while i>j do
local Hj,Lj=H(j),L(j)
if Hj and Hj>max then max = Hj end
if Lj and Lj<min then min =Lj end
j=j+1 end
end
x=(max + min)/2;
end
return x;
end
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
22.09.2025 11:42:59
Это вариант как в задании:
Код
Settings = {
Name = "*Kijun-sen",
kijun_period = 26, -- Период Kijun-sen (можно изменить)
line = {{
Name = "Kijun-sen",
Color = RGB(0,255,255),
Type = TYPE_LINE,
Width = 2,
}}
}
function Init() return 1 end
function OnCalculate(i)
if H(i) and L(i) then
local j=i-Settings.kijun_period; if j<1 then j=1; end
max=H(i); min=L(i);
while i>j do
local H,L=H(j),L(j)
if H and H>max then max = H end
if L and L<min then min =L end
j=j+1 end
return (max + min)/2;
end
end
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
22.09.2025 11:17:26
попробуйте так (проверил)
Код
Settings = {
Name = "*Kijun-sen",
kijun_period = 26, -- Период Kijun-sen (можно изменить)
line = {{
Name = "Kijun-sen",
Color = RGB(0, 0, 255),
Type = TYPE_LINE,
Width = 2,
}}
}
function Init() return 1 end
function OnCalculate(i)
high = H(i) low = L(i)
if high and low then
if i==1 then
max = H(1) min = L(1)
else
if i%Settings.kijun_period==0 then max = high; min =low end
if high > max then max = high end
if low < min then min = low end
return (max + min)/2;
end
end
end
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
22.09.2025 11:02:00
исправит ошибку надо так:
Код
Settings = {
Name = "*Kijun-sen",
kijun_period = 26, -- Период Kijun-sen (можно изменить)
line = {{
Name = "Kijun-sen",
Color = RGB(0, 0, 255),
Type = TYPE_LINE,
Width = 2,
}}
}
написал: if i%Settings.kijun_period==0 then max_high = H(i); min_low = L(i) end
ошибка, так как Settings.kijun_period = nil. 2. Вместо скользящей вами предлагается "прыгающая" :: . Начальные значения каждого периода берутся в качестве экстремумов. Но может быть вы предлагаете свой прыгающий индикатор? ----------- Ниже выложен код реализации индикатора Kijun-sen приблизительно в 3,5 раза более эффективный по времени выполнения, чем то, что выложил Roman Koledin:
Код
Settings = {
Name = "*Kijun-sen_opt" ,
kijun_period = 26 , -- Период Kijun-sen (можно изменить)
line = {{
Name = "Kijun-sen_opt" ,
Color = RGB ( 0 , 0 , 200 ),
Type = TYPE_LINE,
Width = 2
}}
}
function Init () return 1 end
local kijun_period = Settings.kijun_period
function OnChangeSettings ()
kijun_period = Settings.kijun_period
end
---
local TT
local N_C = 500
function OnCalculate (index)
-- -- Вычисление времени обработки свеч --
-- if index == kijun_period + 1 then
-- TT = os.clock()
-- end
-- if index == N_C + kijun_period then
-- message('Kijun-sen. Время обработки ' .. N_C .. ' свечей (млс.) = ' .. (os.clock() - TT) * 1000)
-- end
if index = = 1 then
max_high = H( 1 )
min_low = L( 1 )
else
current_high = H(index)
current_low = L(index)
--------
if current_high > max_high then -- Пришел максимальный
max_high = current_high
else
if index > kijun_period then
-- Ушел из скользящего периода максимальный --
if H(index - kijun_period) > = max_high then -- поиск максимального
max_high = current_high
for j = index - kijun_period + 1 , index - 1 do
current_high = H(j)
if current_high > max_high then max_high = current_high end
end
end
end
end
---
if current_low < min_low then -- Пришел минимальный
min_low = current_low
else
if index > kijun_period then
-- Ушел из скользящего периода минимальный --
if L(index - kijun_period) < = min_low then -- поиск минимального
min_low = current_low
for j = index - kijun_period + 1 , index - 1 do
current_low = L(j)
if current_low < min_low then min_low = current_low end
end
end
end
end
end
return (max_high + min_low) / 2
end
нет не проверял. Да именно прыгающий. Я же написал - попробуйте это. Как другой вариант, который работает быстрее.
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
21.09.2025 15:46:36
Цитата
Roman Koledin написал: простите таже проблема можете помочь её исправить вод код
Settings = { Name = "*Kijun-sen", line = {{ Name = "Kijun-sen", Color = RGB(0, 0, 255), Type = TYPE_LINE, Width = 2 }} }
function Init() return 1 end
local kijun_period = 26 -- Период Kijun-sen (можно изменить)
function OnCalculate(index) -- Проверяем, достаточно ли данных для расчета if index < kijun_period - 1 then return nil end
-- Инициализация переменных для экстремумов local max_high = H(index - kijun_period + 1) local min_low = L(index - kijun_period + 1)
-- Поиск максимума и минимума за период for i = index - kijun_period + 2, index do local current_high = H(i) local current_low = L(i)
if current_high > max_high then max_high = current_high end
if current_low < min_low then min_low = current_low end end
-- Расчет Kijun-sen return (max_high + min_low) / 2 end
попробуйте так:
Код
Settings = {
Name = "*Kijun-sen",
line = {{
Name = "Kijun-sen",
Color = RGB(0, 0, 255),
Type = TYPE_LINE,
Width = 2,
kijun_period = 26 -- Период Kijun-sen (можно изменить)
}}
}
function Init() return 1 end
function OnCalculate(i)
if i==1 then
max_high = H(1)
min_low = L(1)
else
if i%Settings.kijun_period==0 then max_high = H(i); min_low = L(i) end
current_high = H(i)
current_low = L(i)
-- Поиск максимума и минимума за период
if current_high > max_high then max_high = current_high end
if current_low < min_low then min_low = current_low end
-- Расчет Kijun-sen
end
return (max_high + min_low) / 2
end
помогите написать kijun-sen line lua QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
21.09.2025 08:31:50
Цитата
Roman Koledin написал: Спасибо за ответ ---- НО - Вот что квик сообщает ------- C:\QUIK_SBER\LuaIndicators\Kijun-sen.lua:24: attempt to call a nil value (global 'High')
Скрипты от ИИ
Пользователь
Сообщений: Регистрация: 30.01.2015
21.09.2025 08:31:12
Вот что ответил ИИ: ------------------- Вы правы, в скрипте действительно есть ошибки. В языке Lua, который используется для индикаторов в торговых платформах (например, QUIK), для доступа к ценовым данным нужно использовать специальные функции:
High(i) → H(i)
Low(i) → L(i)
Open(i) → O(i)
Close(i) → C(i)
Исправленный код индикатора:
Settings = { Name = "*Kijun-sen", line = {{ Name = "Kijun-sen", Color = RGB(0, 0, 255), Type = TYPE_LINE, Width = 2 }} }
function Init() return 1 end
local kijun_period = 26 -- Период Kijun-sen (можно изменить)
function OnCalculate(index) -- Проверяем, достаточно ли данных для расчета if index < kijun_period - 1 then return nil end
-- Инициализация переменных для экстремумов local max_high = H(index - kijun_period + 1) local min_low = L(index - kijun_period + 1)
-- Поиск максимума и минимума за период for i = index - kijun_period + 2, index do local current_high = H(i) local current_low = L(i)
if current_high > max_high then max_high = current_high end
if current_low < min_low then min_low = current_low end end
помогите написать kijun-sen line lua QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
20.09.2025 07:45:59
Скрипты от ИИ
Пользователь
Сообщений: Регистрация: 30.01.2015
20.09.2025 07:45:38
Вариант индикатора kijun-sen line lua QUIK , который написал Ии ( не проверял).
Код
Settings = {
Name = "*Kijun-sen",
line = {{
Name = "Kijun-sen",
Color = RGB(0, 0, 255),
Type = TYPE_LINE,
Width = 2
}}
}
function Init()
return 1
end
local kijun_period = 26 -- Период Kijun-sen (можно изменить)
function OnCalculate(index)
-- Проверяем, достаточно ли данных для расчета
if index < kijun_period - 1 then
return nil
end
-- Инициализация переменных для экстремумов
local max_high = High(index - kijun_period + 1)
local min_low = Low(index - kijun_period + 1)
-- Поиск максимума и минимума за период
for i = index - kijun_period + 2, index do
local current_high = High(i)
local current_low = Low(i)
if current_high > max_high then
max_high = current_high
end
if current_low < min_low then
min_low = current_low
end
end
-- Расчет Kijun-sen
return (max_high + min_low) / 2
end
Скрипты от ИИ
Пользователь
Сообщений: Регистрация: 30.01.2015
19.09.2025 11:59:39
ИИ делал мне подобный скрипт и на Lua. Но для разработки Ai агентов он просит загрузить torch- luajit либо пишет агента на основе Q-таблицы. ----------------- Питон нем и прикольно, что я на нем особо не пишу и знаю его хуже, чем ИИ.
Скрипты от ИИ
Пользователь
Сообщений: Регистрация: 30.01.2015
19.09.2025 11:56:25
В последней версии загрузчика ИИ сделал сжатие сохраняемых файлов, что обеспечивает экономию диска примерно от 3 до 7 раз.
Скрипты от ИИ
Пользователь
Сообщений: Регистрация: 30.01.2015
19.09.2025 11:54:09
Цитата
Nikolay написал: И даже в этом простом коде ошибка - код обработки файла конфигурации не соответствует структуре json.
ИИ просто сделал у него такое расширение. но читает его в питоне и все нормально обрабатывает.
Скрипты от ИИ
Пользователь
Сообщений: Регистрация: 30.01.2015
17.09.2025 14:57:09
Сейчас отлаживаю с ИИ скрипт AI агента для торговли акциями. Весь код как и в предыдущий полностью написал ИИ. Полет нормальный.
Скрипты от ИИ
Пользователь
Сообщений: Регистрация: 30.01.2015
17.09.2025 14:54:10
Добрый день, Выкладываю работающий скрипт, который написал ИИ под моим руководством. ------------------------------- Скрипт позволяет загружать историю с биржи MOEX. ------------------------- Состоит из двух файлов. --------------- config.json
import os
import pandas as pd
import requests
import json
from datetime import datetime, timedelta
def load_config(config_file="config.json"):
"""
Загружает конфигурацию из JSON файла
Параметры:
config_file (str): Путь к файлу конфигурации
Возвращает:
dict: Конфигурация
"""
if not os.path.exists(config_file):
print(f"Файл конфигурации {config_file} не найден")
return None
try:
with open(config_file, 'r', encoding='utf-8') as f:
config = json.load(f)
return config
except Exception as e:
print(f"Ошибка при загрузке конфигурации: {e}")
return None
def fetch_moex_data(ticker, start_date, end_date, interval=60):
"""
Загружает данные с MOEX API для указанного тикера и временного периода
Параметры:
ticker (str): Тикер инструмента
start_date (datetime): Начальная дата загрузки
end_date (datetime): Конечная дата загрузки
interval (int): Интервал свечей в минутах (по умолчанию 60 минут)
Возвращает:
pd.DataFrame: DataFrame с загруженными данными
"""
data = []
current_start = start_date
print(f"Загрузка данных с MOEX для {ticker} (интервал: {interval} мин) с {start_date} по {end_date}...")
while True:
url = f"http://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities/{ticker}/candles.json"
params = {
'from': current_start.strftime('%Y-%m-%d'),
'till': end_date.strftime('%Y-%m-%d'),
'interval': interval,
'start': 0
}
try:
response = requests.get(url, params=params)
response.raise_for_status() # Проверка на ошибки HTTP
json_data = response.json()
if 'candles' not in json_data or 'data' not in json_data['candles']:
print("Нет данных в ответе API")
break
candles = pd.DataFrame(json_data['candles']['data'],
columns=json_data['candles']['columns'])
if len(candles) == 0:
break
data.append(candles)
# Обновляем время для следующего запроса
current_start = (pd.to_datetime(candles['end'].iloc[-1]) + timedelta(minutes=interval))
if len(candles) < 500: # Если получено меньше 500 записей, это последняя порция
break
except requests.exceptions.RequestException as e:
print(f"Ошибка при запросе данных: {e}")
break
print(f"Загружено {len(data)} блоков данных")
if not data:
return pd.DataFrame()
# Объединяем все блоки данных и удаляем дубликаты
return pd.concat(data).drop_duplicates()
def process_raw_data(raw_data):
"""
Обрабатывает сырые данные: разделяет begin на date и time, удаляет end
Параметры:
raw_data (pd.DataFrame): Сырые данные с MOEX
Возвращает:
pd.DataFrame: Обработанные данные
"""
# Разделение begin на date и time
raw_data['date'] = pd.to_datetime(raw_data['begin']).dt.date
# Преобразование времени в формат без двоеточий (HHMMSS)
raw_data['time'] = pd.to_datetime(raw_data['begin']).dt.strftime('%H%M%S')
# Удаление ненужных столбцов
columns_to_keep = ['date', 'time', 'open', 'high', 'low', 'close', 'volume']
processed_data = raw_data[columns_to_keep].copy()
# Сортировка по дате и времени
processed_data = processed_data.sort_values(['date', 'time'])
return processed_data
def get_last_available_date(ticker_dir):
"""
Определяет последнюю дату, за которую есть данные в структуре каталогов
Параметры:
ticker_dir (str): Путь к каталогу тикера
Возвращает:
datetime.date: Последняя дата или None, если данных нет
"""
last_date = None
# Проходим по всем подкаталогам (годы)
if not os.path.exists(ticker_dir):
return None
for year_dir in os.listdir(ticker_dir):
year_path = os.path.join(ticker_dir, year_dir)
if not os.path.isdir(year_path):
continue
# Проходим по месяцам
for month_dir in os.listdir(year_path):
month_path = os.path.join(year_path, month_dir)
if not os.path.isdir(month_path):
continue
# Проходим по дням
for day_dir in os.listdir(month_path):
day_path = os.path.join(month_path, day_dir)
if not os.path.isdir(day_path):
continue
# Проверяем, что имя дня - это число (день месяца)
if not day_dir.isdigit():
continue
# Формируем дату: год, месяц, день
try:
year = int(year_dir)
month = int(month_dir)
day = int(day_dir)
current_date = datetime(year, month, day).date()
except:
continue
# Сравниваем с последней датой
if last_date is None or current_date > last_date:
last_date = current_date
return last_date
def update_data_file(ticker, interval, output_dir, start_date, end_date):
"""
Обновляет файлы данных, добавляя новые записи при необходимости
Параметры:
ticker (str): Тикер инструмента
interval (int): Интервал свечей в минутах
output_dir (str): Путь к каталогу для сохранения данных
start_date (datetime): Начальная дата для загрузки
end_date (datetime): Конечная дата для загрузки
Возвращает:
None
"""
# Определяем последнюю дату, за которую есть данные
last_date = get_last_available_date(output_dir)
if last_date is None:
# Данных нет, загружаем с начальной даты
new_start_date = start_date
print("Не найдено существующих данных. Загружаем все данные...")
else:
# Загружаем с последней даты (включительно)
new_start_date = datetime.combine(last_date, datetime.min.time())
print(f"Найдены данные до {last_date}. Загружаем новые данные начиная с этой даты...")
# Загружаем данные с MOEX
raw_data = fetch_moex_data(ticker, new_start_date, end_date, interval)
if raw_data.empty:
print("Нет новых данных для загрузки")
return
# Обрабатываем данные
processed_data = process_raw_data(raw_data)
# Сохраняем данные, разбивая по датам
save_data_by_date(ticker, interval, output_dir, processed_data)
print(f"Загружено и сохранено {len(processed_data)} записей")
def save_data_by_date(ticker, interval, output_dir, data):
"""
Сохраняет данные с разбиением по датам в подкаталоги
Параметры:
ticker (str): Тикер инструмента
interval (int): Интервал в минутах
output_dir (str): Базовый каталог для сохранения
data (pd.DataFrame): Данные для сохранения
Возвращает:
None
"""
# Получаем имя интервала
interval_name = get_interval_name(interval)
# Группируем данные по датам
grouped = data.groupby('date')
for date, day_data in grouped:
# Разбиваем дату на год, месяц, день
year = date.year
month = date.month
day = date.day
# Форматируем месяц и день с ведущими нулями
month_str = f"{month:02d}"
day_str = f"{day:02d}"
# Формируем путь к каталогу для этой даты
date_dir = os.path.join(output_dir, str(year), month_str, day_str)
# Создаем каталог, если он не существует
os.makedirs(date_dir, exist_ok=True)
# Создаем подкаталог для интервала
interval_dir = os.path.join(date_dir, interval_name)
os.makedirs(interval_dir, exist_ok=True)
# Удаляем столбец date перед сохранением
day_data_to_save = day_data.drop(columns=['date'])
# Сохраняем каждый параметр в отдельный файл
for column in day_data_to_save.columns:
file_path = os.path.join(interval_dir, column)
# Сохраняем столбец без индекса и без заголовка
day_data_to_save[column].to_csv(file_path, index=False, header=False)
print(f"Сохранено {len(day_data_to_save[column])} значений параметра '{column}' за {date} в {file_path}")
def get_interval_name(interval):
"""
Преобразует интервал в минутах в текстовое представление
Параметры:
interval (int): Интервал в минутах
Возвращает:
str: Текстовое представление интервала
"""
if interval == 1:
return "1min"
elif interval == 10:
return "10min"
elif interval == 60:
return "1hour"
elif interval == 1440:
return "1day"
else:
return f"{interval}min"
if __name__ == "__main__":
# Загрузка конфигурации
config = load_config()
if not config:
print("Не удалось загрузить конфигурацию. Выход...")
exit(1)
# Параметры загрузки
end_date = datetime.now()
print(f"Начало загрузки данных для тикеров: {', '.join([item['ticker'] for item in config['tickers']])}")
print(f"Период: с {min([datetime.strptime(item['start_date'], '%Y-%m-%d') for item in config['tickers']])} по {end_date.strftime('%Y-%m-%d')}")
print("-" * 50)
# Обработка каждого тикера и интервала
for ticker_config in config['tickers']:
ticker = ticker_config['ticker']
start_date_str = ticker_config['start_date']
intervals = ticker_config['intervals']
# Преобразование начальной даты из строки в datetime
try:
start_date = datetime.strptime(start_date_str, '%Y-%m-%d')
except ValueError:
print(f"Ошибка в формате даты для тикера {ticker}: {start_date_str}")
continue
print(f"\nОбработка тикера: {ticker} (начальная дата: {start_date_str})")
print(f"Интервалы: {', '.join([get_interval_name(i) for i in intervals])}")
# Формирование пути к каталогу для сохранения данных
base_dir = "moex"
ticker_dir = os.path.join(base_dir, ticker)
# Обработка каждого интервала для текущего тикера
for interval in intervals:
print(f"\nОбработка интервала: {get_interval_name(interval)}")
# Обновление файла данных
update_data_file(ticker, interval, ticker_dir, start_date, end_date)
# Проверка сохраненных данных
print("\nПроверка сохраненных данных:")
interval_name = get_interval_name(interval)
# Проверяем наличие подкаталогов с датами
if os.path.exists(ticker_dir):
# Собираем все даты из структуры каталогов
dates_found = []
# Проходим по годам
for year_dir in sorted(os.listdir(ticker_dir)):
year_path = os.path.join(ticker_dir, year_dir)
if not os.path.isdir(year_path):
continue
# Проходим по месяцам
for month_dir in sorted(os.listdir(year_path)):
month_path = os.path.join(year_path, month_dir)
if not os.path.isdir(month_path):
continue
# Проходим по дням
for day_dir in sorted(os.listdir(month_path)):
day_path = os.path.join(month_path, day_dir)
if not os.path.isdir(day_path):
continue
# Проверяем наличие подкаталога с интервалом
interval_path = os.path.join(day_path, interval_name)
if os.path.isdir(interval_path):
# Формируем дату для отображения
try:
year = int(year_dir)
month = int(month_dir)
day = int(day_dir)
date_str = f"{year:04d}-{month:02d}-{day:02d}"
dates_found.append(date_str)
except:
pass
if dates_found:
print(f"Найдено {len(dates_found)} дат с данными:")
# Показываем последние 5 дат
for date_str in sorted(dates_found)[-5:]:
# Формируем путь к каталогу интервала
interval_path = os.path.join(ticker_dir, date_str.split('-')[0],
date_str.split('-')[1], date_str.split('-')[2],
interval_name)
# if os.path.exists(interval_path):
# print(f" {date_str}:")
# Проверяем наличие файлов с параметрами
# for param in ['time', 'open', 'high', 'low', 'close', 'volume']:
# param_file = os.path.join(interval_path, param)
# if os.path.exists(param_file):
# # Читаем файл
# param_data = pd.read_csv(param_file, header=None)
# print(f" {param}: {len(param_data)} значений")
# Выводим последние 3 значения для проверки
# if len(param_data) > 0:
# print(f" Последние 3 значения: {', '.join(map(str, param_data.tail(3).values.flatten()))}")
# else:
# print(f" {date_str}: каталог интервала не найден")
else:
print("Данные не найдены")
else:
print(f"Каталог тикера {ticker} не найден")
print("-" * 30)
# print("-" * 50)
print("\nЗагрузка данных завершена для всех инструментов и интервалов")
С питона на луа, памажити ), питон
Пользователь
Сообщений: Регистрация: 30.01.2015
08.09.2025 20:39:40
Цитата
prugramzer написал: , В принципе безразницы. Я луа считаю паскалем. Когдато на нем учился )
Прикольно. Это как мото считать авто, а корову - лошадью.
Заданная волотильность и Волотильность
Пользователь
Сообщений: Регистрация: 30.01.2015
08.09.2025 15:43:52
DeepSeek отвечает:
Отличный вопрос! Это ключевое понятие для любого, кто работает с опционами.
Если коротко: **Заданная волатильность (IV)** — это причина, а **Волатильность (или историческая волатильность, HV)** — это следствие. Но давайте разберем подробнее.
* **Что это?** Это **реализованная, фактическая** волатильность базового актива (акции, индекса и т.д.) за прошедший период (например, за 30, 60, 90 дней). * **Как рассчитывается?** На основе исторических данных о цене актива. Она показывает, насколько сильно цена актива колебалась в прошлом. * **Аналогия:** Это как смотреть в зеркало заднего вида автомобиля. Вы видите, какой дорога была позади вас (насколько bumpy была поездка). * **В доске опционов** она обычно указывается отдельно и относится к самому базовому активу, а не к опциону.
### 2. Заданная волатильность (Implied Volatility — IV) — для Call и Put
* **Что это?** Это **ожидаемая, прогнозируемая** рынком волатильность базового актива на оставшийся срок жизни опциона. Она не вычисляется из прошлых данных, а **«извлекается» (implied) из текущей рыночной цены опциона**. * **Как рассчитывается?** Цена опциона (его премия) подставляется в модель оценки опционов (например, Блэка-Шоулза), и модель решается относительно волатильности. Другими словами, это та величина волатильности, которую рынок *закладывает* в цену опциона *сейчас*. * **Аналогия:** Это как смотреть на прогноз погоды на завтра. Вы не знаете, какая погода будет на самом деле, но рынок дает свой «прогноз» в виде IV. * **В доске опционов** IV указывается для **каждого конкретного опциона** (и для Call, и для Put) с его страйком и экспирацией.
---
### Ключевые различия в таблице
| Характеристика | Волатильность (Historical Volatility) | Заданная волатильность (Implied Volatility) | | :--- | :--- | :--- | | **Суть** | Фактическая волатильность в **прошлом** | Ожидаемая волатильность в **будущем** | | **На что указывает** | На **базовый актив** | На **конкретный опцион** (Call или Put) | | **Расчет** | На основе **исторических цен** актива | Выводится из **текущей цены (премии) опциона** | | **Взгляд** | Ретроспективный (смотрит назад) | Проспективный (смотрит вперед) | | **Динамика** | Меняется **медленно**, по мере обновления данных | Меняется **каждую секунду** вместе с движением цены опциона |
---
### Почему IV разная для Call и Put на один и тот же актив?
Теоретически, для опционов с одинаковым страйком и датой экспирации IV Call и Put должна быть одинаковой. Однако на практике так бывает не всегда из-за:
1. **Спрос и предложение:** Если есть ажиотажный спрос на опционы Put (например, на хеджирование падения), их премии растут. Чтобы это произошло в модели ценообразования, должна вырасти подставляемая в нее волатильность (IV). В этот момент IV Put может стать выше, чем IV Call для аналогичных страйков. Это явление называется **«скиew»** (перекос волатильности). 2. **Временная структура волатильности (Term Structure):** Ожидания волатильности на разные сроки (неделя, месяц, квартал) могут различаться.
### Практическое значение для трейдера
* **Сравнение IV и HV:** Если **IV > HV**, это означает, что рынок ожидает увеличения колебаний актива. Опционы считаются «дорогими». Если **IV < HV**, опционы «дешевые», и рынок ожидает затишья. * **Торговля волатильностью:** Трейдеры могут покупать опционы, когда IV низкая (ожидая ее роста), и продавать, когда IV высокая (ожидая ее снижения). * **Индикатор настроений:** Высокая IV опционов Put часто свидетельствует о страхе и пессимизме на рынке (иногда это называют «индексом страха» VIX, который по сути является агрегированной IV опционов на S&P 500).
**Вывод:** «Просто волатильность» в доске опционов говорит вам о прошлом актива. **Заданная волатильность (IV)** для каждого опциона Call и Put — это гораздо более важный показатель, который говорит о будущих ожиданиях рынка и напрямую определяет, насколько опцион «дорогой» или «дешевый» в данный момент.
Заданная волотильность и Волотильность
Пользователь
Сообщений: Регистрация: 30.01.2015
08.09.2025 15:40:13
GLM отвечает: Разница между «заданной волатильностью» (implied volatility — IV) для опционов Call и Put и «просто волатильностью» в таблице опционов — это **разница между теоретическим ожиданием и практическим отображением рыночных данных.разница между теоретическим ожиданием и практическим отображением рыночных данных. Давайте разберёмся подробнее:
1. «Просто волатильность» на бирже опционов (обычно IV):
Что это такое: когда вы смотрите на таблицу опционов (например, в терминале Bloomberg, TOS, Interactive Brokers), в столбце «Волатильность» или «IV» почти всегда отображается подразумеваемая волатильность (Implied Volatility — IV)
Что представляет собой IV: Это обратный расчёт. Рыночная цена опциона (премия) известна. Модели ценообразования опционов (например, модель Блэка — Шоулза) используют несколько входных параметров: цена базового актива, страйк, время до экспирации, безрисковая ставка, дивиденды и волатильность. IV — это значение волатильности, которое нужно подставить в модель, чтобы получить теоретическую цену, равную текущей рыночной премии опциона.
Ключевая идея: IV — это рыночное ожидание будущей волатильности базового актива за время действия опциона, «зашифрованное» в его текущей цене. Чем выше ожидаемая волатильность, тем дороже опцион (и выше его IV).
Теоретическое равенство колл-опциона и пут-опциона: согласно паритету пут-колл (Put-Call Parity), для европейских опционов на один и тот же базовый актив с одинаковым страйком и датой экспирации IV колл-опциона и IV пут-опциона должны быть равны. Паритет устанавливает строгую математическую связь между ценами колл-опциона, пут-опциона, базового актива и безрисковой ставкой. Если IV колл-опциона и пут-опциона различаются, возникает возможность арбитража.
2. «Заданная волатильность» для колл- и пут-опционов (разная IV):
Что это такое: На практике, особенно при торговле опционами на акции с дивидендами или в условиях ликвидности, вы часто видите РАЗНЫЕ значения IV для опционов Call и Put одного страйка и срока экспирации в таблице опционов.
Почему это происходит (несмотря на паритет): Это не ошибка в расчётах, а отражение рыночных реалий и особенностей расчёта/отображения:
Дивиденды: Это основная причина. Модели ценообразования требуют точного учёта ожидаемых дивидендов. Если:
Дивиденды недооценены в модели: Рынок «знает», что дивиденды будут выше, чем заложено в стандартных настройках терминала. Чтобы компенсировать это, IV Call будет ниже, а IV Put будет выше теоретически равного значения. Почему?
Колл: Высокие дивиденды негативно влияют на цену колл-опциона (так как цена акции падает на величину дивиденда после экс-даты). Чтобы цена колл-опциона оставалась рыночной при недооценённых дивидендах, модель должна использовать более низкий IV.
Пут: Высокие дивиденды положительно влияют на цену пут-опциона. Чтобы цена пут-опциона оставалась рыночной при недооценённых дивидендах, модель должна использовать более высокую IV.
Дивиденды переоценены в модели: Обратная ситуация: IV Call будет выше, IV Put будет ниже.
Ликвидность и спреды: в случае неликвидных опционов рыночные цены Bid/Ask могут сильно отличаться и не соответствовать теоретической стоимости. Расчёт IV для цены Bid опциона Call и цены Ask опциона Put (или наоборот) может дать слегка отличающиеся значения из-за спреда.
Американские опционы: досрочное исполнение (особенно колл-опционов на дивидендные акции или пут-опционов с глубоким проникновением в деньги) нарушает строгий паритет европейских опционов. Модели для американских опционов сложнее, и IV колл-опционов/пут-опционов могут незначительно различаться.
Ошибки в данных или настройках терминала: редко, но возможно: неправильно заданная дивидендная доходность, ставка, цена базового актива или баг в платформе.
Краткосрочные дисбалансы спроса/предложения: очень высокий локальный спрос на колл-опционы или пут-опционы может временно «поднять» их цену (и, следовательно, IV) выше/ниже уровня, диктуемого паритетом, пока арбитражеры не восстановят равновесие.
3. «Волатильность» на бирже против «заданных» колл/пут-опционов: краткий обзор
Конкретные значения IV, рассчитанные для опционов Call и Put отдельно
Теоретическое Ожидание
Должна быть одинаковой для колл- и пут-опционов с одним страйком/сроком экспирации (из-за паритета)
Может отличаться для колл- и пут-опционов с одним страйком/сроком экспирации
Причина Разницы
Нет разницы в теории
Дивиденды (основная причина), ликвидность/спреды, раннее исполнение (американские акции), ошибки в данных, краткосрочные дисбалансы
Что Показывает
Общее рыночное ожидание волатильности базового актива
Рыночная цена опциона, скорректированная с учётом факторов (особенно дивидендов), и отражает конкретные условия спроса/предложения для колл- или пут-опциона
Практическое Значение
Полезна для сравнения «дороговизны» опционов с разными страйками/сроками экспирации (поверхность волатильности)
Критически важно для точной оценки отдельного опциона. Разница IV Call/Put сигнализирует о рыночных ожиданиях в отношении дивидендов или других факторах, нарушающих паритет.
Вывод:
«Просто волатильность» в таблице опционов — это подразумеваемая волатильность (IV). Она отражает рыночные ожидания относительно будущей волатильности базового актива.
«Заданная волатильность» для колл- и пут-опционов — это те же значения IV, но рассчитанные и отображаемые отдельно для каждого типа опциона.
Теоретически IV колл и пут должны быть равны из-за паритета пут-колл.
Основная причина — неточный или несвоевременный учёт ожидаемых дивидендов в настройках модели/терминала. На практике они часто различаются. Эта разница не случайна: она напрямую связана с тем, как рынок оценивает влияние дивидендов на цены колл- и пут-опционов.
Наблюдая за разницей в IV для колл- и пут-опционов одного страйка, вы получаете ценную информацию: она показывает, насколько рыночные ожидания в отношении дивидендов (или других факторов, нарушающих паритет) отличаются от тех, что заложены в «стандартных» настройках вашей торговой платформы. Это важный сигнал для точного ценообразования и поиска арбитражных возможностей.
Заданная волотильность и Волотильность
Пользователь
Сообщений: Регистрация: 30.01.2015
08.09.2025 15:37:37
Алиса отвечает:
Термины «заданная волатильность Call» и «заданная волатильность Put» в опционной торговле отличаются тем, что они связаны с разными видами опционов, а «просто волатильность» — с общим понятием волатильности базового актива.
Заданная волатильность Call Указывает на волатильность, которая влияет на цену колл-опциона — контракта, предоставляющего держателю право приобрести базовый актив по заранее определённой цене (страйк) до определённой даты (дата истечения).
Особенности:
Чем выше волатильность базового актива, тем выше цена опциона, так как увеличивается вероятность значительного изменения цены.
Влияние волатильности зависит от срока действия контракта: чем дальше дата исполнения опциона, тем большее влияние волатильность оказывает на его цену.
Заданная волатильность Put Указывает на волатильность, которая влияет на цену пут-опциона — контракта, дающего держателю право продать базовый актив по установленной цене до даты истечения контракта.
Особенности:
Большие колебания увеличивают шанс исполнения опциона, повышая цену.
Максимальный убыток покупателя ограничен уплаченной премией, в то время как потенциальная прибыль может быть значительной при существенном падении стоимости базового актива.
Просто волатильность Указывает на волатильность базового актива — показатель, отражающий колебания рыночной цены актива за оцениваемый период.
Особенности:
Чем выше волатильность, тем больше рисков для владельца актива.
Волатильность либо измеряется в абсолютном выражении (в значениях колебаний с общей единицей измерения), либо переводится в процентное соотношение.
Важно: подразумеваемая волатильность (Implied Volatility, IV) — это не то же самое, что историческая волатильность (Historical volatility, HV). Историческая волатильность измеряет прошлые колебания цен, а подразумеваемая — ориентирована на будущее, определяется текущей рыночной ценой.
С питона на луа, памажити ), питон
Пользователь
Сообщений: Регистрация: 30.01.2015
08.09.2025 07:27:05
ответ нейросети (результат не проверял): -----------------------
Код
Вот переписанная функция на Lua с учетом особенностей языка:
function rman(src, len)
-- Создаем матрицу как таблицу таблиц
local m = {}
for k = 1, len do
-- Используем 1-индексацию, храним исходный индекс как k-1 (0-based)
m[k] = {
src[k] or 0, -- nz() аналог: заменяем nil/NaN на 0
k - 1 -- сохраняем 0-based индекс
}
end
-- Сортировка по первому элементу (значению) по убыванию
table.sort(m, function(a, b)
return a[1] > b[1]
end)
-- Вычисление суммы квадратов разностей
local sum = 0.0
for k = 1, len do
local original_index = m[k][2] -- исходный 0-based индекс
local current_index = k - 1 -- текущий 0-based индекс
sum = sum + math.pow(original_index - current_index, 2)
end
return sum
end
Ключевые отличия и пояснения:Индексация:Lua использует 1-based индексацию,
поэтому циклы идут от 1 до len Исходные индексы (0-based) сохраняются как k - 1Матрица:
Реализована как таблица таблиц m = {}Каждая строка: { значение, исходный_индекс }
Обработка NaN/nil:Аналог nz() - src[k] or 0 заменяет nil/NaN на 0
Для строгой проверки NaN можно добавить: type(src[k]) == "number" and src[k] == src[k]
Сортировка:Используется table.sort() с кастомным компаратором
Сортировка по первому элементу (значению) по убываниюВычисление суммы:
В цикле сравниваются исходный индекс и текущая позицияРазница возводится в квадрат через math.pow()
Пример использования:lua
local data = {10, 30, 20, 50, 40}
local result = rman(data, #data)
print(result) -- Выведет: 10.0
Особенности реализации:Функция принимает таблицу src и длину len
Возвращает число (сумму квадратов разностей)Корректно обрабатывает:
Отрицательные числа Нулевые значенияДубликаты в исходных данныхНеопределенные значения (nil/NaN)
Для работы с очень большими массивами (>100K элементов) рекомендуется оптимизировать сортировку,
но для типичных случаев (например, технический анализ) текущая реализация эффективна.
Рыночная заявка для торговли фьючерсами
Пользователь
Сообщений: Регистрация: 30.01.2015
02.09.2025 10:05:46
Если делаете цену как предлагают выше, то ваша заявка будет всегда активной. если ставить перед лучшей ценой при наличии спреда, то будет пассивной (ком. биржи==0)
написал: На срочной секции нет рыночных ордеров. Можно только устанавливать ордера внутри ценовых границы последнего клиринга. Причина проста - сумма ГО зависит от цены. Поэтому устанавливая ордер далеко от цены клиринга, ГО возрастает и существенно.
И какую цену ставить? Текущая + сколько? (для покупки) Может быть, текущая + (текущая + максимум)/2 ?
Лучшая цена предложения/ спроса.
То есть ты предлагаешь перед подачей заявки сканировать стакан?
Можно читать из ТТП. Можно читать стакан. Затраты времени не большие. При этом еще анализирую спред и глубину рынка. Если глубина рынка устраивает, то можно ставить цену на весь нужный объем.
Мы с большим вниманием относимся к пожеланиям пользователей, стараясь реагировать на них максимально оперативно, понимая востребованность тех или иных доработок. В тоже время возможности сделать "всё и сразу" мы не имеем, так как штат разработчиков помимо функционала ПО работает и над массой других проектов. Как правило, мы всегда пишем о этапе рассмотрения пожелания и его реализации. Поэтому ответ Вы получите, когда пожелание будет рассмотрено.
"Постараюсь" говорит человек, который в душе понимает, что этого не сделает, но просто не хочет обидеть отказом просителя.
"Сделаю" - говорит человек, который точно знает, что сделает, выполнит обещанное.
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Что означает " постараемся рассмотреть его" ? А можете рассмотреть без старания? --------------------------- Почему бы не написать короче и понятнее, например так: ----------------------- " Ваше пожелание зарегистрировано. О его реализации будет сообщено дополнительно".
написал: На срочной секции нет рыночных ордеров. Можно только устанавливать ордера внутри ценовых границы последнего клиринга. Причина проста - сумма ГО зависит от цены. Поэтому устанавливая ордер далеко от цены клиринга, ГО возрастает и существенно.
И какую цену ставить? Текущая + сколько? (для покупки) Может быть, текущая + (текущая + максимум)/2 ?
Лучшая цена предложения/ спроса.
Система не дает продать облигацию, При попытке продать облигацию в стакане пишет "Инструмент запрещен для операций шорт"
Пользователь
Сообщений: Регистрация: 30.01.2015
29.08.2025 17:13:54
, А Вы брокера спрашивали? Продает не система, а брокер (это указано в ГК РФ и в вашем соглашении с брокером). QUIK лишь отсылает ему Вашу заявку ( это указано в регламенте брокера)
Убрать выходные дни с графиков
Пользователь
Сообщений: Регистрация: 30.01.2015
29.08.2025 06:13:27
Полагаю, что эту фичу придется ждать годами, так как необходимо изменение дизайна окна параметров и добавление новых параметров. --------------------------------------- Поэтому единственное решение, если уж без этого никак, написать свой индикатор с обходом выходных и спать спокойно.
Система не дает продать облигацию, При попытке продать облигацию в стакане пишет "Инструмент запрещен для операций шорт"
Пользователь
Сообщений: Регистрация: 30.01.2015
28.08.2025 12:57:23
Цитата
Karina Dmitrieva написал: , покажите скриншот из таблицы Состояние счета, чтобы было видно фирму, код клиента и данную позицию.
у вас 1 шт а пытаетесь продать 4.
Баг в работе скрипта Lua, В работе скрипта встречается баг, из-за которого у меня ломается весь скрипт:(
Пользователь
Сообщений: Регистрация: 30.01.2015
27.08.2025 05:45:08
Рекомендую сделать так: -------------------- Прочитайте файл один раз в таблицу и работайте с таблицей. При закрытии скрипта сохраняйте таблицу в файл.
Баг в работе скрипта Lua, В работе скрипта встречается баг, из-за которого у меня ломается весь скрипт:(
Пользователь
Сообщений: Регистрация: 30.01.2015
26.08.2025 13:34:23
Несколько советов. -------------- 1) все глобальные переменные изначально равны nil. поэтому можно убрать в OnInit() следующие строки:
price = nil -- Не трогать. uprice = nil dprice = nil SellPrice = nil KillLine = nil pp = nil ---------------------------- 2) если переменная не равна nil, то она true. поэтому вместо if uprice ~= nil and dprice ~= nil then можно писать: if uprice and dprice then =====================
скрипт трудно читается. Поставьте вывод в лог файл и проверяйте по шагам. Если учитесь программировать, то учитесь отлаживать написанное. -------------------------- учебник по луа:
Учет всех прошлых сделок совершенных в терминале Quik
Пользователь
Сообщений: Регистрация: 30.01.2015
23.08.2025 15:47:10
Цитата
pilot написал: Установил Quik, настроил окна и тут обнаружилось что этот терминал хранит информацию о сделках только в текущей сессии. Поискал в интернете, но пока не обнаружил как вести учет сделок, совершенных в прошлых сессиях? Вбивать вручную параметры всех сделок в Excel как-то несерьезно для 21-го века. Пожалуйста поделитесь опытом.
Единственный документ, содержащий все Ваши сделки, который имеет юридическое значение это отчет брокера. Терминал QUIK не предоставляет юридически значимую информацию.