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

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

Страницы: Пред. 1 ... 7 8 9 10 11 12 13 14 15 16 17 ... 72 След.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Ziveleos,
Вы можете делать еще так, возможно будет проще понимать что и зачем:
-----------------
Например,  есть flag
-----------------
1) надо выделить бит 0
x=flag & 1  -- x равен значению бита
-----------------
2) надо выделить бит 1
z=flag>>1;  x=z & 1  -- x равен значению бита
-----------------
3) надо выделить бит 2
z=flag>>2;  x=z & 1  -- x равен значению бита
--------------------
4) надо выделить бит 3
z=flag>>3;  x=z & 1  -- x равен значению бита
------------------------
5) надо выделить бит 4
z=flag>>4;  x=z & 1  -- x равен значению бита
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
TGB написал:
.
<Поле таблицы (данные любого типа Lua кроме nil, при присвоении которого полю, соответствующая запись таблицы удаляется>.
---------------
Поправлю Вас..
nil - это такая же переменная как и другие. Отличается лишь тем, что ее тип =0, а тип строки =3.
проверка переменной на nil, это  равенство ее типа нулю.
---------------
Поэтому поле таблицы может быть любого типа, в том числе и типа nil.
==================
Команды в байт-коде луа - это просто целое число, которое всегда указывает на функцию  СИ.
Т е внутри VMLua нет никакого чистого луа, там лишь чистый СИ.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
nikolz, Я про надежность какой вариант надежней? Или все безопасно?
По надежности и безопасности все варианты одинаковые, полностью безопасные, надежные.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
так  order.flags & 1  
быстрее,
чем order.flags % 2,
примерно в 3 раза
Сохранение стакана, Описание эксперимента с сохранением стакана
 
Цитата
Delv написал:
Цитата
nikolz написал:
 
Цитата
Delv  написал:
Решил сохранить историческую информацию о стаканах по отдельно взятому инструменту.
Есть 2 обработчика: OnQuote и OnAllTrades. В обоих стоит фильтрация по инструменту. События из них кладутся в некий общий список(std::list<std::any>),
 Забыл сказать Вам ранее.
1) Существуют сделки, которых нет в стакане.
2) Для эксперимента можно сделать так.
Синхронизируйте часы компьютера от сервера точного времени. При этом проверьте на сколько будет уходить время на Вашем компьютере.
Реально получить 2-5 ms .
Потом пишите стакан и сделки с метками компьютерного времени.
Потом обработайте файл с оценкой разницы компьютерного времени и времени сделок.
В итоге Вы получите, что сделки приходят к Вам с запозданием
Сделки и срезы стаканов могут приходит в одном пакете.
Количество изменений стакана  в действительности всегда больше чем число совершенных сделок.
Но выбор среза стакана очевидно определяется не моментом совершения сделок, либо не только.
-----------------
В любом случае, если так сделаете, то узнаете много нового.
===============
Прим: Когда-то давно привозили данные с биржи по сделкам для экспертизы в рамках одного уголовного дела.
Там много чего есть интересного.
Спасибо, надо будет поинтересоваться. Пока же я буду просто использовать очередность сделок и кадров стакана. Разница по времени там небольшая будет. Те же 2-5 мс для меня не имеют особого значения, так как на сделку(отправка заявки на биржу и получение ответа по транзакции) уходит куда больше. До 250 мс.
2-5 ms - это  не задержка прихода, а ошибка синхронизации времени компьютера относительно времени биржи.
Эта величина погрешности. Вы же не используете градусник у которого погрешность измерения 10 градусов.
-----------------------------
На форуме я выкладывал результаты измерения запаздывания прихода сделок и свечей. Получались даже секунды, а для свечей десятки секунд.
----------------
Но если Вам все равно, но какой смысл вообще смотреть вчерашний день.
Сохранение стакана, Описание эксперимента с сохранением стакана
 
Цитата
Delv написал:
Решил сохранить историческую информацию о стаканах по отдельно взятому инструменту.
Есть 2 обработчика: OnQuote и OnAllTrades. В обоих стоит фильтрация по инструменту. События из них кладутся в некий общий список(std::list<std::any>),
Забыл сказать Вам ранее.
1) Существуют сделки, которых нет в стакане.
2) Для эксперимента можно сделать так.
Синхронизируйте часы компьютера от сервера точного времени. При этом проверьте на сколько будет уходить время на Вашем компьютере.
Реально получить 2-5 ms .
Потом пишите стакан и сделки с метками компьютерного времени.
Потом обработайте файл с оценкой разницы компьютерного времени и времени сделок.
В итоге Вы получите, что сделки приходят к Вам с запозданием
Сделки и срезы стаканов могут приходит в одном пакете.
Количество изменений стакана  в действительности всегда больше чем число совершенных сделок.
Но выбор среза стакана очевидно определяется не моментом совершения сделок, либо не только.
-----------------
В любом случае, если так сделаете, то узнаете много нового.
===============
Прим: Когда-то давно привозили данные с биржи по сделкам для экспертизы в рамках одного уголовного дела.
Там много чего есть интересного.
getParamEx
 
Цитата
Alexander написал:
GAZP, фьючерсы идут GAZR
Я вроде бы изначально объяснил - возьмите таблицу с биржи и формируйте по ней код фьючерса
Для тех, кто в танке, объясняю на пальцах:
Код
базисного
актива
(поле "C")
Код
базисного актива
на срочном рынке
Название базисного актива
GZGAZRПАО "Газпром" (о.а.)
SPSBPRПАО Сбербанк (п.а.)
SRSBRFПАО Сбербанк (о.а.)
Делайте , как говорю, и будет Вам счастье.
Когда лучше getParamEx, а когда getParamEx2 ?, Что предпочесть ?
 
Цитата
BVladimir написал:
Цитата
nikolz написал:
Динамические данные надо брать через  getParamEx., а getParamEx вызывать при срабатывании onParam.При этом, чтобы не читать ненужное, надо в onParam поставить фильтр на торгуемые инструменты.
При срабатывании onParam вызывать именно getParamEx или всетаки getParamEx2 ?
В документации OnParam написано:
При вызове данной функции пользователь может вызвать функцию getParamEx() и получить значение нужного параметра.  
------------------
getParamEx2
Функция предназначена для получения значений всех параметров биржевой информации
из Таблицы текущих торгов с возможностью в дальнейшем отказаться от получения
определенных параметров, заказанных с помощью функции ParamRequest. Для отказа от получения какого-либо
параметра воспользуйтесь функцией CancelParamRequest.
---------------
getParamEx
Функция предназначена для получения значений всех параметров биржевой информации
из таблицы «Текущие торги». С помощью этой функции можно получить любое из
значений Таблицы текущих торгов для заданных кодов класса и инструмента.
====================
полагаю, что если нет надобности использовать ParamReques,
то проще getParamEx.
Формат orders.dat и trades.dat
 
Нигде.
Все форматы файлов данных QUIK закрыты разработчикам.  Этой хотелки уже более 20 лет.
getParamEx
 
Цитата
paluke написал:
Ну почти... Посмотрите на сбербанк или газпром. Код базового актива для фьючерса может не совпадать с кодом акций.
покажите, где для фьючерса сбербанка и газпрома код не совпадает.
Код базового актива у сбербанка SR и SP, а у газпрома GZ.
У какого фьючерса этих акций иначе?
Когда лучше getParamEx, а когда getParamEx2 ?, Что предпочесть ?
 
Цитата
BVladimir написал:
Цитата
nikolz написал:
Функция getParamEx берет параметры из архива терминала. Это сравнительно медленно.У инструментов много неизменяемых  параметров. Их лучше выбрать один раз и сохранить в таблице. Потом брать из этой таблице не используя getParamEx.
Т.е. "более" актуальные данные нужно брать через getParamEx2 во всех случаях, когда открыта ТТТ ? Или могут быть другие ситуации ?
Динамические данные надо брать через  getParamEx., а getParamEx вызывать при срабатывании onParam.
При этом, чтобы не читать ненужное, надо в onParam поставить фильтр на торгуемые инструменты.
Таблица с измемениями открытого интереса
 
Цитата
Mariana написал:
Здравствуйте,

Я хотела бы научиться писать небольшие вспомогательные програмки на QLUA, опыт програмирования у меня очень небольшой, когда-то давно был курс в университете. Я смогла написать следующую программу, которая выполняет следующее:
при запуске формируется таблица с фьючерсами, запоминается в отдельной колонке открытый интересе в момент создания таблицы.
Далее, каждые несколько секунд берется текущий открытый интерес и вычисляется изменение открытого интереса. Эти данные выводятся в отдельную колонку.

На текущий момент, больше всего я не понимаю, как работать с типами данных, почему-то чтобы выводились данные в колонку - их нужно преобразовывать в строки, иначе у меня выводятся нули.
К сожалению, мне очень не хватает рабочих примеров, чтобы быстрее обучиться.

Хотя код рабочий, я буду признательна, если кто-то сможет подправить код с точки зрения приведения типов. Хочется чтобы в столбцах OI, OIINIT, OICHG, OICHG% были не строки, а числа.

