nikolz (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 83 След.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Вот еще информация к размышлению.
В одном из вариантов робота реализовал подписку в колбеке Onparam.
------------------------
Размер кода функции подписки для любого числа инструментов  12 строк. (Двенадцать строк)
--------------------------
Работает без задержек т е асинхронно.
-----------------------
Вот лог файл работа такой подиписки.  
Время указано в ms ( для справки ms - 1/1000 секунды)
Подписка на 10 интервалов занимает примерно 0.006 сек.  В первой строке список инструментов на которы подписываемся и список интервалов
Когда подписка закончилась то задержка работы колбека  из-за вызова этой функции составляет  4 мкс это 0.000004 сек.
Код
ns={[1]=SBER,[2]=ROSN,[3]=GAZP,[4]=PLZL,[5]=GMKN,[6]=CHMF,[7]=HYDR,[8]=LKOH,[9]=MOEX,[10]=SNGS,[0]=10}
Tint={INTERVAL_TICK,INTERVAL_M1,INTERVAL_M2,INTERVAL_M3,INTERVAL_M4,INTERVAL_M5,INTERVAL_M6,INTERVAL_M10,INTERVAL_M15,INTERVAL_M20,INTERVAL_M30,INTERVAL_H1}; Tint[0]=#Tint;

t(ms)=0.8372,GAZP,QJSIM,int=1,N=11,ds=table: 0000014C184142F0
t(ms)=1.5296,GAZP,QJSIM,int=60,N=10,ds=table: 0000014C18414730
t(ms)=2.1807,GAZP,QJSIM,int=30,N=9,ds=table: 0000014C18416C70
t(ms)=2.8129,GAZP,QJSIM,int=20,N=8,ds=table: 0000014C18416AB0
t(ms)=3.437,GAZP,QJSIM,int=15,N=7,ds=table: 0000014C18418470
t(ms)=4.0609,GAZP,QJSIM,int=10,N=6,ds=table: 0000014C184197B0
t(ms)=4.687,GAZP,QJSIM,int=6,N=5,ds=table: 0000014C183F9870
t(ms)=4.7432,GAZP,QJSIM,int=5,N=4,ds=table: 0000014C183F9D70
t(ms)=5.3711,GAZP,QJSIM,int=4,N=3,ds=table: 0000014C183F9D30
t(ms)=6.0284,GAZP,QJSIM,int=3,N=2,ds=table: 0000014C183FA070
t(ms)=6.7003,GAZP,QJSIM,int=2,N=1,ds=table: 0000014C1804B2D0
t(ms)=6.7394
t(ms)=0.2054,LKOH,QJSIM,int=1,N=11,ds=table: 0000014C1804B590
t(ms)=0.4092,LKOH,QJSIM,int=60,N=10,ds=table: 0000014C1804A850
t(ms)=0.6107,LKOH,QJSIM,int=30,N=9,ds=table: 0000014C1804B010
t(ms)=0.81,LKOH,QJSIM,int=20,N=8,ds=table: 0000014C1804AAD0
t(ms)=1.0044,LKOH,QJSIM,int=15,N=7,ds=table: 0000014C1804B890
t(ms)=1.2009,LKOH,QJSIM,int=10,N=6,ds=table: 0000014C1804BA90
t(ms)=1.3916,LKOH,QJSIM,int=6,N=5,ds=table: 0000014C1804BAD0
t(ms)=1.5861,LKOH,QJSIM,int=5,N=4,ds=table: 0000014C1804C250
t(ms)=1.7787,LKOH,QJSIM,int=4,N=3,ds=table: 0000014C1804BF50
t(ms)=1.9693,LKOH,QJSIM,int=3,N=2,ds=table: 0000014C1804BE10
t(ms)=2.1587,LKOH,QJSIM,int=2,N=1,ds=table: 0000014C1804D550
t(ms)=2.1975
t(ms)=0.1918,PLZL,QJSIM,int=1,N=11,ds=table: 0000014C1804C9D0
t(ms)=0.3954,PLZL,QJSIM,int=60,N=10,ds=table: 0000014C1804CA90
t(ms)=0.597,PLZL,QJSIM,int=30,N=9,ds=table: 0000014C1804CA50
t(ms)=0.7938,PLZL,QJSIM,int=20,N=8,ds=table: 0000014C1804CBD0
t(ms)=0.9937,PLZL,QJSIM,int=15,N=7,ds=table: 0000014C1804E590
t(ms)=1.1861,PLZL,QJSIM,int=10,N=6,ds=table: 0000014C1804D8D0
t(ms)=1.4026,PLZL,QJSIM,int=6,N=5,ds=table: 0000014C1804DF10
t(ms)=1.5999,PLZL,QJSIM,int=5,N=4,ds=table: 0000014C1804DB50
t(ms)=1.7913,PLZL,QJSIM,int=4,N=3,ds=table: 0000014C1804DF90
t(ms)=1.9999,PLZL,QJSIM,int=3,N=2,ds=table: 0000014C1804EF10
t(ms)=2.2249,PLZL,QJSIM,int=2,N=1,ds=table: 0000014C1804E910
t(ms)=2.266
t(ms)=0.003
t(ms)=0.0016
t(ms)=0.0014
t(ms)=0.7523,SBER,QJSIM,int=1,N=11,ds=table: 0000014C1804F3D0
t(ms)=1.3591,SBER,QJSIM,int=60,N=10,ds=table: 0000014C1804F250
t(ms)=2.0204,SBER,QJSIM,int=30,N=9,ds=table: 0000014C18050750
t(ms)=2.616,SBER,QJSIM,int=20,N=8,ds=table: 0000014C1804F8D0
t(ms)=3.1893,SBER,QJSIM,int=15,N=7,ds=table: 0000014C1804FF50
t(ms)=3.2431,SBER,QJSIM,int=10,N=6,ds=table: 0000014C1804FB90
t(ms)=3.8635,SBER,QJSIM,int=6,N=5,ds=table: 0000014C1804F850
t(ms)=3.9166,SBER,QJSIM,int=5,N=4,ds=table: 0000014C1804FC10
t(ms)=4.5119,SBER,QJSIM,int=4,N=3,ds=table: 0000014C18051190
t(ms)=5.1614,SBER,QJSIM,int=3,N=2,ds=table: 0000014C18050A50
t(ms)=5.9995,SBER,QJSIM,int=2,N=1,ds=table: 0000014C18051610
t(ms)=6.0391
t(ms)=0.0043
t(ms)=0.0042
...
t(ms)=0.0016
t(ms)=0.0035
t(ms)=0.3254,CHMF,QJSIM,int=1,N=11,ds=table: 0000014C1804AD50
t(ms)=0.5977,CHMF,QJSIM,int=60,N=10,ds=table: 0000014C1804B610
t(ms)=0.8343,CHMF,QJSIM,int=30,N=9,ds=table: 0000014C1804B550
t(ms)=1.051,CHMF,QJSIM,int=20,N=8,ds=table: 0000014C1804B390
t(ms)=1.2606,CHMF,QJSIM,int=15,N=7,ds=table: 0000014C1804AC50
t(ms)=1.4699,CHMF,QJSIM,int=10,N=6,ds=table: 0000014C1804BE50
t(ms)=1.6765,CHMF,QJSIM,int=6,N=5,ds=table: 0000014C1804C6D0
t(ms)=1.8828,CHMF,QJSIM,int=5,N=4,ds=table: 0000014C1804BC10
t(ms)=2.0797,CHMF,QJSIM,int=4,N=3,ds=table: 0000014C1804C650
t(ms)=2.2755,CHMF,QJSIM,int=3,N=2,ds=table: 0000014C1804D350
t(ms)=2.4727,CHMF,QJSIM,int=2,N=1,ds=table: 0000014C1804CD10
t(ms)=2.5117
t(ms)=0.0018
t(ms)=0.2665,ROSN,QJSIM,int=1,N=11,ds=table: 0000014C1804CF10
t(ms)=0.485,ROSN,QJSIM,int=60,N=10,ds=table: 0000014C1804D010
t(ms)=0.703,ROSN,QJSIM,int=30,N=9,ds=table: 0000014C1804E410
t(ms)=0.9127,ROSN,QJSIM,int=20,N=8,ds=table: 0000014C1804E350
t(ms)=1.1188,ROSN,QJSIM,int=15,N=7,ds=table: 0000014C1804E6D0
t(ms)=1.3883,ROSN,QJSIM,int=10,N=6,ds=table: 0000014C1804DA90
t(ms)=1.5976,ROSN,QJSIM,int=6,N=5,ds=table: 0000014C1804DD50
t(ms)=1.806,ROSN,QJSIM,int=5,N=4,ds=table: 0000014C1804F010
t(ms)=2.0091,ROSN,QJSIM,int=4,N=3,ds=table: 0000014C1804E850
t(ms)=2.2303,ROSN,QJSIM,int=3,N=2,ds=table: 0000014C1804F390
t(ms)=2.4309,ROSN,QJSIM,int=2,N=1,ds=table: 0000014C1804F610
t(ms)=2.4736
t(ms)=0.0013
t(ms)=0.0038
t(ms)=0.0019
...
t(ms)=0.0013
t(ms)=0.0013
t(ms)=0.0031
t(ms)=0.002
t(ms)=0.0028
t(ms)=0.3455,MOEX,QJSIM,int=1,N=11,ds=table: 0000014C180528D0
t(ms)=0.5907,MOEX,QJSIM,int=60,N=10,ds=table: 0000014C18052E10
t(ms)=0.8181,MOEX,QJSIM,int=30,N=9,ds=table: 0000014C18052E90
t(ms)=1.03,MOEX,QJSIM,int=20,N=8,ds=table: 0000014C18052A10
t(ms)=1.234,MOEX,QJSIM,int=15,N=7,ds=table: 0000014C18052FD0
t(ms)=1.4321,MOEX,QJSIM,int=10,N=6,ds=table: 0000014C18053750
t(ms)=1.63,MOEX,QJSIM,int=6,N=5,ds=table: 0000014C18053B50
t(ms)=1.8317,MOEX,QJSIM,int=5,N=4,ds=table: 0000014C180543D0
t(ms)=2.0248,MOEX,QJSIM,int=4,N=3,ds=table: 0000014C18054510
t(ms)=2.2182,MOEX,QJSIM,int=3,N=2,ds=table: 0000014C18053850
t(ms)=2.41,MOEX,QJSIM,int=2,N=1,ds=table: 0000014C18054190
t(ms)=2.4523
t(ms)=0.0014
t(ms)=0.0013
t(ms)=0.0045
t(ms)=0.0029
t(ms)=0.0031
...
t(ms)=0.0036
t(ms)=0.0018
t(ms)=0.0014
t(ms)=0.0012
t(ms)=0.4719,GMKN,QJSIM,int=1,N=11,ds=table: 0000014C18057690
t(ms)=0.8918,GMKN,QJSIM,int=60,N=10,ds=table: 0000014C18056A90
t(ms)=1.2724,GMKN,QJSIM,int=30,N=9,ds=table: 0000014C18056FD0
t(ms)=1.6336,GMKN,QJSIM,int=20,N=8,ds=table: 0000014C180569D0
t(ms)=1.9807,GMKN,QJSIM,int=15,N=7,ds=table: 0000014C18057110
t(ms)=2.3227,GMKN,QJSIM,int=10,N=6,ds=table: 0000014C18058350
t(ms)=2.6585,GMKN,QJSIM,int=6,N=5,ds=table: 0000014C180579D0
t(ms)=3.0039,GMKN,QJSIM,int=5,N=4,ds=table: 0000014C18058210
t(ms)=3.3355,GMKN,QJSIM,int=4,N=3,ds=table: 0000014C18058750
t(ms)=3.6669,GMKN,QJSIM,int=3,N=2,ds=table: 0000014C18058310
t(ms)=3.995,GMKN,QJSIM,int=2,N=1,ds=table: 0000014C18057DD0
t(ms)=4.0628
t(ms)=0.0028
t(ms)=0.0025
t(ms)=0.0034
t(ms)=0.0019
t(ms)=0.0017
t(ms)=0.0015
...
t(ms)=0.0014
t(ms)=0.0032
t(ms)=0.0015
t(ms)=0.0014
t(ms)=0.0044
t(ms)=0.0036
t(ms)=0.0022
t(ms)=0.3542,HYDR,QJSIM,int=1,N=11,ds=table: 0000014C18055210
t(ms)=0.6975,HYDR,QJSIM,int=60,N=10,ds=table: 0000014C18056010
t(ms)=3.5457,HYDR,QJSIM,int=30,N=9,ds=table: 0000014C180563D0
t(ms)=3.8542,HYDR,QJSIM,int=20,N=8,ds=table: 0000014C18055F10
t(ms)=4.1337,HYDR,QJSIM,int=15,N=7,ds=table: 0000014C18055C50
t(ms)=4.4013,HYDR,QJSIM,int=10,N=6,ds=table: 0000014C18056350
t(ms)=4.6567,HYDR,QJSIM,int=6,N=5,ds=table: 0000014C180570D0
t(ms)=7.2891,HYDR,QJSIM,int=5,N=4,ds=table: 0000014C18056E90
t(ms)=7.5775,HYDR,QJSIM,int=4,N=3,ds=table: 0000014C18057710
t(ms)=7.8695,HYDR,QJSIM,int=3,N=2,ds=table: 0000014C180577D0
t(ms)=8.1107,HYDR,QJSIM,int=2,N=1,ds=table: 0000014C18058190
t(ms)=8.1587
t(ms)=0.0017
t(ms)=0.0012
t(ms)=0.0041
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Цитата
nikolz написал:
А если поставить колбек то и тыкать не надо. Тратим время лишь когда приди данные. Что не так?
Не так, что этот колбек будет вызываться на всех барах истории, начиная с 1. Также он будет дергаться на каждую сделку. Это все лишние телодвижения. По крайней мере мне необходимо пройтись по последним, скажем 100 барам, а далее один раз на новый бар. Но да, можно и так, если организовать доп. проверки в этом колбеке.
Вы не правы.
он дергается основным потоком ровно тогда когда тот запихивает данные в хранилище.
Если нам не надо реагировать на незакрытую свечу, то в колбеке просто ее игнорируем.
при приходе очередной закрытой свечи заданного тайма колбек вызовет функцию инструмента которому эти данные пришли.
Таким образом никаких лишних телодвижений в потоке main нам делать не надо. И не надо тыкать куда-то чтобы проверить есть или нет данных.
---------------------------
История тоже распознается без проблем
------------------------
Все доп проверки решаются парой операторов if  Это примерно 300 наносекунд затрат времени.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Круто нагородили.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Цитата
VPM написал:
Так и в нашем упрощённом варианте предусмотрен выход из цикла подписки.
Может я, конечно, невнимательно смотрел примеры, но все одни предполагали ожидание через цикл. Т.е. заказали - и тут же ждем. В итоге заказ 100 источников растягивается во времени, т.к. последний будет заказан только через 100*время ожидания. Что долго. Подход заказали все сразу в цикле и потом ждем все в цикле лучше, но тоже заблокирует скрипт пока ждем циклом. Здесь же заказ всех сразу. И периодически просто атомарно  "тыкаем палочкой" на предмет данных. Пришли - можем делать что-то с данными. Нет - переходим к другим задачам, а эта пока путь остается. Т.е. ожидание не мешает другим задачам не связанным с данными, коих может быть много в скрипте.
А если поставить колбек то и тыкать не надо. Тратим время лишь когда приди данные. Что не так?
Обсуждаем интерфейс для робота
 
Сейчас реализовал умную заявку.
--------------------------------
В интерфейсе есть столбец с именем Qn - это желаемый размер позиции в лотах.  
----------------------------
Работает это так. левой кнопкой увеличиваем Qn и робот будет докупать, правой кнопкой уменьшаем Qn и робот будет продавать.
Покупает и продает он по лучшим ценам.
В таблице есть параметр dp . этот параметр задает в минимальных  шагах цены допустимый уход цены в заявке от лучшей цены.
------------------------  
Алгоритм работы умной заявки можно заменить, подключив новую задачу вместо существующей.
-----------------------  
Управление заявками и задачами реализованы в конечном автомате и пользователь их не знает и не видит.
В задачах выставление заявок можно задавать через события и колбеки, а стоп-заявку  и ее параметры установить в таблице интерфейса .
Обсуждаем интерфейс для робота
 
Сейчас пишу робота  на основе ИИ 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." 
 -- описание столбцов
В таблице отображаются либо отдельные значения, либо значения из списка.
Например, я задаю типы стоп заявок в виде :
Код
T_stop={"stop","take","st_ta","oth_sec","linked","ord_st","ord_ta","ord_st_ta"}; T_stop[0]=#T_stop; --типы стоп-заявок
Пользователь может изменять данные лишь двумя способами  -- выбирать из существующего списка или изменять значение на плюс минус 1 нажатием правой или левой кнопки мышки..
Двойным щелчком мышки можно сделать значение активным или пассивным.
-----------------
Например, можно сделать неактивными все инструменты ,кроме одного, и робот будет торговать лишь этим инструментом.
Можно сделать неактивным стоп или short и робот не будет ставить стоп или покупать в шорт.
-------------------------  
Еще в файле инициализации задается список имеющихся алгоритмов торговли , я называю их задачами.  
Код
list_task="task1,task2,task3,task4"  -- список существующих задач
а также список задач для всех инструментов по умолчанию
Код
user_task={"task1","task2" } --задачи для каждого инструмента по умолчанию

для каждого инструмента можно указать индивидуальные параметры или задачи, которые в списке инструментов указываются через ":"
=========================
Это весь интерфейс.

Конструктивные предложения приветствуются.
О торговле фьючерсами и ГО
 
Если Вы обязались купить
Потом обязались продать
То у вас нет обязанности. вторая погасила первую ГО вам вернули. За вычетом разницы в цене и комис.
О торговле фьючерсами и ГО
 
Фьючерс - это не товар, а обязанность
ГО - это залог под исполнения этой обязанности.
О торговле фьючерсами и ГО
 
Если Вы продаете то что уже купили то платите лишь комиссию
Если Вы покупаете то что уже продали то аналогично  
О торговле фьючерсами и ГО
 
Цитата
Сергей Че написал:
Допустим, я купил 2 фьючерса с ГО = 10 000 руб. Для их покупки у меня должно быть свободно минимум 2 * 10 000 руб = 20 000 руб, которые будут заморожены при покупке.
Спустся время я хочу закрыть позицию. Для этого мне надо продать два фьючерса. И для этого у меня так же должны быть свободны 20 000 руб или нет?
Получается, чтобы торговать фьючерсом с плечом Х, мне надо иметь 2 * Х * ГО руб свободных денег? Я прав? Или я где-то что-то недопонимаю?
Прикольно, Вы хотите платить и когда покупаете что-то и когда продаете что-то?  
---------------------------
Может лучше начать с чтения учебников, а не с реальной торговли?  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Поясняю.
"Все  смешалось, кони, люди"
--------------------  
Вы подписываетесь на параметр из ТТП  а ждете свечи.Вы уж определитесь.
------------------------------------------------------------------------
"А, ты за большевиков, али за коммунистов?"
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Минимальный рабочий Скрипт для QUIK

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), Нечеткая логика или Система принятия решений в трейдинге
 
