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

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

Страницы: Пред. 1 ... 49 50 51 52 53 54 55 56 57 58 59 ... 80 След.
вывести выставление заявки из функции main в отдельную функцию
 
Цитата
s_mike@rambler.ru написал:
Цитата
Imersio Arrigo написал:
 
Цитата
nikolz  написал:
Чтобы ускорить работу надо функцию выставления заявки запускать в отдельном потоке,
 А как это ускорит работу?
Никак
Ну если не можете запустить выставление заявки в отдельном потоке, то запустите все остальное в другом потоке.
Например , можно в отдельных потоках запускать алгоритмы принятия решений роботом для различных рынков (бумаг)
можно в отдельных потоках запускать любые функции, которые не связаны с основным потоком КВИК.
В отдельных потоках дополнительно к main можно запускать любые действия внутри колбеков и тем самым ускорять их исполнение.
-----------------  
Так как узким местом териминала КВИК является его хранилище, то, чтобы обеспечить параллельную работу потоков,
надо всю информацию, поступающую в терминал квик, дублировать в свои таблицы и файлы
и работать не с хранилищем терминала, а со своей базой данных.
--------------------
описание полей ТТП, где взять полное и актуальное
 
Цитата
Дмитрий написал:
Здравствуйте!
По названиям параметров ТТП, к которым можно обращаться с помощью функции getParamEx, иногда бывает трудно однозначно понять, что эти параметры означают и/или как рассчитываются их значения.
Подскажите, пожалуйста, где можно взять подробное и актуальное описание всех параметров, которые транслируются с Московской биржи?
Если оно есть на сайте биржи, то подскажите ссылку.
Описание полей любой таблицы в т числе и ТТП  можно легко получить используя вывод через DDE сервер в excel. Для получения имен параметров надо установить флажок "Формальные заголовки"  С заголовками столбцов"  
вывести выставление заявки из функции main в отдельную функцию
 
Цитата
Duke2 написал:
Evgenii, Main зациклен, просто в выдержку кода не попало зацикливание. Спасибо все равно
дело в том что поток колбеков и поток Main - это разные потоки.
Если функция выставления заявки будет работать в майн,
то это ничего не даст, кроме лучшей читаемости текста программы.
--------------------------
Чтобы ускорить работу надо функцию выставления заявки запускать в отдельном потоке,
а в цикле  майн проверять завершение работы этой функции.
-----------------
Если есть желание это сделать,
то рекомендую почитать книгу Дж.Рихтер Создание эффективных WIN-32 приложений с учетом специфики 64-разрядной версии Windows
Ускорение работы скриптов, предложение по развитию QLUA
 
Цитата
Anton написал:
Цитата
nikolz написал:
не надо отслеживать новые версии и исправлять то, что перестает работать
Это, конечно, важный плюс, спору нет. Но если один мейн рушится, что с остальными делать? Очевидно, тоже прибивать и завершать весь скрипт, т.к. очень сомнительно, что большинство скриптов следуют RAII (до предыдущей версии это было физически невозможно даже и никто не бухтел, т.е. буквально  никто  этим не морочился). В таком раскладе мультипликативно снижаем общую надежность скрипта, если (утрированно) надежность одного мейна 0.5 и всего скрипта тоже, то при двух таких мейнах надежность скрипта в целом уже 0.25.
Указанная Вами проблема легко решается.
--------------------------------
Дело в том, что в моем решении создание роботов разделяется на отдельные ,самостоятельные и не требующие нового программирования модули.
Ранее я уже намекал на такое решение.
Это решение легко представить, если ответить на вопрос -Чем отличаются роботы торгующие акциями друг от друга?
----------------------------
Они отличаются лишь торговым алгоритмом.
В моем варианте, я сделал модуль для работы кучу общих модулей - модуль для  стакана, модуль для  счета, модуль для сделок, модуль для заявок, модуль стопов и т д.
Все эти модули являются универсальными и одинаковыми для любого робота.
-----------------------------------
В итоге, разработка робота сводится к программированию лишь алгоритма принятия решения.
Этот алгоритм можно написать на более простом и близком к естественному языку.
----------------------------------
В итоге нет надобности изучать LUA, изучать QLUA.  
Надо изучать именно закономерности рынка и написать алгоритм состояний робота
и логику изменения этих состояний.
----------------------------------
В итоге любой буратино может легко реализовать свой гениальный алгоритм, как стать миллионером на поле чудес.
Тестирование робота на исторических данных в quik, Как построить график на основе произвольных данных
 
Тестирование робота на исторических данных в quik, Как построить график на основе произвольных данных
 
Цитата
Христиан написал:
В итоге решил сделать тестирование стратегий на C# и потом переносить алгоритм на lua
в квик на  луа тестирование стратегий работает очень медленно.
Более лучшим вариантом является амиброкер и связка его с QUIK.
Потокобезопасные функции в Lua 5.3
 
Цитата
Anton написал:
Цитата
nikolz написал:
если бы все было так просто, то проблему многопоточности в луа не поднимали бы на форумах  уже лет ..надцать.
Это именно проблемы многопоточности как таковой, а не многопоточности в луа. В приведенной статье тоже. Как раз автор пришел в конце к правильному выводу, асинхронность рулит. Надо только не забывать, что нынче практически все процессоры многоядерные, даже контроллеры многие, так что многопоточность все равно будет присутствовать, главное ее локализовать и не позволить ей разползтись по всему коду. Конкретно в квике уже отступать некуда, архитектура выбрана такая и трудно предположить, как ее можно обратно-совместимо поправить. Теперь только костыли лепить.

