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

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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 84 След.
Не получается запустить два скрипта одновременно, При запуске второго первый останавливается
 
User12501
Если выложите скрипт, скажу как исправить.
Как вычислить положение курсора или перекрестия с графика инструмента
 
Цитата
Виталий Дерягин написал:
Нужно для того, чтобы отыскать ближайшую метку на графике от курсора к которой будет прикреплена таблица с данными и при нажатии горячей клавиши будет выводится таблица.
Это Вы не реализуете.
Как вычислить положение курсора или перекрестия с графика инструмента
 
Цитата
Виталий Дерягин написал:
Это вообще можно реализовать на КВИКЕ?
Сложно, что практически не имеет смысла.  
Не получается запустить два скрипта одновременно, При запуске второго первый останавливается
 
Не получается запустить два скрипта одновременно, При запуске второго первый останавливается
 
Цитата
User12501 написал:
Цитата
nikolz написал:
Я проверил, если запускать два простейших скрипта, типа message(...) sleep, то работают. Но если мой мониторинг цены запараллелить с простейшим - останавливается. Возможно какая-то конкретная функция есть, которая не хочет делить ресурсы.

Более того, останавливается даже в момент загрузки второго скрипта. Т.е. нажимаю кнопку "добавить", выбираю файл скрипта (но не запускаю) - и первый останавливается.

P.S. Тут по правилам форума новичку можно писать только одно сообщение в сутки. Так что если я молчу - не значит, что всё ок или я забил.  
У меня 1 скрипт - это робот который создает таблицу (видно на рисутке) обрабатывает колбеки выставляет заявки и выдает команды второму роботу Второй робот считает алгоритмы и выдает команды первому роботу. Они общаются через mapping file и глобальные переменные среды приложения.  Могу еще что-нибудь добавить .  
Не получается запустить два скрипта одновременно, При запуске второго первый останавливается
 
Как создать мост QLua-скрипта с другим C++ приложением? Вопрос концепта., Предлагаю такой подход, но есть вопросы.
 
...замечу, глобальные переменные не луа, а среды исполнения приложения.
Как создать мост QLua-скрипта с другим C++ приложением? Вопрос концепта., Предлагаю такой подход, но есть вопросы.
 
Цитата
A.T. написал:
Потому что это совсем колхоз, архитектурно неправильно. Я еще должен выделять специальное место в системе, как загашник... Когда существует официальная связка Lua-C (описанная в книге Иерусалимского), в детали не вникал и данные не гонял, но тестовый запуск уже получился, это есть.

Тем более есть мысли применить такой мост Lua-C <=> VC++ (MFC, скорее всего) и в другом месте, не только как узкоспециальный плагин на раз.

И потом, что значит "особенно в RAM диске"? Мне еще сторонний витруальный диск ради этого создавать? Какими-то сторонними драйверами? И запускать/пересоздавать его, заботиться после каждой перезагрузки. Который будет мешаться в системе в повседневных делах. У меня не только квик, у меня и другие развлечения есть.
То есть это даже не костыль, это хуже. Настолько временное решение, что лучше о нем не думать.
На сайте Майкрософта висит готовый пример для named pipes. И не только для него.

Насчет протокол на запрос-ответ понадобится в любом случае, тут спасибо за заметку. Пока думаю об этом в первом приближении. Думаю отделаться простыми переменными, if-elsами, сравнениями и кейсами. Хотя это не дело, если делать нормальный переносимый мост. Но для себя сгодится и так. Наверно. Тут не знаю, опыта в создании протоколов нет.
Расскажу свой опыт решения этой задачи.
--------------------
Сначала кратко повторю то, что уже недавно и давно писал на форуме с тестами.
------------------------
Во-первых замечу если ставите sleep ( я использую event) то задержка передачи данных будет равна задержке sleep.  можно поставить sleep(10) этого достаточно чтобы поток не грузил ядро впустую.
Можно даже поставить sleep(1)  но задержка реально будет примерно 10 ms - это квант OS.
--------------------
Так вот обмен через файлы это самое простое (примерно 10 операторов) и задержка не более 15 ms
----------------------
Я использую для обмена между процессами File Mapping https://learn.microsoft.com/en-us/windows/win32/memory/using-file-mapping
При этом если использовать event, то задержа примерно в 100 раз меньше, чем при обмене через файлы.
Для обмена между скриптами т е потоками main  в разных скриптах QUIK , использую глобальные переменные.
При этом, если использовать event, то задержка примерно в 1000 раз меньше, чем при обмене через файлы (3-5 мкс)
----------------------------  
Эти методы самые быстрые.
-------------------
Время загрузки тарминала QUIK
 
Я утверждаю, что время загрузки(старта)  существенно зависит от наличия скриптов индикаторов на луа и архива истории.
------------------
Провел тест времени загрузки (начала работы )терминала QUIK (брокер Сбербанк)
---------------------

Тест 1:
Сделал копию рабочей папки QUIK
Удалил папку архивы и индикаторы и подключился к брокеру:
-------------
Время старта вычислял по интервалу от момента двухфакторной до начала отображения стакана и графиков