Повторю еще раз. Подписка делается однократно при запуске робота.  Т е она не влияет на его работу никак.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
далее создаю файл для сохранения данных текущего дня  Для истории есть отдельная сжатая база глубиной 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), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
ds, error_desc  = CreateDataSource(class_code, sec_code, 60, "last")
пардон, не понял сначала .
Расскажу как я делаю подписку.   Число инструментов не имеет значения. Сейчас в разрабатываемом роботе 10 инструментов.
------------------------
Подписка делается один раз в функции получения параметров инструментов заданных списком в фале ini.
вот фрагмент подписки.
Код
local ds,err;  
if int>0 then --подписка на свечи
while ds==nil do ds,err=CreateDataSource(clas,sec,int); sleep(1); end
end
 
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Если скрипт не осилите, то покажите фрагмент кода, как Вы будете обрабатывать свечи отдельного инструмента/
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Если это у Вас универсальная система,
то покажите код для произвольного числа инструментов,
список которых будет задавать пользователь либо, этот список формирует сам робот исходя из состояния рынка.
Проблема с нажатием правой кнопки
 
Когда в таблице в скрипте нажимаю правую кнопку мышки, то вылезает окно квика


можно как-то это отключить?
Scoping
 
Цитата
Develing написал:
Scoping
Если не знаете, то спросите сначала у Алисы.
--------------------------
Алиса AI
Быстрый ответ на основе источников
Содержимое ответа

