nikolz написал: Чтобы ускорить работу надо функцию выставления заявки запускать в отдельном потоке,
А как это ускорит работу?
Никак
Ну если не можете запустить выставление заявки в отдельном потоке, то запустите все остальное в другом потоке. Например , можно в отдельных потоках запускать алгоритмы принятия решений роботом для различных рынков (бумаг) можно в отдельных потоках запускать любые функции, которые не связаны с основным потоком КВИК. В отдельных потоках дополнительно к main можно запускать любые действия внутри колбеков и тем самым ускорять их исполнение. ----------------- Так как узким местом териминала КВИК является его хранилище, то, чтобы обеспечить параллельную работу потоков, надо всю информацию, поступающую в терминал квик, дублировать в свои таблицы и файлы и работать не с хранилищем терминала, а со своей базой данных. --------------------
Дмитрий написал: Здравствуйте! По названиям параметров ТТП, к которым можно обращаться с помощью функции getParamEx, иногда бывает трудно однозначно понять, что эти параметры означают и/или как рассчитываются их значения. Подскажите, пожалуйста, где можно взять подробное и актуальное описание всех параметров, которые транслируются с Московской биржи? Если оно есть на сайте биржи, то подскажите ссылку.
Описание полей любой таблицы в т числе и ТТП можно легко получить используя вывод через DDE сервер в excel. Для получения имен параметров надо установить флажок "Формальные заголовки" С заголовками столбцов"
Duke2 написал: Evgenii, Main зациклен, просто в выдержку кода не попало зацикливание. Спасибо все равно
дело в том что поток колбеков и поток Main - это разные потоки. Если функция выставления заявки будет работать в майн, то это ничего не даст, кроме лучшей читаемости текста программы. -------------------------- Чтобы ускорить работу надо функцию выставления заявки запускать в отдельном потоке, а в цикле майн проверять завершение работы этой функции. ----------------- Если есть желание это сделать, то рекомендую почитать книгу Дж.Рихтер Создание эффективных WIN-32 приложений с учетом специфики 64-разрядной версии Windows
nikolz написал: не надо отслеживать новые версии и исправлять то, что перестает работать
Это, конечно, важный плюс, спору нет. Но если один мейн рушится, что с остальными делать? Очевидно, тоже прибивать и завершать весь скрипт, т.к. очень сомнительно, что большинство скриптов следуют RAII (до предыдущей версии это было физически невозможно даже и никто не бухтел, т.е. буквально никто этим не морочился). В таком раскладе мультипликативно снижаем общую надежность скрипта, если (утрированно) надежность одного мейна 0.5 и всего скрипта тоже, то при двух таких мейнах надежность скрипта в целом уже 0.25.
Указанная Вами проблема легко решается. -------------------------------- Дело в том, что в моем решении создание роботов разделяется на отдельные ,самостоятельные и не требующие нового программирования модули. Ранее я уже намекал на такое решение. Это решение легко представить, если ответить на вопрос -Чем отличаются роботы торгующие акциями друг от друга? ---------------------------- Они отличаются лишь торговым алгоритмом. В моем варианте, я сделал модуль для работы кучу общих модулей - модуль для стакана, модуль для счета, модуль для сделок, модуль для заявок, модуль стопов и т д. Все эти модули являются универсальными и одинаковыми для любого робота. ----------------------------------- В итоге, разработка робота сводится к программированию лишь алгоритма принятия решения. Этот алгоритм можно написать на более простом и близком к естественному языку. ---------------------------------- В итоге нет надобности изучать LUA, изучать QLUA. Надо изучать именно закономерности рынка и написать алгоритм состояний робота и логику изменения этих состояний. ---------------------------------- В итоге любой буратино может легко реализовать свой гениальный алгоритм, как стать миллионером на поле чудес.
nikolz написал: если бы все было так просто, то проблему многопоточности в луа не поднимали бы на форумах уже лет ..надцать.
Это именно проблемы многопоточности как таковой, а не многопоточности в луа. В приведенной статье тоже. Как раз автор пришел в конце к правильному выводу, асинхронность рулит. Надо только не забывать, что нынче практически все процессоры многоядерные, даже контроллеры многие, так что многопоточность все равно будет присутствовать, главное ее локализовать и не позволить ей разползтись по всему коду. Конкретно в квике уже отступать некуда, архитектура выбрана такая и трудно предположить, как ее можно обратно-совместимо поправить. Теперь только костыли лепить.
Многие решали, в том числе и основоположники . К сожалению, конкретно в их решении очереди блокирующие, эдакий qnx получился.
Дискуссия схоластическая, но замечу, что Вы путаете понятия Проблема многопоточности и проблема синхронизации потоков - это синонимы. т е первое это есть второе. Проблема именно луа а не многопоточности. Как решать задачу синхронизации потоков в конкретном софте хорошо разжевано у Рихтера. Но в луа проблема в том, что есть сборщик мусора и много сторонних библиотек. -------------------------- Вы не внимательно прочитали статью, на которую ссылаетесь. --------------------------- цитата: "В этой работе мы исследуем модель, основанную на выполнении потоков без общей памяти, которые используют передачу сообщений для синхронизации и общения." Т е это фактически многозадачное решение, а не многопоточное. ------------------------------ и далее цитата: "Связь между процессами Lua происходит исключительно через сообщения. Cвязь с передачей сообщений может быть медленнее по сравнению с общей памятью." =============== Т е упрощенно, запускаем несколько независимых VMLua как несколько задач, а потом пересылаем данные между ними в виде сообщений OC. Проблемы такого решения хорошо известны.
verder написал: Каков оптимальный способ программно остановить исполнение скрипта на QLua? Например, код диагностирует некую внутреннюю ошибку по своей логике, выкидывает message и сразу останавливает работу скрипта во всех потоках.
в main есть бесконечный цикл поставьте в нем переменную и присваивайте ей nil при ошибке. В итоге скрипт завершит работу
Я определения текущего количества фьючерсов в портфеле я использую функцию getFuturesHolding. Обратил внимание, что если по тикеру ранее не было сделок, то функция возвращает Nil, а не 0 как я предполагал. Если сделки ранее были, то количество бумаг отображается корректно.
Можно ли как-нибудь выйти из этой ситуации?
просто написать local x=0; -- текущее количество фьючерсов if ( getFuturesHolding...) then x= getFuturesHolding... end -- читаем текущее количество
nikolz написал: Есть очень простое решения проблемы статуса сессии. Делаем раз - синхронизируем компьютер по серверу времени. Это позволяет нам синхронизироваться с временем биржи с погрешностью не более 0.01 сек Делаем два - пишем константы начала и конца сессий Делаем три - где надо и не надо просто сравниваем текущее время с константами и решаем какое сейчас состояние сессии без каких либо кодов с биржи ------------------------ Самое смешное в том, что биржа(брокер) свои коды формируют точно так же.
Как для автомобиля - крутить рукоятку если стартер не заводит автомобиль - простое решение ). Я перешел к пользованию статусом сессии именно потому, что однажды, пользуясь простым решением, забыл перевести сезонное время (я живу в стране где его надо переводить) и потерял прилично денег на этом.
полагаю что потеряли вы не по причине что забыли перевести время. это лишь вариант самоуспокоения. Если Вы включили комп позже начала сессии, то никакие сигналы Вам не помогут. и статус сессии здесь не причем. Конечно решать Вам, я лишь изложил свой опыт решения данной проблемы
Что я выше описал, это на стороне qlua.dll, то есть аркино производство. В самой lua53.dll правки если и есть, то крайне незначительные, практически все строка в строку ложится на сорцы луа из репозитория, как выше из разбора дампа видно.
Цитата
nikolz написал: Проблема многопоточности в луа - это проблема луа.
Луа дает lua_lock/lua_unlock и на этом его проблемы с многопоточностью закончены. Можно поспорить, здорово ли, что в некоторых функциях 5.3 вытащили часть обращений к стеку из-под лока, если говорить о проблемах луа. Но вот как сделаны эти самые локи (и не только), это уже вопросы к арке.
Ва заблуждаетесь, если бы все было так просто, то проблему многопоточности в луа не поднимали бы на форумах уже лет ..надцать. Вот, например, результат попытки решения критическими секциями (look, unlook) и таких воплей в инете много. -------------------- Тоже решал эту проблему, но не уверен, что нашел окончательное решение .
добавлю свои пять копеек. Если это особенности VMLua то разработчики ничего исправлять не будут. VMLua написана не ими. Они лишь встраивают ее в КВИК и сделали dll интерфейса на луа с хранилищем терминала и обменом с сервером КВИК. --------------------- Проблема многопоточности в луа - это проблема луа. Есть различные решения этой проблемы, но они никак не связаны с КВИК.
Есть очень простое решения проблемы статуса сессии. Делаем раз - синхронизируем компьютер по серверу времени. Это позволяет нам синхронизироваться с временем биржи с погрешностью не более 0.01 сек Делаем два - пишем константы начала и конца сессий Делаем три - где надо и не надо просто сравниваем текущее время с константами и решаем какое сейчас состояние сессии без каких либо кодов с биржи ------------------------ Самое смешное в том, что биржа(брокер) свои коды формируют точно так же.
Добавлю свои пять копеек к решению проблемы. ----------------------------------------- Обычно такая проблема возникает, если есть массивы, которые определяются лишь при старте индикатора. В результате, при смене тайма, они остаются не пустыми. В итоге нарушается индексация и возникают отсутствующие элементы ------------------------- Проблему решаем так: ---------------------------- Создаем специальную функцию инициализации всех переменных индикатора. ----------------------- Эту функцию вызываем в двух местах - в Init() - здесь можно и не вызывать, но делаю это, так как Init как бы для этого создана. Вызывается в индикаторе один раз при запуске и не влияет на скорость исполнения. и в onCalculate() при индексе равном 1 Например так: -------------------------------- function OnCalculate(k) if k==1 then -- вызываем функцию инициализации end -------------------------- Если будете выполнять данное правило, то проблем при переключении тайма не будет.
Вадим написал: Кажется я понял, что колбэк функция возвращает два состояния заявки - старое и новое
Заявка на Покупку Дата Номер Флаг 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
В случае первого появления заявки оба состояния новые В случае последующих изменений старое+новое состояние
Воспринимайте колбек, как сигнал на бесчисленное множество событий, из которых Вам надо очень малое число. Поэтому не надо пытаться их все понять. --------------- Надо всегда ставить фильтр лишь того, что нужно. Остальное - игнорировать. В реалии событий может быть хоть тысяча, но вам нужно лишь два. Вместо того , чтобы выяснять что это за событие, определитесь что же конкретно нужно Вам. ----------------------- В итоге роботу будут безразличны все события в мире, кроме тех, которые нужны Вам.
Сама постановка задачи ассоциируется примерно с таким: Надо на автомобиль поставить ракетный двигатель. Даже страшно представить что будет с таким хотелкиным, если ему это сделать , но скорее всего он и сам не знает, зачем это реально надо.
Сергей написал: Прежде всего, я нигде, вроде, не просил написать скрипт на Луа, или каком-либо еще языке, достаточно было изложить общий принцип организации выборки. Прямой, обратный, с использованием специальных функций, что-то еще. По существу последнего ответа, спасибо, хоть какая-то конкретика, по крайней мере понятно, как организована сортировка в таблице позиций. Уж, как это обработать в скрипте, дело действительно индивидуальное.
сталкивался с такой ситуацией. Ее исключить можно если контролировать размер таблицы. -------------- Полагаю, что лучшим способом, является не лазить постоянно в хранилище терминала, так как это очень накладная операция, а создавать свои таблицы и отслеживать в них появление и удаление строк в соответствии с колбеками.
Старатель написал: Andrey Bezrukov, Никакого архива, конечно же, не будет. В этом нет смысла. Вероятность воспроизвести точно такую же ситуацию не высока, и ваш ответ ("проблема не воспроизводится") очевиден. Вы можете только подтвердить или опровергнуть гипотезу:
Цитата
Старатель написал: Первый список загружается вместе с QUIK. Второй загружается вместе с файлом настроек уже после того, как стартуют скрипты.
А заодно проверить в своём коде терминала, что в момент подмены списков таблица trade_accounts сначала очищается, а затем вставляются списки из info.wnd. И в этот момент как раз существует гипотетическая вероятность получения nil из вышеприведённого кода. Как-то так, других вариантов у меня нет.
И зарегистрировать пожелание на доработку: стартовать скрипты после полной загрузки настроек. Если, конечно пользы от этого будет больше, чем вреда.
Пример ещё нескольких функций, которые зависят от последовательности загрузки настроек: getNumCandles, getLinesCount, getCandlesByIndex
Попробуйте решить подобную проблему путем контроля времени пинга до сервера. --------------- примечание: Решал эту проблему давно, поэтому не уверен, что один этот параметр использовал, но помню, что решил. В настоящее время встраиваю роботов в индикаторы, поэтому подобные скрипты где-то в архивах пылятся.
Игорь Б написал: 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 и если не открыт то делать его открытие, а не спать.
Боюсь те, кто этим смог бы грамотно воспользоваться, могут это сами и сделать, как автор идеи, в частности. Всем остальным буратинам это не нужно и вредно.
с Вами не согласен по трем причинам: 1) Если это решение будет официальное, то не надо отслеживать новые версии и исправлять то, что перестает работать . Как это есть сейчас. 2) Буратинам будет еще легче писать свои хотелки так как нет надобности одно и тоже программировать в множестве роботов Все будет существенно проще 3) если это реализуют, то размещу следующее пожелание, в котором создание роботов превращается в написание лишь алгоритма, а все или почти функции QLUA скрываются в обертке Т е буратинам даже не надо изучать луа. Просто пишут почти на естественном языке что хотят и все работает.
Добрый день, Прошу разработчиков рассмотреть следующее предложение по развитию QLUA. ---------------- Суть проблемы. При создании нескольких скриптов приходится дублировать внешнюю среду функции main в каждом скрипте Т е все колбеки и все глобальные переменные Но так как все это исполняется в одном потоке создается существенное торможение работы терминала при большом числе скриптов. -------------------- Решение - предложение. Решить проблему можно двумя путями. Вариант1 Реализовать возможность создание в одном скрипте множество функций main Т е реализовать механизм запуска нескольких потоков в одном скрипте Ввариант2 Реализовать возможность работы множеству скриптов с одной глобальной областью Этот вариант реализуется, например, путем подмены указателя глобальной таблицы скрипта на указатель общей глобальной области Этот вариант я реализовал лет восемь назад для win32 и LUA 5.1, Теперь надо все переделывать на 64 и 5.3 ------------------- Поэтому предлагаю это сделать для всех буратин.
Nikolay написал: Это, конечно, похвально написать свой RabbitMQ, но, в результате, получится схема не меньшей сложности. Т.е. мы пишем свой терминал. Он будет собирать события терминала, исполнять команды скриптов и читать их ответы, передавать им поток данных.
При этом мы итак находимся внутри такого окружения... Что мешает написать скрипт исполняющий сразу несколько алгоритмов, по многим инструментам. Будет один скрипт, одно окружение. А колбеки Квика слишком ненадежная конструкция. Проще без них. Хотя, конечно, от части из них отказаться сложно, как, например, OnTransReply.
вообще-то я написал о том, что сделал сам лет ...надцать назад, т е фактически сразу как внедрили VMlua в квик. А перед этим примерно года за два я сам в переписке с руководством разработчика предлагал внедрить вместо QPILE LUA. не утверждаю, что они меня послушались, но в результате появился луа в квике. --------------------- Тот механизм, о котором я написал, позволяет очень просто делать много роботов по различным алгоритмом для одного инструмента. Колбеки не дублируются в скриптах Каждый колбек существует в своем скрипте и вызывается всего один раз квиком для получения данных вне зависимости от числа роботов. Роботы получают требуемые данные от этого скрипта. т е потоки синхронизируются и обмениваются данными , а также чтобы не дублировать код, могут запускать функции других скриптов через механизм колбеков между скриптами. Сравнительно просто в этом варианте отдавать данные совершенно независимым процессам. ----------------------- Но если не мечтать о вечном, то проще всего делать роботов как индикаторы.
nikolz написал: Каждый скрипт условно можно разделить на три части1) действия вне колбеков и функции main - это отдельный поток и VM Lua2) функция main каждого скрипта - это отдельный поток и VMLua3) вызов и исполнение функций колбек осуществляется в одном основном потоке термина.
Не совсем оно так, стейт для тела скрипта и колбеков один и выполняется в основном потоке квика, стейт для мейна второй и выполняется в специально для него созданном потоке. То есть ваш п.1 лишний, нет отдельного стейта для тела.
Ваши мысли насчет 128 ядер это из разряда давайте загрузим проц бесполезной работой, чо он простаивает-то. В любом случае ваши 100500 потоков будут сериализоваться на доступе к общим ресурсам, т.е. в основном (в таком количестве) они будут крутить спинлок. Для примера предлагаю прогу из directx sdk, где можно отрисовать одно и то же либо одним потоком, либо многими. Запустите и убедитесь, что проц оно жрет в N раз больше, а fps растет процентов на 5.
Я вам предлагаю для примера посмотреть алгоритм БПФ либо нейронной сети
Иван Ру написал: Интересно мнение форумчан - как предпочитаете писать скрипты - все в одном файле или в виде конструктора - с подгрузкой отдельных файлов: 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 имеет существенный недостаток. Все колбеки вызываются из одного потока и каждый из них повторяется в различных скриптах. В итоге получается дублирование одних и тех же действий многократно. Я устранил эту проблему и сделал механизм при котором колбеки в скриптах не повторяются, а скрипты могут запускать функции друг у друга и получать данные из других скриптов.. ------------------------- В итоге не только повышается скорость, но и размер кода сокращается в десятки раз.
Иван Ру написал: Вот так ругается на строку кода в цикле расположенном в пределах main, где пытаюсь считать статус соединения... while is_run do sleep (50) if isConnected() == 1 then .. -- не могу понять, что тут написал не так, ругается на эту строку ... end
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
Nikolay написал: Начались торги в вечернюю сессию на фондовой секции. Я уже задавал вопрос про трансляцию времени сессии, но вот сейчас она идет и можно посмотреть на реальный поток данных.
Что мы видим:
Вот утро. Начало торгов. По фьючерсу все ожидаемо и понятно. Есть и времена и статус. По акции я вижу только статус, а время заполнилось только утренним аукционом.
Вот данные пор акции внутри дня. Время утреннего акциона. Это как понимать? Уже сессия к концу идет, а время старое. [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"}
Вечер. По фьючерсам все адекватно, а вот по акциям:
Времена аукциона я еще могу понять. А вот что это такое при старте вечерней сессии уже с трудом. И опять - времена то где? Почему нельзя заполнить времена прямо при подключению к серверу, как это делается для фьючерсов и менять их, если они меняются внутри дня? Поля же есть.
Часть акций торгуется, часть нет. А информации о времени сессии нет. Раньше можно было хотя бы определить константы, когда времена были фиксированными (хоть это было и спорное решение), но сейчас то как.
На первом этапе на вечерней сессии торгуются 25 ликвидных акций из списка индекса МосБиржи, а до конца года в список торгуемых инструментов войдут все акции из индекса МосБиржи (38 акций), а также 50 наиболее ликвидных иностранных акций из американского индекса S&P 500.
Николай написал: В 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 например 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_ написал: Не ломай голову, в явном виде пропиши дату, когда надо переходить на новый фьючерс.
С календариком посмотреть когда какой фъючерс заканчивается и в какой день лучше менять с учетом праздников и выходных? Особенно это неудобно у нефти. Хотелось бы автоматизировать
ну так введите в начале года в программу календарь и считывайте автоматически. в чем проблема?
Кто может написать простой скрипт на Lua для индивидуального графика-индикатора?, написать простой скрипт на Lua для индивидуального графика-индикатора
Кто может написать простой скрипт на Lua для индивидуального графика-индикатора?, написать простой скрипт на Lua для индивидуального графика-индикатора
правильно понял : вывести на экран сумму= "количество заявок на покупку" + "на продажу" + обьем (???) ------------------------ В таблице нет параметра "объем" есть "оборот в деньгах" --------------- что такое "объем" и откуда его брать?
Сергей написал: Освежу темку. 1. Если фирма для брокера это группа счетов, то зачем в вызовах getDepoEx, getMoneyEx, getFuturesLimit, ... кроме номера счета указывать еще и фирму? Кажется, эта информация избыточна. 2. Практически всегда, номер счета фондового рынка МБ имеет код "L01~00000F00", получается это не счет клиента, и даже не брокера, а .... счет чего?
на бирже торгуют фирмы(брокеры) а не их клиенты поэтому информация о фирме нужна бирже. кроме того в сделке на бирже есть и идентификатор клиента, но идентификатор клиента(счет) нужен реально лишь брокеру для разнесения сделок по клиентам во внутренней "амбарной книге"
just написал: Здравствуйте, подскажите, пожалуйста можно ли программно получить базовый актив по фьючерсу или наоборот найти есть ли фьючерсы к заданному активу. Например, getParamEx("SPBFUT", "SiM0", "OPTIONBASE").param_image возвращает значение "Si", а актив, который, я так понял, лучше всего подходит в качестве базового я нахожу по коду USD000UTSTOM. Ну и по другим фьючерсам аналогично... Вычислить конкретный базовый актив, который можно использовать в коде я не вижу как...
Si - фьючерсный контракт на курс доллара США/ российского рубля, обращающийся на бирже РТС FORTS. Для фьючерса Si базовым активом является официальный курс доллара и рос. рубля Центральным Банком РФ. Участники сделки (покупатель и продавец) фьючерса торгуются только за цену, и несут ответственность перед РТС до момента исполнения (даты погашения). Исполнение фьючерса происходит по расчетной цене, которая зафиксируется в день погашения.
вместо: 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, либо ставите такое же условие для нуля