Тест2:  загрузил рабочий вариант QUIK



В результате Тест 1 время загрузки без скриптов на луа составляет  12 секунд, а время загрузки со скриптами индикаторов 69 секунд
----------------------------------  
Выводы делайте сами.
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Цитата
TGB написал:
Цитата
nikolz написал:
Из своего опыта замечу, что долго грузится в основном по причине работы скриптов и индикаторов на Lua на истории
   Время загрузки QUIK я проверял на реальном  брокере без открытия графиков и без таблиц.  

nikolz зачем вы работаете на форуме "прокладкой" между комментариями пользователей?
TGB , Вы мудак?
Cкорость обмена данными через файлы
 
Чтобы получить действительно ускорение расчетов на основе множества скриптов надо использовать Event OS не только для синхронизации колбеков QUIK и потока main, но и для синхронизации обмена между скриптами.
В этом случае обмен имет смысл строить на основе Memory-mapped files.  При этом скорость обмена между скриптами по сравнению с обменом через файлы будет примерно в 100 и более раз быстрее.
Cкорость обмена данными через файлы
 
Говорят, что все новое - это хорошо забытое старое.
---------------------
Решил обновить тему обмена данными между скриптами.
Выше я привел результаты тестов.
----------------------------
Но вопрос у меня следующий.
---------------------------
Знаете ли Вы какая у Вас будет задержка обмена данными между Вашими скриптами?
-----------------------------
Если не знаете, то могу Вас удивить.
-----------------------
Величина этой задержки будет равна значению функции sleep, которую Вы ставите в цикле main.
Если вы написали sleep(1000) то какой бы метод обмены Вы не применили задержка передачи данных будет 1 секунда.
---------------------------
В итоге реально вы не получите задержку менее 15 ms, что соответствует sleep(10).
Отказаться от sleep можно лишь используя Event OS.
-----------------------
Из этого можно следующий вывод.
Если Вы не профессионально пишите софт, то для обмена данными как между скриптами так и с другими приложениями например на питоне
применение обмена через файлы самый простой, быстрый и надежный способ, если Вы знаете как его правильно реализовать.
----------------------------
И еще один печальный вывод.
Функция main это отдельный поток. Казалось бы , что запустив 5 скриптов можно получить робота с 5 потоками и будет он в 5 раз быстрее считать.
Но как бы не так.
В каждом скрипте поток будет тормозится на время sleep.  
и в итоге ускорение либо будет либо нет.
Скорее нет.
------------------------------
Т е sleep в потоке - это тормоз.  
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Из своего опыта замечу, что долго грузится в основном по причине работы скриптов и индикаторов на Lua на истории, которая теперь больше 3000 свечей для каждого инструмента и каждого индикатора.  
Так как каждый индикатор считается два раза, то это время можно без проблем сократить в два раза.
------------------------------
Убедится, что это так легко. Посмотрев время загрузки с тестового сервера. Там история короткая и как правило нет самописных индикаторов на луа.
Какой ИИ адекватно пишет
 
Проще им писать на питоне.
-----------------------
Но все равно, там где я решу задачу в 20 строк у них получается 100.
Какой ИИ адекватно пишет
 
У меня DeepSeek уже помнит, что я пишу для QUIK.
Когда что-то надо написать на луа, но лень вспоминать , спрашиваю его чтобы получить заготовку.
Он начинает приводить примеры и в результате скатывается на финансовый рынок и программирование под QUIK.
Приходится его останавливать чтобы не отвлекался.
Какой ИИ адекватно пишет
 
Цитата
Graf Graf написал:
код на на LUA?

Коллеги, нужно написать простенький код на LUA для монитора состава портфеля, скажем так. Ради этого погружаться в подробности языка LUA нет ни малейшего желания. Озадачил DeepSeek. Он пишет "какой-то код", визуально, вроде, норм, но на практике не работает.
Подскажете, какая нейронка нормально может написать на LUA? Чтобы сразу запустить в Квике и закрыть этот вопрос?
А мне он пишет нормально.
Попробуйте GLM-4.5. Тоже мне пишет нормально.
-----------------------------------
Конечно лучше всего пишут платные агенты.
================================================
Качество кода зависит от тщательности проработки тех задания.  
-----------------------
Так, что сказать "Кто, что все" - и нате Вам.  Увы не получится.
Вопрос по ленте сделок, Вопрос по ленте сделок
 
А как Вы определили, что должен изменится в 2 раза? Какой открытый интерес до этих сделок и после?
Ошибка в отображении данных графика объема торгов: Сбербанк, График объема торгов в системе QUIK не соответствует данным с сайта Мосбиржи
 
Цитата
funduk написал:
Цитата
ДмитрийК написал:
Прошу пояснить такое расхождение в данных.
То, что в квике, надо умножать на lotsize, чтобы получить объём сделок в акциях. 06.06.2025 lotsize на сбере был 10 (сейчас - 1). Это объясняет расхождение порядка. Почему на сайте биржи написано 102 026 188 (акций), в tradingview написано 102 022 760, а в Финам (в транзаке) и БКС (квике) указано 10 200 518 лотов (т.е. акций 102 005 180) я не знаю. Может быть по-разному учтён аукцион открытия.
Может кто-нибудь  объяснить,
какое значение для торговле имеет 102026188 или 102022760 акций ? Погрешность в 6-ом знаке ?
---------------------
Кому важно на улице  30 градусов или 29.999 градусов?    
Состояние счета, Таблица Состояние счета
 