Понятие Scoping (области видимости) в языке программирования Lua определяет, насколько переменная видна остальной части программы. Это понятие относится к глобальным и локальным переменным. wowwiki-archive.fandom.comsimion.comtui.ninja
Область видимости — это участок кода программы, в пределах которого можно получить доступ к значению, хранящемуся в переменной. Под блоком понимается: smart-lab.ru
  • тело управляющей конструкции (if-then, else, for, while, repeat);
  • тело функции;
  • фрагмент кода, заключённый в ключевые слова do...end.
проблема с двойным нажатием кнопки
 
Цитата
Станислав написал:
Организовать какой-то адаптер, который будет заниматься подсчетом количества миллисекунд с нажатия и на основе этих данных отправлять сигнал либо об одиночном либо о двойном нажатии.  
Спасибо.
Решил проблему иначе.
Запоминаю код предыдущего нажатия.
Обработку одинарного нажатия выполняю по отпусканию клавиши.
проблема с двойным нажатием кнопки
 
При двойном нажатии кнопки мыши в таблице созданной в скрипте всегда сначала приходит сигнал об одинарном нажатии кнопки.
Код
msg=1,j=2
msg=1,левая кнопка
msg=5,j=-1
msg=5,изм текущей (выделенной) строки
msg=11,j=2
msg=11,отпущена левая кнопка
msg=3,j=2
msg=3,двойное левой кнопки
Как  устранить сигнал об одинарном нажатии при двойном нажатии?
Примеры простого торгового робота на Lua и Python от разработчиков QUIK, Примеры простого торгового робота на Lua и Python от разработчиков QUIK
 