И еще один вопрос, можно ли добавить столбы
- которые брали бы открытый интерес на начало дня (на 10 утра по Москве, либо на 19:00 предыдущего дня - любой вариант подходит)
- которые брали открытый интерес который был 15 минут назад (получается, это поле должно динамически обновлятьс, достаточно раз в минуту например)
Ликбез.
Скрипты пишем не на QLUA, а на Lua. QLua- это библиотека функций для Lua. Эти функции позволяют скрипту обмениваться данными с терминалом QUIK.
Поэтому про типы и как писать скрипты на луа надо читать в литературе по программированию на луа.
https://jevico.github.io/
https://eligovision.ru/media/upload/lua.pdf
https://chenweixiang.github.io/docs/Programming_in_Lua_4th_Edition.pdf
-----------------------
Относительно типа выводимых данных в таблицу.
Чем Вам мешает сохранение чисел в формате строк?
В данной реализации отображения таблицы используется формат строки для  хранения отображаемых данных,
поэтому надо явно делать из чисел строки. Так сделали разработчики, поэтому надо делать именно так.
----------------------
Изучите библиотеку QLUA и делайте так, как написано в документации. Примите это как догму и не пытайтесь угадать "почему" так сделали разработчики библиотеки.
-----------------
QUIK - это программа для подачи поручений брокеру в текущий торговый день.
Поэтому в ней отображается текущая информация. Если Вам надо информацию прошлых дней то ее надо сохранять в файлах и потом считывать и отображать.
Т е вам надо сделать запись в файл  OI, OIINIT, OICHG, OICHG%  и считывать значения при запуске QUIK.
Хранить данные Вы можете и в двоичном виде как числа, преобразовывать в строку надо лишь для  отображения на экране.
Когда лучше getParamEx, а когда getParamEx2 ?, Что предпочесть ?
 
Цитата
BVladimir написал:
Приветствую, всезнающий All !

1. У меня открыта таблица тек.торгов с нужными инструментами. Как правильно получать данные из нее getParamEx или getParamEx2 ?
2. Сработал колбэк OnParam. Также- как правильно - getParamEx или getParamEx2 ?
Функция getParamEx берет параметры из архива терминала. Это сравнительно медленно.
У инструментов много неизменяемых  параметров.
Их лучше выбрать один раз и сохранить в таблице.
Потом брать из этой таблице не используя getParamEx.
getParamEx
 
Цитата
Alexander написал:
Цитата
nikolz написал:
У Вас есть список акций, которые Вас интересуют.
1. У меня нет списка акций. Я его хотел получить именно из списка фьючерсов на акции, которые есть на Мосбирже. Зная список акций я без проблем получаю нужный мне список фьючерсов на акции.
Можно сделать так:
1) получить этот список из списка открытых инструментов.
2)сформировать списку фьючерсов по этому списку.
3) выбрать те фьючерсы, на которые подписан
4) оставить только те акции для которых есть фьючерсы.
-------------------
относительно "быстро"
Вы  делаете это один раз при старте КВИК поэтому время вычислений не имеет значения. в любом случае не превысит нескольких секунд.
getParamEx
 
Цитата
Alexander написал:
Цитата
nikolz написал:
Сейчас уже точно не помню, но вроде бы делал какой-то листинг и по нему формировал фьючерсы . При этом учитываешь какой квартал, так как для разных кварталов разные правила. Все делается автоматом.
У меня есть строка, полученная так: sec_list = getClassSecurities("SPBFUT") и впринципе её раскидать на фьючерсы разные проблем нет никаких, хоть по кварталам используя "Спецификации коротких кодов фьючерсных и опционных контрактов на срочном рынке" c Мосбиржи:  https://www.moex.com/s205
Но в любом случае для отсева из всей этой общей кучи, чтобы отделить только фьючерсы на акции, придётся задавать что-то, связанное с акциями. Я для этого использую шаблон на каждую акцию и ищу через string.gmatch(longStr, Str .. "(%u)(%d)"), где longStr = sec_list, Str = шаблон((AF) например для Аэрофлота). Но вот сформировать тоже самое не задавая шаблон(не привязываясь к акции) никак не получится, нет такой возможности.
может что-то забыл, но в указанной Вами ссылке вроде все есть:

Спецификации коротких кодов фьючерсных и опционных контрактов на срочном рынке

Коды срочных контрактов состоят из следующих частей:

Коды фьючерсов
CMY


Коды опционов

CPKMY
                                                           
W
     

C – краткий код базисного актива,
P – цена страйк (максимум 6 символов),
К – тип расчетов,
M – месяц исполнения (а также тип для опциона),
Y – год исполнения,
W – признак недельного опциона.


Кодирование базового актива (поле "C")

Группа
контрактов
Код
базисного
актива
(поле "C")
Код
базисного актива
на срочном рынке
Название базисного актива
Я же написал как делал
У Вас есть список акций, которые Вас интересуют.
Из таблицы Кодирование базового актива находим код базового актива на срочном рынке
-------------------
После этого записываем код фьючерса:
---------------
кода базового актива, месяц, год.
------------------
В итоге получите список фьючерсов для акций.
=============
Если используете колбек onParam, то те коды фьючерсов на которые вы не подписаны никогда не получите.
В результате у вас будут коды фьючерсов на акции, на которые вы подписались
------------------
Аналогично опционы.
------------------
Что не так?
getParamEx
 
Цитата
Alexander написал:
Цитата
nikolz написал:
 
Цитата
Alexander  написал:
Подскажите кто знает если. С помощью getParamEx есть ли параметры в ТТТ такие, чтобы отсортировать фьючерсы на акции от остальных фьючерсов. В квике по названию вроде ничего не подходит. Или как-то такое сделать по другому. Т.е. я получаю: sec_list = getClassSecurities("SPBFUT") и потом мне из всей этой кучи надо выделить только фьючерсы на акции. По класскоду у всех "SPBFUT", что у индексных, что у товарных, что у акционных. Пока вижу только вариант через string.gmatch и шаблон, но тогда для каждого варианта(смотрим на мосбирже все фьючи на акции) надо указать шаблон. Так пока делаю, но это длинно, для каждой акции свой шаблон. И спиок на бирже могут поменять и придётся менять код. Типа бы какого-нибудь не только класскоде, а ещё бы и подкласса иметь на фьючерсы на акции.
 Когда-то давно делал так. На бирже находим правила формирования названия фьючерса. Далее по имени нужных нам акций формируем имена фьючерсов. При этом еще учитываем правило формирования даты фьючерса. Все вроде бы работало правильно.
Ну я типа так и делаю. Только даже проще. Мне так же приходиться как и у Вас написано "по имени нужных нам акций" определять шаблон и по нему мне из всей кучи находит СРАЗУ ВСЕ доступные на данный момент фьючерсы на эти акции, без всякого " правило формирования даты фьючерса". Думал может можно как-то упростить, так как на каждую акцию приходится задавать свой шаблон(Аэрофлот - AF, Газпром - GZ, и т.д).Но список может меняться и приходится постоянно следить и корректировать код, а этого хотелось бы избежать. Это можно было бы легко делать если бы например Мосбиржа помимо кода на фьючерсы "SBPFUT", например ввела бы подкоды. Для фьючерсов на акции свой подкод, для валюты свой, для товаров свой, для процентных свой и для индексных свой. Но такого видимо нет.
Сейчас уже точно не помню, но вроде бы делал какой-то листинг и по нему формировал фьючерсы .
При этом учитываешь какой квартал, так как для разных кварталов разные правила. Все делается автоматом.  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Цитата
Как же не имеет можно норм. распределение считать вероятности получать!
Ликбез.
--------------------
А кто Вам сказал, что Вы имеете нормальный закон распределения.
По-секрету Вам скажу, что еще в прошлом веке было доказано что нормальный закон встречается редко.
--------------------------
Если закон не нормальный, то арифметическое среднее не является состоятельной оценкой первого момента плотности вероятности, т е средней величиной.
----------------------------------------
В результате появились методы  робастного оценивания.
--------------------------------------------------------
Ученье -свет, а неучей-тьма.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
существует правило:  Рынок двигают рыночные заявки.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Ликбез.
Если игрок ставит лимитную заявку , которая теперь называется пассивной, то он делает ровно тоже самое что и маркетмейкер,
т е играет против рынка и тем самым сжимает спред.
----------------------
Именно поэтому биржа за такие ставки не берет комиссию у простых игроков,
а маркетмейкеру она еще за это приплачивает.
-------------------
Так что все лимитчики становятся маркетмейкерами,хотя сами этого и не знают.
квик полностью недоступен, даже не могу запустить
 
переустановите полностью или откатите назад. Возможно что-то не из той версии или что-то удалили
GetParamEx2(). А что, так можно?
 
Цитата
Kolossi написал:
Признаться даже в голову не пришло проверить param_type. Боюсь даже спрашивать нахрена это придумано.
Спасибо за подсказку.
могу предположить для корректности преобразования. Т е чтобы строки не пытались смотреть как числа.
У них в таблицах очевидно не поддерживается формат луа.
Возможно, чтобы компактно хранить или быстрее вытаскивать из архива терминала.
У них еще много особенностей в форматах данных библиотеки QLUA,
поэтому лучше делать как в документации и тогда не будет сюрпризов.
GetParamEx2(). А что, так можно?
 