Игорь_С,
Если надо определить сколько можно выставить, то
Можно использовать функцию CalcBuySell --  Функция предназначена для расчета максимально возможного количества лотов в
заявке.
или getBuySellInfo  или getBuySellInfoEx --Функция предназначена для получения параметров таблицы «Купить/Продать».
Такого не может быть, но опять.
 
Цитата
Dmitry Mishin написал:
Как уже было описано выше - при возникновении разрыва соединения, сервер может не получить информацию о том, что терминал более не подключен к нему. Терминал диагностировал разрыв соединения, и, в этом случае, сервер не получил информации об этом.

При сохранении tcp сессии со стороны сервера QUIK он будет ожидать продолжения обмена информацией в течение таймаута.
какая величина  таймаута?
Такого не может быть, но опять.
 
При этом непонятно, что ждет сервер и как долго он это будет ждать, если от терминала ничего не приходит и соединение разорвано.
Такого не может быть, но опять.
 
Цитата
Dmitry Mishin написал:
Здравствуйте.

Сообщение вида "Вы уже работаете в системе" говорит о том, что сервер не получил информацию от терминала о разрыве соединения. Соответственно, со стороны сервера, пользователь остаётся подключенным, пока не закончится установленный таймаут соединения.
Вероятно, так совпадает, что при закрытии терминала и последующем его открытии таймаут истекает и подключение становится возможным.

Для получения дополнительной информации о причинах возникновения разрыва соединения рекомендуем обратиться к Вашему брокеру, а если разобраться не удастся, то инициируйте его обращение к нам.
Это понятно, но терминал выдал сообщение что сервер принудительно разорвал соединение.
Полагаю, что сервер и не ждет сообщения так как сам разорвал это соединение.
что не так?
Такого не может быть, но опять.
 
брокер Сбербанк
Такого не может быть, но опять.
 
при этом нажатие на ключи и ввод логина снова не помогает. Спасает лишь закрытие приложения полностью.
Такого не может быть, но опять.
 
пока писал сообщение опять та же хрень.
Такого не может быть, но опять.
 
Вопрос к разработчикам.
--------------------
можете объяснить причину такого явления.
------------------
Терминал работает нормально. На рынке все спокойно.
вдруг приходит сообщение:  "Сервер принудительно разорвал соединение"
-----------------------
после этого терминал пытается автоматически восстановить соединение.
----------------------
приходит сообщение: "Вы уже работаете в системе"

потом сообщение "соединение восстановить не удалось"
---------------------
И так пока не надоест.
=====================
Приходится закрывать принудительно терминал и запускать снова.
====================
Что за хрень происходит?
getBuySellInfo в QuikPy, Правильно ли я понимаю, что эта функция не реализована?
 
в любую сторону и даже двухсторонний обмен проще через файлы.
getBuySellInfo в QuikPy, Правильно ли я понимаю, что эта функция не реализована?
 
Цитата
GeorgeM написал:
Цитата
nikolz написал:
 
Цитата
Проще всего передать данные через файл.
Мне нужно не передать данные, а получить данные. Т.е. находясь в питоновском скрипте, нужно узнать, сколько сейчас акций в портфеле. Например рублевый счёт в портфеле я научился узнавать через функцию QuikPy().GetPortfolioInfo. Вопрос о том, если аналогичный способ для количества акций
проще через файлы.
Пассивная заявка в sendTransaction(), Как правильно заполнить
 
попробуйте так
----------------------------
order ={
TRANS_ID = tostring(100),
CLASSCODE = "FUTSPREAD",
ACTION = "Ввод заявки на спрэд фьючерсов",
Торговый счет = "76863d4",
Тип = "Лимитированная",
К/П = "Продажа",
Своп-Цена = tostring(260),
Количество= tostring(1),
Условие исполнения = "Только пассивная",
Переносить заявку = "Да",
Дата экспирации= "20251130",
}
getBuySellInfo в QuikPy, Правильно ли я понимаю, что эта функция не реализована?
 
Цитата
GeorgeM написал:
В модуле QukPy нет функции getBuySellInfoEx. Есть закомментированная строка с этой функцией, т.е. я как понял, в планах на реализацию. Попробовал сделать вот так:

qp.process_request({'data': f'{firm_id}|{client_code}|{class_code}|{sec_code}', 'id': '121', 'cmd': 'getBuySellInfo', 't': ''})

Однако выдаёт ошибку 'lua_error': 'Command not implemented in Lua qsfunctions module: getBuySellInfo'


Мне нужно из питон-скрипта узнавать текущее количество акций в портфеле. Как можно это делать?
Проще всего передать данные через файл.
Присвоим идентификатор графику программно!
 