Цитата
Олег Денисов написал:
Может есть у кого-нибудь такой "простой работающий робот qlua с выставлением стопа и профита"?
На сколько простой?
-------------------------
В интернете можно найти много предложений роботов для QUIK за деньги .
Вы удивитесь, но это все  "простые" роботы.  
Торговый счёт и код клиента
 
спросите в браузере  Яндекса Алису, она все объяснит простым русским языком.
Установка отметок на графике через скрипт
 
Цитата
gngngn написал:
нет +4 к Москве
А на графике какое?
Установка отметок на графике через скрипт
 
Цитата
gngngn написал:
всем спасибо. метки все таки появляются на графике, но с сильным смещением вправо, подскажите с чем это может быть связано  
На компе время московское?
Не видны текстовые метки на графике
 
gngngn
Вот  правильный бутерброд.
Код
label_params={["TEXT"]="",["IMAGE_PATH"]="",["ALIGNMENT"]="Left",["YVALUE"]=0,["DATE"]=0,["TIME"]=0,["R"]=0,["G"]=0,["B"]=0,
["TRANSPARENCY"]=0,["TRANSPARENT_BACKGROUND"]=0,["FONT_FACE_NAME"]='Times New Roman',["FONT_HEIGHT"]=10,["HINT"]=""}

