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

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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 87 След.
Изменение параметров встроенных индикаторов из скрипта
 
Добрый день,
---------------------
Сейчас в QLUA есть возможность перезапустить скрипт индикатора при изменении параметров в окне настройки индикатора.
-----------------------
Предлагаю реализовать возможность изменения параметров встроенного индикатора из скрипта.
==================
Поясняю:
--------------------
Да, можно написать копию встроенного индикатора на луа и таким образом решить задачу изменения параметров индикатора.
-----------------
Но такое решение работает раз в 100 медленнее, чем встроенное.
--------------------
Кроме того, в терминале QUIK много встроенных индикаторов и нет смысла  делать их в виде копии на луа,
либо использовать Вашу библиотеку скриптов на луа и изучать алгоритмы индикаторов.

 
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Прикольно читать Вашу тему.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:

Ответ на Ваш вопрос очевиден, "Промышленный" - это то чем пользуются хэдж - фонды, или закрытые отделы в банках под управлением у которых находятся собственные средства, а не клиентов. И такие торговые платформы отвечают не которым стандартом, где то выше уже какие то стандарты приводил.
Если правильно понял Ваш ответ, то термин "промышленная архитектура"  это Вы придумали вв детском саду.
------------------------
Если  я не прав, то дайте ссылку, где этот термин определен.
Назовите хоть один хедш-фонд  или банк,   который использует этот термин.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
объясняю популярно, для тех, кто изобретает велосипед.
-------------------
Если Вы пользуете встроенные графики , то проще и быстрее не читать их в скрипте и потом выковыривать название индикатора из легенды,
а записать из значения либо параметры, включая код индикатора , интервал в файл.
В скрипте прочитать эти параметры при их смене на графике (если это график с якорем).
либо писать индикаторы в файлы с именем инструмента и читать в скрипте соответствующий файл.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Концептуально, такую архитектуру можно свести к последовательным шагам взросления системы, в стиле боевого QUIK-safe.
Важных, самостоятельных 4 - логических слоя, как в профессиональных торговых платформах:

2.2. Использование данных от индикатора (и это уже по взрослому).
Код
 
И ни какой магии, типа машинного обучения или нейросетей!  А главное безопасное изменение и замена модулей. Хочется думать так, а жизнь покажет, что опять не учитываю.  ::  
Прикольно, что вы написали. И это не по взрослому, а по дилетанскому.
-----------------------
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
nikolz,  "У нас" - это те кто пользуется  инфраструктурой Квика, и я рассуждаю о разворачивании на ее основе торговой платформы на луа, а не вообще. Не нужны, тут ни какие драйвера, кроме того что предоставляет квик. Разворачивая торговую систему, приводя в порядок архитектуру  и дописывая модули, мне это напомнило порядок ОС (как пример DOS). Зная это, можно изначально закладывать архитектуру как промышленную. Сложно но можно!
а что такое "промышленная архитектура"? Откуда вы взяли этот термин? если сами придумали, то дайте определение.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Цитата
nikolz написал:
А если серьезно, то попробуйте написать на луа какой-нибудь драйвер устройства, что является обязательным элементом OC.
Не я тоже возмущен почему, у "Условного Маркет Мейкера"  скорость 10 мк.сек. а унас 200 мл.сек., а кому повезет, ну хорошо кто следит, 100 мл.сек.
И это ни сколько не отменяет тот  факт что код может отвечать принципам и требованиям ОС?
Вы заблуждаетесь относительно "у нас"  
На бирже торгует брокер, а не его клиенты. QUIK - это программа подачи заявок брокеру, а не для прямой торговли на бирже.
--------------------  
относительно мксек ММ и mkсек QUIK.  млсек - это время прохождение данных от Вашего ПК до брокера по интернету.  Разместите свой ПК в дата центре на M9 и у вас тоже будут мкс.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
А если серьезно,
то попробуйте написать на луа какой-нибудь драйвер устройства,
что является обязательным элементом OC.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Вы еще больше удивитесь, когда узнаете,
что из кирпичей можно построить стены дома и,
даже сложить печку в доме том.
--------------
А самое прикольное,
Вы никогда бы не догадались,
земля -круглая, а не плоская.  
--------------
В мире еще много удивительного и не познанного.
Рыночная заявка для торговли фьючерсами
 