https://forum.quik.ru/messages/forum10/message65707/topic7633/#message65707
Структура моего робота
 
Имеет практический смысл создавать отдельных роботов для акций, фьючерсов, опционов, валюты, облигаций.
----------------------------
Можно создать отдельных роботов для ликвидных и неликвидных акций.
------------------------------
Для каждого такого робота создается своя задача или несколько задач.
В итоге создается библиотека задач.
-----------------------
Особенность таких задач в том, что в них не надо реализовывать механизм работы с биржей или брокером.
Это все делает основной робот nkbot.
Он и заявку отправит и стоп поставит, если надо.
Структура моего робота
 

В данной теме рассказываю, как построен мой торговый робот.

Полагаю, что тема будет интересна не только начинающим писателям роботов,

так как излагаю свои идеи, которые обладают определенной новизной .

----------------------------

Структура робота организована в виде сети роботов типа “звезда”.

Каждый робот – это отдельный поток или процесс ОС Windows.

------------------------------

В центре звезды находится главный робот nkbot, который обрабатывает события колбеков и таймера  и раздает задания другим роботам.

События организованы в виде очереди. Если событий нет в течении заданного интервала, то робот выполняет задание по таймеру.

---------------------------

Все остальные роботы работают с заданной для каждого робота группой инструментов

и выполняют свои задачи по команде nkbot, либо по истечению заданного интервала времени.

---------------------------

Каждый робот работает в своем потоке OS Windows, либо в процессе терминала  QUIK и имеет доступ к библиотеке QLua, либо в изолированном потоке(процессе) OS  

Роботы в терминале запускаются как скрипты терминала QUIK.

----------------------------

Связь робота nkbot с каждым роботом сети выполняется через очередь команд в общей памяти.

Список работающих роботов создается в файле инициализации nkbot_ini.lua.

Задачи для роботов создаются в отдельных файлах в виде функций и загружаются в робота во время запуска скрипта по заданному списку задач для каждого робота.

--------------------------

Несколько примеров реализации отдельных элементов данной структуры.

Все роботы сети, кроме nkbot, имеют одинаковую структуру и реализуются одним скриптом.

Имя робота состоит из “nkbot_” и далее идентификатор робота.

Например, nkbot_B.lua, nkbot_C.lua  два робота B и C

Файл nk_bot_B.lua

Код
Ts={SBER={int={1,2,5,10,20},q=true},
GAZP={int={2,5},q=true}, LKOH={int={5},q=true}} 
--инструменты, которыми торгует робот , интервалы свечей и флаг
получения стакана

list_task="task1,task2"  -- задачи, которые
быдет исполнять робот  

nkLog=true;  -- -включить вывод в лог файл

----------------не трогать---------------

minfo =
debug.getinfo(1, "S").source:sub(2); path =
minfo:match("(.*[/\\])") or "."

dofile(path.."stream.lua")

Файл nk_bot_С.lua
Код
Ts={SiZ5={int={5}}, RIZ5={int={5,10},},SRZ5={int={30}}}
--инструменты и интервалы свечей

list_task="task3,task4"  -- список задач

nkLog=true;

----------------не трогать---------------

minfo =
debug.getinfo(1, "S").source:sub(2); path =
minfo:match("(.*[/\\])") or "."

dofile(path.."stream.lua")

файл инициализации nkbot_init.lua
Код
list_stream="B,C"  --список потоков
nkLog=true; --включаем лог файл
Асинхронная подписка на свечи
 