function labeldraw(price, textlabel, texthint) 
TS=getInfoParam("SERVERTIME")
TIME =string.sub(TS,1,2)..string.sub(TS,4,5).. string.sub(TS,7,8); 
label_params.DATE =DATE; 
label_params.TIME =TIME; 
label_params.TEXT = textlabel
label_params.TRANSPARENT_BACKGROUND = 1
label_params.YVALUE = price
label_params.HINT = texthint
label_id_text = AddLabel(tiker_id, label_params)
end

function main()
tiker_id = "SBER_ID"
DATE = tostring(os.date("%Y%m%d"))
while  true do
number_of_candles = getNumCandles(tiker_id)
price, _, _ = getCandlesByIndex(tiker_id, 0, number_of_candles - 1, 1)  
sleep(1)
text = "ppppp "..price[0].close
labeldraw(price[0].close, text, "eeeeee")
end
message (tostring(label_id_text))
end
Не видны текстовые метки на графике
 
Цитата
gngngn написал:
gngngn
У Вас скрипт работает лишь один раз.  В майн надо делать бесконечный цикл. Читайте документацию.
Индекс запсииси в таблице ордеров
 
Предположу, что так сбрасывают зависшие каналы, когда их много.
-------------------
"Хотелось бы услышать начальника транспортного цеха"
Установка отметок на графике через скрипт
 