Цитата
nikolz написал:
Тоже решал эту проблему
Многие решали,  в том числе и основоположники . К сожалению, конкретно в их решении очереди блокирующие, эдакий qnx получился.

Дискуссия схоластическая, но замечу, что Вы путаете понятия
Проблема многопоточности и проблема синхронизации потоков - это синонимы. т е первое это есть второе.
Проблема именно луа а не многопоточности.
Как решать задачу синхронизации потоков в конкретном софте хорошо разжевано у Рихтера.
Но в луа проблема в том, что есть сборщик мусора и много сторонних библиотек.
--------------------------
Вы не внимательно прочитали статью, на которую ссылаетесь.
---------------------------
цитата: "В этой работе мы исследуем модель, основанную на выполнении потоков без общей памяти, которые используют передачу сообщений для синхронизации и общения."
Т е это фактически многозадачное решение, а не многопоточное.
------------------------------
и далее цитата:
"Связь между процессами Lua происходит исключительно через сообщения. Cвязь с передачей сообщений может быть медленнее по сравнению с общей памятью."
===============  
Т е упрощенно, запускаем несколько независимых VMLua как несколько задач, а потом пересылаем данные между ними в виде сообщений OC.
Проблемы такого решения хорошо известны.
 
Оптимальный способ остановки исполнения скрипта
 
Цитата
verder написал:
Каков оптимальный способ программно остановить исполнение скрипта на QLua?
Например, код диагностирует некую внутреннюю ошибку по своей логике, выкидывает message и сразу останавливает работу скрипта во всех потоках.
в main есть бесконечный цикл поставьте в нем переменную и присваивайте ей nil  при ошибке. В итоге скрипт завершит работу
getFuturesHolding - возврат Nil если не было сделок?
 
Цитата
Leonid написал:
Здравствуйте.

Я определения текущего количества фьючерсов в портфеле я использую функцию getFuturesHolding.
Обратил внимание, что если по тикеру ранее не было сделок, то функция возвращает Nil, а не 0 как я предполагал.
Если сделки ранее были, то количество бумаг отображается корректно.

Можно ли как-нибудь выйти из этой ситуации?
просто написать
local x=0;  -- текущее количество фьючерсов
if ( getFuturesHolding...) then x= getFuturesHolding...  end  -- читаем  текущее количество
Потокобезопасные функции в Lua 5.3
 
https://zen.yandex.ru/media/id/5d1e1629b4a58500acbc079a/mnogopotochnost-v-lua-moia-glavnaia-oshibka-...
Статус сессии.
 
Цитата
Kolossi написал:
Цитата
nikolz написал:
Есть очень простое решения проблемы статуса сессии.
Делаем раз - синхронизируем компьютер по серверу времени.  Это позволяет нам синхронизироваться с временем биржи с погрешностью не более 0.01 сек
Делаем два - пишем константы начала и конца сессий
Делаем три - где надо и не надо просто сравниваем текущее время с константами и решаем какое сейчас состояние сессии без каких либо кодов с биржи
------------------------
Самое смешное в том,  что биржа(брокер)  свои коды формируют точно так же.
Как для автомобиля - крутить рукоятку если стартер не заводит автомобиль - простое решение ). Я перешел к пользованию статусом сессии именно потому, что однажды, пользуясь простым решением, забыл перевести сезонное время (я живу в стране где его надо переводить) и потерял прилично денег на этом.
полагаю что потеряли вы не по причине что забыли перевести время.
это лишь вариант самоуспокоения.
Если Вы включили комп позже начала сессии, то никакие сигналы Вам не помогут.
и статус сессии здесь не причем.
Конечно решать Вам, я лишь изложил свой опыт решения данной проблемы
Потокобезопасные функции в Lua 5.3
 
Цитата
Anton написал:
Цитата
nikolz написал:
Если это особенности VMLua
Что я выше описал, это на стороне qlua.dll, то есть аркино производство. В самой lua53.dll правки если и есть, то крайне незначительные, практически все строка в строку ложится на сорцы луа из репозитория, как выше из разбора дампа видно.

Цитата
nikolz написал:
Проблема многопоточности в луа - это проблема луа.
Луа дает lua_lock/lua_unlock и на этом его проблемы с многопоточностью закончены. Можно поспорить, здорово ли, что в некоторых функциях 5.3 вытащили часть обращений к стеку из-под лока, если говорить о проблемах луа. Но вот как сделаны эти самые локи (и не только), это уже вопросы к арке.
Ва заблуждаетесь,
если бы все было так просто, то проблему многопоточности в луа не поднимали бы на форумах  уже лет ..надцать.
Вот, например, результат попытки решения критическими секциями (look, unlook)
и таких воплей в инете много.
--------------------
Тоже решал эту проблему, но не уверен, что нашел окончательное решение .
Потокобезопасные функции в Lua 5.3
 
добавлю свои пять копеек.
Если это особенности VMLua то разработчики ничего исправлять не будут.
VMLua написана не ими. Они лишь встраивают ее в КВИК и сделали dll интерфейса на луа с хранилищем терминала и обменом с сервером КВИК.
---------------------
Проблема многопоточности в луа - это проблема луа.
Есть различные решения этой проблемы, но они никак не связаны с КВИК.
Статус сессии.
 