Цитата
Kolossi написал:
local aaa=getParamEx(p_classcode,"GMKN","EV_SESS_ALLOWED").param_value local bbb=getParamEx(p_classcode,"LSRG","EV_SESS_ALLOWED").param_value message(aaa.."/"..bbb)- aaa=getParamEx(p_classcode,"GMKN","EV_SESS_ALLOWED").param_image local bbb=getParamEx(p_classcode,"LSRG","EV_SESS_ALLOWED").param_image message(aaa.."/"..bbb)
Все правильно.
Данное поле имеет тип 3 .
И если прочитаете документацию, то там черным по белому на русском написано:
param_valueSTRINGЗначение параметра. Для param_type = 3 значение параметра равно «0», в  остальных случаях – числовое представление. Для перечислимых типов значение  равно порядковому значению перечисления
Вы это и получили
getParamEx
 
Цитата
Alexander написал:
Подскажите кто знает если. С помощью getParamEx есть ли параметры в ТТТ такие, чтобы отсортировать фьючерсы на акции от остальных фьючерсов. В квике по названию вроде ничего не подходит. Или как-то такое сделать по другому. Т.е. я получаю: sec_list = getClassSecurities("SPBFUT") и потом мне из всей этой кучи надо выделить только фьючерсы на акции. По класскоду у всех "SPBFUT", что у индексных, что у товарных, что у акционных. Пока вижу только вариант через string.gmatch и шаблон, но тогда для каждого варианта(смотрим на мосбирже все фьючи на акции) надо указать шаблон. Так пока делаю, но это длинно, для каждой акции свой шаблон. И спиок на бирже могут поменять и придётся менять код. Типа бы какого-нибудь не только класскоде, а ещё бы и подкласса иметь на фьючерсы на акции.
Когда-то давно делал так. На бирже находим правила формирования названия фьючерса. Далее по имени нужных нам акций формируем имена фьючерсов. При этом еще учитываем правило формирования даты фьючерса. Все вроде бы работало правильно.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:они как раз у тех у кого миллионные обороты.
Включите таблицу "всех сделок" и посмотрите на исполнение, когда пройдут пройдут 100 млн $ посчитайте сколько на берется сделок.
HFT роботы - это скорее инструмент маркетмейкера и тех кого он привлекает для подержания определенной ликвидности, есть конечно и частники как же без них.00 лет назад на современном рынке уже как телега с кобылой на шоссе.
Вы про айсберг -заявки знаете?
Я вам вообще-то про мировые рынки, которые подобно океану,  говорю, а не про российский рынок, подобный небольшому озерку.
Рекомендую почитать про обвалы на биржах США и кто их создал.  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Цитата
Хотелось бы увидеть картину как трейдер с миллионными оборотами сидит и рассматривает минутки а лучше тики.
Это называется HFT роботы, они как раз у тех у кого миллионные обороты.
---------------------
Трейдер не сидит и не смотрит, так как это высокочастотный робот.
---------------------
Таких роботов сейчас на биржах из всей массы торгующих процентов 70.
-----------------
В инете, правда на английском, можно встретить статьи реальных крупных трейдеров,  которые торгуют сами . Они рассказывают как было до прихода HFT и как теперь стало трудно торговать и как они теперь меняют свои стратегии.
В итоге, то что в популярных книжках и сделано 100 лет назад на современном рынке уже как телега с кобылой на шоссе.
--------------------------------
Безусловно HFT не для частных инвесторов - это инструмент крупных банков, инвест. фондов, короче монстров фондового рынка.
move_orders, move_orders
 
Цитата
krabykraby написал:
GetParamEx?
эта функция получения параметра из архива терминала QUIK, а не сервера QUIK.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Цитата
nikolz написал:
из предполагаемой модели движения цены.
Сейчас расскажу с начала:
1) "Где деньги Зин"?
2) Чем цену двигают на рынке?
3) кто может поволить, безопасно для себя двинуть цену?

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

Вы поймите никто на рынке не устраивает игрушки с моделями и распределениями,
все рулит конъектура подчиненая закону Спроса и Предложения.  
Опять Вы ошибаетесь.
Закон Спроса и Предложения - это и есть модель рынка.
Модель - это упрощенное представление действительности.
Мозг всегда явно или неявно на основе опыта и знаний создает модели действительности и прогнозирует реальные события на основе этих моделей.
-------------------
Человек в своей деятельности всегда создает модели , прежде чем реализует что-то в будущем.
Закон - это формулировка некоторой закономерности на основе упрощенной модели действительности.
 
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
nikolz,
Цитата
nikolz написал:
Вероятностные события, это события которые могут произойти, но не обязательно. А прогноз - это и есть Ваше ожидание каких-то событий.
Индикаторы в основном отвечают на два постулата:
1) Определить направление тенденции;
2) Определить зоны Перекупленности / Перепродонасти.
Чтоб они стали статистически значимы нужна серьезная выборка.
А это значит и серьезное отставание от события.

Мы ищем приемлемое между сглаженностью и отставанием.
Так прогностический у нас взгляд или вероятностный?

При составлении рыночных прогнозов надо учитывать главное (фундаментальное)

Цены меняются согласно закона "спроса и предложения".
Когда спрос превышает предложение, то цены растут;  
Когда предложение превышает спрос, то цены падают.

Опытные трейдеры не торгуют против рынка!

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

Ну к примеру делаем прогноз:

посчитали что измененни цены за прошлый год в среднем 0.5% роста в день.
   252р.д * 0.5% = 126% годовых нас устраевает.
Допустим есть отличный алгаритм определения точки входа.
Входим цель соответсвует нашему прогнозу,
но тут событие 02.22г. все рухнуло.
Пересчитываем теперь у нас измененни цены за прошлый год в среднем -0.5% снижения в день. Меняем цель.

Тут операторы заметили что рынок ушел сильно в зону перепроданости цены интересны и начинают накпление.

Это Вам не чего не на поминает?

подбор целей посмотрите Т.Демарка у него хотябы структурировано.
Возражая, Вы лишь подтверждаете то, что я сказал.
Попробую Вам это показать на Ваших ответах.

Вы возражаете против того, что всегда используете прогнозирование, но пишите

Индикаторы в основном отвечают на два постулата:
1) Определить направление тенденции;
2) Определить зоны Перекупленности / Перепродонасти.

1) и 2) - это и есть прогноз поведения цены и состояние рынка в будущем. Вы называете прогноз поcтулатом, но термин Постулат в данном случае не применим.
ПОСТУЛА́Т, - Исходное положение, принимаемое без доказательств.  
Т е постулат - это некие исходные предположения (аксиома)  но 1) и 2) - не содержат предположений, а определяют лишь Ваши желания.
---------------------------
Ваше утверждение: При составлении рыночных прогнозов надо учитывать главное (фундаментальное)
является  вашим ПОСТУЛАТОМ.
-------------
На самом деле что и как учитывает игрок на рынке зависит от его знаний и опыта, но любой игрок, делает прогноз перед тем как сделает ставку.
--------------------
Относительно Т.Демарка
Любой автор книжки или лектор на курсах всегда выстраивает некоторую логику в своих интересах, подбирает только те примеры из бесконечного множества, которые наглядно показывают, что он прав.
-----------------
Проблема в том, что на рынке будут обязательно ситуации, когда Ваш прогноз  по правилам Демарка будет ошибочным. Если бы было не так, то не было бы ни кризисов, ни постоянного притока буратин и оттока проигравших.  
Уверен< что Вы не читали, поэтому рекомендую почитать книгу Джорджа Сороса «Новая парадигма финансовых рынков», он ее написал после кризиса 2008 года.
Она сложнее, чем популярные книжки Демарка и других "прославленных"  брокерами гуру.  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Цитата
nikolz написал:
является прогностическим и это не зависит от выбранных вами индикаторов.
А с чего  вдруг, в лучшем случае вероятным, если умеете ее считать.
Вы путаете понятия.
--------------------
Вероятностные события, это события которые могут произойти, но не обязательно.
А прогноз - это и есть Ваше ожидание каких-то событий.
Все решение о покупке или продаже Вы примите в будущем, так как в прошлом вы их уже приняли.
-----------------------
Вы принимаете решения на основе Вашего убеждения, что это решение правильное.
Если Вы покупаете, то Вы ожидаете,что цена пойдет вверх т е Ваш мозг прогнозирует.
Если Вы берете правила из книжки, то Вы используете чей-то алгоритм, который по мнению автора позволяет прогнозировать движение цены в ожидаемом направлении.
======================
В основе любого прогноза лежит статистика или иначе сказать накопленный опыт.
В итоге любое наше действие по жизни всегда связано с прогнозом его последствий.
-----------------------
То каким образом мы формируем свои ожидания определяется методом, который используем для прогноза.
--------------------------------
Если используете монте-карло, цепи Маркова или максимального правдоподобия , то это будет вероятностный прогноз т. е. решение  принимаем на основе вычисления оценки вероятности наступления данного события.
---------------------
Если используете индикаторы, а решения принимаете на основе их пересечения между собой или с уровнями, то Вы прогнозируете на основе статистических наблюдений в прошлом, но и в этом случае Вы используете априорную вероятность наступления событий.
-------------------
Т.е. Вы сознательно или нет всегда прогнозируете последствия своих действий и прогноз этот строите на основе статистики (опыта) связывая это с вероятности успешного решения.
 
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
и еще...
Относительно индикаторов в том числе RSI Вы немного заблуждаетесь.
Любое решение на рынке, кроме решений методом монте-крало, является прогностическим и это не зависит от выбранных вами индикаторов.
А вот индикаторы должны выбираться исходя из предполагаемой модели движения цены.
-------------------
Если Вы списываете индикаторы из книжки , то Вы должны быть уверены что рынок сейчас соответствует  модели рынка, которую взял автор этой книги.
----------------------
Самое прикольное, что все авторы этих бестселлеров на самом деле рассказывают одно и тоже и берут одни и те же индикаторы - самые простейшие цифровые фильтры как правило не выше 2-го порядка.
Поэтому с точки зрения цифровой обработки сигналов все эти гуру жонглируют примитивной арифметикой, при этом показывают специально подобранные эффективные картинки движения цены.
===============
В интернете Вы можете найти объемные статистические исследования практически всех книжных алгоритмов и доказательство что на большом интервале времени эти алгоритмы ничего существенного вам не дадут.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Цитата
Nikolay написал:
Уже давно были проведены количественные эксперименты по случайным методикам входа в позицию. Элементарно монеткой, кубиком. Все сводится к управлению рисками.
Про вход в позицию каждый день каждый из нас случайным образом, кому то удается вероятность подтянуть на свою сторону.
Знания арифметики в этом случае полезны, можно прикинуть сколько средств нужно чтоб двинуть рынок.
Цитата
Nikolay написал:
Впрочем, тем, кто не гадает, а изучает компании в которые собирается инвестировать, монетка не нужна, как и скользящие средние и т.д.
Плюс есть но не более. см мой пример с нефтью.
Рынки живут по закону Спроса и Предложения!
Не зная этих основ, тяжело рассчитывать на стабильность  и учитывать с кем имеешь дело.
Вы заблуждаетесь. Маркет -мейкер - это игрок на бирже, задача которого  сжимать спред. Т е у него просто стратеги играть против движения рынка. Ему за это биржа платит.
Но на рынке есть и обычные игроки которые играют против рынка. Поэтому маркет-мейкер ни при чем.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
На мой взгляд важней здесь математика. Вот пример.