Цитата
gngngn написал:
Добрый день
код который вы скинули кладет терминал

у меня скорей всего что то с самим терминалом, пробивал несколько простых скриптов, метки создаются - message (tostring(label_id_text)) выводи id метки
Чтобы выводились метки надо установить в скрипте интервал равный интервалу на графике.  Установлено 5 минут.
идентификатор графика установлен t ag = "SBER_ID"
версия QUIK 12.8.0.6  сервер тестовый
Метки на графике в скрипте
 
По просьбе трудящихся.


Код
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

Установка отметок на графике через скрипт
 
gngngn,
Вот решение Вашей хотелки - метки в скрипте:




это скрипт:
Код
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
Установка отметок на графике через скрипт
 
Общие сведения

Индикаторы технического анализа представляют собой отдельный класс скриптов,  которые удовлетворяют определенным условиям и расположены в папке 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
Установка отметок на графике через скрипт
 
Цитата
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
}

label_id_text = AddLabel(tiker_id, label_params)

end

function main()
tiker_id = "SBER_ID"

number_of_candles = getNumCandles(tiker_id)
price, _, _ = getCandlesByIndex(tiker_id, 0, number_of_candles - 1, 1)  
sleep(300)

text = "ppppp "..price[0].close
labeldraw(price[0].close, text, "eeeeee")
message (tostring(price[0].close))
message (tostring(label_id_text))
end
Метки выставляются в индикаторе, а вы написали скрипт.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
поправил комментарии
Код
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), Нечеткая логика или Система принятия решений в трейдинге
 