Есть очень простое решения проблемы статуса сессии.
Делаем раз - синхронизируем компьютер по серверу времени.  Это позволяет нам синхронизироваться с временем биржи с погрешностью не более 0.01 сек
Делаем два - пишем константы начала и конца сессий
Делаем три - где надо и не надо просто сравниваем текущее время с константами и решаем какое сейчас состояние сессии без каких либо кодов с биржи
------------------------
Самое смешное в том,  что биржа(брокер)  свои коды формируют точно так же.
Ошибка в индикаторе при увеличении таймфрейма
 
Добавлю свои пять копеек к решению проблемы.
-----------------------------------------
Обычно такая проблема возникает,  если есть массивы, которые определяются лишь при старте индикатора.
В результате, при смене тайма, они остаются не пустыми.
В итоге нарушается индексация и возникают отсутствующие элементы
-------------------------
Проблему решаем так:
----------------------------
Создаем специальную функцию инициализации всех переменных индикатора.
-----------------------
Эту функцию вызываем в двух местах -
в  Init()  - здесь можно и не вызывать, но делаю это, так как Init как бы для этого создана. Вызывается в индикаторе один раз при запуске и не влияет на скорость исполнения.
и в onCalculate() при индексе равном 1
Например так:
--------------------------------
function OnCalculate(k)
if k==1 then
-- вызываем функцию инициализации
end
--------------------------
Если будете выполнять данное правило, то проблем при переключении тайма не будет.
Работа с OnOrder
 
Цитата
Вадим написал:
Кажется я понял, что колбэк функция возвращает два состояния заявки - старое и новое

Заявка на Покупку
Дата                                     Номер                  Флаг Dec/Hex/Bin
Thu Aug 13 21:55:00 2020: 26203598248162  25 / #19 / 00011001
Thu Aug 13 21:55:00 2020: 26203598248162  25 / #19 / 00011001
Thu Aug 13 22:12:43 2020: 26203598248162  25 / #19 / 00011001
Thu Aug 13 22:12:43 2020: 26203598248162  26 / #1A / 00011010

Заявка на Продажу
Дата                                     Номер                  Флаг Dec/Hex/Bin
Thu Aug 13 21:56:27 2020: 26203598274028  29 / #1D / 00011101
Thu Aug 13 21:56:27 2020: 26203598274028  29 / #1D / 00011101
Thu Aug 13 22:24:21 2020: 26203598274028  29 / #1E / 00011101
Thu Aug 13 22:24:21 2020: 26203598274028  30 / #1E / 00011110

В случае первого появления заявки оба состояния новые
В случае последующих изменений старое+новое состояние
Воспринимайте колбек, как сигнал на бесчисленное множество событий, из которых Вам надо очень малое число.
Поэтому не надо пытаться их все понять.
---------------
Надо всегда ставить фильтр лишь того, что нужно.
Остальное - игнорировать.
В реалии  событий может быть хоть тысяча, но вам нужно лишь два.
Вместо того , чтобы выяснять что это за событие, определитесь что же конкретно нужно Вам.
-----------------------
В итоге роботу будут безразличны  все события в мире, кроме тех, которые нужны Вам.
Нужен скрипт на LUA, Доходности облигаций по ask и bid из стакана
 
Сама постановка задачи ассоциируется примерно с таким: Надо на автомобиль поставить ракетный двигатель.
Даже страшно представить что будет с таким хотелкиным, если ему это сделать ,
но скорее всего он и сам не знает, зачем это реально надо.
Синхронизация getNumberOf и getItem
 
Цитата
Сергей написал:
Прежде всего, я нигде, вроде, не просил написать скрипт на Луа, или каком-либо еще языке, достаточно было изложить общий принцип организации выборки. Прямой, обратный, с использованием специальных функций, что-то еще. По существу последнего ответа, спасибо, хоть какая-то конкретика, по крайней мере понятно, как организована сортировка в таблице позиций. Уж, как это обработать в скрипте, дело действительно индивидуальное.
сталкивался с такой ситуацией. Ее исключить можно если контролировать размер таблицы.
--------------
Полагаю, что лучшим способом, является не лазить постоянно в хранилище терминала,
так как это очень накладная операция, а создавать свои таблицы
и отслеживать в них появление и удаление строк в соответствии с колбеками.
Получение данных из таблиц при автостарте
 
Цитата
Старатель написал:
Andrey Bezrukov,
Никакого архива, конечно же, не будет. В этом нет смысла. Вероятность воспроизвести точно такую же ситуацию не высока, и ваш ответ ("проблема не воспроизводится") очевиден.
Вы можете только подтвердить или опровергнуть гипотезу:
Цитата
Старатель написал:
Первый список загружается вместе с QUIK.
Второй загружается вместе с файлом настроек уже после того, как стартуют скрипты.
А заодно проверить в своём коде терминала, что в момент подмены списков таблица trade_accounts сначала очищается, а затем вставляются списки из info.wnd. И в этот момент как раз существует гипотетическая вероятность получения nil из вышеприведённого кода. Как-то так, других вариантов у меня нет.

И зарегистрировать пожелание на доработку: стартовать скрипты после полной загрузки настроек. Если, конечно пользы от этого будет больше, чем вреда.