если очень надо, пишите в личку.
Рыночная заявка для торговли фьючерсами
 
Цитата
Сергей Че написал:
Цитата
nikolz написал:
Спасибо, конечно, за примеры транзакций, но ты так и не ответил на мой вопрос про запрос данных из стакана.
Не припомню, что я обязался отвечать на все вопросы на форуме.
Рыночная заявка для торговли фьючерсами
 
Снятие всех заявок на срочном рынке FORTS
на покупку  контрактов на курс акций Ростелеком -ао
TRANS_ID=50; ACCOUNT=SPBFUT00001;  ACTION=KILL_ALL_FUTURES_ORDERS; OPERATION=B; CLASSCODE=SPBFUT;  BASE_CONTRACT=RTKM;
Рыночная заявка для торговли фьючерсами
 
Перестановка заявок на срочном рынке FORTSACTION=MOVE_ORDERS; TRANS_ID=333; CLASSCODE=SPBFUT;  SECCODE=EBM6; FIRM_ID=SPBFUT389; MODE=1; FIRST_ORDER_NUMBER=21445064;  FIRST_ORDER_NEW_PRICE=10004; FIRST_ORDER_NEW_QUANTITY=4;  SECOND_ORDER_NUMBER=21445065; SECOND_ORDER_NEW_PRICE=10004;  SECOND_ORDER_NEW_QUANTITY=4;
Рыночная заявка для торговли фьючерсами
 
см. док:
Заявка на продажу
Фьючерс LKOH-3.10, рыночная, 15  контрактов
ACCOUNT=SPBFUT00009; CLIENT_CODE= SPBFUT00009; TYPE=M;  TRANS_ID=8; CLASSCODE=SPBFUT; SECCODE=LKH0; ACTION=NEW_ORDER; OPERATION=S;  PRICE=16231; QUANTITY=15;
Странная задача) помогите
 
для какого приложения пишите?
После обновления на версию 12.8.3.4 появился глюк в таблице "купить-продать", Глюк с фильром инструментов в таблице
 
Цитата
Ivan Smirnov написал:
Цитата
nikolz написал:
Проверьте подписку.  часто при обновлении обновляется подписка и в результате принимаются  новые инструменты.
Не совсем понимаю что такое подписка и где ее проверять. В настройках получения котировок стоит получать "умным заказом".

Дело в том что если даже несколько раз заходить в меню "редактировать таблицу" (таблицы купить-продать) и сохранять настройки, то на несколько секунд после этого отображается правильный набор инструментов а потом туда добавляется целая гора других инструментов. И так можно повторять несколько раз, результат будет всегда такой.

Поэтому полагаю что все же речь идет о глюке.
После обновления на версию 12.8.3.4 появился глюк в таблице "купить-продать", Глюк с фильром инструментов в таблице
 
Цитата
Ivan Smirnov написал:
Здравствуйте.
Один из моих брокеров обновил квик до версии 12.8.3.4 и в новой версии сразу стал заметен глюк в таблице "купить-продать".
Суть его в том, что независимо от того, какие инструменты отобраны для отображения в этой таблице, в нее добавляется большое количество других инструментов (в моем случае порядка 800) из разных классов. По какому принципу они туда отбираются не совсем понятно. В моем конкретном случае мне "на глаз" кажется что это все инструменты которые есть во всех других таблицах данного экземпляра квик.

Сценарий:

1) Открыть таблицу купить-продать
2) Нажать "редактировать таблицу", отобрать несколько инструментов, сохранить
3) Подождать несколько секунд (до минуты)
4) Помимо выбранных на шаге 2) инструментов в таблице отобразятся еще какие-то инструменты

При этом если снова зайти в настройку "редактировать таблицу", там по-прежнему будут только выбранные пользователем инструменты (т.е. настройка по-прежнему выглядит корректно)
Проверьте подписку.  часто при обновлении обновляется подписка и в результате принимаются  новые инструменты.
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
 