Если считать простую среднею и использовать при определении тренда то и получишь что насчитал,
а данном случае отставание результата составляет Period/2+1, то есть заметил тренд после половины периода этой средней.
И что с этим делать я не знаю,
я использую фильтры, ведь космические корабли стыкуют в автоматическом режиме в заданный момент времени.
Ну отставание 1 - 2 бара при выявленной тенденции можно себе позволить.

Мне вот  в начале работы над скриптом казалось, что торговать нужно НА ВСЕХ таймфреймах одновременно.
Это все описано и опубликовано и есть подходы, к примеру 3 окна Эльдера.
Попробую высказать свое мнение.
------------
Интересно, как Вы ответите на такие вопросы:
1) Почему известные в книгах методы торговли встречаются в литературе как успешные лишь единожды.
Например метод черепах. Никто не похвалился, что он повторил то, что прочитал и стал миллионером положив изначально на депозит 1000 руб?
2) Почему победители различных трейдерских соревнований выигрывают лишь один раз.
----------------
Кратко мой ответ состоит в том, что все перечисленные выше события являются случайными.
=============
Относительно методов, например Эльдера или еще каких-то известных гуру, которые никогда не были не то что математиками, но и не изучали ее. Все их методы - это арифметика.
--------------------------------------
В таких  книгах примеры эффективности этих методов всегда подобраны именно так, чтобы доказать то, о чем пишет автор.
Никто из них не привел доказательство работы этих методов тогда, когда рынок не движется так, как думает автор,
=================
Когда человек торгует на рынке сам или пишет некоторую программу торговли, то он сознательно или нет использует некоторую модель (картинку) будущего движения цены.  Если Вы используете какие либо индикаторы - свечи, скользящее среднее, RSI и т д, то успешность торговли зависит от того позволяют ли эти индикаторы, которые являются фильтрами, сформировать из движения цены нужное Вам решение
купить/ продать.
=================
К сожалению, большинство частных инвесторов опираясь на знания полученные на курсах, на которых пересказывают книжки этих гуру строят стратегию торговли методом "рекле"  - режу-клею.
Т е нарезали индикаторов и рекомендаций из разных книжек и склеили их в один скрипт  не получилось снова рекле.
--------------------------
Таблицы lua
 
Цитата
Nikolay написал:
for key in pairs(T) do
end
for key, val in pairs(t) do
Как запустить скрипт qlua из командной строки?
 
Цитата
swerg написал:

Хотелось просто иметь возможность запускать Lua-скрипт для отладки какого-то алгоритма или какой-то функции. Потом этот отлаженный функционал использовать уже в реальных торговых скриптах.

Однако, если запустить скрипт написанный для QLua в штатном lua.exe, то скрипт вовсе не будет работать, т.к. он в любом случае использует некоторые функции, которые добавлены в QLua. Та же message. Если используется в скрипте - он будет тупо ломаться. А менять постоянно print / message не очень-то удобно.

Вот такие задачи и ставились при написании этой штуковины, не более.
Непонятно, зачем делать отдельное приложение для запуска скрипта вне терминала, если скрипт можно запускать и отлаживать в SciTe?
Как запустить скрипт qlua из командной строки?
 
пардон, опечатка
Так как обмен между процессами делается иначе , чем обмен между потоками в одном процессе.
Как запустить скрипт qlua из командной строки?
 
и еще...
функция main имеет доступ к функциям библиотеки QLUA потому, что main запускается в дочерней VMLUA, которая запущена в отдельном потоке, но в том же процессе.
Функции QLUA предназначены для получения данных из архивов QUIK.
------------------------------------
Если Вы запустите VMLua в новом процессе, например запустив Lua53.exe и в нем загрузите QLua.dll, то в этом процессе функции этой библиотеки не смогу получить доступ к архивам QUIK.  
Так как обмен между процессорами делается иначе , чем обмен между потоками в одном процессе,
---------------------
Т е библиотека QLUA не предназначена для связи процессов.
Поэтому для Вашей хотелки надо писать новую библиотеку , а для этого надо SDK который разработчики не дают,
либо делать связь между процессами внутри скрипта в QUIK или через файлы или иным способом.
Как запустить скрипт qlua из командной строки?
 
Цитата
Alexander написал:
Цитата
nikolz написал:
 
Цитата
Alexander  написал:
 
Цитата
 nikolz   написал:
VMLua - это программа и она запускается вызовом lua_pcall, в которой вызываетсясобственно VMLua  - эта функция  Вот ее тест из sorce code Lua 5.4
  Ну тут всё правильно написали про VMLua, что она именно ЗАПУСКАЕТСЯ, а ранее писали, что VMLua РАБОТАЕТ как самостоятельная единица.
 Любая программа сначала запускается, а потом работает как самостоятельная единица. Поэтому я и написал - запускается и работает.  
Отсюда все и недопонимания возникли. Программа конечно, чтобы начать работать должна быть сначала быть загружена в память, а потом ей должно быть передано управление(call, jmp, return с адресом в стеке, int, может и ещё что есть). Так вот в моём понимании VMLua сначала просто загружена в качестве библиотеки lua53dll и НЕ работает, а работать начинает только тогда, когда нужные функции из неё для компиляции, интерпретации начинают ВЫЗЫВАТЬСЯ, ну или начинает вызываться специальная функция, которая начинает интерпретировать весь скрипт тем же самым образом, но в любом случае библиотека есть и она НЕ работает пока её функции не начнут вызывать. Поэтому Вы всё объединили в кучу - загрузка и передача управления в функцию одной фразой - VMLua уже работает.
Если в скрипте есть операторы, то они исполнятся при загрузке скрипта т е до вызова функций, вернее сказать после компиляции в байт код, но до вызова OnInit и запуска main и вызова каких либо колбеков терминалом.
А VMLua до загрузки скрипта.
Cкрипт загружается функцией  библиотеки Lua. VMLua это интерпретатор байт-кода. Поэтому естественно, что загрузка и компиляция скрипта в байт код выполняется не VM Lua а библиотечной функцией, а вто исполнение этого кода выполняет функция VMLua.  
Как запустить скрипт qlua из командной строки?
 
Цитата
Alexander написал:
Тут вот, что хотелось попробовать. Запускаем скрипт QLUA из вне через lua53.exe. В скрипте подключаем qlua.dll. При работающем скрипте она может быть уже загружена и поток квика её использует. Да, пространства потоков разные у lua53.exe и у квика будут. Но функции qlua будут иметь доступ ко всем данным(таблицы например) потока квика если их умудриться вызвать. Чтобы их вызывать например из exe, dll, нам нужны заголовки с объявлениями. Можно ли их получить? А чтобы их вызывать из скрипта, нужно перменным скрипта задать адреса этих функций, как окружение, которое строит квик в виде _G. ... Как организовать то или другое? Или при загрузке qlua.dll уже будет окружение _G? И достаточно просто extern тип _G? Но опять же нужен заголовок с описание типа того же _G. Попробую потом посмотреть qlua.dll на предмет экспорта, и что там с символами. У квика вообще код закрытый? Они предоставляют lib файлы? Заголовки?
Вы ошибаетесь.
QLua - это не скрипт, а dll - написана на СИ или С++.  Т е скрипт на луа вызывает из нее функции.
Lua53.exe  - это приложение и внутри него запускается VMLua так же как и в терминале QUIK.