Пример ещё нескольких функций, которые зависят от последовательности загрузки настроек: getNumCandles, getLinesCount, getCandlesByIndex
Попробуйте решить подобную проблему путем контроля времени пинга до сервера.
---------------
примечание:
Решал эту проблему давно, поэтому не уверен, что один этот параметр использовал, но помню, что решил.
В настоящее время встраиваю роботов в индикаторы, поэтому подобные скрипты где-то в архивах пылятся.  
Обработка ошибок - открыт ли файл., Обработка ошибок - открыт ли файл.
 
например нам так
if Log==nil then Log=io.open(pat..name..".log","w")  end -- открываем если файл не открыт для записи  
Обработка ошибок - открыт ли файл., Обработка ошибок - открыт ли файл.
 
Цитата
Игорь Б написал:
Myfilefile = "\\MyData.txt";
  i = 0;
  while i == 0 do
     Myfile = io.open(getScriptPath()..Myfilefile,"r+");
-- Если файл занят      
     if Myfile == nil then
        sleep(100);
     else
        i = 1;
     end;
  end;
у вас просто неправильно сделана реакция на       if Myfile == nil then
если  Myfile == nil  это означает что файл не открыт
т е вам надо проверять на ni и если не открыт  то
делать его открытие,
а не спать.
 
Ускорение работы скриптов, предложение по развитию QLUA
 
п.3 тоже давно реализовал в предыдущей версии
но мне оно не нужно, а буратинам в самый раз.
Ускорение работы скриптов, предложение по развитию QLUA
 
Цитата
Anton написал:
Цитата
Андрей написал:
нереально круто
Боюсь те, кто этим смог бы грамотно воспользоваться, могут это сами и сделать, как автор идеи, в частности. Всем остальным буратинам это не нужно и вредно.
с Вами не согласен по трем причинам:
1) Если это решение будет официальное, то не надо отслеживать новые версии и исправлять то, что перестает работать . Как это есть сейчас.
2) Буратинам будет еще легче писать свои хотелки так как нет надобности одно и тоже программировать в множестве роботов Все будет существенно проще
3) если это реализуют, то размещу следующее пожелание, в котором создание роботов превращается в написание лишь алгоритма, а все или почти функции QLUA скрываются в обертке
Т е буратинам даже не надо изучать луа. Просто пишут почти на естественном языке что хотят и все работает.
Ускорение работы скриптов, предложение по развитию QLUA
 
Добрый день,
Прошу разработчиков рассмотреть следующее предложение по развитию QLUA.
----------------
Суть проблемы.
При создании нескольких скриптов приходится дублировать внешнюю среду функции main в каждом скрипте
Т е все колбеки и все глобальные переменные
Но так как все это исполняется в одном потоке создается существенное торможение работы терминала при большом числе скриптов.
--------------------
Решение - предложение.
Решить проблему можно двумя путями.
Вариант1
Реализовать возможность  создание в одном скрипте множество функций main
Т е реализовать механизм запуска нескольких потоков в одном скрипте  
Ввариант2
Реализовать возможность работы множеству скриптов с одной глобальной областью
Этот вариант реализуется, например, путем подмены указателя глобальной таблицы скрипта на указатель общей глобальной области  
Этот вариант я реализовал лет восемь назад для win32 и LUA 5.1,  
Теперь надо все переделывать на 64 и 5.3
-------------------
Поэтому предлагаю это сделать для всех буратин.
Принципы написания скриптов, Разделять или объединять?
 
Цитата
Nikolay написал:
Это, конечно, похвально написать свой RabbitMQ, но, в результате, получится схема не меньшей сложности. Т.е. мы пишем свой терминал. Он будет собирать события терминала, исполнять команды скриптов и читать их ответы, передавать им поток данных.

При этом мы итак находимся внутри такого окружения... Что мешает написать скрипт исполняющий сразу несколько алгоритмов, по многим инструментам. Будет один скрипт, одно окружение.
А колбеки Квика слишком ненадежная конструкция. Проще без них. Хотя, конечно, от части из них отказаться сложно, как, например, OnTransReply.
вообще-то я написал о том, что сделал сам лет ...надцать назад,
т е фактически сразу как внедрили VMlua в квик.
А перед этим примерно года за два я сам в переписке с руководством разработчика предлагал внедрить вместо QPILE LUA.
не утверждаю, что они меня послушались, но в результате появился луа в квике.
---------------------
Тот механизм, о котором я написал, позволяет очень просто делать много роботов  по различным алгоритмом для одного инструмента.
Колбеки не дублируются в скриптах  
Каждый колбек существует в своем скрипте и вызывается всего один раз квиком для получения данных вне зависимости от числа роботов.
Роботы получают требуемые данные от этого скрипта. т е потоки синхронизируются и обмениваются данными , а также чтобы не дублировать код, могут запускать функции других скриптов через механизм колбеков между скриптами.
Сравнительно просто в этом варианте отдавать данные совершенно независимым процессам.
-----------------------
Но если не мечтать о вечном,
то проще всего делать роботов как индикаторы.
Принципы написания скриптов, Разделять или объединять?
 
Цитата
Anton написал:
Цитата
nikolz написал:
Каждый скрипт условно можно разделить на три части1) действия вне колбеков и функции main - это отдельный поток и VM Lua2) функция main каждого скрипта - это отдельный поток и VMLua3) вызов и исполнение  функций колбек осуществляется  в одном основном потоке термина.
Не совсем оно так, стейт для тела скрипта и колбеков один и выполняется в основном потоке квика, стейт для мейна второй и выполняется в специально для него созданном потоке. То есть ваш п.1 лишний, нет отдельного стейта для тела.