T+ - это режим когда деньги сейчас, а стулья либо чере 1 либо через 2 дня
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
 
Цитата
Kilor написал:
Цитата
nikolz написал:
SBMM торгуется в режиме T+. Почему у SBMM  появится цена T0?
Я купил эту позицию вчера в количестве 100 лотов по цене X и сегодня докупил 200 лотов по цене Y.
В T1, понятно, я вижу, что у меня "сейчас" 300 лотов общей себестоимостью 100X+200Y.
В T0 вижу, что на начало сессии имелось 100 лотов общей себестоимостью... 0! Выглядит странно, как минимум.
T0 - это режим торгов при котором взаиморасчет выполняется в день заключения сделки. Е+ - это режим когда деньги сейчас, а стулья либо чере 1 либо через 2 дня.
-----------------------------
В режиме Т0 на Московской бирже, как правило, торгуются облигации субъектов РФ, муниципальные облигации, корпоративные еврооблигации, номинированные в рублях и иностранной валюте, кроме долларов США, и облигации МФО
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
 
Если режим T+ то с какого цена приобретения будет на T0?
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
 
SBGB  аналогично:
SBGB ETF. Регистрационный номер. 3629. Код ISIN. RU000A1000F9. Режим торгов. Т+
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
 
SBMM торгуется в режиме T+. Почему у SBMM  появится цена T0?
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
 
Цитата
Oleg Kuzembaev написал:
Kilor, здравствуйте.

Попробуйте донести поддержке, что Вы не указываете на ошибку при передаче данных, а просто хотели, чтобы брокер отправлял Вам цену приобретения и в Т0 тоже, и что это нужно Вам для анализа данных, а также написания скриптов.
А если прочитать ее из T1. Это не решит проблему?
Рыночная заявка для торговли фьючерсами
 
Цитата
Сергей Че написал:
Цитата
nikolz написал:
nikolz, спасибо за то, что ты поделился своим подходом к созданию торгового робота, но у него есть один большой минус — он может двигать стопы, только когда он работает.

Что если я открыл позицию, потом закрыл квик, выключил компьютер, и включил его дня через три или через неделю?
За это время цена могла улететь, куда угодно, задеть стоп, инициировать его исполнение, но поскольку твой отступ слишком маленький (5 шагов), то не факт, что созданная лимитная заявка будет исполнена (особенно при резком движении цены против тебя). И ты будешь нести большие убытки.

Получается, что твой робот должен работает постоянно, 24/7, но даже в этом случае не факт, что ты закроешь позицию, когда сработает стоп, потому что нельзя исключать ситуацию, когда могут быть перебои с электроэнергией. К примеру, скачок электроэнергии — и твой компьютер отключился, или есть проблема на электроподстанции — и район города сидит без электричества, или с электричеством всё нормально, но проблема у провайдера —  тупо нет соединения с серверами. И пока будут чинить, торги на бирже идут, цена уходит, а ты (поскольку робот не работает) не можешь контролировать ситуацию.

Пока единственный выход — это когда ты заранее задаёшь стопу приличный отступ на всякий пожарный, например,  цена минус 100 шагов , чтобы гарантированно закрыть позицию, даже когда торговый робот может не работать при исполнении стопа. Но тогда опять встаёт вопрос, не выйдет ли цена для лимитной заявки за пределы диапазона  [PRICE_MIN, PRICE_MAX] . Ведь если выйдет, то заявка будет просто отклонена.

Как же неудобно, когда для срочного рынка нет простого и понятного  type="M"  +  price="0",  как оно есть для фондового! Приходится изобретать всякие костыли.
Все верно. Суть стоп-ордера - использовать удаленный сервер брокера . Если надо сделать тоже самое, то надо ставить квик на виртуальный сервер в дата-центре.
-----------------------  
Прикольно Ваша мечта. Поставить - и не смотреть неделю. Вы серьезно?  
------------------------------
Если Вы периодически включаете комп, то можно автоматом переустанавливать стоп. В таком варианте, всегда можно подстроить цену род текущее состояние рынка.
------------------
Если Вы поставите на 100 шагов, то можете получить продажу на дне. Т е продадите и цена уйдет вверх.
Рыночная заявка для торговли фьючерсами
 