сделал новый интерфейс еще проще:
Код
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), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Возможно Вы не обратили внимание,
но у меня
ВСЯ УНИВЕРСАЛЬНАЯ СИСТЕМА это 380 операторов
из них 120 - это конечный автомат обработки колбеков
и 60 - конечный автомат обработки задач.
-----------------------------
+ скрипты задач.  
которые могут создать событие на выставление удаление перестановку заявок.
----------------------
Интерфейс к ней показал ранее.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
У меня данные обновляются лишь по колбекам.
Поэтому нет смысла их кэшировать.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
"Едем дальше, видим больше"! На мой взгляд данный подход, нужно распространить на получение "Серверных данных". Для понимания проблематики, архитектуру предлагается использовать общею для фондового и сросного рынков?  Задача все та же.

Задача - возможность торговать и управлять 1 инструментом так и портфелем (универсальность), с учетом рисков (как квиковских, так и собственно ручных), ну и конечно одной из основных задач управление позицией.
Структура - модульная, много разового использования.
Интерфейс - наипростейший, понятный бабушке!

Обобщенно свести квиковские в функции в удобную оболочку:

Функции взаимодействия скрипта Lua и Рабочего места QUIK  
getDepoEx - функция для получения позиций по инструментам указанного типа
 getMoneyEx - функция для получения информации по денежным позициям указанного типа
 getFuturesLimit - функция для получения информации по фьючерсным лимитам
 getFuturesHolding - функция для получения информации по фьючерсным позициям
 getSecurityInfo - функция для получения информации по инструменту?
 getTradeDate - функция для получения даты торговой сессии
 CalcBuySell - функция для расчета максимально возможного количества лотов в заявке? (скорее для контроля, уж больно тяжелая?)
 getPortfolioInfoEx - функция для получения значений параметров таблицы «Клиентский портфель» с учетом срока расчётов
 getBuySellInfoEx - функция для получения параметров (включая срок расчётов) таблицы «Купить/Продать» (Важная для маржинальной торговли!)
