Этих "придурков" обычно называют маркетмейкерами. На сайте биржи есть все материалы по ним. Они должны присутствовать в стакане, не помню точно, 95% времени. Поэтому они и стоят. И получают вознаграждение от биржи за каждую сделку, в которой они являются пассивной стороной. Поэтому они не совершают сделок между собой...
Какие именно данные нужны? Список всех сделок или нарезка на временные промежутки (к примеру, 5 минутки, дневки и т.п.)
Данные получить можно несколькими способами. Везде куча нюансов. 1. Скачать с финама (https://www.finam.ru/profile/moex-akcii/gazprom/export/). Тут есть и сделки, и временные "нарезки". Общий совет - чем больше объем данных, тем меньше выбирайте временной промежуток запроса. Т.е. сделки лучше скачивать отдельными запросами по каждому торговому дню. 5-ти минутки, например, можно сразу забрать отдельными запросами по годам. А "дневки", думаю, можно сразу запрашивать за несколько лет. 2. Использовать ИСС Московской биржи https://www.moex.com/a2193. Можно получить и сделки по дням и свечи. Что-то бесплатно, что-то за деньги. Есть ограничения по глубине данных (возможно только для бесплатных вариантов, платные не пробовал). 3. http://export.rbc.ru/ - тут можно получить бесплатно только дневные данные, но есть валютные пары и международные индексы и т.п.
новичок, не понял, зачем ты мне ссылку на чикагский мануал прислал? Давай еще на китайском найди чтоли. Или лучше место, где в мануале от плазы про стопы написано. P.s. Хамство - не признак большого ума
Алексей Ч написал: Если 5000 раз вызывать функцию math.random(1, 999), то какова вероятность получать одинаковые числа? Мне опять почему то сильно кажется, то вероятность будет равна 100%
Ну так ведь 5000 в ~5 раз больше чем 999, так что да 100% будут повторения. И что в этом удивительного?
для меня ничего удивительно нет, все так. Удивительно это для того, то применял этот метод несколькими постами выше моего поста.
Удивительная это вещь: общение на форумах! Спрашивают совет про стоп-заявки. Пишу, что стоп-заявок нет, используете лимитки. Один меня (зачем-то) тычет носом в мануал, где написано, что стоп-заявок нет. А вопрошающий вдруг сам рад тому, что где то нашел другой тот же самый совет использовать лимитки.
Если совсем не стесняться, то мне почему то сильно кажется, что на бирже нет никаких стоп-заявок. Только лимитки и заявки по рынку (не на фортс). Стоп-заявки реализованы на стороне брокера и им же обрабатываются. Таким образом, стоп-заявка - это алгоритм реализации выставления лимитной заявки, но решенный способами, разработанными квиковцами и на стороне сервера брокера. Поэтому, если рассматривать работу со стоп-заявками, то естественно, что на стороне брокера "они должны по идее/будут" исполняться быстрее, чем на стороне своего квика. Что лучше, подать лимитную заявку в систему или стоп-заявку, которая еще будет обрабатываться у брокера и потом попадет в систему - это каждый сам решает. При торговле большим количеством контрактов, действительно, нужно писать отдельный модуль управления заявками (что я и сделал для себя). Мой субъективный подход в том, чтобы не пользоваться стоп-заявками вообще. Это решает и проблему выявления стоп-заявок брокером (если у брокера действительно есть алгоритм собирания стопов, в чем я сильно сомневаюсь). Но в этом случае, алгоритм выставления лимитных заявок тоже приходится изобретать самому. Если торговля идет небольшим объемом, то проще, опять по моему субъективному мнению, посылать в систему рыночные заявки. P.S. вопрос на сообразительность. Если 5000 раз вызывать функцию math.random(1, 999), то какова вероятность получать одинаковые числа? Мне опять почему то сильно кажется, то вероятность будет равна 100%
не путаете с кнопкой "ОК"? Обычно с ней двойной перерасчет... Я всем строго настрого советую никогда ни при каких условиях в здравом уме не жать кнопку "ОК". "Применить", потом закрыть крестиком.
есть догадки! дело в том, что во многих инвест конторах в квике лимиты по деньгам и бумагам (грубо говоря, все позиции клиента) загружаются вручную или автоматически из файла. Т.е. грубо говоря, квик не знает сколько у вас денег и бумаг, пока кто-то ему не "скажет" через загрузку лимитов. Такой пункт в меню квика каждый может увидеть у себя в квике. Но эта опция на клиентских квиках не работает. Так вот скорее всего в конторе Бориса загрузка лимитов может происходить более 1 раза в день. К примеру, ответственный сотрудник утром загружает лимиты из сохраненного вчера файла лимитов. Далее бэк-офис в течение дня (если не успел до начала торгов) расчитывает новые лимиты и готовит новый файл с лимитами, который снова загружаются в квик. Квик автоматически перечитывает все быстро пересчитывает. Но у Бориса его автоматика успевает получить пустые таблицы. Отсюда "баги"
3.6.1 getFuturesHolding Функция предназначена для получения информации по фьючерсным позициям. TABLE getFuturesHolding(STRING firmid, STRING trdaccid, STRING sec_code, NUMBER type) Функция возвращает таблицу Lua с параметрами Таблицы позиций по фьючерсам. В случае ошибки функция возвращает «nil».
Виталий, расскажите, пожалуйста, как Вы отправляете в поддержку архив рабочего места? Для тупых по шагам, чем пакуете, как развер архива на выходе. Пытаюсь запаковать и отправить квик по инструкции без файла справки и т.п. В ответ приходит уведомление, что размер архива превышает лимит. Удаляю из архива файл info.exe. Новое письмо уходит, но общение с тех поддержкой после этого прекращается.
Ну какие странности!?! С луа Вы почему то используете медленный for pairs, а в С++ быстрый for...
Попробуйте такую формулу для lua
Код
function sum(t)
local sum = 0
for x=1, #t do
sum = sum + t[x]
end
return sum
end
P.S. Народ тут в поисках скорости в многопоточности и dll на плюсах совсем не видит, что миллион раз сладывает одно и тоже. Понимаю,что код во втором листинге делает это в качестве теста. Но посмотрите внимательно на свой "рабочий", нет ли там того же самого
"101200" преобразуйте в секунды примерно так 10*3600+12*60+00. Секунды как есть, минуты умножайте на 60, часы на 3600 (3600 секунд в 1 часе). Получаем 36720 секунд. Потом прибавляйте сколько нужно. К примеру +45 сек. И затем обратные действия. 36720+45 = 36765. 36765 делим на 60. Остаток от деления = 45- это секунды 36765 - 45 = 36720 (остались минуты и часы) 36720 делим на 3600, остаток от деления = 720. Делим на 60, получаем 12 - это минуты 36720 - 720 = 36000 (остались только часы) 36000 / 3600 = 10 - часы. В итоге 101245... как то так
делайте дополнительную функцию... У меня практически каждый скрипт индикатора начинается одинаково. Примерно так:
Код
function Start
--инициализация переменных
end
function OnCalculate(index)
if index==1 then
Start()
end
-- далее расчеты
end
P.S. в квике к сожалению, есть еще неразрешимые проблемы. Например, задвоение меток при переключении в режиме связанных окон. Периодически (уже третий год пошел) шлю им письма с архивом и тут писал. Письма они не получают, а баг даже типа "пофиксили" в 7.19. Но он и ныне там.... P.P.S извиняюсь, наболело
Добрый день. Проблема скорее всего в Вашем скрипте. Использую LuaSQLite3. Читаю ТВС. Раз в полсекунды (уверен, можно и чаще) пишу новые сделки в таблицу. Далее транзакциями пишу в базу свежую порцию сделок... Итак уже полгода и по всем акциям и фьючам. База занимает 2 гига.
Обфускатор, в качестве защиты, мало что даёт на самом деле.
Вы его уже пробовали, надеюсь? Да, с ним есть проблемы, но он добавляет 10 Х г...внокода от исходного. Итого 20кб исходного кода превращается 200кб невнятного луатекста
Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.
Смена инструмента осуществляется при помощи настроек диаграммы? Можете выложить Ваш скрипт. На вопрос выше ответим позднее.
Здравствуйте! Ошибка воспроизводится на следующем скрипте:
Код
Settings = {
Name = 'Example4',
Mult = 1,
Identifier = 'TESTCHART'
}
ChartID = 0
function Init()
-- ChartID = 0 -- идентификатор метки
plDate = '' -- дата метки
plTime = '' -- время метки
Data = 0 -- данные для графика
PrintDbgStr('[QLUA]: DelAllLabels ' .. tostring(DelAllLabels(Settings.Identifier)))
PrintDbgStr('[QLUA]: Init')
testmodify = false
return 1
end
function OnCalculate(index)
-- получение информации об инструменте
local t = getDataSourceInfo()
SecCode = t.sec_code
ClassCode = t.class_code
-- Дата и время для метки
plDate = string.format('%4d%02d%02d', T(index).year, T(index).month, T(index).day)
plTime = string.format('%02d%02d%02d', T(index).hour, T(index).min, T(index).sec)
Data = getNumberOf('all_trades') -- данные для метки
-- если ID метки не найден, то рисуем новую. Иначе меняем старую
if index == Size() then
if ChartID == 0 then
ChartID =
PlotLabel(
C(index),
plDate,
plTime,
'text ' .. Data .. ' ' .. SecCode,
Data .. ' ' .. SecCode,
Settings.Identifier,
'green'
)
PrintDbgStr('[QLUA]: ChartID =0, new Label, new ChartID= ' .. ChartID)
else
testmodify =
ModifyLabel(
C(index),
plDate,
plTime,
'text ' .. Data .. ' ' .. SecCode,
Data .. ' ' .. SecCode,
Settings.Identifier,
ChartID,
'green'
)
PrintDbgStr('[QLUA]: ChartID =' .. ChartID .. ' modified ' .. tostring(testmodify))
end
end
return index
end
function PlotLabel(fPRICE, fDATE, fTIME, fTEXT, fHINT, fCHARTTAG, fCOLOR)
local r, g, b = 255, 255, 255
if fCOLOR == 'green' then
r = 0
g = 255
b = 0
elseif fCOLOR == 'red' then
r = 255
g = 0
b = 0
end
local label_params = {
TEXT = tostring(fTEXT),
IMAGE_PATH= "",
ALIGNMENT = 'LEFT',
YVALUE = fPRICE,
DATE = fDATE,
TIME = fTIME,
R = r,
G = g,
B = b,
TRANSPARENCY = 0,
TRANSPARENT_BACKGROUND = 1,
FONT_FACE_NAME = 'Lucida Console',
FONT_HEIGHT = 10,
HINT = tostring(fHINT)
}
return AddLabel(fCHARTTAG, label_params) or -1
end
function ModifyLabel(fPRICE, fDATE, fTIME, fTEXT, fHINT, fCHARTTAG, fCHARTID, fCOLOR)
local r, g, b = 255, 255, 255
if fCOLOR == 'green' then
r = 0
g = 255
b = 0
elseif fCOLOR == 'red' then
r = 255
g = 0
b = 0
end
local label_params = {
TEXT = tostring(fTEXT),
IMAGE_PATH= "",
ALIGNMENT = 'LEFT',
YVALUE = fPRICE,
DATE = fDATE,
TIME = fTIME,
R = r,
G = g,
B = b,
TRANSPARENCY = 0,
TRANSPARENT_BACKGROUND = 1,
FONT_FACE_NAME = 'Lucida Console',
FONT_HEIGHT = 10,
HINT = tostring(fHINT)
}
return SetLabelParams(fCHARTTAG, fCHARTID, label_params)
end
function OnDestroy()
DelAllLabels(Settings.Identifier)
end
В режиме связанных окон переключаемся на другой инструмент и потом обратно. Получаем две (!) потерявшиеся метки
Обнаружил, что getItem из таблицы всех сделок в индикаторе запаздывает. Итак, делаем простой, но "тяжелый" индикатор
Код
Settings = {
Name = "*MyTest3",
line = {Name = "Test", Color = RGB(0, 100, 0), Type = TYPE_CANDLE, Width = 1}
}
local counter = 0
local lastNum = 0
function Init()
return 1
end
function OnCalculate(index)
if index == Size() then
local n = getNumberOf("all_trades")
for i = lastNum, n - 1 do
row = getItem("all_trades", i)
if row.period == 1 and row.sec_code == "RIM8" and row.class_code == "SPBFUT" then
counter = counter + row.qty
end
end
lastNum = n
return counter
end
end
Накладываем на дневной график только за сегодня на подключенный квик. По идее, объем и показания индикатора должны совпадать, но есть разница на одну самую последнюю сделку.
"Цирк" легко проверить на таблице сделок и стакану....Либо прочитайте уже наконец инструкцию. Раздел 3. Таблица обезличенных сделок. Там черным по белому написано "«Купля» – заключена сделка путем выставления заявки на покупку против находящейся в торговой системе котировки на продажу;"
Перезалил бота сюда. В telegram_settings.lua нужно указать настройки бота. В квике запустить telegram.lua Помимо сообщений о сделках и заявках, сообщает так же по запросам: Fut - деньги на фортс (вариационная маржа) Pos - позиции на фортс Usd - текущие котировки USDRUB_TOM Eur - соответственно EURRUB_TOM Если написать код фьюча, то можно получить его котировку. Любые другие символы сообщают, подключен ли квик или нет. В файл log.txt пишет номер последнего запроса
У меня данная штука запустилась. Накидал все везде))) Данным ботом пользуюсь уже с месяц. В файле telegram_settings.lua нужно ввести настройки своего бота. Сам бот тут. Там есть что еще допиливать...
Задача больше концептуальная. Есть индикатор, который обрабатывает таблицу все сделок. Соответственно, таблица каждый день новая... Вопрос в том, чтобы как то сохранять историю вычислений за предыдущие дни, допустим, в файл. Сохранение в файл не проблема, проблема в том, что скрипт индикатора должен как -то узнать, когда записывать данные в файл. Вряд ли функция OnCalculate знает, что она сегодня вызывается последний раз. Возможно ли как-то запустить функцию OnCalculate (или какую то другую функция) по времени из индикатора, допустим в 23:55?
Settings=
{
Name = "Example1" ,
Mult = 1
}
function Init()
OnCalcCo unt=0
return 1
end
function OnCalculate(index)
if index==1 then message ("Index= " .. tostring(index) .." Mult= " .. tostring(Settings.Mult)) end
return index*Settings.Mult
end
Добавляю индикатор - получаю одно окно сообщений. Меняю в свойствах индикатора Mult, получаю еще два окна!
Так и задумано. К INIT() вопросов нет. Все что я сделал, это : 1. Добавил индикатор (приложил скрин). Счетчик вырос на число свечек. 2. Один раз изменил его свойства, Mult менял на 2 (второй скрин).
После шага 2 счетчик должен вырасти на число баров,а фактически вырос на (число баров)*2
Добрый день. Заметил такую особенность. При добавлении своего индикатора, OnCalculate, как и положено, "проходит" по всем свечкам. Но при изменении свойств индикатора, происходит два "прохода". Первый со старыми свойствами, второй с новыми. Так и должно быть? Квик в офлайне.
Код
Settings=
{
Name = "Example1" ,
Mult = 1
}
function Init()
OnCalcCo unt=0
return 1
end
function OnCalculate(index)
OnCalcCo unt=OnCalcCount+1
PrintDbgStr("[QLUA] " .. tostring(OnCalcCount) .. " Mult " .. tostring(Settings.Mult))
return index*Settings.Mult
-- return nil
end
После добавления (счетчик увеличился на количество свечек) Счетчик соответствует количеству свечей. При изменении свойств счетчик вырос на двойное число свечей (два прохода)