openbuys - Активные на покупку opense[[s - Активные на продажу
Эти переменные содержат число, а не логическую переменную В них либо ноль либо не ноль, а не TRUE и FALSE -------------------------- Но запускать заново скрипт или main нет надобности в вашем случае.
Серёга187 написал: Опытные подскажите: правильно ли я выставляю заявку на отложенную покупку? А то еще ни разу не сработала. Брокер сбер.
Все правильно делал. Просто цена сильно быстро росла и стоп не сработал...
если правильно, то стоп должен сработать, и либо заявка исполнится, либо в стакане останется неисполненная заявка. ------------------------- Если этого нет, то неправильно что-то сделал.
Ликбез: Вообще-то, скрипт запускается не в QLUA, а в терминале QUIK. QLUA - это библиотека на CИ для обращения на языке луа к функциям и архиву данных терминала QUIK. Поэтому нет в библиотеках луа функции запуск скрипта терминала из подобного скрипта =============== Можно из скрипта терминал квик запускать еще скрипты в дополнительных потоках, но это не тоже самое и функции в чистом луа для этого нет. -------------------
Ликбез о том какие ресурсы скрыты от создателей роботов на чистом Lua. ---------------------- Cделал тест сравнения быстродействия чистого LUA и LUA совместно с функцией на СИ c использованием системы команд AVX2. --------------- в тесте вычисляется в цикле 32000 раз сумма элементов таблиц размером в 32000. вот этот тест:
Код
MAX_SIZE=32000;
local pX,hFM,hfl=nkarray.cr(32768,4,"nkQUIK1");
local pY,hFM,hfl=nkarray.cr(32768,4,"nkQUIK2");
-------------------------------------
local N=MAX_SIZE
startA();
for j=1,N do opVC(2,1,pY,1,N,pX,1); end
local t1=stopA();
------------------------------
local x1={} local x2={} for i=1,N do x1[i]=0; x2[i]=1; end
startA();
for j=1,N do for i=1,N do x1[i]=x1[i]+x2[i]; end end
local t=stopA();
print("t1="..(0.1*t1/1000)..",t="..(0.1*t/1000)..",t/t1="..t/t1)
а вот результат LUA+C+AVX2 в 153 раза быстрее "чистого LUA":
Дмитрий написал: nikolz, почему же стоп-лимит - это заявка на закрытие убыточной позиции? Вот у автора нет позиции, он хочет купить при пробитии вверх. Если цена выставляемой лимитной заявки не будет выше макс возможной, и рынок за время выставления не уйдет выше этой цены, это желание автора исполнится
Безусловно, можно и микроскопом забить гвоздь. и все названия - это лишь условности, которые упрощают понимание сущности вещей. -------------------------- Поэтому я пытаюсь объяснить, что название заявок было придумано не просто так, а с целью указать на их назначение. ----------------------- Любая заявка направлена на совершение сделки. -------------------------- Но некоторым конструкциям заявок авторы дают название. Стоп - означает "остановить" ---------------------------- В документации КВИК сказано: В системе QUIK существуют следующие типы условных заявок: (указано правильно типы условных заявок, а не типы стоп-заявок Иначе масло - масленое).
«Стоп-лимит» - стоп-заявка, порождающая при исполнении лимитированную заявку.
НАЗНАЧЕНИЕ: Ограничение величины убытков при изменении цен сделок в сторону, противоположную ожидаемой.
------------------------- Выше я показал, что согласно документации в QUIK вообще все отложенные заявки назвали стоп-заявками. ------------------------------- А кроме этого для каждой стоп заявки еще придумали тип стоп-заявки. ----------------------- Квиковское определение в глоссарии стоп-заявки не выдерживает критики и не соответствует введенным ими же типам. ====================== Поэтому квиковские стоп-заявки - это не стоп-заяки в классическом понимании, так как стоп-заявка существует лишь в одном исполнении, как указано в документации КВИК под типом Стоп-лимит. ========================== Поэтому выставить заявку против рынка с помощью отложенной заявки типа "стоп-лимит" можно. Это можно сделать и заявкой типа «Стоп-цена по другому инструменту» ===================== Если бы квиковцы не изобретали велосипед в терминологии рынка, то не возникало бы такой путаницы и многих вопросов, что можно, а что нельзя. ------------------------------ В действительности, названные ими стоп-заявки - это ОТЛОЖЕННЫЕ заявки. ------------------------- Т е в отличии от заявок, которые отправлены на биржу, эти заявки остаются на сервере брокера до момента возникновения условия отправки их на биржу. И слово "стоп" вообще не имеет смысла в их названии. ----------------------------- Это заявки можно назвать отложенными -условными или отложенными-алгоритмическими. Но самое бессмысленное название для них - это "Стоп заявки" ----------------------- Т е мы имеем наглядный пример, как дилетантское применение общепринятого в профессиональной области понятие стоп-заявки приводит к путанице, а не к упрощению понимания сущности.
и еще В некоторых стоп-заявках терминала квик указывается более 2 значений цен. Согласно определению это уже не стоп-заявки. ------------------ Тогда это что за заявки?
пардон, опечатка ----------------------- Исправляю согласно документации КВИК Разработчики QUIK дали свое собственное определение стоп-заявки: -------------------------------------- Стоп-заявка – поручение, исполняемое брокером в зависимости от достижения рыночной ценой инструмента определенного уровня. В такой заявке указывается два значения цены.
Прикольно, но первое предложение этого определения - это условие лимитной заявки. Второе предложение не верно, если заявка будет выполнена по рыночной цене. ------------------------- Таким образом, определение стоп-заявки придуманное разработчиками КВИК - не выдерживает никакой критики. Это масло масленое. ==================== Очевидно, понимая, что они написали бессмыслицу, далее они уточняют: «Стоп-лимит» – это стандартная стоп-заявка; ------------------------ Поэтому в приведенном выше ликбезе следует согласно документации читать стандартная стоп-заявка - «Стоп-лимит» – это заявка на закрытие убыточной позиции ========================= и далее Можно конечно использовать ее для открытия новой позиции, вне зависимости от наличия позиции, но для этого есть другие типы стоп-заявок. -------------------- Ув, разработчики может имеет смысл убрать это Ваше определение стоп-заявок? Просто ужас какой-то.
Ликбез: ------------------------ стоп-заявка - это заявка, которая хранится на сервере брокера. ----------------------- Название стоп-заявка означает, что ее назначение закрыть убыточную позицию. -------------------------------- Условия стоп-заявки проверяет сервер брокера. ------------------------------ При возникновения условий, стоп-заявка переписывается сервером в заявку и отправляется на биржу. ------------------------ Можно конечно использовать ее для открытия новой позиции, вне зависимости от наличия позиции, но для этого есть другие типы заявок.
Танечка написал: Подскажите, как создать в квике лимитную заявку например на покупку выше текущей цены? Устанавливаю цену, галочка по рынку не стоит, все-равно входит по рынку. Что за фигня.... В приложении скрин МТ5 - там называется BUY stop. Как это сделать в квике?
попробуйте почитать руководство пользователя QUIK , а не MT5 ------------------------------ Ввод заявки
кнопка Назначение
Формирование и передача на исполнение новой заявки на покупку/продажу инструментов.
Открытие окна «Ввод заявки» осуществляется:
Нажатием кнопки на панели инструментов;
Двойным нажатием левой кнопки мыши;
Нажатием клавиши «F2»;
Выбором в таблице пункта контекстного меню «Новая заявка»;
Выбором пункта меню Действия;
Использованием Общего способа выполнения транзакций с выбором операции «Ввод заявки»;
Из окна «Графики». Подробнее см. Ввод заявки из окна «Графики».
Если кнопка на панели инструментов неактивна (серая), значит, ввод заявки по выбранному инструменту невозможен.
Если при вводе заявки из таблицы неизвестен инструмент, по которому подается заявка (в таблице нет выделенных строк, или таблица пустая), то на экран выводится форма выбора инструмента для новой заявки:
Для выбора доступны только те классы, по которым у пользователя есть право активных операций и для которых получена соответствующая операции транзакция.
Признак «Только активные инструменты» позволяет исключить из списка инструменты или контракты, не имеющие заявок, сделок или открытых позиций.
При нажатии кнопки «Выбрать» открывается форма ввода заявки по выбранному инструменту.
См. также Управление заявками из Таблицы котировок
nikolz написал: колбек OnTransReply это реакция на транзакцию, а не на состояние заявки. Для заявки надо работать по OnOrder OnStopOrder либо по таблицам заявок и стоп-заявок
Я получила номер заявки через OnOrder, записала его в переменную и эту переменную записала в ключ ["BASE_ORDER_KEY"], но квик опять говорит что не указан номер базовой заявки. Что не так? Получить номер из таблицы заявок у меня тоже не получается - одни ошибки выдает. Помогите составить кусок кода на получение номера заявки из таблицы заявок пожалуйста
колбек OnTransReply это реакция на транзакцию, а не на состояние заявки. Для заявки надо работать по OnOrder OnStopOrder либо по таблицам заявок и стоп-заявок
Все очень просто и банально. ----------------------- Деньги разработчикам QUIK платят брокеры. -------------------------------------- Брокерам платят их клиенты. ---------------- Два вопроса знатокам ------------------------- 1) С какого бодуна Вы жалуетесь разработчикам на хреновые услуги брокеров 2) C какого бодуна разработчики квик обязаны делать что-то для Вас. ----------------------- Надо искать там, где потеряли, а не там, где светло.
У меня вин 10 все работает нормально у сбербанка. Возможно не установили сертификат. У меня никаких кнопок в квике не появилось. Попробуйте переустановить сертификат
serg написал: как загрузить квик сбербанковский? все время надпись выскакивает:"Цепочка сертификатов обработана, но обработка прервана на корневом сертификате, у которого отсутствует отношение доверия с поставщиком доверия."
c 1 апреля в КВИК сбербанка можно зайти если у вас установлен на компе сертификат минцифры
Про Pine Script. это разработка TradingView и скрипты исполняются на их сервере. т е все что вы напишите - это их собственность На их сайте для Вас дан ответ на вопрос: ---------------------------- Почему я не должен использовать скрипт Pine?
Основная причина, по которой вы не захотите использовать скрипт Pine, заключается в том, что вы ограничены вселенной TradingView.
Вот некоторые конкретные ограничения:
Данные. Если TradingView не предлагает нужные вам данные, вам не повезло. Конечно, TradingView имеет очень обширную базу данных. Но если ваша стратегия предполагает торговлю на малоизвестных рынках, данные о ценах могут быть недоступны.
Сервис выходит за рамки данных о ценах. Некоторые стратегии включают экономические или статистические данные. TradingView предлагает некоторые данные (в основном данные Quandl) в этой категории, но в настоящее время они ограничены.
Если вы используете альтернативные данные в своей стратегии, вероятно, будет проще использовать другой язык программирования, который обеспечивает большую гибкость.
Внешние библиотеки. Pine Script не подходит, если вы хотите использовать внешние библиотеки для выполнения таких задач, как машинное обучение. Есть лучшие альтернативы, если ваша стратегия основана на использовании науки о данных или других сторонних библиотек.
Станислав написал: А интерпретатор JavaScript в Node.js? По идее должна быть хорошая производительность.
Не видел торговых систем на их основе Подключать к КВИКУ не планирую. Вполне устраивает Lua, MQL5 и C.
PineScript, TradingView, терминал Тинькофф.
Да я и не прошу его подключать к квик. Сейчас молодежь со школы учат программировать на python, наверное, это был бы самый востребованный вариант в будущем. (сам не программирую на нем)
Давно торгую на MOCEX и давно использую QUIK. Как я писал ранее на форуме, QUIK позволяет работать с высокой скоростью. ---------------------------- Если возникнет необходимость в использовании TradingView, то напишу для него. Пока мне этого не надо. ----------------------------- Относительно питона. Тоже кое что использую для разработки встроенного софта IOT. ------------------------------ Проведенный тест показал что его интерпретатор почти в 100 раз медленне C и в 50 раз медленнее LuaJIT. Прикручивать его с КВИКУ смысла не вижу. ----------------------------------- В школе учился давно, тогда там программировать не учили, но это мне не мешает программировать сейчас на любом языке, если надо. Полагаю, что в будущем молодежь освоит все что ей понадобится самостоятельно.
nikolz написал: Один компьютер может обсчитывать очень сложный алгоритм по одному инструменту в реальном времени. Например нейронную сеть на 1 миллиард нейронных связей. ------------------------Делаем в интернет пул скажем 1000 компьютеров Получаем распределенный кластер прогнозирования 1000 инструментов в реальном времени.
:: . «Остапа понесло ….. Остап со вчерашнего дня еще ничего не ел. Поэтому красноречие его было необыкновенно» Ильф и Петров: «Двенадцать стульев»
nikolz написал: Один компьютер может обсчитывать очень сложный алгоритм по одному инструменту в реальном времени. Например нейронную сеть на 1 миллиард нейронных связей. ------------------------ Делаем в интернет пул скажем 1000 компьютеров Получаем распределенный кластер прогнозирования 1000 инструментов в реальном времени.
При таком размахе нужен не QUIK, а плаза, а там совсем другой подход.
Ликбез: плаза - это протокол , а не терминал. --------------------- Plaza II Шлюз FORTS — Программное обеспечение, обеспечивающее обмен данными между Серверной частью ПО – Торговой и клиринговой системы рынка фьючерсных контрактов и опционов (Торговой системой FORTS) и сертифицированной брокерской системой Интернет-трейдинга (читай сервер QUIK ) по протоколу Plaza II.
Один компьютер может обсчитывать очень сложный алгоритм по одному инструменту в реальном времени. Например нейронную сеть на 1 миллиард нейронных связей. ------------------------ Делаем в интернет пул скажем 1000 компьютеров Получаем распределенный кластер прогнозирования 1000 инструментов в реальном времени.
Александр М написал: Сами по себе цифры конечно красивые и проделана видимо огромная работа, но вот практическая целесообразность такой оптимизации под вопросом для реальных задач из под QUIK.
нет никакой оптимизации. ------------------------- Какую реальную задачу Вы сейчас решаете? Возможно она потому и не решается, что решается примитивно. --------------------------------- Представьте , что можно на КВИКЕ решать задачу в 100 раз сложнее за тоже время, что у Вас сейчас. ---------------------------------------- А учитывая возможность запуска много потоков, сложность решаемой задачи на квик может быть в 500...1000 чем решаемая Вами сейчас. ------------------------------------- И это на обычном компьютере без CUDA. ---------------------- Прикиньте сколько стоит компьютер, который в 100 раз быстрее вашего считает? А 2 1000? Вот эту задачу это и решает. -------------------- Если вы пришли на рынок за баблом то не ждите, что Вам его примитивный скрипт принесет. Скорее всего он его сольет. Чудес не бывает.
Sergey написал: Спасибо за ответ! Я вчера размышлял пока засыпал и пришел к такому выводу. Выражаясь вашими словами, разность движений направлений за день, определяет и направление по которому будет следовать индикатор. Проще говоря, если цена закрытия ниже половины ATR, то направление индикатора будет вниз, даже если свеча при этом будет зеленой.
Каждый индикатор предполагает некоторую модель рынка. В данном случае предполагается, что во первых рынок очень ликвидный. ----------------- Индикатор ATR Расчетная формула ATR: ATR = Moving Average(TRj, n), где TRj = максимальному из модулей трех значений |High — Low|, |High — Closej-1|, |Low — Closej-1|. ------------------- Понимать его можно так: Это сглаженное значение максимального диапазона движения либо последней свечи за день, либо свечи с учетом гэпа. Т е это индикатор движения (волатильности) рынка. ----------------------- ATR - это индикатор разности, поэтому некорректно сравнивать его с ценой.
Модель данного индикатора такая. Предполагается, что направление движения цены определяет направление денежного потока на рынке. ----------------------------- Так как все широко известные индикаторы были предложены до компьютеров, то они предполагают интервал от дня и выше. ------------------------ Для конкретики рассмотрим интервал день. -------------- Чтобы было наглядно, нарисуйте один период синусоиды -------------------------- (Close-Low) -диапазон движения цены вниз относительно закрытия за день, -------------------- (High-Close) -диапазон движения цены вверх день ------------------ Предполагаем , что это разное направление движения денег . ---------------- 2*Close-Low-High =(Close-Low)-(High-Close) - разность направлений движения денег за день ------------------- High-Low - это весь диапазон движения денег за день -------------------- ((2*Close-Low-High)/(High-Low)) - относительное изменение денежного потока ------------------- ((2*Close-Low-High)/(High-Low))*Volume - абсолютное изменение денежного потока за день
Добрый день, Ранее сообщал, что сделал возможность запуска скриптов QUIL в отдельных потоках в LUAJIT. ---------------- кратко это работает так. В колбек OnParam приходят сделки инструментов, которые передаются в функцию main() ----------------------- В main - это LUA 5.3 по каждому инструменту запускается скрипт алгоритма робота в отдельном потоке из пула потоков под LUAJIT. ====================== На просторах интернета нашел тесты по которым разработчики сравнивали MT5 сравнивали MQL5 и LUA в QUIK. --------------------- вот сами тесты:
Код
-- TestQuickSort
local array={}
local function QuickSort(arr,left,right)
local i=left
local j=right
local center=arr[math.floor((i+j)/2)]
while i<=j do
while(arr[i]<center and i<right) do i=i+1 end
while(arr[j]>center and j>left) do j=j-1 end
if i<=j then local x=arr[i] arr[i]=arr[j] arr[j]=x i=i+1 j=j-1 end
end
if left<j then QuickSort(arr,left,j) end
if right>i then QuickSort(arr,i,right) end
end
local function Start1()
for i=0,MAX_SIZE-1 do array[i]=i%100 end
start=os.clock()
QuickSort(array,0,MAX_SIZE-1)
res=(os.clock()-start)*1000
print("TestQuickSort SIZE="..MAX_SIZE..", time=" .. res .. " ms")
for i=1,MAX_SIZE-1 do
if array[i]<array[i-1] then print("Array not sorted"); break;
end
end
end
local str=""
local a={}
local function PiCalculate(digits)
local d = 0
local c = (math.floor(digits/4)+1)*14
local f = 10000
for i=0,c do a[i]=20000000 end
c=c-14
b=c
while b>0 do
e=d%f
d=e
while b-1>0 do
b=b-1
d = d * b + a[b]
g = (b * 2) - 1
a[b]=(d%g)*f
d=math.floor(d/g)
end
r=e+math.floor(d/f)
if r<1000 then
if(r>99) then
str=str .. "0"
else
if(r > 9) then
str=str .. "00"
else
str=str .. "000"
end
end
end
str=str .. string.format("%d",r)
c=c-14
b=c
end
end
function Start2()
start=os.clock()
PiCalculate(MAX_SIZE)
res=(os.clock()-start)*1000
print("TestPiCalculated SIZE="..MAX_SIZE..", time=" .. res .." ms Pi="..string.sub(str,1,16))
end
-- TestFibo
local fib={}
local function TestFibo(n)
if n<2 then return 1 else return TestFibo(n-2)+TestFibo(n-1) end
end
local function Start3()
start=os.clock()
for i=0,MAX_SIZE-1 do fib[i]=TestFibo(i) end
res=(os.clock()-start)*1000
print("TestFibo SIZE="..MAX_SIZE..", time="..res.." ms Fibo[39]="..fib[39])
end
-- TestArrays
local function Start4()
local x={} local y={}
local start=os.clock()
for i=1,MAX_SIZE,1 do x[i]=i y[i]=0 end
y[MAX_SIZE]=0
for k=1,MAX_SIZE,1 do
for i=MAX_SIZE, 1,-1 do y[i]=y[i]+x[i] end
end
local res=(os.clock()-start)*1000
local check=0
for k=1,MAX_SIZE,1 do check=check+y[k] end
print("Test Arrays SIZE="..MAX_SIZE..", Time = "..res.." ms check=".. check)
end
local function Ackermann(m,n)
if(m==0) then return(n+1) end
if(n==0) then return(Ackermann(m-1,1)) end
return(Ackermann(m-1,Ackermann(m,(n-1))))
end
-- TestAckermann
local function Start5()
local check=0
local start=os.clock()
for i=1,MAX_SIZE do check=check+Ackermann(1+i%3,1+i%5); end
local finish=os.clock()
local res=(finish-start)*1000
print("TestAckermann SIZE="..MAX_SIZE..",time=".. string.format("%.0f",res).." ms check="..check)
end
-- TestFloat
local f0=0.0
local f1=123.456789
local f2=98765.12345678998765432
local f3=12345678943.98
function TestFloat(MAX_SIZE)
MAX_SIZE=MAX_SIZE-1
for i=0, MAX_SIZE do
for j=0, MAX_SIZE do
f0=f0+(f1/(i+1))-f2+(f3*i);
end
end
end
function Start6()
local t=os.clock()
TestFloat(MAX_SIZE)
local res=(os.clock()-t)*1000
local check=f0
print("TestFloat SIZE="..MAX_SIZE..", time=" ..res.." ms check="..tostring(check));
end
MAX_SIZE=35000; Start6()
MAX_SIZE=120000; Start5()
MAX_SIZE=32000; Start4()
MAX_SIZE=40; Start3()
MAX_SIZE=22000; Start2()
MAX_SIZE=16000000; Start1()
=================== На этих тестах я провел тест LUA 5.3 и LUAJIT. ================== Результаты говорят сами за себя: Когда подключу MT5 к QUIK, то сделаю тест и для него. ----------------------- Следите за новостями.
Станислав написал: Очень интересно, поздравляю с успехом коллега!
Не понимаю, где была инициализирована переменная nk1?PS: К сожалению, не являюсь программистом на C/C++.
nk1 инициализирована в другом потоке и скрипте на Lua5.3. Применительно к скриту QUIK - в функции main() ------------------ Т е таким образом в этот поток в скрипт LuaJIT передаются любые параметры из потока со скриптом на Lua5.3
В качестве ликбеза. ---------------------- LUAJIT - это компилятор с оптимизацией в реальном времени. --------------------------- Так как любой робот это циклическое повторение расчета алгоритма прогноза по полученным данным, то LuaJIT выполняет компиляцию и оптимизацию скрипта совместно с виртуальной машиной. ---------------------------- В итоге с каждым новым циклом скрипт работает все быстрее и быстрее, приближаясь по скорости к чистому CИ.
сделал библиотеку , которая позволяет из скрипта на Lua5.3...5.4 вызвать в отдельных потоках скрипты на LuaJIT. Теперь можно запустить в скрипте КВИКА программный пакет TORCH ( ФАКЕЛ) . ---------------------------------- Вот пример бесконечного цикла скрипта в LuaJIT с синхронизацией потоков по событиям и вызов функций СИ через библиотеку FFI. --------------------------------. В этом примере из потока скрипта Lua5.3 передаются данные в поток скрипта LuaJIT через переменную nk1, которая выводится в файл.
Код
local ffi = require("ffi")
ffi.cdef[[
void Sleep(int ms);
long OpenEventA(uint64_t dwDesiredAccess, int bInheritHandle, const char* S);
long WaitForSingleObject( uint64_t hHandle, long dwMilliseconds);
long CreateEventA(int dwDesiredAccess, int M,int bInheritHandle, const char* S);
int SetEvent(uint64_t hEvent);
int ResetEvent(uint64_t hEvent);
]]
path = "D:/QUIK_SCRIPT/nk_bot/"
Log=io.open("D:/QUIK_SCRIPT/nk_bot/test_jit.log","w")
local event=ffi.C.OpenEventA(0x1f0003,0,"event");
while true do
local x=ffi.C.WaitForSingleObject(event,-1); --ждем события
local z=nk1;
Log:write(os.time()..","..tostring(z).."\n"); Log:flush();
ffi.C.ResetEvent(event)
-- print(x)
end
это не ложные шипики. Посмотрите формулу RSI RSI считается по разности закрытия свечей. Поэтому увеличение периода сглаживания не тоже самое что RSI на большем интервале. На интервале 1 день все свечи с интервалом 1 ча просто не существуют. Я конечно понимаю, что Вам все равно, так как Вы не понимаете смысла индикаторов.
Хочу собрать свечи по спросу и предложению (не закрытые заявки) из тиковых данных. Отдельно свечи, отражающие количество заявок и отдельно свечи, отражающие их объём.
Насколько я понимаю, система QUIK сама получает данные в тиковом виде и затем преобразует их в свечи, в том числе такие типы свечей, которые упомянул.
Я бы хотел как-нибудь воспользоваться этой возможностью системы, но не знаю как.
Подскажите, пожалуйста, что я могу сделать?
Вы ничего не путаете? Тики - это сделки, а не заявки.
Добрый день, Всем известно, что есть библиотека ffi https://luajit.org/ext_ffi.html Библиотека FFI позволяет вызывать внешние функции C и использовать структуры данных C из чистого кода Lua. Библиотека FFI в значительной степени устраняет необходимость написания утомительных ручных привязок Lua / C на C. Нет необходимости изучать отдельный язык привязки — он анализирует простые объявления C! Они могут быть вырезаны и вставлены из заголовочных файлов C или справочных руководств. Это задача связывания больших библиотек без необходимости иметь дело с хрупкими генераторами привязки. --------------------- Все казалось прекрасно, но... Библиотека FFI тесно интегрирована в LuaJIT (она недоступна как отдельный модуль). конечно, не так уж страшно, но... LuaJIT сделан на ядре Lua5.1 и следовательно для квика не подходит. ------------------------ Написал собственную библиотеку для любого ядра Lua, которая делает тоже самое, что и FFI, но быстрее. В итоге можно загрузить на исполнение любую функцию написанную на С/С++ из любой библиотеки DLL. И следовательно получить максимальную скорость вычисления любых алгоритмов, не программируя на СИ и не изучая API C for Lua. ---------------------------- Накладные расходы на преобразование параметров в пределах кванта высокоточного таймера (см далее). --------------------------- Вот пример вызова трех функций из WIN32 ------------------------------ QueryPerformanceCounter - высокоточный таймер квант 0.1 мкс. SleepEx - функция паузы MessageBoxA - вывод окна сообщения пример вызова в луа: В программе два варианта измерение интервала Sleep в 1 секунду и вывод результата в окно
Код
-------------sleep и высокоточный таймер вариант 1 -------------------
local x1=rfs("i","QueryPerformanceCounter","Kernel32.dll");
rfs(0,"SleepEx","Kernel32.dll",1000,0);
local x2=rfs("i","QueryPerformanceCounter","Kernel32.dll");
-------------sleep и высокоточный таймер вариант 2 -------------------
local pL,pF=nkcf.gf2L("Kernel32.dll","QueryPerformanceCounter")
local x3=rfs("i",pF);
rfs(0,"SleepEx","Kernel32.dll",1000,0);
local x4=rfs("i",pF);
s="t1="..0.1*(x2-x1).." мкс".." t2="..0.1*(x4-x3).." мкс";
print(" "..s);
rfs(0,"MessageBoxA","User32.dll",0, s, "sleep, timer",1);
Спецификации коротких кодов фьючерсных и опционных контрактов на срочном рынке
Коды срочных контрактов состоят из следующих частей:
Коды фьючерсов
C
M
Y
Коды опционов
C
P
K
M
Y
W
C – краткий код базисного актива, P – цена страйк (максимум 6 символов), К – тип расчетов, M – месяц исполнения (а также тип для опциона), Y – год исполнения, W – признак недельного опциона.
Для опционов на фьючерсные контракты в поле "цена страйк" указывается цена базисного актива (цена фьючерсного контракта). В свою очередь, цена фьючерсного контракта – это цена пакета акций, входящих в один контракт.
Для опционов на акции в поле "цена страйк" указывается цена за единицу базисного актива.
Кодирование типа расчетов (поле "К")
Символ в коротком коде
Базовый актив
Категория
Тип расчетов
A
Фьючерс
Американский
Уплата премии
B
Фьючерс
Американский
Маржируемый
С
Акция
Европейский
Уплата премии
Кодирование месяца исполнения (поле "M")
Для фьючерсов:
Месяц
Код фьючерса
Январь
F
Февраль
G
Март
H
Апрель
J
Май
K
Июнь
M
Июль
N
Август
Q
Сентябрь
U
Октябрь
V
Ноябрь
X
Декабрь
Z
Для опционов:
Месяц
Код опциона КОЛЛ
Код опциона ПУТ
Январь
A
M
Февраль
B
N
Март
C
O
Апрель
D
P
Май
E
Q
Июнь
F
R
Июль
G
S
Август
H
T
Сентябрь
I
U
Октябрь
J
V
Ноябрь
K
W
Декабрь
L
X
Кодирование года исполнения (поле "Y")
Год исполнения фьючерса и опциона кодируется одной цифрой от 0 до 9. 2 – 2022 год, 3 – 2023 год, 4 – 2024 год.
Недельный опцион с экспирацией в 1-й четверг месяца
Недельный опцион с экспирацией в 1-ю среду месяца
B
Недельный опцион с экспирацией во 2-ой четверг месяца
Недельный опцион с экспирацией во 2-ую среду месяца
С
Недельный опцион с экспирацией в 3-й четверг месяца
Недельный опцион с экспирацией в 3-ую среду месяца
D
Недельный опцион с экспирацией в 4-ый четверг месяца
Недельный опцион с экспирацией в 4-ую среду месяца
E
Недельный опцион с экспирацией в 5-ый четверг месяца
Недельный опцион с экспирацией в 5-ую среду месяца
Алгоритм определения полей Y, M и W для недельного опциона на фьючерсные контракты:
Рассматривается четверг недели, на которую приходится день экспирации
Y определяется по году этого четверга
M определяется по месяцу этого четверга
W определяется:
по порядковому номеру этого четверга в месяце (для опционов на фьючерсы на индексы и валютные пары) Пример 1
по порядковому номеру четверга в месяце, которому предшествует последний торговый день опционов (для опционов на фьючерсы на акции) Пример 2
Пример 1: Недельный опцион call на индекс RTS со страйком 130000 исполняется 30 декабря 2019 года в понедельник. Четверг на этой неделе (2 января) - неторговый день. Поэтому день исполнения был перенесен на ближайший предшествующий торговый день. Короткий код: RI130000BA0A, так как четверг недели экспирации относится к январю 2020 года, и это первый четверг в месяц. Полный код: RTS-1.20M301219CA 130000
Пример 2: Недельный опцион call на SBRF со страйком 20 000 с датой исполнения 31.03.2021 в среду. Система кодирует такую серию, как апрельскую, т.к. четверг данной недели приходится на апрель. Код месяца: D Код недели: A (1-неделя месяца). Ближайший к дате исполнения 31.03.2021 четверг - 01.04.2021, т.е. уже в апреле Короткий код: SR20000BD1A Полный код: SBRF-4.21M310321CA 20000
На Срочном рынке Московской Биржи предусмотрена возможность заведения опционных контрактов с нулевыми и отрицательными страйками. Рассмотрим пример их кодирования для месячного опциона call на июльский фьючерс на нефть марки Brent с исполнением 25 июня 2020 г. со страйком -10. Короткий код контракта: BR-10BF0 Полный код контракта: BR-7.20M250620СA -10 В случае нулевого страйка (0) для аналогичного контракта: Короткий код контракта: BR0BF0 Полный код контракта: BR-7.20M250620СA 0
Алгоритм определения полей Y, M и W для недельного опциона на ценные бумаги:
Рассматривается среда недели, на которую приходится день экспирации
Y определяется по году этой среды
M определяется по месяцу этой среды
W определяется по порядковому номеру этой среды в месяце Пример 3
Пример 3: Недельный опцион call на акцию Газпрома со страйком 300 исполняется 27 июля 2022 года в среду (четвертая среда месяца экспирации). Короткий код: GZ300CG2DПолный код: GAZPP220722CE 300