Ваши мысли насчет 128 ядер это из разряда давайте загрузим проц бесполезной работой, чо он простаивает-то. В любом случае ваши 100500 потоков будут сериализоваться на доступе к общим ресурсам, т.е. в основном (в таком количестве) они будут крутить спинлок. Для примера предлагаю прогу из directx sdk, где можно отрисовать одно и то же либо одним потоком, либо многими. Запустите и убедитесь, что проц оно жрет в N раз больше, а fps растет процентов на 5.
Я вам предлагаю для примера посмотреть алгоритм БПФ либо нейронной сети  
Принципы написания скриптов, Разделять или объединять?
 
Цитата
Иван Ру написал:
Цитата
nikolz написал:
 
Цитата
Иван Ру  написал:
Интересно мнение форумчан - как предпочитаете писать скрипты - все в одном файле или в виде конструктора - с подгрузкой отдельных файлов:
1. Отдельных функций/процедур (выставление заявки, считывание определенных данных и т.п.)
2. Отдельных классов (стратегия, позиция и т.п.)
 Существующая структура QLUA имеет существенный недостаток.
Все колбеки вызываются из одного потока и каждый из них повторяется в различных скриптах.
В итоге получается дублирование одних и тех же действий многократно.
Я устранил эту проблему и сделал механизм при котором колбеки в скриптах не повторяются,
а скрипты могут запускать функции друг у друга и получать данные из других скриптов..
-------------------------
В итоге не только повышается скорость, но и размер кода сокращается в десятки раз.
Признаться, все более склоняюсь в сторону такой модели, в первую очередь из-за разрастания скрипта и усложнения его логики из-за чего работа и модификация скрипта становится все более затруднительной...
Полагаю можно использовать такую структуру:
- базовый скрипт, который определяет статус сессии и агрегирует информацию из коллбэков
- описание классов (стратегия, позиция и т.п.)
- типовые универсальные модули, например, удаление устаревшей части данных таблиц (цены, бид аск и т.п.), ежедневное определение ключевых временных точек сессии в формате posix, визуализация и логгирование информации и т.п.
- собственно скрипты с описанием стратегий, логики определение сигналов на вход и выход и сопутствующих действий...

Если кто-то поделится своим видением организационной структуры - буду признателен

Поясню свое прежнее беспокойство - у меня большинство скриптов работает одновременно с большим числом инструментов, предполагается большой объем расчетов, опасаюсь, что в тех случаях когда они осуществляются не в теле основного потока (main), а путем многократного вызова функции, это может негативно сказаться на быстродействии скрипта.
Проблема усложняется тем, что разработчики не утруждают себя документацией по API к их библиотеке,
нигде не описывают интерфейс взаимодействия скриптов с терминалом на уровне API C for LUA.
На основе ответов основного разработчика QLUA(не будем показывать пальцем) ,  
по-моему мнению, схема взаимодействия скриптов с терминалом следующая:
-------------------------------
Каждый скрипт условно можно разделить на три части
1) действия вне колбеков и функции main - это отдельный поток и VM Lua
2) функция main каждого скрипта - это отдельный поток и VMLua
3) вызов и исполнение  функций колбек осуществляется  в одном основном потоке термина.
---------------------------
В итоге получаем следующее.
Если Вы не профессионал , то скорее всего будете много делать в колбеках  - так проще .
Все колбеки будете вызывать в каждом из скриптов.
-------------------------------
Получается прикольно.
Даже если у Вас суперкомпьютер с 128 ядрами , то все колбеки будут тупо работать на одном ядре и в одном потоке,
в котором крутится еще и основное ядро терминала КВИК.
------------------
Сейчас версию 7 заменяют на версию 8
В итоге XP с одним ядром не работает вообще. Но зато у Вас теперь win10 64 бита и ядер хоть 128.
А что реально в сухом остатке?
--------------------------
Представим что на телегу прикрутить двигатель от болида формулы 1, а впереди телеги все та же лошадь  .
Вопрос, насколько быстрее эта телега теперь довезет Вас из пункта А в пункт В?
-----------------------------------------
Конечно есть решение костыльное - ничего не делать в колбеках,  а делать все в main.
Но резонно спросить разработчиков, а о чем думали они когда разрабатывали концепцию встраиваемой виртуальной машины?
--------------------------------
Да и это костыльное решение не решает проблему многократного дублирования кода в различных скриптах.
---------------------------------
На самом деле все могло  быть существенно проще и исполняться существенно быстрее, но именно это никому не требуется.
--------------------------
На рынке всегда решается лишь одна задача, за разработку инструмента для решения которой платят разработчикам, -  как у буратины отобрать пять золотых.
-----------------------------------
В итоге для целей конструирование игрушечных роботов,
чем занимаются посетители данного форума,
все сделано просто замечательно.
============================================================­========================
"Теперь попросим на трибуну начальника транспортного цеха. Пусть доложит об изыскании внутренних резервов. "
 
Принципы написания скриптов, Разделять или объединять?
 
Цитата
Иван Ру написал:
Интересно мнение форумчан - как предпочитаете писать скрипты - все в одном файле или в виде конструктора - с подгрузкой отдельных файлов:
1. Отдельных функций/процедур (выставление заявки, считывание определенных данных и т.п.)
2. Отдельных классов (стратегия, позиция и т.п.)
Существующая структура QLUA имеет существенный недостаток.
Все колбеки вызываются из одного потока и каждый из них повторяется в различных скриптах.
В итоге получается дублирование одних и тех же действий многократно.
Я устранил эту проблему и сделал механизм при котором колбеки в скриптах не повторяются,
а скрипты могут запускать функции друг у друга и получать данные из других скриптов..
-------------------------
В итоге не только повышается скорость, но и размер кода сокращается в десятки раз.
Что я делаю не так, ошибка... attempt to call a boolean value (global 'isConnected')
 