Цитата
Сергей Че написал:
Цитата
nikolz написал:
Но заявку linkedorder  ловим в OnOrder, так как она там будет до таблицы.  
А как тогда ты тогда определишь, что это не просто лимитная заявка, а лимитная заявка, созданная при активации стопа? По полю   trans_id  , который мы запоминаем при создании стопа?
по номеру stop.linkedorder  
Рыночная заявка для торговли фьючерсами
 
Цитата
Сергей Че написал:
Цитата
nikolz написал:
Если речь про стоп-ордер, то я делал так.
ставлю цену, сместив ее относительно стоп например на 5 шагов.
Когда стоп сработает, то лимитная заявка либо сработает, либо останется активной.
Если она осталась активной, то на следующем тике робот ее переставляет на лучшую цену и так делает, пока вся позиция не закроется.
То есть, насколько я правильно понял, ты в коллбеке   OnStopOrder(stop)   читаешь поле   stop.linkedorder   (номер заявки, зарегистрированной по наступлению условия стоп-цены) и по номеру ищешь заявку в таблице   orders  , и у найденной зяавки проверяешь битовые флаги. И если она активна, то снимаешь её, и ставишь новый стоп-ордер на новую цену?  
Почти так. Но заявку linkedorder  ловим в OnOrder, так как она там будет до таблицы.  
Рыночная заявка для торговли фьючерсами
 
Цитата
Сергей Че написал:
Если я ставлю стоп-ордер на закрытие позиции, то я не могу знать, когда именно он исполнится: может через минуту, а может через месяц.
Поэтому я не знаю, какой будет диапазон   [ PRICE_MIN, PRICE_MAX ]  , когда цена достигнёт уровня срабатывания стопа.
Если бы знал, то сразу бы выставил известный заранее   PRICE_MIN   при закрытии лонга (или известный заранее   PRICE_MAX   при закрытии шорта).
Дело в том, что на срочном рынке нельзя выставить   type="M"   +   price="0"  , как документация советует  для фондового рынка .
А раз так, то приходится в стоп-заявке писать, что цена срабатывания   Х  , а цена исполнения   Х ±     100     шагов   (в зависимости от того, что закрываю, шорт или лонг).
И тут вопрос, а не выйдет ли   Х ±     100     шагов   за пределы диапазона       [ PRICE_MIN, PRICE_MAX ] ?  
Если речь про стоп-ордер, то я делал так.
ставлю цену, сместив ее относительно стоп например на 5 шагов.
Когда стоп сработает, то лимитная заявка либо сработает, либо останется активной.
Если она осталась активной, то на следующем тике робот ее переставляет на лучшую цену и так делает, пока вся позиция не закроется.
Рыночная заявка для торговли фьючерсами
 
Цитата
Сергей Че написал:
Цитата
paluke написал:
 
Цитата
Сергей Че  написал:
Если в заявке указать цену меньше PRICE_MIN (или больше PRICE_MAX), она всё равно приведётся к PRICE_MIN (PRICE_MAX)? Или заявка просто будет отклонена?
 Будет отклонена.

Надо ставить ту цену, по которой вы готовы купить. Ожидая роста, неплохо бы еще прикинуть, на сколько оно может вырасти. И учесть комиссии. А ставя PRICE_MAX, есть ненулевой шанс по этой цене и купить. Что может оказаться сильно завышено.
Выставляя цену, равную PRICE_MAX, я куплю по PRICE_MAX только в одном случае - если в стакане есть только 1 продавец, который выставил заявку в районе PRICE_MAX.
На ликвидном инструменте это просто невозможно.
Выставляйте цену для покупки по лучшей цене предложений либо больше , чем она на несколько шагов цены.
Еще можно делать так. Найти в стакане максимальный объем и выставить по его цене. тогда точно купите .
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
 
Возможно ошибаюсь, но разве в T0  отображается вчерашняя цена?  
Cкорость обмена данными через файлы
 