Более того, перед запуском VMLua в память грузится куча функций на СИ, которые позволяют в скрипте обращаться к строкам, таблицам, математическим функциям.   Все они написаны на СИ и находятся в Lua53.dll

Т е Вы хотите к этой куче догрузить свою dll. Ну и что Вы этим проверите? Лишь есть или нет у Вас в dll ошибки.
Но так делается при разработке любых приложений на любых языках . Ни луа ни квик ни причем.
--------------------
Я же Вам написал что так и делаю много много раз, как Вы хотите.
---------------------
Даже на форуме выкладывал пример , в котором запускал скрипт, загружал dll и обменивался данными с QUIK
================
Про функции qlua - к чему они имеют доступ описано в документации.
----
Заголовки к функциям из dll, если их нет, то делаются самостоятельно на основе dll и документации.
Для этого Вам надо изучить технологию разработки программ на СИ.
-----------------------
Разработчики уже объясняли, что они не дадут SDK (software development kit  на С)  для разработки пользовательских dll для QUIK.
Взамен этого они слепили QLua.dll и внедрили в терминал VMLua.
---------------
Поэтому спасение утопающих -дело рук самих утопающих.
Как запустить скрипт qlua из командной строки?
 
Цитата
Alexander написал:
Цитата
nikolz написал:
VMLua - это программа и она запускается вызовом lua_pcall, в которой вызываетсясобственно VMLua  - эта функция  Вот ее тест из sorce code Lua 5.4
Ну тут всё правильно написали про VMLua, что она именно ЗАПУСКАЕТСЯ, а ранее писали, что VMLua РАБОТАЕТ как самостоятельная единица.
Любая программа сначала запускается, а потом работает как самостоятельная единица. Поэтому я и написал - запускается и работает.  
Как запустить скрипт qlua из командной строки?
 