Цитата
Иван Ру написал:
Вот так ругается на строку кода в цикле расположенном в пределах main, где пытаюсь считать статус соединения...
while is_run do
 sleep (50)
 if isConnected() == 1 then  .. -- не могу понять, что тут написал не так, ругается на эту строку
     ...
 end
какими словами ругается?
for для значений свечей
 
Цитата
jonny1960 написал:
Подскажите, как правильно получить значения цены закрытия для N последних свечей и умножить на их порядковый номер по счету (P1 * 5) + (P2 * 4) + (P3 * 3)

И не совсем понимаю, что делает функция Squeeze и зачем она нужна?

if CandleExist(I,ds) then

if it.l >= P then
local MD = 0
for i = it.l-P+1, it.l do
    MD = MD + (GetValueEX(it[Squeeze(i,P)], VT, ds))  * i
end
return MD
end
end
http://www.kamynin.ru/
пример индикатора для произвольных параметров.
по его подобию можете сделать любой свой.
Кто как решил вопрос уведомления о сделках?
 
На самом деле посылать письма из квика на смартфон
или оповещать через приложение,  работающие через интернет,
которое установлено  на смартфоне - это какой-то мазохизм.
---------------------
У вас терминал квика в режиме торгов постоянно включен в интернет
и смартфон тоже в интернете.
Ну так что же вам мешает передать сообщение по схеме pоint to point, а не гонять письма и сообщения через сторонние сервера?
Скорость передачи будет раз в сто выше, а накладные расходы раз в сто меньше.
Делал такое, давно это было.
--------------------------
Подумайте на досуге.
Расчёт ГО
 
ГО  считает не квик, а программа от биржи.
См. ссылку выше.
Все правила и формулы биржевых торгов устанавливает биржа.
Базовый актив по фьючерсу, Базовый актив по фьючерсу можно ли получить
 
Цитата
Незнайка написал:
Для фьючерсного контракта на акцию есть конкретная ценная бумага, которая торгуется на бирже и поставляется при экспирации.
Как из квика получить код этой бумаги, например для GZU0?
начну с анекдота:
-----------------------
Мужик вечером что-то ищет у фонаря.
Прохожий спрашивает - что потерял?
Да вон там у забора 100 рублей.
А почему здесь ищешь?
Так тут светлее.
--------------------------------
Вы очевидно как этот мужик.
Вместо того, чтобы искать коды фьючерсов на бирже , которая их и придумала, задаете вопрос на форуме.
---------------------------
В будущем ищите там, где потеряли.
=====================
Ваш ответ на бирже называется:
-------------------
Спецификации коротких кодов фьючерсных и опционных контрактов на срочном рынке
---------------------
https://www.moex.com/a214

Параметр STARTTIME, ENDTIME, Вечерняя сессия на фондовой секции
 
Цитата
Nikolay написал:
Начались торги в вечернюю сессию на фондовой секции. Я уже задавал вопрос про трансляцию времени сессии, но вот сейчас она идет и можно посмотреть на реальный поток данных.

Что мы видим:

Вот утро. Начало торгов. По фьючерсу все ожидаемо и понятно. Есть и времена и статус.
По акции я вижу только статус, а время заполнилось только утренним аукционом.


[INFO  2020-06-23 09:16:58] : SRU0 STATUS {param_image = "приостановлена", param_type = "4", param_value = "2.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 CLSTATE {param_image = "Назначен пр.", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 MONSTARTTIME {param_image = "7:00:00", param_type = "5", param_value = "70000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 MONENDTIME {param_image = "8:40:00", param_type = "5", param_value = "84000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 STARTTIME {param_image = "10:00:00", param_type = "5", param_value = "100000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 ENDTIME {param_image = "18:45:00", param_type = "5", param_value = "184500.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 EVNSTARTTIME {param_image = "19:00:00", param_type = "5", param_value = "190000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 EVNENDTIME {param_image = "23:50:00", param_type = "5", param_value = "235000.000000", result = "1"}

[INFO  2020-06-23 09:16:58] : SBER STATUS {param_image = "торгуется", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER CLSTATE {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER MONSTARTTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER MONENDTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER STARTTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER ENDTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER EVNSTARTTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER EVNENDTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}

[INFO  2020-06-23 09:50:00] : SBER TRADINGSTATUS {param_image = "открытие", param_type = "4", param_value = "3.000000", result = "1"}
[INFO  2020-06-23 09:50:02] : SBER STARTTIME {param_image = "9:50:00", param_type = "5", param_value = "95000.000000", result = "1"}
[INFO  2020-06-23 09:59:33] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:59:33] : SBER ENDTIME {param_image = "9:59:34", param_type = "5", param_value = "95934.000000", result = "1"}
[INFO  2020-06-23 10:00:00] : SRU0 STATUS {param_image = "торгуется", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 10:00:00] : SRU0 TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 10:00:00] : SBER TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}

Вот данные пор акции внутри дня. Время утреннего акциона. Это как понимать? Уже сессия к концу идет, а время старое.
[INFO  2020-06-23 17:33:32] : SBER TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 17:33:32] : SBER STARTTIME {param_image = "9:50:00", param_type = "5", param_value = "95000.000000", result = "1"}
[INFO  2020-06-23 17:33:32] : SBER ENDTIME {param_image = "9:59:34", param_type = "5", param_value = "95934.000000", result = "1"}