Цитата
Йцукен написал:
nikolz, так что, не знаете как в QLua синхронизировать запись из разных скриптов в один файл?
Знаю. Но, не хочу гадать, что Вы понимаете под этим и что у Вас не получается.
Напишите тест-скрипт и расскажите что не так.  
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Йцукен,
А как Вам это:

3 февраля 2010 года ошибка в алгоритме HFT-робота компании Infinium Capital Management, торговавшего нефтяными контрактами, привела к неконтролируемому росту заявок и скачку цены на нефть на 1,3% прямо перед закрытием биржи. Примерно за секунду работы робот сгенерировал убытков на $1 млн. kommersant.ru
------------------------
С HFT-трейдингом связывают обвал на американском фондовом рынке 6 мая 2010 года. За пять минут индекс DJIA, и без того снижавшийся весь день, потерял около 7%, чтобы ещё через 15 минут отыграть большую часть падения. Многие трейдеры сочли это естественным результатом насыщения рынка роботами: реагируя на продажи, те драматически усилили уже наметившееся движение. kommersant.ruru.wikipedia.org*

23 марта 2012 года компьютерный HFT-алгоритм, запущенный с терминалов неопознанного трейдера, «убил» попытку американской компании BATS Global Markets провести IPO. Попытка вывести акции на биржу продолжалась ровно 9 секунд, в течение которых бумаги компании обесценились практически до нуля, торги по ним были приостановлены, а через некоторое время руководство компании заявило о полном отказе выходить на биржу в обозримом будущем.  
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Цитата
Nikolay написал:
Учет комиссий не решается колбеками и данными из таблиц. Решается же он через обработку отчетов брокера. Комиссия биржи транслируется вместе с сделкой, поэтому её условно можно считать. Брокера же чаще всего транслирует "ерунду". И только в отчете за день будут точные цифры, т.к. они могу зависеть от оборота за день, типа инструмента и др, и в момент сделки точных банально нет. Так что гораздо проще в алгоритм вбить процент либо величину комиссии и учитывать её. А корректировать через разбор отчета брокера.
Комиссия брокера считается в конце дня, так как реально сделки урегулируются лишь после сессии клиринговыми компаниями.
Только эти компании могут списывать и зачислять денежные средства в оплату сделок.
После получения их отчета, брокер соответственно списывает деньги у клиентов и начисляет свою комиссию.
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
openbal NUMBER Входящий остаток
openlimit NUMBER Входящий лимит
currentbal NUMBER Текущий остаток
currentlimit NUMBER Текущий лимит
locked_sell NUMBER В продаже. Количество инструментов, заблокированное под исполнение заявок  клиента на продажу
locked_buy NUMBER В покупке. Количество инструментов в активных заявках клиента на  покупку
locked_buy_value NUMBER Стоимость инструментов, заблокированных под покупку
locked_sell_value NUMBER Стоимость инструментов, заблокированных под продажу
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Цитата
User12501 написал:

Например если в момент OnTrade мне нужно знать общее количество оставшихся акций
Для этого надо ловить это:
  • OnDepoLimit - изменение позиции по инструментам
алгоритм бота - стопа
 
Предлагаю обсудить один из моих вариантов бота, который управляет стопом.
-------------------------
Конструктивная критика приветствуется.
===================
Открываем график с инструментом , помещаем на него скрипт-индикатор бота и совершаем сделки.
----------------------
Бот имеет два режима.
----------------------------------
В первом режиме бот автоматически установит стоп, если есть позиция  по инструменту.
--------------------------
Во втором режиме бот начнет управлять стопом, если руками установить стоп  в любую позицию.
Когда бот обнаружит установленный стоп, он будет его переставлять в соответствии с заданным алгоритмом.
----------------------
Если позиция закроется, то стоп будет снят.
При появлении новой позиции бот будет управлять стопом.
----------------------------------
Чтобы бот перестал управлять, надо снять стоп руками.
---------------------------------
При старте QUIK бот начинает работать в установленном режиме.

 
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
Цитата
nikolz написал:
Поправьте так и ничего не повесится
А слона-то вы и не заметили. Я специально модифицировал скрипт, чтобы показать, какие инструкции выполняются под блокировкой (в используемой версии Lua).
Если Вам интересно изучить, какие функции выполняются с блокировкой в Lua, то изучайте исходники.
https://www.lua.org/source/5.4/lobject.h.html#hvalue
Там все есть. Я этот этап прошел очень давно. Не вижу особого смысла снова возвращаться к этой теме.  
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:

