Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
18.11.2025 19:53:45
Вот еще информация к размышлению. В одном из вариантов робота реализовал подписку в колбеке Onparam. ------------------------ Размер кода функции подписки для любого числа инструментов 12 строк. (Двенадцать строк) -------------------------- Работает без задержек т е асинхронно. ----------------------- Вот лог файл работа такой подиписки. Время указано в ms ( для справки ms - 1/1000 секунды) Подписка на 10 интервалов занимает примерно 0.006 сек. В первой строке список инструментов на которы подписываемся и список интервалов Когда подписка закончилась то задержка работы колбека из-за вызова этой функции составляет 4 мкс это 0.000004 сек.
написал: А если поставить колбек то и тыкать не надо. Тратим время лишь когда приди данные. Что не так?
Не так, что этот колбек будет вызываться на всех барах истории, начиная с 1. Также он будет дергаться на каждую сделку. Это все лишние телодвижения. По крайней мере мне необходимо пройтись по последним, скажем 100 барам, а далее один раз на новый бар. Но да, можно и так, если организовать доп. проверки в этом колбеке.
Вы не правы. он дергается основным потоком ровно тогда когда тот запихивает данные в хранилище. Если нам не надо реагировать на незакрытую свечу, то в колбеке просто ее игнорируем. при приходе очередной закрытой свечи заданного тайма колбек вызовет функцию инструмента которому эти данные пришли. Таким образом никаких лишних телодвижений в потоке main нам делать не надо. И не надо тыкать куда-то чтобы проверить есть или нет данных. --------------------------- История тоже распознается без проблем ------------------------ Все доп проверки решаются парой операторов if Это примерно 300 наносекунд затрат времени.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
18.11.2025 17:36:15
Круто нагородили.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
написал: Так и в нашем упрощённом варианте предусмотрен выход из цикла подписки.
Может я, конечно, невнимательно смотрел примеры, но все одни предполагали ожидание через цикл. Т.е. заказали - и тут же ждем. В итоге заказ 100 источников растягивается во времени, т.к. последний будет заказан только через 100*время ожидания. Что долго. Подход заказали все сразу в цикле и потом ждем все в цикле лучше, но тоже заблокирует скрипт пока ждем циклом. Здесь же заказ всех сразу. И периодически просто атомарно "тыкаем палочкой" на предмет данных. Пришли - можем делать что-то с данными. Нет - переходим к другим задачам, а эта пока путь остается. Т.е. ожидание не мешает другим задачам не связанным с данными, коих может быть много в скрипте.
А если поставить колбек то и тыкать не надо. Тратим время лишь когда приди данные. Что не так?
Обсуждаем интерфейс для робота
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 18:16:45
Сейчас реализовал умную заявку. -------------------------------- В интерфейсе есть столбец с именем Qn - это желаемый размер позиции в лотах. ---------------------------- Работает это так. левой кнопкой увеличиваем Qn и робот будет докупать, правой кнопкой уменьшаем Qn и робот будет продавать. Покупает и продает он по лучшим ценам. В таблице есть параметр dp . этот параметр задает в минимальных шагах цены допустимый уход цены в заявке от лучшей цены. ------------------------ Алгоритм работы умной заявки можно заменить, подключив новую задачу вместо существующей. ----------------------- Управление заявками и задачами реализованы в конечном автомате и пользователь их не знает и не видит. В задачах выставление заявок можно задавать через события и колбеки, а стоп-заявку и ее параметры установить в таблице интерфейса .
Обсуждаем интерфейс для робота
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 18:05:21
Сейчас пишу робота на основе ИИ Lua и QUIK. Кратко изложу интерфейс для работы с ним. --------------------- Интерфейс имеет такой вид:
содержание строк и столбцов задается двумя строками в файле инициализации робота:
Код
list_sec="ROSN,GAZP,SBER,PLZL,GMKN,CHMF,HYDR,LKOH,MOEX,SNGS" --список торгуемых инструментов
list_user_table="sec:-108,short:-4:0,int:4:1,quote:-4:0,stop:-108:1,spred:4:1,offset:4:1,dp:4:1,Qn:4:0,Q:4:0,last:8:0.,bid:8:0.,offer:8:0.,price:8:0.,prof:8:0."
-- описание столбцов
В таблице отображаются либо отдельные значения, либо значения из списка. Например, я задаю типы стоп заявок в виде :
Пользователь может изменять данные лишь двумя способами -- выбирать из существующего списка или изменять значение на плюс минус 1 нажатием правой или левой кнопки мышки.. Двойным щелчком мышки можно сделать значение активным или пассивным. ----------------- Например, можно сделать неактивными все инструменты ,кроме одного, и робот будет торговать лишь этим инструментом. Можно сделать неактивным стоп или short и робот не будет ставить стоп или покупать в шорт. ------------------------- Еще в файле инициализации задается список имеющихся алгоритмов торговли , я называю их задачами.
Код
list_task="task1,task2,task3,task4" -- список существующих задач
а также список задач для всех инструментов по умолчанию
Код
user_task={"task1","task2" } --задачи для каждого инструмента по умолчанию
для каждого инструмента можно указать индивидуальные параметры или задачи, которые в списке инструментов указываются через ":" ========================= Это весь интерфейс.
Конструктивные предложения приветствуются.
О торговле фьючерсами и ГО
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 17:34:55
Если Вы обязались купить Потом обязались продать То у вас нет обязанности. вторая погасила первую ГО вам вернули. За вычетом разницы в цене и комис.
О торговле фьючерсами и ГО
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 17:33:26
Фьючерс - это не товар, а обязанность ГО - это залог под исполнения этой обязанности.
О торговле фьючерсами и ГО
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 17:31:37
Если Вы продаете то что уже купили то платите лишь комиссию Если Вы покупаете то что уже продали то аналогично
О торговле фьючерсами и ГО
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 17:29:47
Цитата
Сергей Че написал: Допустим, я купил 2 фьючерса с ГО = 10 000 руб. Для их покупки у меня должно быть свободно минимум 2 * 10 000 руб = 20 000 руб, которые будут заморожены при покупке. Спустся время я хочу закрыть позицию. Для этого мне надо продать два фьючерса. И для этого у меня так же должны быть свободны 20 000 руб или нет? Получается, чтобы торговать фьючерсом с плечом Х, мне надо иметь 2 * Х * ГО руб свободных денег? Я прав? Или я где-то что-то недопонимаю?
Прикольно, Вы хотите платить и когда покупаете что-то и когда продаете что-то? --------------------------- Может лучше начать с чтения учебников, а не с реальной торговли?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 17:12:16
, Поясняю. "Все смешалось, кони, люди" -------------------- Вы подписываетесь на параметр из ТТП а ждете свечи.Вы уж определитесь. ------------------------------------------------------------------------ "А, ты за большевиков, али за коммунистов?"
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
local WORKING_FLAG = true local class_code, sec_code = "TQBR", "SBER"--"SPBFUT", "RIZ5"
-- Простые переменные для данных local last_bid = "N/A" local last_offer = "N/A" local last_candle = nil local ds = nil
-- Прямые callback функции без сложных систем function OnParam(class_code, sec_code) if class_code == "SPBFUT" and sec_code == "RIZ5" then last_bid = getParamEx(class_code, sec_code, "bid").param_value or "N/A" last_offer = getParamEx(class_code, sec_code, "offer").param_value or "N/A" end end
function OnQuote(class_code, sec_code) -- Просто получаем стакан, но не обрабатываем чтобы не нагружать end
-- Callback для свечей local function onCandleUpdate(index) if ds and index = 30 then message(string.format("Статус: %d итераций, Bid=%s, Offer=%s", iteration, last_bid, last_offer))
local result = ds:SetEmptyCallback() -- SetUpdateCallback(onCandleUpdate) -- message("получать данные с сервера, размер: " .. ds:Size() ..' '..tostring(result) ) if ds:Size() and ds:Size()>0 then message(string.format("Свеча: O=%.1f H=%.1f L=%.1f C=%.1f", ds:O(ds:Size()), ds:H(ds:Size()), ds:L(ds:Size()), ds:C(ds:Size()) )) end
last_print_time = current_time end
-- ВАЖНО: Даем время QUIK обработать события sleep(1000) -- 1 СЕКУНДА - достаточно для избежания "Превышения времени" end
message("Робот остановлен") end
-- Простые обработчики остановки function OnStop() WORKING_FLAG = false if ds then ds:Close() end message("Робот остановлен по команде") end function OnClose() WORKING_FLAG = false if ds then ds:Close() end end function OnInit() message("Скрипт инициализирован") end
У Вас в скрипте ошибка Надо подписываться не так CreateDataSource(class_code, sec_code, 1,"last") а так CreateDataSource(class_code, sec_code, 1)
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 16:39:15
Повторю еще раз. Подписка делается однократно при запуске робота. Т е она не влияет на его работу никак.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 16:37:35
далее создаю файл для сохранения данных текущего дня Для истории есть отдельная сжатая база глубиной 10 лет. Создаю колбек для обработки данных
Код
local fD=pTD..sec.."/"..int.."/current.txt"; --файл данных текущего дня
local fe=io.open(fD,"w");
if ds then ds:SetUpdateCallback(cb_candle(sec,ds,fe)); else ds={} end
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
пардон, не понял сначала . Расскажу как я делаю подписку. Число инструментов не имеет значения. Сейчас в разрабатываемом роботе 10 инструментов. ------------------------ Подписка делается один раз в функции получения параметров инструментов заданных списком в фале ini. вот фрагмент подписки.
Код
local ds,err;
if int>0 then --подписка на свечи
while ds==nil do ds,err=CreateDataSource(clas,sec,int); sleep(1); end
end
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 10:50:48
, Если скрипт не осилите, то покажите фрагмент кода, как Вы будете обрабатывать свечи отдельного инструмента/
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 10:44:48
, Если это у Вас универсальная система, то покажите код для произвольного числа инструментов, список которых будет задавать пользователь либо, этот список формирует сам робот исходя из состояния рынка.
Проблема с нажатием правой кнопки
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 09:43:32
Когда в таблице в скрипте нажимаю правую кнопку мышки, то вылезает окно квика
Если не знаете, то спросите сначала у Алисы. -------------------------- Содержимое ответа
Понятие Scoping (области видимости) в языке программирования Lua определяет, насколько переменная видна остальной части программы. Это понятие относится к глобальным и локальным переменным. Область видимости — это участок кода программы, в пределах которого можно получить доступ к значению, хранящемуся в переменной. Под блоком понимается:
тело управляющей конструкции (if-then, else, for, while, repeat);
тело функции;
фрагмент кода, заключённый в ключевые слова do...end.
проблема с двойным нажатием кнопки
Пользователь
Сообщений: Регистрация: 30.01.2015
17.11.2025 09:21:59
Цитата
Станислав написал: Организовать какой-то адаптер, который будет заниматься подсчетом количества миллисекунд с нажатия и на основе этих данных отправлять сигнал либо об одиночном либо о двойном нажатии.
Спасибо. Решил проблему иначе. Запоминаю код предыдущего нажатия. Обработку одинарного нажатия выполняю по отпусканию клавиши.
проблема с двойным нажатием кнопки
Пользователь
Сообщений: Регистрация: 30.01.2015
16.11.2025 10:40:06
При двойном нажатии кнопки мыши в таблице созданной в скрипте всегда сначала приходит сигнал об одинарном нажатии кнопки.
Как устранить сигнал об одинарном нажатии при двойном нажатии?
Примеры простого торгового робота на Lua и Python от разработчиков QUIK, Примеры простого торгового робота на Lua и Python от разработчиков QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
14.11.2025 11:19:32
Цитата
Олег Денисов написал: Может есть у кого-нибудь такой "простой работающий робот qlua с выставлением стопа и профита"?
На сколько простой? ------------------------- В интернете можно найти много предложений роботов для QUIK за деньги . Вы удивитесь, но это все "простые" роботы.
Торговый счёт и код клиента
Пользователь
Сообщений: Регистрация: 30.01.2015
13.11.2025 20:42:01
спросите в браузере Яндекса Алису, она все объяснит простым русским языком.
У Вас скрипт работает лишь один раз. В майн надо делать бесконечный цикл. Читайте документацию.
Индекс запсииси в таблице ордеров
Пользователь
Сообщений: Регистрация: 30.01.2015
13.11.2025 12:18:42
Предположу, что так сбрасывают зависшие каналы, когда их много. ------------------- "Хотелось бы услышать начальника транспортного цеха"
Установка отметок на графике через скрипт
Пользователь
Сообщений: Регистрация: 30.01.2015
12.11.2025 20:06:40
Цитата
gngngn написал: Добрый день код который вы скинули кладет терминал
у меня скорей всего что то с самим терминалом, пробивал несколько простых скриптов, метки создаются - message (tostring(label_id_text)) выводи id метки
Чтобы выводились метки надо установить в скрипте интервал равный интервалу на графике. Установлено 5 минут. идентификатор графика установлен t ag = "SBER_ID" версия QUIK 12.8.0.6 сервер тестовый
Метки на графике в скрипте
Пользователь
Сообщений: Регистрация: 30.01.2015
12.11.2025 16:00:39
По просьбе трудящихся.
Код
label_params={["TEXT"]="",["IMAGE_PATH"]="",["ALIGNMENT"]="Left",["YVALUE"]=0,["DATE"]=0,["TIME"]=0,["R"]=255,["G"]=255,["B"]=255,
["TRANSPARENCY"]=0,["TRANSPARENT_BACKGROUND"]=0,["FONT_FACE_NAME"]='Times New Roman',["FONT_HEIGHT"]=10,["HINT"]=""}
function labeldraw(price, YYYYMMDD,HMS,textlabel, texthint)
label_params.TEXT = textlabel;
label_params.DATE = YYYYMMDD;
label_params.TIME =HMS;
label_params.YVALUE = price;
label_params.HINT = texthint;
label_id_text = AddLabel(tag, label_params)
end
function main()
local i=0; local _size=0;
while true do
local size= getNumCandles(tag);
while size>i do
local t, _, _ = getCandlesByIndex(tag, 0, i, 1)
local z=t[0]; local Hi,Li,Ci,Oi=z.high,z.low,z.close,z.open;
i=i+1;
local Ti=ds:T(i)
YYYYMMDD=100*(100*Ti.year+Ti.month)+Ti.day;
HMS=100*(100*Ti.hour+Ti.min)+Ti.sec;
labeldraw(Hi, YYYYMMDD,HMS,"A", "B")
end
sleep(1)
end
end
function OnInit(p) -- инициализация функции main
sec,clas,int="SBER","QJSIM",5;
tag = "SBER_ID"
ds=CreateDataSource ("sec","QJSIM",5)
while ds==nil do ds,err=CreateDataSource(clas,sec,int); sleep(1); end
end
Установка отметок на графике через скрипт
Пользователь
Сообщений: Регистрация: 30.01.2015
12.11.2025 15:56:51
, Вот решение Вашей хотелки - метки в скрипте:
это скрипт:
Код
label_params={["TEXT"]="",["IMAGE_PATH"]="",["ALIGNMENT"]="Left",["YVALUE"]=0,["DATE"]=0,["TIME"]=0,["R"]=255,["G"]=255,["B"]=255,
["TRANSPARENCY"]=0,["TRANSPARENT_BACKGROUND"]=0,["FONT_FACE_NAME"]='Times New Roman',["FONT_HEIGHT"]=10,["HINT"]=""}
function labeldraw(price, YYYYMMDD,HMS,textlabel, texthint)
label_params.TEXT = textlabel;
label_params.DATE = YYYYMMDD;
label_params.TIME =HMS;
label_params.YVALUE = price;
label_params.HINT = texthint;
label_id_text = AddLabel(tag, label_params)
end
function main()
local i=0; local _size=0;
while true do
local size= getNumCandles(tag) message (size)
-- if size>_size then price, _, _ = getCandlesByIndex(tiker_id, 0, size - 1, 1) _size=size; end
while size>i do
local t, _, _ = getCandlesByIndex(tag, 0, i, 1)
local z=t[0]; local Hi,Li,Ci,Oi=z.high,z.low,z.close,z.open;
i=i+1;
local Ti=ds:T(i)
YYYYMMDD=100*(100*Ti.year+Ti.month)+Ti.day;
HMS=100*(100*Ti.hour+Ti.min)+Ti.sec;
labeldraw(Hi, YYYYMMDD,HMS,"A", "B")
end
sleep(1)
end
end
function OnInit(p) -- инициализация функции main
sec,clas,int="SBER","QJSIM",5;
tag = "SBER_ID"
ds=CreateDataSource ("sec","QJSIM",5)
while ds==nil do ds,err=CreateDataSource(clas,sec,int); sleep(1); end
end
Установка отметок на графике через скрипт
Пользователь
Сообщений: Регистрация: 30.01.2015
12.11.2025 14:16:33
Общие сведения
Индикаторы технического анализа представляют собой отдельный класс скриптов, которые удовлетворяют определенным условиям и расположены в папке LuaIndicators в каталоге терминала. Если папка отсутствует в каталоге, необходимо создать ее вручную. Список скриптов не доступен из диалога Сервисы / LUA скрипты....
При добавлении нового индикатора на график плагин qlua сканирует папку LuaIndicators, проверяет файлы с расширением lua и luac (скомпилированные скрипты lua) на соответствие следующим требованиям:
определена функция Init,
определена функция OnCalculate,
определена таблица Lua с именем Settings, в которой есть поле «Name».
Пример минимального корректного кода для индикатора:
Settings={} Settings.Name = "minimal" function Init() return 1 end function OnCalculate(index) return 1 end
Установка отметок на графике через скрипт
Пользователь
Сообщений: Регистрация: 30.01.2015
12.11.2025 14:14:35
Цитата
gngngn написал: день день. Помоги решить вопрос на графике не отображается метка (текст) причем при проверки message (tostring(label_id_text)) сообщение выдает id метки Так же на графике при нажатии правой кнопки при выборе удалить, строка "все метки в диаграмме" становится активной (получается метка на график попадает, но ее не видно) скрипт отображения метки следующий:
function labeldraw(price, textlabel, texthint) label_params = { TEXT = textlabel, ALIGNMENT = "LEFT", DATE = tostring(os.date("%Y%m%d")), TIME = tostring(os.date("%H%M%S")), R = 0, G = 0, B = 0, TRANSPARENCY = 90, FONT_HEIGHT = 10, TRANSPARENT_BACKGROUND = 1, YVALUE = price, HINT = texthint }
text = "ppppp "..price[0].close labeldraw(price[0].close, text, "eeeeee") message (tostring(price[0].close)) message (tostring(label_id_text)) end
Метки выставляются в индикаторе, а вы написали скрипт.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
06.11.2025 18:49:50
поправил комментарии
Код
list={
--список инструментов для портфеля
sec="ROSN,GAZP,SBER,PLZL,GMKN,CHMF,HYDR,LKOH,MOEX,SNGS"
task="task1,task2,task3,task4" -- список существующих задач
}
user_sec=" interval:1,quote:0,short:0,stop:0,takeprofit:0,task:task1:task2,quota:0"
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
06.11.2025 18:48:51
сделал новый интерфейс еще проще:
Код
list={
--список инструментов для портфеля, если нет, то все инструменты по заданным классам
sec="ROSN,GAZP,SBER,PLZL,GMKN,CHMF,HYDR,LKOH,MOEX,SNGS"
task="task1,task2,task3,task4" -- список существующих задач
}
user_sec=" interval:1,quote:0,short:0,stop:0,takeprofit:0,task:task1:task2,quota:0"
--user_sec--параметры пользователя для sec по умолчанию--interval --интервал свечей --quote --подписка на стакан --short -- разрешениe коротких позиций --stop--флаг разрешения установки стопа 1 -обычный, 2-скользящий, --takeprofit, -- флаг разрешения TakePrifit --task---список задач по умолчанию для каждого инструмента --quota--для средств для покупки в одной заявке --можно задавать индивидуальные параметры для задач и инструментов
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
06.11.2025 18:36:10
, Возможно Вы не обратили внимание, но у меня ВСЯ УНИВЕРСАЛЬНАЯ СИСТЕМА это 380 операторов из них 120 - это конечный автомат обработки колбеков и 60 - конечный автомат обработки задач. ----------------------------- + скрипты задач. которые могут создать событие на выставление удаление перестановку заявок. ---------------------- Интерфейс к ней показал ранее.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
06.11.2025 18:29:11
У меня данные обновляются лишь по колбекам. Поэтому нет смысла их кэшировать.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
06.11.2025 18:27:36
Цитата
VPM написал: "Едем дальше, видим больше"! На мой взгляд данный подход, нужно распространить на получение "Серверных данных". Для понимания проблематики, архитектуру предлагается использовать общею для фондового и сросного рынков? Задача все та же.
Задача - возможность торговать и управлять 1 инструментом так и портфелем (универсальность), с учетом рисков (как квиковских, так и собственно ручных), ну и конечно одной из основных задач управление позицией. Структура - модульная, много разового использования. Интерфейс - наипростейший, понятный бабушке!
Обобщенно свести квиковские в функции в удобную оболочку:
Функции взаимодействия скрипта Lua и Рабочего места QUIK getDepoEx - функция для получения позиций по инструментам указанного типа getMoneyEx - функция для получения информации по денежным позициям указанного типа getFuturesLimit - функция для получения информации по фьючерсным лимитам getFuturesHolding - функция для получения информации по фьючерсным позициям getSecurityInfo - функция для получения информации по инструменту? getTradeDate - функция для получения даты торговой сессии CalcBuySell - функция для расчета максимально возможного количества лотов в заявке? (скорее для контроля, уж больно тяжелая?) getPortfolioInfoEx - функция для получения значений параметров таблицы «Клиентский портфель» с учетом срока расчётов getBuySellInfoEx - функция для получения параметров (включая срок расчётов) таблицы «Купить/Продать» (Важная для маржинальной торговли!)
У меня эти функции спрятаны. Пользователю доступ к ним не нужен и он про них ничего не знает и знать не хочет. В задаче он просто читает нужную переменную скрипта.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
написал: В своем скрипте все параметры типа firmid, client получаю из QUIK. Т е их не надо вводить пользователю.
Не очень понимаю этот подход, ну если с firmid все еще понятно, зависит в чей терминал скипт загружен. То с client не все очевидно, все равно приходится в водить,
можете вводить это не принципиально. Для информации. Вот что надо ввести пользователю в мой скрипт
Код
clas_list="QJSIM:0,SPBFUT:1,CETS:2"; --список классов счетов и тип инструментов 0 -акции 1-фьючерсы 2- валюта 3- опционы
sec_list="ROSN,GAZP,SBER,PLZL,GMKN,CHMF,HYDR,LKOH,MOEX,SNGS" --список инструментов для портфеля, если нет, то все инструменты по заданным классам
task_list="task1,task2,task3,task4" -- список существующих задач
sec_user={ --параметры устанавливаемые пользователем для инструментов по умолчанию
1, --интервал свечей
0, --подписка на стакан
0, --флаг разрешения коротких позиций
0,--флаг разрешения установки стопа 1 -обычный, 2-скользящий, 3 -take 4-stop и take
"task1",
"task2" --список задач по умолчанию для каждого инструмента
}
т е clas_list - список торгуемых классов sec_list -список торгуемых инструментов task_list -- список существующих задач, которые ему дает разработчик или он пишет сам sec_user -- параметры для все инструментов ---------------------- Для каждого инструмента,задачи можно через ':' указать индивидуальные параметры. Пользователю не надо изучать луа, если он не хочет писать задачи. =================== У меня тоже универсальная система.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
06.11.2025 15:12:23
и еще В своем скрипте все параметры типа firmid, client получаю из QUIK. Т е их не надо вводить пользователю.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
QuickDataManager:new(firmid, client_code). Конструктор создаёт экземпляр менеджера с обязательными параметрами firmid и client_code. Это основные параметры для работы с системой QUIK. Все остальные параметры передаются как опциональные в виде таблицы в функции.
QuickDataManager:_loadData(param, optional_params). Это основная функция для ленивой загрузки данных. В зависимости от параметра (например, "money", "depo", "portfolio", и т.д.), она делает запросы к соответствующим функциям QUIK. Функция также проверяет, есть ли уже кэширов анные данные для этого параметра, и если они есть — возвращает их. Если данных нет, выполняется запрос и кэшируются результаты? Здесь основной вопрос как правильно организовать работу?
QuickDataManager:__index(key). Метатаблица __index отвечает за доступ к данным через ключи, такие как money, depo, portfolio и другие. Для каждого ключа вызывается соответствующая функция ленивой загрузки, которая получает необходимые данные и кэширует их.
Параметры (например, tag, currcode, limit_kind, sec_code и другие) передаются через опциональные параметры, что позволяет адаптировать запросы под различные нужды и сохранить гибкость подхода.
Пример использования. При первом обращении к данным (manager.money, manager.depo, manager.portfolio, и т.д.) данные будут загружены, затем они будут кэшироваться для последующего использования без лишних запросов к системе. Что позволяет уменьшить нагрузку на систему и ускорить последующие операции. Как альтернатива. Если нужно избежать повторного получения одинаковых данных, можно добавить механизм для "очистки" кэша по истечении времени или по запросу.
Лучше не заставлять пользователя изучать Lua и не вводить без острой надобности специальные термены. Например, вместо:
Код
QuickDataManager:new(firmid, client_code).
написал бы
Код
fimid=XXXX
client_code=EEEE
а в скрипте под капотом написал бы
Код
QuickDataManager:new(firmid, client_code).
про термины: "ленивая" загрузка - пользователю обязательно это знать? Тогда что такое ленивая и какие еще есть ? ---------------------------- Т е сначала решите, для кого Вы пишите эту инструкцию. Т е какой у него уровень знаний должен быть, чтобы понять, что вы написали.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
06.11.2025 10:25:03
Цитата
VPM написал: Попурри на тему "Три тополя на Плющихи" в исполнении ... . ::
Зацените на сколько удобен интерфейс конечного пользователя в этом подходе.
Код
Преимущества MARKETDATA_PRO v1.0:
Вы не учитываете тот факт, что только Вы знаете это .
Мне как пользователю непонятно зачем мне это. -------------------------- Слишком.сложно, много букв. Трудно выявлять ошибки. -------------------- Попробуйте не дублировать уже описанное. -------------------- Все общее разместите в начале. Например так:
Код
-- Примеры использования универсальной системы:
market = "TQBR"
ticker = "SBER"
-- Глобальный экземпляр
MDP = MarketData_Pro.Manager:new()
-- 1. УНИВЕРСАЛЬНЫЙ ТЕХНИЧЕСКИЙ АНАЛИЗ ДЛЯ ЛЮБЫХ ДАННЫХ
-- Анализ цены последней сделки
local price_analysis = MDP:getOrCreate{ interval = INTERVAL_H1, param = "last" }
print ( "Цена SMA20:" , price_analysis:sma( 20 ))
print ( "Цена RSI14:" , price_analysis:rsi( 14 ))
-- Анализ стакана (биды)
local bid_analysis = MDP:getOrCreate{ interval = INTERVAL_M5, param = "bid" }
print ( "Биды EMA10:" , bid_analysis:ema( 10 ))
print ( "Биды STDDEV20:" , bid_analysis:getIndicator( "STDDEV" , 20 ))
-- Анализ объема
local volume_analysis = MDP:getOrCreate{ interval = INTERVAL_M15, param = "volume" }
print ( "Объем SMA30:" , volume_analysis:sma( 30 ))
-- 2. КАСТОМНЫЕ ИНДИКАТОРЫ ДЛЯ ЛЮБЫХ ПАРАМЕТРОВ
-- Регистрация индикатора для спреда
MDP:registerIndicator( "SPREAD_EMA" , function (buffer, period)
if buffer.size < period then return nil end
local sum = 0
for i = 1 , period do sum = sum + buffer:last(i).value end
return round(sum / period, 4 )
end , "EMA for Spread" , {"numeric"})
-- Анализ спреда bid/offer
local spread_data = MDP:getOrCreate{ description = "Bid-Offer Spread" }
-- Здесь можно обновлять буфер вручную с вычисленным спредом
spread_data:updateBuffer( "value" , 0.15 ) -- пример спреда
print ( "Спред EMA10:" , spread_data:getIndicator( "SPREAD_EMA" , 10 ))
-- 3. УНИВЕРСАЛЬНЫЙ АНАЛИЗ РАЗНЫХ ТИПОВ ДАННЫХ
local analyses = {
{param = "last" , desc = "Price Analysis" },
{param = "bid" , desc = "Bid Analysis" },
{param = "volume" , desc = "Volume Analysis" },
{param = "value" , desc = "Value Analysis" }
}
for _, analysis in ipairs(analyses) do
local data = MDP:getOrCreate{ ticker = "GAZP" , interval = INTERVAL_D1, param = analysis.param }
local sma = dat a:sma( 20 )
local rsi = dat a:rsi( 14 )
print ( string.format ( "%s - SMA20: %.2f, RSI14: %.1f" , analysis.desc, sma or 0 , rsi or 0 ))
end
-- 4. COMPLEX MULTI-PARAMETER ANALYSIS
interval = INTERVAL_H1
-- Анализ нескольких параметров одновременно
local multi_analysis = function ()
local price = MDP:getOrCreate{ param = "last" }
local volume = MDP:getOrCreate{ param = "volume" }
local bids = MDP:getOrCreate{ param = "bid" }
local price_trend = price:ema( 10 ) > price:ema( 20 )
local volume_spike = volume:sma( 5 ) > volume:sma( 20 ) * 1.5
local bid_strength = bids:ema( 5 ) > bids:ema( 10 )
return price_trend and volume_spike and bid_strength
end
-- 5. DYNAMIC INDICATOR CREATION
-- Создание индикатора на лету
local dynamic_indicator = function ()
MDP:registerIndicator( "VOLUME_PRICE_RATIO" , function (buffer, priceBuffer, period)
if not priceBuffer or buffer.size < period then return nil end
local volume_avg = 0
local price_avg = 0
for i = 1 , period do
local vol_item = buffer:last(i)
local price_item = priceBuffer:last(i)
if vol_item and price_item then
volume_avg = volume_avg + vol_item.value
price_avg = price_avg + price_item.value
end
end
volume_avg = volume_avg / period
price_avg = price_avg / period
return volume_avg / math.max (price_avg, 0.001 )
end , "Volume-Price Ratio" , {"volume"})
end
Универсальная система - это такая система, разработчик которой не имеет представления где и как ее будут применять. ----------------------- Пользователь такой системы не в состоянии понять все, что включил в нее разработчик. ------------------------- В результате реально либо используется 10 процентов возможности такой системы, либо пользователь начинает делать свою - не универсальную.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
06.11.2025 06:12:12
Цитата
VPM написал: , 1. Вы не отвечаете на заданные Вам вопросы, ну как минимум в общении это не вежливо! , для меня это и не важно. 2. Ну, нужны Вам все эти гигибайты истории, да и храните, я же не против, я привёл паттерн для текущей задачи. 3. Именно так создал, этот подход убираю ошибки для тестирования. 4. С песней в точку что вижу, с чем разбираюсь, про то и пою, 20 раз уже на это отвечал, если есть проблемы с памятью я записывайте, нет мне несложно повторить и 100 раз одно и тоже. 5. И уж пожалуйста, про время не нужно, оно мне интересно в рамках исполнения моих задач, описанных в скрипта. А про оптимизацию в песнях ни слова . Задачей оптимизации, следящий раз, сейчас найти приемлемое решение для задач описанных выше! 6. Возможно у такого специалиста есть рекомендации по задаче? Или " Слов из песни не выбросить "? ::
У Вас много слов в песне, возможно пропустил Ваш вопрос. Если не сложно, то повторите.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
05.11.2025 19:01:01
, Если вы останавливаете корутины, то теряете время на их остановке и запуске. Это дорогая процедура. Но Вам же время не важно.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
05.11.2025 18:54:47
, Не в обиду, но мне Ваши опусы напоминают песню ямщика: -Ямщик - ты о чем поешь? -Так что вижу, так о том и пою.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
05.11.2025 18:51:59
Цитата
VPM написал: Существует несколько подходов к организации данных в QUIK. Нужно выбрать структуру для проекта, который будет включать в себя: а) DataPoller.lua (планировщик опросов в корутинах); б) MarketData (модуль для работы с рыночными данными); с) DataManager (менеджер данных, который объединяет все вместе).
Учитывая, что задача стоит избежать фризов и минимизировать задержки, а также обеспечить актуальность данных , предлагается следующий подход:
DataPoller будет заниматься асинхронным опросом данных (через корутины) и обновлением кэша. MarketData будет предоставлять интерфейс для доступа к данным (через метатаблицы с ленивой загрузкой и кэшированием). DataManager будет управлять созданием и жизненным циклом источников данных, а также взаимодействием между Poller и MarketData.
При этом мы можем использовать комбинацию подхода 3 (ООП-ленивый доступ) и 4 (кэш + корутина). Тогда концепция выглядит следующим образом:
1. DataPoller. Создает и управляет корутинами для периодического обновления данных. Каждый источник данных (например, тикер) регистрируется в планировщике. Планировщик обновляет кэш данных в фоновом режиме.
2. MarketData. Представляет объект-источник данных (например, свечи, стакан, параметры инструмента). При первом обращении к полю, если данных нет в кэше, они запрашиваются синхронно (редкий случай, но как fallback (запасной план) ). Основной доступ к данным идет из кэша, который асинхронно обновляется планировщиком.
3. DataManager. Инициализирует планировщик и создает источники данных. Предоставляет интерфейс для получения источника данных (например, по тикеру и интервалу для свечей). Управляет жизненным циклом данных (создание, удаление, обновление).
Пример последовательности: Пользователь запрашивает у DataManager данные по SBER (например, свечи M1). DataManager создает объект MarketData для SBER M1, если он еще не создан, и регистрирует его в DataPoller. DataPoller начинает периодически (каждые N ms) обновлять данные для SBER M1 (например, запрашивать последние свечи и класть в кэш). Пользователь обращается к объекту MarketData (например, candles:getValue("close", -1)), и получает данные из кэша. Таким образом, мы имеем асинхронное обновление данных и синхронный доступ к ним без блокировок?
Теперь код для каждого модуля. Начнем с DataPoller (адаптируем тот, что уже есть, но упростим и настроим под эту задачу).
DataPoller будет: Принимать задачи (источники данных) с callback для обновления. Запускать корутины, которые периодически вызывают callback и обновляют кэш. MarketData (источник данных) будет: Иметь метод update() (который будет вызываться планировщиком) для обновления своих данных. Иметь кэш для хранения последних данных. Предоставлять методы для доступа к данным (например, getValue). DataManager будет: Хранить все созданные источники данных (например, по ключу market_ticker_interval). Создавать новые источники, если их нет, и регистрировать их в DataPoller.
Вы это сделали или просто рассуждаете? Если сделали то покажите профиль задержек на тестах и оцените сколько инструментов вы сможете обрабатывать. Какие у Вас результаты на истории?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
05.11.2025 18:49:25
Цитата
VPM написал: Еще раз. Идеальный производственный паттерн работы с QUIK: В QUIK нет смысла "стримить" все свечи постоянно — нужно один раз получить исторический буфер и дальше обновлять только последнюю (текущую, незакрытую) через callback/опрос?
Тогда, Алгоритм модуля MarketData_Pro.Poller, который: а) Загружает исторические свечи (100–500 штук) в UniversalBuffer при инициализации. б) Держит кеш последней свечи (текущий бар) отдельно. с) Обновляет кеш по событию или через быстрый опрос QUIK (getParamEx / getCandlesByIndex). д) По таймфрейму??? проверяет закрытие свечи > переносит кеш в буфер и очищает кеш? е) Отдает актуальные данные любому индикатору через getValue() или прямой доступ к буферу?
Вы ошибаетесь. История торгов нужна не для того, чтобы постоянно ее обрабатывать. На истории проверяют идеи торгов. Я на истории обучаю роботов.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
05.11.2025 18:35:42
Т е примерно в 10000 раз меньше, чем у Вас, если Вы поставите sleep на 1 сек
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
написал: Собственно задачей может быть не только функция, выполняемая в main, но и любой процесс или другой поток со своей VMLua или любом другом языке и даже в облаке или у соседа на компе.
Вот этого точно, не обсуждаю. 1 терминал, 1 маин, множество корутин или сейчас рассматриваю как предлагал альтернативу , . Все остальное к программистам системщикам или , ::
Цитата
написал: Свчеи хранятся в сжатом формаье (степень сжатия примерно 7 раз . 10 лет SBER на 1 мин это 2 млн свечей. Сжатый объем 28МБайт.
Но это тоже для Ваших каких то специфических задач. "Дата соурсе" в квик организовано как интерфейс получения данных о свечах, получил к примеру 100 бар в буфер, обработал расчеты допустим индикатора и все. Обновляется буфер согласно тайм фрейма. Текущее (не завершенную свечу) держим в кеш, обновляется оперативно по колбеку.
Я у Вас спрашивал как вы обрабатываете события последовательно перебираете очередь или есть приоритеты, если есть то чем обосновываете
Приоритеты не имеет смысла делать, так как очередь пока короткая. У моего робота реакция на колбек составляет не более 0.1 ms.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
05.11.2025 14:17:56
посмотрел объем сохраненных данных за период 10 лет по 26 инструментам. Всего 603МБ. сжатых 7Z.