Вечер. По фьючерсам все адекватно, а вот по акциям:

[INFO  2020-06-23 18:40:00] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 18:40:05] : SBER TRADINGSTATUS {param_image = "аукцион", param_type = "4", param_value = "4.000000", result = "1"}
[INFO  2020-06-23 18:40:16] : SBER STARTTIME {param_image = "18:40:01", param_type = "5", param_value = "184001.000000", result = "1"}
[INFO  2020-06-23 18:40:16] : SBER ENDTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}

[INFO  2020-06-23 18:45:15] : SBER TRADINGSTATUS {param_image = "ЦАЗ", param_type = "4", param_value = "5.000000", result = "1"}
[INFO  2020-06-23 18:45:16] : SBER STARTTIME {param_image = "18:45:14", param_type = "5", param_value = "184514.000000", result = "1"}

[INFO  2020-06-23 18:50:02] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 18:50:04] : SBER ENDTIME {param_image = "18:50:00", param_type = "5", param_value = "185000.000000", result = "1"}
[INFO  2020-06-23 19:00:12] : SBER TRADINGSTATUS {param_image = "открытие", param_type = "4", param_value = "3.000000", result = "1"}
[INFO  2020-06-23 19:00:13] : SBER STARTTIME {param_image = "19:00:01", param_type = "5", param_value = "190001.000000", result = "1"}
[INFO  2020-06-23 19:00:13] : SBER ENDTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 19:04:54] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 19:04:54] : SBER ENDTIME {param_image = "19:04:54", param_type = "5", param_value = "190454.000000", result = "1"}
[INFO  2020-06-23 19:05:00] : SBER TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}

[INFO  2020-06-23 19:21:34] : SBER STARTTIME {param_image = "19:00:01", param_type = "5", param_value = "190001.000000", result = "1"}
[INFO  2020-06-23 19:21:34] : SBER ENDTIME {param_image = "19:04:54", param_type = "5", param_value = "190454.000000", result = "1"}

Времена аукциона я еще могу понять. А вот что это такое при старте вечерней сессии уже с трудом. И опять - времена то где?
Почему нельзя заполнить времена прямо при подключению к серверу, как это делается для фьючерсов и менять их, если они меняются внутри дня? Поля же есть.

Часть акций торгуется, часть нет. А информации о времени сессии нет. Раньше можно было хотя бы определить константы, когда времена были фиксированными (хоть это было и спорное решение), но сейчас то как.
На первом этапе на вечерней сессии торгуются 25 ликвидных акций из списка индекса МосБиржи,
а до конца года в список торгуемых инструментов войдут все акции из индекса МосБиржи (38 акций),
а также 50 наиболее ликвидных иностранных акций из американского индекса S&P 500.
Ошибка скрипта Lua
 
Цитата
Николай написал:
В Lua загружаю библиотеку написанную мной на C++ (я предварительно переписал и скомпилировал C++ код под Lua5.3)require("luacdll")
Файлы luacdll.dll и файл lua положил в папку с quik. При загрузке dll выдает ошибку
error loading module 'luacdll' fr om file '.\luacdll.lua':
.\luacdll.lua:1: too many C levels (lim it is 200) in main function near '"luacdll"'
Компилировал библиотеку на C++ под Win64 Relise в Visual Studio 2017
регистрировал внешние функции так
extern "C" LUALIB_API int luaopen_luacdll(lua_State *L) {
// эта функция выполнится в момент вызова require() в Lua-коде
// регистрируем реализованные в dll функций, чтобы они стали дуступны для Lua
#if LUA_VERSION_NUM >= 502
lua_newtable(L);
luaL_setfuncs(L, ls_lib, 0);
lua_setglobal(L, "luacdll");
#else
luaL_openlib(L, "luacdll", ls_lib, 0);
#endif
return 0;
}
Если указать в коде Lua перед загрузкой модуля dll
package.cpath = "C:\\Open_Broker_QUIK_AGromazin\\luacdll.dll"
Ничего не меняется
Внимательно читаем сообщение об ошибке:
too many C levels (lim it is 200) in main function near '"luacdll"'
Усе понятно?
Медленное обновление значений таблицы в скрипте при sleep < 100
 
Цитата
Михаил В написал:
Если выставить sleep < 100 например 10 или 1, то обновление в таблице происходят очень медленно, раз в 10 секунд примерно или по нажатию мышкой в любую ячейку таблицы. Торговые операции при этом проходят нормально. Можно ли как-то побороть?
Пример:
function main()
  CreateTable()
  while IsRun do
     SetCell(t_id, 8, 1, tostring(math.random(1,9999)))
     sleep(10)
  end
end
1) вообще-то минимальный квант времени для задачи в винде без танцев с бубном составляет не менее 10 мс.
sleep останавливает вашу задачу и отдает оставшееся время ее кванта другой задачи.
если Вы установите 10 или меньше, то вы ничего не отдадите в реальности, т к это и есть минимум для вашей задачи.
В квике все еще хуже.
Поэтому ставить в sleep значения меньше 10 - не имеет смысла.
Надо ставить  больше.
-----------------------
2) в документации на QLUA указано, что если установлен sleep ,   нет обработки событий терминала в функции main.
-------------------------------------------
Поэтому не следует ждать чудо от QUIK,
подобно тому как не следует пытаться  на самокате выжать 100 км в час.
--------------------------------
Будьте реалистом.
Расчёт ГО
 