Теперь если ваш код модифицировать следующим образом:
Код
   local  x, y
 function   main ()
   while   true   do 
    y  =   99 
    x  =   199 
    x, y  =  y, x
     if  x ~ =   99   or  y ~ =   199   then 
      s  =  tostring(x) .. "," .. tostring(y) .. "\n"
     end 
   end  
 end   
и запустить, то QUIK повесится (версия Lua: 5.4.1).

Поправьте так и ничего не повесится:
Код
local  x, y
 function   main ()
   while   true   do 
    y=99
    x= 99 
    x, y  =  y, x
     if  x~= 99   or  y ~= 199   then 
      s  =  tostring(x) .. "," .. tostring(y) .. "\n"
     end 
       sleep(1);
   end  
 end  
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Два других должны быть не нулевые , так как определяют клиента на сервере брокера.
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Цитата
User12501 написал:
Создаю заявку из lua-скрипта на покупку ровно одной акции. Т.е. никаких финтов с частичным исполнением не может быть. При исполнении происходят два вызова функции OnTrade. Сделал полную распечатку всей таблицы от обоих вызовов. Отличие только в трёх полях: uid, on_behalf_of_uid, trans_id. При первом вызове все три нулевые, при втором все три - ненулевые.

Вопросы следующие:
1. Гарантируется ли, что вызов OnTrade, в котором эти поля нулевые, является не последним, т.е. я могу его игнорировать, т.к. после него будет следующий?
2. Гарантируется ли, что вызов, в котором эти поля ненулевые, является последним?
3. Являются ли эти три поля синхронными всегда? (Т.е. либо все три равны 0, либо все три не равны 0?) Т.е. можно ли проверять только одно из них, а не все три вместе?
Если заявка, по которой пройдет сделка выставлена не скриптом Lua, то trans_id будет нулевой .
-------------------------------------------
Должны быть не нулевые , так как определяют клиента на сервере брокера.
-----------------------------
Полагаю , что первый раз приходит с биржи, второй - с сервера брокера.
 
 
Cкорость обмена данными через файлы
 
Цитата
Йцукен написал:
Цитата
nikolz написал:
Но если это разные потоки или приложения, то надо синхронизировать
Как в QLua синхронизировать запись из разных скриптов в один файл?
А Вы писали из разных скриптов в один файл? Что получается?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
Цитата
nikolz написал:
x,y=y,x;
       if x~=99 or y~=199 then
           Log:write(tostring(x)..","..tostring(y).."\n")
Даже если вы поймаете тут ошибку, то подумайте вот о чём:
1) Может ли другой поток поменять значения переменных перед if ? Будет ли это означать отсутсвие атомарности в операторе присваивания?
2) Может ли другой поток поменять значения переменных перед выводом их в файл, т.е. гарантированно ли вы получите те значения, которые проверяли в if ?

    Скрытый текст       Ответ на 2-й вопрос - Нет.
Не знаю что Вы называете атомарностью операции.
Но В языке программирования Lua нет специальных атомарных операций.
-------------------------------------
Дело в том, что скрипт луа выполняется на виртуальной машине, а его операторы преобразуются в байт код.  Т е любой оператор -это набор функций на СИ. Поэтому официально в луа нет атомарных операций.
Можно говорить о синхронизации потоков при обращении к данным. Что делается известными методами, в том числе и в VMLua и в библиотеке  QLUA.
-----------------
Кроме того, VMLua изначально сделана не многопоточная( это всем известно).  Поэтому , если механизм синхронизации встроен, то ответ на ваш 2 вопрос будет нет, а если он не встроен , то ответ Да.
Рекомендую открыть в КВИКе еще поток ОС с VMLua как корутину (так открыт поток main) и обратится из него к общим переменным.  И Вы увидите ответ на Ваш вопрос. ( У Вас QUIK все просто вылетит аварийно)
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
тест поправил:
Код
minfo=debug.getinfo(1, "S").source:sub(2);  path=minfo:match("(.*[/\\])") or "."
Log=io.open(path.."/test.log","w"); 
fconnect=1; 
local x,y;
function main()
    while true do
        y=99 x=199      x,y=y,x;
        if x~=99 or y~=199 then
            Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
        end
            sleep(1);
       end 