В качестве финального варианта выкладываю скрипт подписки без колбеков.
Код
--Пример асинхронного запроса свечей--результат в массиве ds для каждого инструмента
----------------------
name="nk_bot"
fnlog="D:/"..name..".log"; nkLog=io.open(fnlog,"w") 
Tclas={}
Tclas.QJSIM={SBER={int={1,2,5,10,20},ds={}}, GAZP={int={2,5},ds={}}, LKOH={int={5},ds={}}}
Tclas.SPBFUT={SiZ5={int={5},ds={}}, RIZ5={int={5,10},ds={}},SRZ5={int={30},ds={}}}
local tim=os.clock()
 ------------------------
 function main()
  run=true;
  local x=0; for c,tc in pairs(Tclas) do  for s,ts in pairs(tc) do  x=x+1 end  end    MaxDS=x;
  while run do 
     if MaxDS then 
   for c,tc in pairs(Tclas) do 
      for s,ts in pairs(tc) do  
         local ts=tc[s]; local int=ts.int; local ds=ts.ds;local  N=#int; local M=#ds;
       if N~=M then local j=0; 
           while N>j do j=j+1; 
            if ds[j]==nil then local x=CreateDataSource(c,s, int[j]);  
            if x and x:Size()>0  then    local ti=math.tointeger(1000*(os.clock()-tim)//1);
            ds[j]=x; nkLog:write("time(ms)="..tostring(ti)..","..c..","..s..",j="..j..",int="..int[j]..",size="..ds[j]:Size().."\n"); nkLog:flush();
            end
         end
       end
       M=#ds; if N==M then MaxDS=MaxDS-1; nkLog:write(s..",подписка завершена\n");        nkLog:flush(); end
         end
      end
   end
   if MaxDS==0 then  nkLog:write("блокируем блок подписки\n");    nkLog:flush(); MaxDS=nil end
   end
 --  Выполнение заданий скрипта --
      sleep (10)
   end 
end
function OnStop(signal)    run = false   return 1000 end
после завершения подписки  в main будет исполнятся из кода подписки лишь один оператор if.
------------------------------  
Недостаток этого варианта по сравнению с первым тот, что в нем тратится время main на неисполненные подписки, если данный инструмент не торгуется.
Во втором варианте тратится время основного потока QUIK на подобные подписки.
--------------------------
Оптимальным вариантом будет решение, которое объединяет первый третий вариант.
--------------------------------
Именно такое решение я и использую в настоящее время.
Асинхронная подписка на свечи
 
поправил немного:
Код
function OnParam(c,s)
if MaxDS then 
for c,tc in pairs(Tclas) do 
   for s,ts in pairs(tc) do  
   local ts=tc[s]; local int=ts.int; local ds=ts.ds;local  N=#int; local M=#ds;
   if N~=M then local j=0; 
   while N>j do j=j+1; 
   if ds[j]==nil then  local x=CreateDataSource(c,s, int[j]);  
   if x:Size()>0  then  local ti=math.tointeger(1000*(os.clock()-tim)//1);
   ds[j]=x; nkLog:write("time(ms)="..tostring(ti)..","..c..","..s..",j="..j..",int="..int[j]..",size="..ds[j]:Size().."\n"); nkLog:flush();
       end
      end
   end
   M=#ds; if N==M then MaxDS=MaxDS-1; nkLog:write(s..",подписка завершена\n"); nkLog:flush(); end
      end
   end
   end
   if MaxDS==0 then  nkLog:write("блокируем OnParam\n"); nkLog:flush(); MaxDS=nil end
  end
end
Асинхронная подписка на свечи
 
Поступило два вопроса.
1) Если инструмент очень редко изменяется в ТТП,  но кому-то надо срочно что-то считать ( не представляю что надо считать по этому инструменту) . Решаем эту проблему.
--------------------------
2)  Этот код, хоть и на 4 мкс, но будет грузить основной поток после того, как подписка закончится.  Решает и эту проблему,
-----------------------------------
Вот вариант скрипта, в котором этих проблем нет:
Код
--Пример асинхронного запроса свечей--
--результат в массиве ds для каждого инструмента
Tclas={}
Tclas.QJSIM={SBER={int={1,2,5,10,20},ds={}}, GAZP={int={2,5},ds={}}, LKOH={int={5},ds={}}}
Tclas.SPBFUT={SiZ5={int={5},ds={}}, RIZ5={int={5,10},ds={}},SRZ5={int={30},ds={}}}
local tim=os.clock()
 ------------------------
RUN = true
function main()
local fDS=true;
 while RUN do 
 --  Выполнение заданий скрипта --
    sleep (10)
   end 