в документации указанной выше Вы узнаете что ГО зависит от направления сделки:
Эффекты:
• Асимметричное ГО на покупку и продажу
• Увеличение ГО по однонаправленным позициям из-за учета
процентного риска
• Снижение изменений из-за влияния IR с увеличением срока
• Снижение ГО по позициям в ММС и по «Календарным спредам»
---------------------
Как узнать, будут ли завтра или в другую дату торги по фъючерсу, Автоматическая замена кодов фъючерсов
 
Цитата
Евгений Петров написал:
Цитата
_sk_ написал:
Не ломай голову, в явном виде пропиши дату, когда надо переходить на новый фьючерс.
С календариком посмотреть когда какой фъючерс заканчивается и в какой день лучше менять с учетом праздников и выходных? Особенно это неудобно у нефти. Хотелось бы автоматизировать
ну так введите в начале года в программу календарь и считывайте автоматически.
в чем проблема?
Расчёт ГО
 
здесь руководство:
http://ftp.moex.com/pub/ClientsAPI/Spectra/SpectraIM/prod/doc/
здесь софт:
http://ftp.moex.com/pub/ClientsAPI/Spectra/SpectraIM/prod/
Расчёт ГО
 
Цитата
Незнайка написал:
Т.е., вас не смущает, что в окне ввода заявки указывается одно значение ГО, а резервируется под эту заявку совсем другая величина?
читайте первоисточники:
https://www.moex.com/s95
https://www.moex.com/s1573
Создание индикатора внутри скрипта
 
пример
http://www.kamynin.ru/
Индикатор для QUIK на LUA
 
пример
http://www.kamynin.ru/
Кто может написать простой скрипт на Lua для индивидуального графика-индикатора?, написать простой скрипт на Lua для индивидуального графика-индикатора
 
пример здесь:
http://www.kamynin.ru/
Кто может написать простой скрипт на Lua для индивидуального графика-индикатора?, написать простой скрипт на Lua для индивидуального графика-индикатора
 
Цитата
Дмитрий написал:
можете написать этот скрипт?
правильно понял :
вывести на экран  сумму=
"количество заявок на покупку" + "на продажу" + обьем (???)
------------------------
В таблице нет параметра "объем"
есть "оборот в деньгах"
---------------
что такое  "объем" и откуда его брать?
Соответствие Кодов клиента и Торговых счетов, Определение соответствия Кодов клиента и Торговых счетов
 
Цитата
Сергей написал:
Освежу темку.
1. Если фирма для брокера это группа счетов, то зачем в вызовах getDepoEx, getMoneyEx, getFuturesLimit, ... кроме номера счета указывать еще и фирму? Кажется, эта информация избыточна.
2. Практически всегда, номер счета фондового рынка МБ имеет код "L01~00000F00", получается это не счет клиента, и даже не брокера, а .... счет чего?
на бирже торгуют фирмы(брокеры) а не их клиенты
поэтому информация о фирме нужна бирже.  
кроме того в сделке на бирже есть и идентификатор клиента,
но идентификатор клиента(счет)  нужен реально лишь брокеру для разнесения сделок по клиентам во внутренней "амбарной книге"
Базовый актив по фьючерсу, Базовый актив по фьючерсу можно ли получить
 
Цитата
just написал:
Здравствуйте, подскажите, пожалуйста можно ли программно получить базовый актив по фьючерсу или наоборот найти есть ли фьючерсы к заданному активу.
Например, getParamEx("SPBFUT", "SiM0", "OPTIONBASE").param_image возвращает значение "Si", а актив, который, я так понял, лучше всего подходит в качестве базового я нахожу по коду USD000UTSTOM. Ну и по другим фьючерсам аналогично... Вычислить конкретный базовый актив, который можно использовать в коде я не вижу как...
Si - фьючерсный контракт на курс доллара США/ российского рубля, обращающийся на бирже РТС FORTS.
Для фьючерса Si базовым активом является официальный курс доллара и рос. рубля Центральным Банком РФ.
Участники сделки (покупатель и продавец) фьючерса торгуются только за цену, и несут ответственность перед РТС до момента исполнения (даты погашения).
Исполнение фьючерса происходит по расчетной цене, которая зафиксируется в день погашения.
Индикатор уровней совпадения цен
 
например:
Индикатор уровней совпадения цен
 
тип "4"
Получение параметров из таблиц в переменные
 
вместо:
if tblAsk==nil          then Ask=0          else Ask=tonumber(tblAsk.param_value)                   end  
--------------
пишите проще:
if tblAsk   then  Ask=tonumber(tblAsk.param_value)    end  
----------------------------------
где используете Ask
тоже пишите
if Ask then ....  end
-----------------
В итоге вы не будете тратить время на расчеты если Ask=nil ,
а в Вашем случает Вы тратите время на расчеты, если Ask=0,
либо ставите такое же условие для нуля
 
Расчёт ГО
 
Цитата
Незнайка написал:
т
возможно это что-то прояснит:
https://iwtkl.livejournal.com/21873.html
Страницы: Пред. 1 ... 49 50 51 52 53 54 55 56 57 58 59 ... 80 След.
Наверх