Цитата
TGB написал:
Цитата
nikolz написал:
void luaV_execute (lua_State *L, CallInfo *ci) {
...............
    Зачем вы постоянно гадите на форуме чужими длинными текстами?
   Вы испытываете терпение поддержки QUIK?
   Вы думаете, что чем длиннее ваши комментарии, тем умнее выглядите?
Помните, что говорил А.П. Чехов?:"Краткость, сестра таланта" :: . И куда вы относитесь по этой классификации?
Если не понимаете, то не читайте. Классификатор Вы наш.
Как запустить скрипт qlua из командной строки?
 
и еще...
скрипт исполняется в VMLua ,которую запускает КВИК, потом  в отдельном потоке запускает в дочерняя VMLua  и в ней Ваша функцию main
в которой крутится бесконечный цикл.
Вот этот цикл бесконечно и исполняет приведенная выше функция VMLua.
терминал никак не контролирует эту функции.
В потоке терминала сделана синхронизация обращения к глобальному стеку VMLua
Вы в своем main скрипте в вызываете функции из QLUA для обмена данными с основным потоком QUIK.
Так все и работает.  
как получить размер плеча по инструменту (DLong) через QuikSharp?
 
Цитата
swerg написал:
Официальная поддержка чгео?
QuikSharp - сторонний продукт. Обратитесь к его разработчикам.
поддержка буратин, которым лень читать документацию.
Как запустить скрипт qlua из командной строки?
 
Цитата
Alexander написал:
Alexander
Вы же сами написали как исполняется скрипт.
Код
luaL_openlibs(L); /* открывает стандартные библиотеки
*/
while (fgets(buff, sizeof(buff), stdin) != NULL) {
error = luaL_loadstring(L, buff) || lua_pcall(L, 0, 0, 0);
if (error) {
fprintf(stderr, "%s\n", lua_tostring(L, -1));
lua_pop(L, 1); /* выталкивает сообщение об ошибке из стека
*/
}

Я точно также запускаю свои скрипты внутри КВИКА в потоках из пула.
Т е запускаю сколько мне надо новых VMLua внутри КВИКА и КВИК ничего в них не контролирует.
более того, можно вообще запустить вне квика VMLua и в нем скрипт чего-угодно, а необходимые данные передавать из квика с помощью библиотеки QLUA, которая собственно и сделана для передачи данных из терминала в скрипт луа.
-----------------------
VMLua - это программа и она запускается вызовом lua_pcall, в которой вызывается
собственно VMLua  - эта функция  Вот ее тест из sorce code Lua 5.4
Код
void luaV_execute (lua_State *L, CallInfo *ci) {
  LClosure *cl;
  TValue *k;
  StkId base;
  const Instruction *pc;
  int trap;
#if LUA_USE_JUMPTABLE
#include "ljumptab.h"
#endif
 startfunc:
  trap = L->hookmask;
 returning:  /* trap already set */
  cl = clLvalue(s2v(ci->func.p));
  k = cl->p->k;
  pc = ci->u.l.savedpc;
  if (l_unlikely(trap)) {
    if (pc == cl->p->code) {  /* first instruction (not resuming)? */
      if (cl->p->is_vararg)
        trap = 0;  /* hooks will start after VARARGPREP instruction */
      else  /* check 'call' hook */
        luaD_hookcall(L, ci);
    }
    ci->u.l.trap = 1;  /* assume trap is on, for now */
  }
  base = ci->func.p + 1;
  /* main loop of interpreter */
  for (;;) {
    Instruction i;  /* instruction being executed */
    vmfetch();
    #if 0
      /* low-level line tracing for debugging Lua */
      printf("line: %d\n", luaG_getfuncline(cl->p, pcRel(pc, cl->p)));
    #endif
    lua_assert(base == ci->func.p + 1);
    lua_assert(base <= L->top.p && L->top.p <= L->stack_last.p);
    /* invalidate top for instructions not expecting it */
    lua_assert(isIT(i) || (cast_void(L->top.p = base), 1));
    vmdispatch (GET_OPCODE(i)) {
      vmcase(OP_MOVE) {
        StkId ra = RA(i);
        setobjs2s(L, ra, RB(i));
        vmbreak;
      }
      vmcase(OP_LOADI) {
        StkId ra = RA(i);
        lua_Integer b = GETARG_sBx(i);
        setivalue(s2v(ra), b);
        vmbreak;
      }
      vmcase(OP_LOADF) {
        StkId ra = RA(i);
        int b = GETARG_sBx(i);
        setfltvalue(s2v(ra), cast_num(b));
        vmbreak;
      }
      vmcase(OP_LOADK) {
        StkId ra = RA(i);
        TValue *rb = k + GETARG_Bx(i);
        setobj2s(L, ra, rb);
        vmbreak;
      }
      vmcase(OP_LOADKX) {
        StkId ra = RA(i);
        TValue *rb;
        rb = k + GETARG_Ax(*pc); pc++;
        setobj2s(L, ra, rb);
        vmbreak;
      }
      vmcase(OP_LOADFALSE) {
        StkId ra = RA(i);
        setbfvalue(s2v(ra));
        vmbreak;
      }
      vmcase(OP_LFALSESKIP) {
        StkId ra = RA(i);
        setbfvalue(s2v(ra));
        pc++;  /* skip next instruction */
        vmbreak;
      }
      vmcase(OP_LOADTRUE) {
        StkId ra = RA(i);
        setbtvalue(s2v(ra));
        vmbreak;
      }
      vmcase(OP_LOADNIL) {
        StkId ra = RA(i);
        int b = GETARG_B(i);
        do {
          setnilvalue(s2v(ra++));
        } while (b--);
        vmbreak;
      }
      vmcase(OP_GETUPVAL) {
        StkId ra = RA(i);
        int b = GETARG_B(i);
        setobj2s(L, ra, cl->upvals[b]->v.p);
        vmbreak;
      }
      vmcase(OP_SETUPVAL) {
        StkId ra = RA(i);
        UpVal *uv = cl->upvals[GETARG_B(i)];
        setobj(L, uv->v.p, s2v(ra));
        luaC_barrier(L, uv, s2v(ra));
        vmbreak;
      }
      vmcase(OP_GETTABUP) {
        StkId ra = RA(i);
        const TValue *slot;
        TValue *upval = cl->upvals[GETARG_B(i)]->v.p;
        TValue *rc = KC(i);
        TString *key = tsvalue(rc);  /* key must be a string */
        if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) {
          setobj2s(L, ra, slot);
        }
        else
          Protect(luaV_finishget(L, upval, rc, ra, slot));
        vmbreak;
      }
      vmcase(OP_GETTABLE) {
        StkId ra = RA(i);
        const TValue *slot;
        TValue *rb = vRB(i);
        TValue *rc = vRC(i);
        lua_Unsigned n;
        if (ttisinteger(rc)  /* fast track for integers? */
            ? (cast_void(n = ivalue(rc)), luaV_fastgeti(L, rb, n, slot))
            : luaV_fastget(L, rb, rc, slot, luaH_get)) {
          setobj2s(L, ra, slot);
        }
        else
          Protect(luaV_finishget(L, rb, rc, ra, slot));
        vmbreak;
      }
      vmcase(OP_GETI) {
        StkId ra = RA(i);
        const TValue *slot;
        TValue *rb = vRB(i);
        int c = GETARG_C(i);
        if (luaV_fastgeti(L, rb, c, slot)) {
          setobj2s(L, ra, slot);
        }
        else {
          TValue key;
          setivalue(&key, c);
          Protect(luaV_finishget(L, rb, &key, ra, slot));
        }
        vmbreak;
      }
      vmcase(OP_GETFIELD) {
        StkId ra = RA(i);
        const TValue *slot;
        TValue *rb = vRB(i);
        TValue *rc = KC(i);
        TString *key = tsvalue(rc);  /* key must be a string */
        if (luaV_fastget(L, rb, key, slot, luaH_getshortstr)) {
          setobj2s(L, ra, slot);
        }
        else
          Protect(luaV_finishget(L, rb, rc, ra, slot));
        vmbreak;
      }
      vmcase(OP_SETTABUP) {
        const TValue *slot;
        TValue *upval = cl->upvals[GETARG_A(i)]->v.p;
        TValue *rb = KB(i);
        TValue *rc = RKC(i);
        TString *key = tsvalue(rb);  /* key must be a string */
        if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) {
          luaV_finishfastset(L, upval, slot, rc);
        }
        else
          Protect(luaV_finishset(L, upval, rb, rc, slot));
        vmbreak;
      }
      vmcase(OP_SETTABLE) {
        StkId ra = RA(i);
        const TValue *slot;
        TValue *rb = vRB(i);  /* key (table is in 'ra') */
        TValue *rc = RKC(i);  /* value */
        lua_Unsigned n;
        if (ttisinteger(rb)  /* fast track for integers? */
            ? (cast_void(n = ivalue(rb)), luaV_fastgeti(L, s2v(ra), n, slot))
            : luaV_fastget(L, s2v(ra), rb, slot, luaH_get)) {
          luaV_finishfastset(L, s2v(ra), slot, rc);
        }
        else
          Protect(luaV_finishset(L, s2v(ra), rb, rc, slot));
        vmbreak;
      }
      vmcase(OP_SETI) {
        StkId ra = RA(i);
        const TValue *slot;
        int c = GETARG_B(i);
        TValue *rc = RKC(i);
        if (luaV_fastgeti(L, s2v(ra), c, slot)) {
          luaV_finishfastset(L, s2v(ra), slot, rc);
        }
        else {
          TValue key;
          setivalue(&key, c);
          Protect(luaV_finishset(L, s2v(ra), &key, rc, slot));
        }
        vmbreak;
      }
      vmcase(OP_SETFIELD) {
        StkId ra = RA(i);
        const TValue *slot;
        TValue *rb = KB(i);
        TValue *rc = RKC(i);
        TString *key = tsvalue(rb);  /* key must be a string */
        if (luaV_fastget(L, s2v(ra), key, slot, luaH_getshortstr)) {
          luaV_finishfastset(L, s2v(ra), slot, rc);
        }
        else
          Protect(luaV_finishset(L, s2v(ra), rb, rc, slot));
        vmbreak;
      }
      vmcase(OP_NEWTABLE) {
        StkId ra = RA(i);
        int b = GETARG_B(i);  /* log2(hash size) + 1 */
        int c = GETARG_C(i);  /* array size */
        Table *t;
        if (b > 0)
          b = 1 << (b - 1);  /* size is 2^(b - 1) */
        lua_assert((!TESTARG_k(i)) == (GETARG_Ax(*pc) == 0));
        if (TESTARG_k(i))  /* non-zero extra argument? */
          c += GETARG_Ax(*pc) * (MAXARG_C + 1);  /* add it to size */
        pc++;  /* skip extra argument */
        L->top.p = ra + 1;  /* correct top in case of emergency GC */
        t = luaH_new(L);  /* memory allocation */
        sethvalue2s(L, ra, t);
        if (b != 0 || c != 0)
          luaH_resize(L, t, c, b);  /* idem */
        checkGC(L, ra + 1);
        vmbreak;
      }
      vmcase(OP_SELF) {
        StkId ra = RA(i);
        const TValue *slot;
        TValue *rb = vRB(i);
        TValue *rc = RKC(i);
        TString *key = tsvalue(rc);  /* key must be a string */
        setobj2s(L, ra + 1, rb);
        if (luaV_fastget(L, rb, key, slot, luaH_getstr)) {
          setobj2s(L, ra, slot);
        }
        else
          Protect(luaV_finishget(L, rb, rc, ra, slot));
        vmbreak;
      }
      vmcase(OP_ADDI) {
        op_arithI(L, l_addi, luai_numadd);
        vmbreak;
      }
      vmcase(OP_ADDK) {
        op_arithK(L, l_addi, luai_numadd);
        vmbreak;
      }
      vmcase(OP_SUBK) {
        op_arithK(L, l_subi, luai_numsub);
        vmbreak;
      }
      vmcase(OP_MULK) {
        op_arithK(L, l_muli, luai_nummul);
        vmbreak;
      }
      vmcase(OP_MODK) {
        savestate(L, ci);  /* in case of division by 0 */
        op_arithK(L, luaV_mod, luaV_modf);
        vmbreak;
      }
      vmcase(OP_POWK) {
        op_arithfK(L, luai_numpow);
        vmbreak;
      }
      vmcase(OP_DIVK) {
        op_arithfK(L, luai_numdiv);
        vmbreak;
      }
      vmcase(OP_IDIVK) {
        savestate(L, ci);  /* in case of division by 0 */
        op_arithK(L, luaV_idiv, luai_numidiv);
        vmbreak;
      }
      vmcase(OP_BANDK) {
        op_bitwiseK(L, l_band);
        vmbreak;
      }
      vmcase(OP_BORK) {
        op_bitwiseK(L, l_bor);
        vmbreak;
      }
      vmcase(OP_BXORK) {
        op_bitwiseK(L, l_bxor);
        vmbreak;
      }
      vmcase(OP_SHRI) {
        StkId ra = RA(i);
        TValue *rb = vRB(i);
        int ic = GETARG_sC(i);
        lua_Integer ib;
        if (tointegerns(rb, &ib)) {
          pc++; setivalue(s2v(ra), luaV_shiftl(ib, -ic));
        }
        vmbreak;
      }
      vmcase(OP_SHLI) {
        StkId ra = RA(i);
        TValue *rb = vRB(i);
        int ic = GETARG_sC(i);
        lua_Integer ib;
        if (tointegerns(rb, &ib)) {
          pc++; setivalue(s2v(ra), luaV_shiftl(ic, ib));
        }
        vmbreak;
      }
      vmcase(OP_ADD) {
        op_arith(L, l_addi, luai_numadd);
        vmbreak;
      }
      vmcase(OP_SUB) {
        op_arith(L, l_subi, luai_numsub);
        vmbreak;
      }
      vmcase(OP_MUL) {
        op_arith(L, l_muli, luai_nummul);
        vmbreak;
      }
      vmcase(OP_MOD) {
        savestate(L, ci);  /* in case of division by 0 */
        op_arith(L, luaV_mod, luaV_modf);
        vmbreak;
      }
      vmcase(OP_POW) {
        op_arithf(L, luai_numpow);
        vmbreak;
      }
      vmcase(OP_DIV) {  /* float division (always with floats) */
        op_arithf(L, luai_numdiv);
        vmbreak;
      }
      vmcase(OP_IDIV) {  /* floor division */
        savestate(L, ci);  /* in case of division by 0 */
        op_arith(L, luaV_idiv, luai_numidiv);
        vmbreak;
      }
      vmcase(OP_BAND) {
        op_bitwise(L, l_band);
        vmbreak;
      }
      vmcase(OP_BOR) {
        op_bitwise(L, l_bor);
        vmbreak;
      }
      vmcase(OP_BXOR) {
        op_bitwise(L, l_bxor);
        vmbreak;
      }
      vmcase(OP_SHR) {
        op_bitwise(L, luaV_shiftr);
        vmbreak;
      }
      vmcase(OP_SHL) {
        op_bitwise(L, luaV_shiftl);
        vmbreak;
      }
      vmcase(OP_MMBIN) {
        StkId ra = RA(i);
        Instruction pi = *(pc - 2);  /* original arith. expression */
        TValue *rb = vRB(i);
        TMS tm = (TMS)GETARG_C(i);
        StkId result = RA(pi);
        lua_assert(OP_ADD <= GET_OPCODE(pi) && GET_OPCODE(pi) <= OP_SHR);
        Protect(luaT_trybinTM(L, s2v(ra), rb, result, tm));
        vmbreak;
      }
      vmcase(OP_MMBINI) {
        StkId ra = RA(i);
        Instruction pi = *(pc - 2);  /* original arith. expression */
        int imm = GETARG_sB(i);
        TMS tm = (TMS)GETARG_C(i);
        int flip = GETARG_k(i);
        StkId result = RA(pi);
        Protect(luaT_trybiniTM(L, s2v(ra), imm, flip, result, tm));
        vmbreak;
      }
      vmcase(OP_MMBINK) {
        StkId ra = RA(i);
        Instruction pi = *(pc - 2);  /* original arith. expression */
        TValue *imm = KB(i);
        TMS tm = (TMS)GETARG_C(i);
        int flip = GETARG_k(i);
        StkId result = RA(pi);
        Protect(luaT_trybinassocTM(L, s2v(ra), imm, flip, result, tm));
        vmbreak;
      }
      vmcase(OP_UNM) {
        StkId ra = RA(i);
        TValue *rb = vRB(i);
        lua_Number nb;
        if (ttisinteger(rb)) {
          lua_Integer ib = ivalue(rb);
          setivalue(s2v(ra), intop(-, 0, ib));
        }
        else if (tonumberns(rb, nb)) {
          setfltvalue(s2v(ra), luai_numunm(L, nb));
        }
        else
          Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM));
        vmbreak;
      }
      vmcase(OP_BNOT) {
        StkId ra = RA(i);
        TValue *rb = vRB(i);
        lua_Integer ib;
        if (tointegerns(rb, &ib)) {
          setivalue(s2v(ra), intop(^, ~l_castS2U(0), ib));
        }
        else
          Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT));
        vmbreak;
      }
      vmcase(OP_NOT) {
        StkId ra = RA(i);
        TValue *rb = vRB(i);
        if (l_isfalse(rb))
          setbtvalue(s2v(ra));
        else
          setbfvalue(s2v(ra));
        vmbreak;
      }
      vmcase(OP_LEN) {
        StkId ra = RA(i);
        Protect(luaV_objlen(L, ra, vRB(i)));
        vmbreak;
      }
      vmcase(OP_CONCAT) {
        StkId ra = RA(i);
        int n = GETARG_B(i);  /* number of elements to concatenate */
        L->top.p = ra + n;  /* mark the end of concat operands */
        ProtectNT(luaV_concat(L, n));
        checkGC(L, L->top.p); /* 'luaV_concat' ensures correct top */
        vmbreak;
      }
      vmcase(OP_CLOSE) {
        StkId ra = RA(i);
        Protect(luaF_close(L, ra, LUA_OK, 1));
        vmbreak;
      }
      vmcase(OP_TBC) {
        StkId ra = RA(i);
        /* create new to-be-closed upvalue */
        halfProtect(luaF_newtbcupval(L, ra));
        vmbreak;
      }
      vmcase(OP_JMP) {
        dojump(ci, i, 0);
        vmbreak;
      }
      vmcase(OP_EQ) {
        StkId ra = RA(i);
        int cond;
        TValue *rb = vRB(i);
        Protect(cond = luaV_equalobj(L, s2v(ra), rb));
        docondjump();
        vmbreak;
      }
      vmcase(OP_LT) {
        op_order(L, l_lti, LTnum, lessthanothers);
        vmbreak;
      }
      vmcase(OP_LE) {
        op_order(L, l_lei, LEnum, lessequalothers);
        vmbreak;
      }
      vmcase(OP_EQK) {
        StkId ra = RA(i);
        TValue *rb = KB(i);
        /* basic types do not use '__eq'; we can use raw equality */
        int cond = luaV_rawequalobj(s2v(ra), rb);
        docondjump();
        vmbreak;
      }
      vmcase(OP_EQI) {
        StkId ra = RA(i);
        int cond;
        int im = GETARG_sB(i);
        if (ttisinteger(s2v(ra)))
          cond = (ivalue(s2v(ra)) == im);
        else if (ttisfloat(s2v(ra)))
          cond = luai_numeq(fltvalue(s2v(ra)), cast_num(im));
        else
          cond = 0;  /* other types cannot be equal to a number */
        docondjump();
        vmbreak;
      }
      vmcase(OP_LTI) {
        op_orderI(L, l_lti, luai_numlt, 0, TM_LT);
        vmbreak;
      }
      vmcase(OP_LEI) {
        op_orderI(L, l_lei, luai_numle, 0, TM_LE);
        vmbreak;
      }
      vmcase(OP_GTI) {
        op_orderI(L, l_gti, luai_numgt, 1, TM_LT);
        vmbreak;
      }
      vmcase(OP_GEI) {
        op_orderI(L, l_gei, luai_numge, 1, TM_LE);
        vmbreak;
      }
      vmcase(OP_TEST) {
        StkId ra = RA(i);
        int cond = !l_isfalse(s2v(ra));
        docondjump();
        vmbreak;
      }
      vmcase(OP_TESTSET) {
        StkId ra = RA(i);
        TValue *rb = vRB(i);
        if (l_isfalse(rb) == GETARG_k(i))
          pc++;
        else {
          setobj2s(L, ra, rb);
          donextjump(ci);
        }
        vmbreak;
      }
      vmcase(OP_CALL) {
        StkId ra = RA(i);
        CallInfo *newci;
        int b = GETARG_B(i);
        int nresults = GETARG_C(i) - 1;
        if (b != 0)  /* fixed number of arguments? */
          L->top.p = ra + b;  /* top signals number of arguments */
        /* else previous instruction set top */
        savepc(L);  /* in case of errors */
        if ((newci = luaD_precall(L, ra, nresults)) == NULL)
          updatetrap(ci);  /* C call; nothing else to be done */
        else {  /* Lua call: run function in this same C frame */
          ci = newci;
          goto startfunc;
        }
        vmbreak;
      }
      vmcase(OP_TAILCALL) {
        StkId ra = RA(i);
        int b = GETARG_B(i);  /* number of arguments + 1 (function) */
        int n;  /* number of results when calling a C function */
        int nparams1 = GETARG_C(i);
        /* delta is virtual 'func' - real 'func' (vararg functions) */
        int delta = (nparams1) ? ci->u.l.nextraargs + nparams1 : 0;
        if (b != 0)
          L->top.p = ra + b;
        else  /* previous instruction set top */
          b = cast_int(L->top.p - ra);
        savepc(ci);  /* several calls here can raise errors */
        if (TESTARG_k(i)) {
          luaF_closeupval(L, base);  /* close upvalues from current call */
          lua_assert(L->tbclist.p < base);  /* no pending tbc variables */
          lua_assert(base == ci->func.p + 1);
        }
        if ((n = luaD_pretailcall(L, ci, ra, b, delta)) < 0)  /* Lua function? */
          goto startfunc;  /* execute the callee */
        else {  /* C function? */
          ci->func.p -= delta;  /* restore 'func' (if vararg) */
          luaD_poscall(L, ci, n);  /* finish caller */
          updatetrap(ci);  /* 'luaD_poscall' can change hooks */
          goto ret;  /* caller returns after the tail call */
        }
      }
      vmcase(OP_RETURN) {
        StkId ra = RA(i);
        int n = GETARG_B(i) - 1;  /* number of results */
        int nparams1 = GETARG_C(i);
        if (n < 0)  /* not fixed? */
          n = cast_int(L->top.p - ra);  /* get what is available */
        savepc(ci);
        if (TESTARG_k(i)) {  /* may there be open upvalues? */
          ci->u2.nres = n;  /* save number of returns */
          if (L->top.p < ci->top.p)
            L->top.p = ci->top.p;
          luaF_close(L, base, CLOSEKTOP, 1);
          updatetrap(ci);
          updatestack(ci);
        }
        if (nparams1)  /* vararg function? */
          ci->func.p -= ci->u.l.nextraargs + nparams1;
        L->top.p = ra + n;  /* set call for 'luaD_poscall' */
        luaD_poscall(L, ci, n);
        updatetrap(ci);  /* 'luaD_poscall' can change hooks */
        goto ret;
      }
      vmcase(OP_RETURN0) {
        if (l_unlikely(L->hookmask)) {
          StkId ra = RA(i);
          L->top.p = ra;
          savepc(ci);
          luaD_poscall(L, ci, 0);  /* no hurry... */
          trap = 1;
        }
        else {  /* do the 'poscall' here */
          int nres;
          L->ci = ci->previous;  /* back to caller */
          L->top.p = base - 1;
          for (nres = ci->nresults; l_unlikely(nres > 0); nres--)
            setnilvalue(s2v(L->top.p++));  /* all results are nil */
        }
        goto ret;
      }
      vmcase(OP_RETURN1) {
        if (l_unlikely(L->hookmask)) {
          StkId ra = RA(i);
          L->top.p = ra + 1;
          savepc(ci);
          luaD_poscall(L, ci, 1);  /* no hurry... */
          trap = 1;
        }
        else {  /* do the 'poscall' here */
          int nres = ci->nresults;
          L->ci = ci->previous;  /* back to caller */
          if (nres == 0)
            L->top.p = base - 1;  /* asked for no results */
          else {
            StkId ra = RA(i);
            setobjs2s(L, base - 1, ra);  /* at least this result */
            L->top.p = base;
            for (; l_unlikely(nres > 1); nres--)
              setnilvalue(s2v(L->top.p++));  /* complete missing results */
          }
        }
       ret:  /* return from a Lua function */
        if (ci->callstatus & CIST_FRESH)
          return;  /* end this frame */
        else {
          ci = ci->previous;
          goto returning;  /* continue running caller in this frame */
        }
      }
      vmcase(OP_FORLOOP) {
        StkId ra = RA(i);
        if (ttisinteger(s2v(ra + 2))) {  /* integer loop? */
          lua_Unsigned count = l_castS2U(ivalue(s2v(ra + 1)));
          if (count > 0) {  /* still more iterations? */
            lua_Integer step = ivalue(s2v(ra + 2));
            lua_Integer idx = ivalue(s2v(ra));  /* internal index */
            chgivalue(s2v(ra + 1), count - 1);  /* update counter */
            idx = intop(+, idx, step);  /* add step to index */
            chgivalue(s2v(ra), idx);  /* update internal index */
            setivalue(s2v(ra + 3), idx);  /* and control variable */
            pc -= GETARG_Bx(i);  /* jump back */
          }
        }
        else if (floatforloop(ra))  /* float loop */
          pc -= GETARG_Bx(i);  /* jump back */
        updatetrap(ci);  /* allows a signal to break the loop */
        vmbreak;
      }
      vmcase(OP_FORPREP) {
        StkId ra = RA(i);
        savestate(L, ci);  /* in case of errors */
        if (forprep(L, ra))
          pc += GETARG_Bx(i) + 1;  /* skip the loop */
        vmbreak;
      }
      vmcase(OP_TFORPREP) {
       StkId ra = RA(i);
        /* create to-be-closed upvalue (if needed) */
        halfProtect(luaF_newtbcupval(L, ra + 3));
        pc += GETARG_Bx(i);
        i = *(pc++);  /* go to next instruction */
        lua_assert(GET_OPCODE(i) == OP_TFORCALL && ra == RA(i));
        goto l_tforcall;
      }
      vmcase(OP_TFORCALL) {
       l_tforcall: {
        StkId ra = RA(i);
        /* 'ra' has the iterator function, 'ra + 1' has the state,
           'ra + 2' has the control variable, and 'ra + 3' has the
           to-be-closed variable. The call will use the stack after
           these values (starting at 'ra + 4')
        */
        /* push function, state, and control variable */
        memcpy(ra + 4, ra, 3 * sizeof(*ra));
        L->top.p = ra + 4 + 3;
        ProtectNT(luaD_call(L, ra + 4, GETARG_C(i)));  /* do the call */
        updatestack(ci);  /* stack may have changed */
        i = *(pc++);  /* go to next instruction */
        lua_assert(GET_OPCODE(i) == OP_TFORLOOP && ra == RA(i));
        goto l_tforloop;
      }}
      vmcase(OP_TFORLOOP) {
       l_tforloop: {
        StkId ra = RA(i);
        if (!ttisnil(s2v(ra + 4))) {  /* continue loop? */
          setobjs2s(L, ra + 2, ra + 4);  /* save control variable */
          pc -= GETARG_Bx(i);  /* jump back */
        }
        vmbreak;
      }}
      vmcase(OP_SETLIST) {
        StkId ra = RA(i);
        int n = GETARG_B(i);
        unsigned int last = GETARG_C(i);
        Table *h = hvalue(s2v(ra));
        if (n == 0)
          n = cast_int(L->top.p - ra) - 1;  /* get up to the top */
        else
          L->top.p = ci->top.p;  /* correct top in case of emergency GC */
        last += n;
        if (TESTARG_k(i)) {
          last += GETARG_Ax(*pc) * (MAXARG_C + 1);
          pc++;
        }
        if (last > luaH_realasize(h))  /* needs more space? */
          luaH_resizearray(L, h, last);  /* preallocate it at once */
        for (; n > 0; n--) {
          TValue *val = s2v(ra + n);
          setobj2t(L, &h->array[last - 1], val);
          last--;
          luaC_barrierback(L, obj2gco(h), val);
        }
        vmbreak;
      }
      vmcase(OP_CLOSURE) {
        StkId ra = RA(i);
        Proto *p = cl->p->p[GETARG_Bx(i)];
        halfProtect(pushclosure(L, p, cl->upvals, base, ra));
        checkGC(L, ra + 1);
        vmbreak;
      }
      vmcase(OP_VARARG) {
        StkId ra = RA(i);
        int n = GETARG_C(i) - 1;  /* required results */
        Protect(luaT_getvarargs(L, ci, ra, n));
        vmbreak;
      }
      vmcase(OP_VARARGPREP) {
        ProtectNT(luaT_adjustvarargs(L, GETARG_A(i), ci, cl->p));
        if (l_unlikely(trap)) {  /* previous "Protect" updated trap */
          luaD_hookcall(L, ci);
          L->oldpc = 1;  /* next opcode will be seen as a "new" line */
        }
        updatebase(ci);  /* function has new base after adjustment */
        vmbreak;
      }
      vmcase(OP_EXTRAARG) {
        lua_assert(0);
        vmbreak;
      }
    }
  }
}