У меня эти функции спрятаны.
Пользователю доступ к ним не нужен и он про них ничего не знает и знать не хочет.
В задаче он просто читает нужную переменную скрипта.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Цитата
nikolz написал:
В своем скрипте все параметры типа 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), Нечеткая логика или Система принятия решений в трейдинге
 
и еще
В своем скрипте все параметры типа firmid, client  получаю из QUIK.
Т е их не надо вводить пользователю.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Что делает:

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), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
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), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
nikolz,  1. Вы не отвечаете на заданные Вам вопросы, ну как минимум в общении это не вежливо!   , для меня  это и не важно.
2. Ну, нужны Вам все эти гигибайты истории, да и храните, я же не против, я привёл паттерн для текущей задачи.
3. Именно так создал, этот подход убираю ошибки для тестирования.
4. С песней в точку что вижу, с чем разбираюсь, про то и пою, 20 раз уже на это отвечал, если есть проблемы с памятью я записывайте, нет мне несложно повторить и 100 раз одно и тоже.
5. И уж пожалуйста, про время не нужно, оно мне интересно в рамках исполнения моих задач, описанных в скрипта.  А про   оптимизацию в песнях ни слова . Задачей оптимизации, следящий раз, сейчас найти приемлемое решение для задач описанных выше!
6. Возможно у такого специалиста есть рекомендации по задаче? Или " Слов из песни не выбросить "?  ::  
У Вас много слов в песне, возможно пропустил Ваш вопрос.  Если не сложно, то повторите.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Если вы останавливаете корутины, то теряете время на их остановке и запуске. Это дорогая процедура.
Но Вам же время не важно.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Не в обиду, но мне Ваши опусы напоминают песню ямщика:
-Ямщик - ты о чем поешь?
-Так что вижу, так  о том и пою.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
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), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Еще раз. Идеальный производственный паттерн работы с QUIK:  В QUIK нет смысла "стримить" все свечи постоянно — нужно один раз получить исторический буфер и дальше обновлять только последнюю (текущую, незакрытую) через callback/опрос?

Тогда, Алгоритм модуля MarketData_Pro.Poller, который:
а) Загружает исторические свечи (100–500 штук) в UniversalBuffer при инициализации.
б) Держит кеш последней свечи (текущий бар) отдельно.
с) Обновляет кеш по событию или через быстрый опрос QUIK (getParamEx / getCandlesByIndex).
д) По таймфрейму???  проверяет закрытие свечи > переносит кеш в буфер и очищает кеш?
е) Отдает актуальные данные любому индикатору через getValue() или прямой доступ к буферу?
Вы ошибаетесь.
История торгов нужна не для того, чтобы постоянно ее обрабатывать. На истории проверяют идеи торгов. Я на истории обучаю роботов.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Т е примерно в 10000 раз меньше, чем у Вас, если Вы поставите sleep на 1 сек
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Цитата
nikolz написал:
Собственно задачей может быть не только функция, выполняемая в main, но и любой процесс или другой поток со своей VMLua или любом другом языке и даже в облаке или у соседа на компе.
Вот этого точно, не обсуждаю. 1 терминал, 1 маин, множество корутин или сейчас рассматриваю как предлагал альтернативу Nikolay, . Все остальное к программистам системщикам или TGB,   ::

Цитата
nikolz написал:
Свчеи хранятся в сжатом формаье (степень сжатия примерно 7 раз .  10 лет  SBER на 1 мин это 2 млн свечей. Сжатый объем 28МБайт.
Но это тоже для Ваших каких то специфических задач.
"Дата соурсе" в квик организовано как интерфейс получения данных о свечах, получил к примеру 100 бар в буфер, обработал расчеты  допустим индикатора и все. Обновляется буфер согласно тайм фрейма. Текущее (не завершенную свечу) держим в кеш, обновляется оперативно по колбеку.

Я у Вас спрашивал как вы обрабатываете события последовательно перебираете очередь или есть приоритеты, если есть то чем обосновываете
Приоритеты не имеет смысла делать, так как очередь пока короткая.
У моего робота реакция на колбек составляет  не более 0.1 ms.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
посмотрел объем сохраненных данных  за период 10 лет по 26 инструментам.
Всего   603МБ. сжатых 7Z.  
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 83 След.
Наверх