end   
function OnParam(c, s) 
   y=100 x=200      x,y=y,x;
   if x~=100 or y~=200 then
        Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
    end
end

function OnInit(p) 
 fconnect=1;
end
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Йцукен,
Вы, очевидно, ждете системные ошибки, типа ошибок обращения к памяти. Верно?
Но их может и не быть.
Атомарность обнаруживается например тем, что записав в ячейку 1 и прибавив к ней 1 Вы ожидаете прочитать из нее 2, а читаете 0, так как с момента прибавления 1 до момента чтения результата другое ядро успело записать в эту ячейку ноль.
 
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
Цитата
nikolz написал:
как вы проверили, что выполняется атомарно?  Где доказательство?
Вот:  #11
Цитата
Йцукен написал:
такой код работает без ошибок

Можете опровергнуть?
Как Вы это установили?  какие ошибки?
---------------------
Вот вам тест:
Код
minfo=debug.getinfo(1, "S").source:sub(2);  path=minfo:match("(.*[/\\])") or "."
Log=io.open(path.."/test.log","w"); 
fconnect=1; 
local x,y;
function main()
  while  fconnect do 
        fconnect=2
        while fconnect==2 do
            y=99 x=199      x,y=y,x;
            if x~=99 or y~=199 then
                Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
            end
        end 
        sleep(10);
    end
    sleep(1000) 
end   
function OnParam(c, s) 
   y=100 x=200      x,y=y,x;
   if x~=100 or y~=200 then
        Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
    end
end

function OnInit(p) 
 fconnect=1;
end
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Атомарная (греч. άτομος — неделимое) операция — операция, которая либо выполняется целиком, либо не выполняется вовсе; операция, которая не может быть частично выполнена и частично не выполнена.
https://ru.wikipedia.org/wiki/Атомарная_операция
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
Похоже, операция множественного присвоения выполняется атомарно.
Вот такой код работает без ошибок:
    Скрытый текст        
Код
   local  run  =   true 
 local  a1, a2, a3, a4, a5, a6, a7, a8, a9  =   0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 
 local  n  =   100 

 function   OnAllTrade ()
   for  i  =   1 , n  do 
    a1, a2, a3, a4, a5, a6, a7, a8, a9  =  i, i, i, i, i, i, i, i, i
   end 
 end 

 function   OnParam ()
   for  i  =   1 , n  do 
    a1, a2, a3, a4, a5, a6, a7, a8, a9  =  i, i, i, i, i, i, i, i, i
   end 
 end 

 function   main ()
   while  run  do 
     sleep ( 1 )
     local  t  =  prec_time()
     for  i  =   1 , n  do 
       if  a1 ~ =  a2  or  a1 ~ =  a3  or  a1 ~ =  a4  or  a1 ~ =  a5  or  a1 ~ =  a6  or  a1 ~ =  a7  or  a1 ~ =  a8  or  a1 ~ =  a9  or  a1  =  =   nil   then 
        error( "error" )
       end 
     end 
   end 
 end 

 function   OnStop ()
  run  =   nil 
 end   
и как вы проверили, что выполняется атомарно?  Где доказательство?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Йцукен,
Интересно, как Вы реализуете обращение к этим переменным в разных потоках?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
a, b = 1, 2
это выполнится на этапе компиляции.
а это
x, y = y, x
как указано ранее
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
атомарной операция присвоения одновременно нескольким переменным
нет.
При множественном присваивании Lua сначала вычисляет все значения, а затем выполняет присваивание.
Данные с индикатора. Просто и быстро.
 
Продолжение здесь:
https://forum.quik.ru/messages/forum17/message80774/topic9418/?result=new#message80774
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 87 След.
Наверх