end
---------------------------------]
function OnParam(c,s)
  if MaxDS then 
     for c,tc in pairs(Tclas) do 
   for s,ts in pairs(tc) do  
     local ts=tc[s]; local int=ts.int; local ds=ts.ds;local  N=#int; local M=#ds;
     if N~=M then       local j=0; 
        while N>j do j=j+1; 
      if ds[j]==nil then    local x=CreateDataSource(c,s, int[j]);  
        if x:Size()>0  then    local ti=math.tointeger(1000*(os.clock()-tim)//1);
           ds[j]=x; nkLog:write("time(ms)="..tostring(ti)..","..c..","..s..",j="..j..",int="..int[j]..",size="..ds[j]:Size().."\n");nkLog:flush();
                   end
      end
       end
       M=#ds; if N==M then MaxDS=MaxDS-1; nkLog:write(s..",подписка завершена\n"); nkLog:flush(); end
   end
    end
   end
  end
 if MaxDS==0 then  nkLog:write("блокируем OnParam\n");    nkLog:flush(); MaxDS=nil end
end

function OnStop(signal)    RUN = false   return 5000 end

function OnInit(p) -- инициализация функции main
local p=string.reverse(p); local n,m=string.find(p,"\\"); 
local pS=string.reverse(string.sub(p,n)); name=string.reverse(string.sub(p,5,n-1)) ;
package.cpath =package.cpath..";"..pS.."?.dll;"
package.path =package.path..";"..pS.."?.lua;"..pS.."?.luac;"
fnlog=pS..name.."_nk.log";   nkLog=io.open(fnlog,"w")
local x=0; for c,tc in pairs(Tclas) do  for s,ts in pairs(tc) do  x=x+1 end  end MaxDS=x;
end
---------------------------
а это результат его работы:
Код
time(ms)=53,QJSIM,SBER,j=1,int=1,size=1041
time(ms)=54,QJSIM,SBER,j=2,int=2,size=523
time(ms)=54,QJSIM,SBER,j=3,int=5,size=209
time(ms)=54,QJSIM,SBER,j=4,int=10,size=105
time(ms)=54,QJSIM,SBER,j=5,int=20,size=53
SBER,подписка завершена
time(ms)=55,QJSIM,GAZP,j=1,int=2,size=523
time(ms)=55,QJSIM,GAZP,j=2,int=5,size=209
GAZP,подписка завершена
time(ms)=207,QJSIM,LKOH,j=1,int=5,size=209
LKOH,подписка завершена
time(ms)=207,SPBFUT,SiZ5,j=1,int=5,size=18572
SiZ5,подписка завершена
time(ms)=207,SPBFUT,SRZ5,j=1,int=30,size=2262
SRZ5,подписка завершена
time(ms)=207,SPBFUT,RIZ5,j=1,int=5,size=11347
time(ms)=207,SPBFUT,RIZ5,j=2,int=10,size=13811
RIZ5,подписка завершена
блокируем OnParam
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Цитата
nikolz написал:
сравните
Э... Возникает вопрос - а когда подписка закончена, этот код что будет делать на постоянные вызовы OnParam? Да и нагрузка на сам колбек основного потока, хоть и небольшая, но есть. Плюс, если инструмент малоликвиден, то подписка на данные когда произойдет? Иногда ведь надо получить данные, что-то рассчитать и закрыть поток. И надо это сейчас, а не когда через часы будет изменение ТТТ.
Когда подписка закончена, Ничего не делает.  Я Выше уже приводил затраты времени. На основной поток это 4 мкс.
Ну относительно нагрузки на основной поток в 4 мкс это прикольно.
--------------------------
Если надо и эти 4 мкс убрать, то надо делать как у меня в настоящее время.
----------------------
Этот код находится в main. А колбек Onparam как и все другие лишь отсылает событие в очередь.
----------------------
Я не стал приводить этот вариант, так как я использую механизм событий, а его посетители этого сайта не поймут и не реализуют .
------------------
Поэтому привел этот вариант ему уже лет пятнадцать.  
========================
Относительно про часы изменения ТТП Вы сильно ошибаетесь.
ТТП меняется на любой чих по инструменту. Т е не только изменение сделок но и изменение очереди заявок.
--------------------
Прикольно, Но если ТТП у Вас часами не меняется по инструменту то что Вы будете считать?
Тогда у вас кроме истории часовой давности ничего нет, ее вы уже получили час назад.
Я любую историю сделок с задержкой 15 инут (бесплатно) получаю с биржи. Для этого QUIK не нужен вообще.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM
Вы опять ушли от ответ.
Повторяю вопрос  Где в документации указано:
Цитата из ваших ля...ля:  Из справки: "Функцию CreateDataSource можно использовать только внутри функций main() и callback."   Ау где Вы это прочитали?
Скрипт правильно ли написан
 
Прикольно,
А компьютера у Вас нет?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
CreateDataSource

я нашел лишь это:

Код
Функция предназначена для создания таблицы Lua и позволяет работать со свечками, полученными с сервера QUIK, 
а также реагировать на их изменение.Формат вызова:TABLE data_source,
 STRING error_desc CreateDataSource (STRING class_code, STRING sec_code, NUMBER interval, 
[, STRING param])Параметры:class_code – код класса,sec_code – код инструмента,interval – интервал запрашиваемого графика,param – необязательный параметр. 
Если параметр не задан,
то заказываются данные на основании таблицы обезличенных сделок, если задан –
данные по этому параметру.
Функция возвращает таблицу data_source в случае успешного завершения. 
Если указан неверный код класса или параметр, то возвращается «nil». 
При этом error_desc содержит описание ошибки.Список констант для передачи в параметр interval : 
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Из справки: "Функцию CreateDataSource можно использовать только внутри функций main() и callback."

Но по моему в OnInit (инициализация функции main ) она не работает? Или?
Дайте ссылку на страницу справки.
Вы зачем свои домыслы здесь пишите? Может сначала проверите, что зря интернет засорять.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Код
-Пример асинхронного запроса свечей--
--результат в массиве ds для каждого инструмента

Tclas={}
Tclas.QJSIM={SBER={int={1,2,5,10,20},ds={}}, GAZP={int={2,5},ds={}}, LKOH={int={5},ds={}}}
Tclas.SPBFUT={SiZ5={int={5},ds={}}, RIZ5={int={5,10},ds={}},SRZ5={int={30},ds={}}}

local tim=os.clock()

function OnParam(c,s)
   local tc=Tclas[c]
   if tc then  local ts=tc[s];  
     if ts then local ts=tc[s]; local int=ts.int; local ds=ts.ds;local  N=#int; local M=#ds;
      if N~=M then local j=0; 
       while N>j do j=j+1; 
          if ds[j]==nil then local x=CreateDataSource(c,s, int[j]);  
        if x:Size()>0  then    local ti=math.tointeger(1000*(os.clock()-tim)//1);
           ds[j]=x; nkLog:write("time(ms)="..tostring(ti)..","..c..","..s..",j="..j..",int="..int[j]..",size="..ds[j]:Size().."\n"); nkLog:flush();
         end
      end
       end
    M=#ds; if N==M then nkLog:write(s..",подписка завершена\n"); nkLog:flush(); end
   end
      end
   end
end

RUN = truefunction main()
    while RUN do 
 --  Выполнение заданий скрипта --
      sleep (10)
   end 
end

function OnStop(signal)    RUN = false   return 5000 end

function OnInit(p)
  local p=string.reverse(p); local n,m=string.find(p,"\\"); 
  local pS=string.reverse(string.sub(p,n)); name=string.reverse(string.sub(p,5,n-1)) ;
  package.cpath =package.cpath..";"..pS.."?.dll;"
  package.path =package.path..";"..pS.."?.lua;"..pS.."?.luac;"
   fnlog=pS..name.."_nk.log";   nkLog=io.open(fnlog,"w")
end

Код
time(ms)=250,SPBFUT,SiZ5,j=1,int=5,size=18508
SiZ5,подписка завершена
time(ms)=704,SPBFUT,RIZ5,j=1,int=5,size=11284
time(ms)=706,SPBFUT,RIZ5,j=2,int=10,size=13779
RIZ5,подписка завершена
time(ms)=871,QJSIM,GAZP,j=1,int=2,size=350
time(ms)=871,QJSIM,GAZP,j=2,int=5,size=140
GAZP,подписка завершена
time(ms)=1547,SPBFUT,SRZ5,j=1,int=30,size=2251
SRZ5,подписка завершена
time(ms)=1880,QJSIM,LKOH,j=1,int=5,size=140
LKOH,подписка завершена
time(ms)=1882,QJSIM,SBER,j=1,int=1,size=696
time(ms)=1882,QJSIM,SBER,j=2,int=2,size=351
time(ms)=1882,QJSIM,SBER,j=3,int=5,size=140
time(ms)=1882,QJSIM,SBER,j=4,int=10,size=71
time(ms)=1884,QJSIM,SBER,j=5,int=20,size=36
SBER,подписка завершена
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
TGB написал:
Цитата
VPM написал:
Переписал с помощью корутин, здесь их применение наиболее показательно.
   Это можно сделать короче:
Код
  RUN  =   true 
 function   main ()
    -- Функции для асинхронного запроса свечей --- 
 -- 1. Массовый запрос свечей BulkRequestCandles. 
 -- Параметр: таблица {{class_code, sec_code, interval}} 
 -- Результат: {{class_code, sec_code, interval, ds}} 
    local  BulkRequestCandles  =   function (par)
       for  i  =   1 ,  # par  do 
         par[i].ds  =   CreateDataSource (par[i].class_code, par[i].sec_code, par[i].interval)
       end 
    end 
 ---------------------------------------- 

    -- 2. Проверка запроса свечей CheckingCandleRequest. 
    -- Параметр: таблица {{class_code, sec_code, interval, ds}} 
    -- Результат в таблице парамктров : {{class_code, sec_code, interval, ds, ok}} 
    -- Значения ok: true - данные начали поступать; nil данные еще не поступили;  
    --              false - ошибка в параметрах запроса 
    -- Знвчение функции: количеситво источников еще ожидающих данные -- 
    local  CheckingCandleRequest  =   function (par)
       local  N  =   # par
       local  ds
       for  i  =   1 ,  # par  do 
         ds  =  par[i].ds
          if  type(ds)  =  =   'string'   then   -- обнаруженная ранее ошибка в параметрах запроса 
             N  =  N  -   1 
          else 
             if  par[i].ok  =  =   nil   then    -- еще не дождались данных 
                if  ds  =  =   nil   then        -- обнаружена ошибка 
                  par[i].ds  =   '  *** Ошибка в параметрах запроса' 
                  par[i].ok  =   false 
                else 
                   -- проверка поступления данных 
                   if  ds: Size ()  >   0   then   -- есть данные  
                     par[i].ok  =   true 
                     N  =  N  -   1  
                   end 
                end 
             else  
               N  =  N  -   1  
             end 
          end 
       end 
       return  N
    end 
    ------------------------------------------------- 
    local   sec_list  =  {}
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'QJSIM' , sec_code  =   'SBER' , interval  =   1 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'QJSIM' , sec_code  =   'SBER' , interval  =   2 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'QJSIM' , sec_code  =   'SBER' , interval  =   5 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'QJSIM' , sec_code  =   'SBER' , interval  =   10 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'QJSIM' , sec_code  =   'SBER' , interval  =   20 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'QJSIM' , sec_code  =   'GAZP' , interval  =   10 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'QJSIM' , sec_code  =   'GAZP' , interval  =   2 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'QJSIM' , sec_code  =   'GAZP' , interval  =   5 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'QJSIM' , sec_code  =   'LKOH' , interval  =   5 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'QJSIM' , sec_code  =   'FEES' , interval  =   5 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'SPBFUT' , sec_code  =   'SiZ5' , interval  =   5 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'SPBFUT' , sec_code  =   'RIZ5' , interval  =   5 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'SPBFUT' , sec_code  =   'RIZ5' , interval  =   15 }
   sec_list[ # sec_list +  1 ]  =  {class_code  =   'SPBFUT' , sec_code  =   'SRZ5' , interval  =   30 }

   BulkRequestCandles(sec_list)
    -------------- 
    local  DS  =   false 
    while  RUN  do 
       -- Проверка поступления свечей (без блокирования цикла обработки) 
      
       if  CheckingCandleRequest(sec_list)  =  =   0   and   not  DS  then 
         DS  =   true 
          -- Отладочная печать -- 
          for  i  =   1 ,  # sec_list  do 
             if  sec_list[i].ok  =  =   true   then  
                message (sec_list[i].sec_code  .. '  ds:size()  =   ' .. sec_list[i].ds:Size()
                        ..'   interval  =   ' .. sec_list[i].interval)
            else  -- Ошибка задания параметров
               message(sec_list[i].sec_code..'   interval  =  '  ..  sec_list[i].interval
                         ..  sec_list[i].ds )
             end 
          end 
       end 
      
       --  Выполнение заданий скрипта -- 
      
       sleep  ( 100 )
    end  
 end 

 function   OnStop (signal)
   RUN  =   false 
    return   5000 
 end 
  
сравните
https://forum.quik.ru/messages/forum17/message80289/topic9362/?result=new#message80289
Асинхронная подписка на свечи
 
Это можно сделать так:
Код
--Пример ассинхронного запроса свечей--
--результат в массиве ds для каждого инструмента

Tclas={}
Tclas.QJSIM={SBER={int={1,2,5,10,20},ds={}}, GAZP={int={2,5},ds={}}, LKOH={int={5},ds={}}}
Tclas.SPBFUT={SiZ5={int={5},ds={}}, RIZ5={int={5,10},ds={}},SRZ5={int={30},ds={}}}

local tim=os.clock()

function OnParam(c,s)
   local tc=Tclas[c]
   if tc then  local ts=tc[s];  
     if ts then local ts=tc[s]; local int=ts.int; local ds=ts.ds;local  N=#int; local M=#ds;
      if N~=M then local j=0; 
       while N>j do j=j+1; 
          if ds[j]==nil then local x=CreateDataSource(c,s, int[j]);  
        if x:Size()>0  then    local ti=math.tointeger(1000*(os.clock()-tim)//1);
           ds[j]=x; nkLog:write("time(ms)="..tostring(ti)..","..c..","..s..",j="..j..",int="..int[j]..",size="..ds[j]:Size().."\n"); nkLog:flush();
         end
      end
       end
    M=#ds; if N==M then nkLog:write(s..",подписка завершена\n"); nkLog:flush(); end
   end
      end
   end
end

RUN = truefunction main()
    while RUN do 
 --  Выполнение заданий скрипта --
      sleep (10)
   end 
end

function OnStop(signal)    RUN = false   return 5000 end

function OnInit(p)
  local p=string.reverse(p); local n,m=string.find(p,"\\"); 
  local pS=string.reverse(string.sub(p,n)); name=string.reverse(string.sub(p,5,n-1)) ;
  package.cpath =package.cpath..";"..pS.."?.dll;"
  package.path =package.path..";"..pS.."?.lua;"..pS.."?.luac;"
   fnlog=pS..name.."_nk.log";   nkLog=io.open(fnlog,"w")
end
В скрипте есть вывод в лог файл, который создается в каталоге скрипта.
Результат работы скрипта на тестовом сервере QUIK
Код
time(ms)=250,SPBFUT,SiZ5,j=1,int=5,size=18508
SiZ5,подписка завершена
time(ms)=704,SPBFUT,RIZ5,j=1,int=5,size=11284
time(ms)=706,SPBFUT,RIZ5,j=2,int=10,size=13779
RIZ5,подписка завершена
time(ms)=871,QJSIM,GAZP,j=1,int=2,size=350
time(ms)=871,QJSIM,GAZP,j=2,int=5,size=140
GAZP,подписка завершена
time(ms)=1547,SPBFUT,SRZ5,j=1,int=30,size=2251
SRZ5,подписка завершена
time(ms)=1880,QJSIM,LKOH,j=1,int=5,size=140
LKOH,подписка завершена
time(ms)=1882,QJSIM,SBER,j=1,int=1,size=696
time(ms)=1882,QJSIM,SBER,j=2,int=2,size=351
time(ms)=1882,QJSIM,SBER,j=3,int=5,size=140
time(ms)=1882,QJSIM,SBER,j=4,int=10,size=71
time(ms)=1884,QJSIM,SBER,j=5,int=20,size=36
SBER,подписка завершена
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Вы какой CHAT AI  используете?
Система принятия решений и/или Нечеткая логика(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 . этот параметр задает в минимальных  шагах цены допустимый уход цены в заявке от лучшей цены.
------------------------  
Алгоритм работы умной заявки можно заменить, подключив новую задачу вместо существующей.
-----------------------  
Управление заявками и задачами реализованы в конечном автомате и пользователь их не знает и не видит.
В задачах выставление заявок можно задавать через события и колбеки, а стоп-заявку  и ее параметры установить в таблице интерфейса .
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 84 След.
Наверх