В чём преимущество OnInit
 
Самый бестолковый колбек это OnTrade.
------------------------------------
Нет смысла тратить на него вообще какое-нибудь время,
так как совершение сделки отражается в заявках и в портфеле.
примеры колбеков
 
Владимир,
Кто о чем а вшивый о бане.
Судя по твоим постоянным попыткам узнать кто меня считает учителем, тебе очень хочется быть им.
Но тебя учить поздно. .
примеры колбеков
 
Цитата
Владимир написал:
nikolz, Лапуль, ну хватит корчить из себя программиста. Уши вянут смотреть на эту бредятину. Вас ХОТЬ КТО-НИБУДЬ принимает за учителя?
Не смотри. И хватит корчить из себя мудака .Давно все понятно.
примеры колбеков
 
пояснение:
-----------------
во всех примерах колбеков есть блок с вызовом функции  SearchItems
он исполняется для каждого инструмента лишь один раз.
---------------------
Это блок нужен, чтобы обработать те сделки и заявки , которые были исполнены или выставлены до запуска скрипта.
Так как эти блоки исполняются один раз, то их время исполнение практически не влияет скорость исполнения колбеков.
примеры колбеков
 
Написал  изучающим Lua примеры вариантов колбеков сделок, заявок и стоп-заявок.
----------------------
Примеры написаны специально для форума и не тестировались, а лишь проверены на синтаксис.
---------------------------
Поэтому, если есть желающие тестить и найдете ошибки, то пишите, исправим вместе.
--------------
В этих колбеках сделки, активные заявки и активные стоп заявки размещаются в соответствующие инструментам рабочие таблицы.
--------------------------------
Код
--таблицы
TRADE={}; -- индексы сделок по инструментам
ORDER={}; -- индексы активных заявок по инструментам
STOP={}; -- индексы активных стоп-заявок по инструментам

