Проблема НЕ в индикаторе, который рисует линию с графика бОльшего таймфрейма. Вы неправильно поняли Романа.
Индикатору. у которого проблема не нужен другой график, он на текущем ТФ рассчитывает бары бОльшего ТФ и по ним считает МА. А сама проблема в функции 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 не предоставляет юридически значимую информацию.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
, Без обид, но это очередное "открытие" дилетанта. ------------------ Это какой-то набор слов , а не математика. Какая-то каша. Например, ----------------------
Код
2. Пояснение на Конкретной Математике
Возьмём пример: Товар / Деньги.
В учебнике: Это два отдельных показателя. Выручка 10 000 руб. и производство 100 единиц товара. Анализ линейный: «Надо производить больше, чтобы больше продать».
В данном подходе: Мы сразу смотрим на отношение Товар/Деньги = 100 / 10 000 = 0.01.
------------------------
2.1 Что это число на самом деле означает?
Это коэффициент окупаемости или «ценность» товара в денежном выражении. Число 0.01 говорит, что 1 рубль выручки «обеспечен» всего 0.01 единицы товара. Это крайне низкая производительность труда или маржинальность.
А если бы отношение было равно 1? Это означало бы идеал: 1 единица товара приносит 1 условную единицу денег. То система работала бы на 100% своей эффективности.
======================= А чем "ценность" товара отличается от цены товара ? Цена товара - говорит, что 1 единица товара дает 100 руб выручки. Т е по смыслу, тоже самое что и придуманная вами "ценность" товара. ================ Про производительность у Вас вообще ерунда написана. ======================== Вы хотя бы сначала изучили учебники, а потом придумывали бы отсебятину из смеси понятий из механики ,математики и демагогии. .
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
20.08.2025 16:31:52
, Непонятно, какой смысл в том, что Вы пересказываете . Что это? Вольная интерпретация понимания процессов на рынка на уровне средней школы? ---------------------- Мозгу свойственно выстраивать логически связанное объяснение (оправдание) того, что он узнает. При этом, как правило, информация (примеры) выбираются им так, чтобы они подтверждали придуманное объяснение. Примеры, которые не подтверждают, просто игнорируются. ------------------ Может для начала дадите пояснение чем то, что вы излагаете лучше того, что написано в учебниках по экономике.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
17.08.2025 16:47:37
Цитата
VPM написал: На мой взгляд, продемонстрировать свойства записи пропорции выше, наглядней всего можно с помощью " Золотой пропорции ", просто подставив значения в формулу и получая свойства.
"Смешались в кучу кони, люди..."
Можно ли уточнить задержку в Интернете до выставления заявок?, Как можно раньше выставить заявку после начала их приёма
Пользователь
Сообщений: Регистрация: 30.01.2015
14.08.2025 05:41:19
Цитата
Ziveleos написал: Мне-то чего волноваться? Это же не я пишу, как у Райкина: " мы вам про насосы , а вы нам - про колёса " Перечитайте топик, если у Вас память как у Б3-34.
А хамить зачем?
Можно ли уточнить задержку в Интернете до выставления заявок?, Как можно раньше выставить заявку после начала их приёма
написал: но возможно, что заявка попадет в конец очереди заявок на сервере брокера.
Если между сделкой условия и активацией стопа проходит больше секунды, то место в очереди уже неважно.
Последние данные, которые мне известны, то, что ядро сервера QUIK обрабатывало 1000 транзакций в секунду. Допустим сейчас в 10 раз больше. Если длина очереди больше 10 000, то будет больше секунды.
Какие ещё тысячи транзакций в секунду после одиннадцати вечера? Вы вообще о чем?! В это время одну-то сделку несколько секунд ждать приходится.
Вы главное не волнуйтесь. Вы о чем? Вообще-то обсуждается не частота сделок на бирже, а скорость выставления заявки. ----------------- В разное время - разные условия. Чел-ку надо не когда все спят, а на открытие. ------------------------- Если в 11 вечера, то попробуйте отключить алгоритм Нейгла.