function OnTrade(tr)
  local n,m;local sec=tr.sec_code;
  local t=TRADE[sec]; --таблица номеров строк сделок в таблице QUIK инструмента sec
  if t then
   m=TRADE[0]; n=t[0];
 else                --создание таблицы инструмента
   m=getNumberOf("trades"); n=0;
   t=SearchItems("trades",n,m-1, function(p1) if p1==sec then return true;end return false; end,"sec_code")
   TRADE[sec]=t;
end
 if m>t[n] then n=n+1; t[n]=m;  t[0]=n; TRADE[0]=m+1; end
end

local function fOrder(tr,T,s)  --функция обработки для колбеков orders и stop_orders
  local n,m,x;local sec=tr.sec_code; local t=T[sec];  --таблица номеров строк в таблице QUIK активных ордеров или стоп_ордеров инструмента sec
  local flag=tr.flags&1; local num=tr.order_num;
  if t then
    m=T[0]; n=t[0];
   for i=1,n do x=getItem(s,i-1);
      if x.num_order==num then
         if flag==0 then n=n-1;if n>0 then t[i]=t[n]; end break; else return; end
      end
   end
 else                --создание таблицы инструмента
   m=getNumberOf(s); n=0;
   t=SearchItems(s,n,m-1, function(p1,p2) if p1==sec and p2&1==1 then return true;end return false; end,"sec_code,flags")
   T[sec]=t;
end
   if flags==1 then n=n+1; t[0]=n; t[n]=m; T[0]=m+1; end
end

function OnOrder(t)   fOrder(t,ORDER,"orders");  end
function OnStopOrder(t) fOrder(t,ORDER,"stop_orders"); end
 
В чём преимущество OnInit
 
Цитата
VPM написал:
Но все ругают колбеки чего ждать от них не понятно,
Так как не только использую все колбеки QLua, но и пишу свои дополнительные колбеки для скриптов Lua,
то попробую объяснить что это за зверь.
-------------------
колбек - это обычная глобальная функция на Lua (можно и на C), но с конкретным именем.
---------------------
В терминале QUIK , при обработке полученных данных с сервера, перед тем как отправить данные в таблицы терминала,
делается вызов функции Lua с именем колбека и ей передаются данные.
--------------------------
Если такой функции нет, то ее нет в глобальном стеке Lua и ее вызов пропускается.
===================
Резюме:   Если Вы ругаете колбеки, то Вы ругаете "чистое" Lua, так как колбек -это функция на чистом луа.
-------------
Колбеки обычно ругают те, кто  луа не изучил толком и в функциях QLUA не разобрался.
---------------
Но зеркало не виновато, в том ...
Заявки.
 
это Вы про метатрейдер намекаете?
Страницы: Пред. 1 ... 7 8 9 10 11 12 13 14 15 16 17 ... 72 След.
Наверх