Приведенный код не является рабочим примером, он показывает только часть по заданному вопросу. Если нужен полный рабочий код то выглядит примерно так:
Код
Settings = {
Name = "имя индикатора" ,
MY_LOVE_PARAMETER = 300,
line = {
{
Name = "!!test",
Color = RGB(0, 255, 0),
Type = TYPE_LINE,
Width = 2
}
}
}
function Init()
return #Settings.line
end
function OnCalculate(indx)
if indx < Size () - Settings.MY_LOVE_PARAMETER then return end
end
Арсений написал: Я тогда изучу внимательнее и отпишусь позже, если будет резон.
Изучил. В принципе, проблема разбилась на две. По первой очень хотелось бы вашего мнения
1) Я сравнивал свои тиковые данные с данными с сайта Финама. Встречается одна и та же особенность - очень небольшой процент сделок, меньше 0.5%, имеет расхождение по времени в одну секунду Вот как это выглядит. Список таких сделок из моего файла (ТОС):
Скрытый текст
Скрытый текст
20180226;10:04:08;2366.8;1;B;35118
Скрытый текст
20180226;10:12:32;2374.7;5;S;35284
Скрытый текст
20180226;10:12:32;2374.65;1;S;35284
Скрытый текст
20180226;10:12:32;2374.65;2;S;35284
Скрытый текст
20180226;10:12:32;2374.5;1;S;35284
Скрытый текст
20180226;10:12:32;2374.5;2;S;35286
Скрытый текст
20180226;10:12:32;2374.4;2;S;35286
Скрытый текст
20180226;10:12:32;2374.4;20;S;35326
Скрытый текст
20180226;10:12:32;2374.35;2;S;35328
Скрытый текст
20180226;10:12:32;2374.35;5;S;35328
Скрытый текст
20180226;10:34:15;2374.35;2;B;36068
Скрытый текст
20180226;12:44:27;2367.7;1;S;37192
Скрытый текст
20180226;12:55:02;2360.05;2;B;36638
Скрытый текст
20180226;15:59:06;2370.55;1;B;35812
Скрытый текст
20180226;17:00:00;2365.6;1;S;35468
Скрытый текст
20180226;18:20:48;2358;1;B;35792
Скрытый текст
20180226;18:20:48;2358;7;B;35784
Скрытый текст
20180226;18:20:48;2358;3;B;35790
Скрытый текст
20180226;19:05:14;2361.4;1;S;35468
Скрытый текст
20180226;20:49:53;2365.85;1;B;35798
Скрытый текст
20180226;23:09:35;2366.9;2;B;35728
Из файла Финама:
Скрытый текст
Скрытый текст
20180226;10:04:09;2366.8;1;B
Скрытый текст
20180226;10:12:33;2374.7;5;S
Скрытый текст
20180226;10:12:33;2374.65;1;S
Скрытый текст
20180226;10:12:33;2374.65;2;S
Скрытый текст
20180226;10:12:33;2374.5;1;S
Скрытый текст
20180226;10:12:33;2374.5;2;S
Скрытый текст
20180226;10:12:33;2374.4;2;S
Скрытый текст
20180226;10:12:33;2374.4;20;S
Скрытый текст
20180226;10:12:33;2374.35;2;S
Скрытый текст
20180226;10:12:33;2374.35;5;S
Скрытый текст
20180226;10:34:16;2374.35;2;B
Скрытый текст
20180226;12:44:28;2367.7;1;S
Скрытый текст
20180226;12:55:03;2360.05;2;B
Скрытый текст
20180226;15:59:07;2370.55;1;B
Скрытый текст
20180226;17:00:01;2365.6;1;S
Скрытый текст
20180226;18:20:49;2358;7;B
Скрытый текст
20180226;18:20:49;2358;1;B
Скрытый текст
20180226;18:20:49;2358;3;B
Скрытый текст
20180226;19:05:15;2361.4;1;S
Скрытый текст
20180226;20:49:54;2365.85;1;B
Скрытый текст
20180226;23:09:36;2366.9;2;B
Во всех файлах количество сделок (без учета мусора) совпадает. Я не сохранял id сделок у себя, но думаю хорошо видно, что сделки совпадают с точностью до секунды. Остальные сделки скриптом нашлись в обоих файлах.
Такое встречается у меня не только в тот день - я выборочно прогнал историю за один из беспроблемных дней - такая же картина, у небольшого числа сделок идет расхождение в секунду.
Что это может быть? Из-за чего так?
2) В почти все файлы добавилась история какой-то предположительно акции. Я не проверял на 100%, но очень похоже на Газпром или НЛМК. Я посчитал, я сохранил историю 18ти инструментов в тот день, и только в один из них это не добавилось. Во всех остальных 17ти есть. Количество строк разное, в некоторых совпадает, но в целом какой-то рандом, колеблется от 32475 до 39738. С 39738, кажется, 5 файлов и визуально совпадает начало и конец Время торгов тоже характерное , с 10 до 18.48 Первые 300+ сделок действительно отображаются в неправильное время
Скрытый текст
Скрытый текст
20180226;9:59:59;148.5;10;S;0
Скрытый текст
20180226;9:59:59;148.5;2;S;0
Скрытый текст
20180226;9:59:59;148.5;6;B;0
Скрытый текст
20180226;9:59:59;148.5;10;B;0
Скрытый текст
20180226;9:59:59;148.5;1;B;0
Скрытый текст
20180226;9:59:59;148.5;1;B;0
Скрытый текст
20180226;9:59:59;148.5;1;B;0
Но учитывая, что у меня какие-то расхождения в секунду обнаружились выше, может дело в этом Не знаю, говорит ли вам о чем-то эта информация, но вот на всякий случай описываю. Для себя я эту часть проблемы "закрыл", бо в дальнейшем все равно буду получать котировки скриптом. Да и нужные котировки все загрузились :)
Качнул историю Газпрома за 26ое - это оно! 39738 сделок, и начинается все в 9:59:59 )) Ок, я не в курсе, почему с этого времени, какой-то предторговый период в акциях что ли. Но почему-то не во всех файлах она полностью качнулась.
function VS() -- функция VS local H_tmp={} -- объявление массива под значения High local L_tmp={} -- объявление массива под значения Low local V_tmp={} -- объявление массива под значения VOLUME local it = {[1]=0, l=0} -- в массив попадают номера свечек, из которых потом ищется нужная свечка где и рисуется индикатор return function (I, Fsettings, ds) -- возвращает значение function (I, Fsettings, ds) local Fsettings=(Fsettings or {}) local Ba = (Fsettings.NUMBER_OF_BARS or 300) -- присваивается значение количество баров или 300 for li=Ba,0,-1 do
Aidar написал: Имелось ввиду что на языке lua корректно следующее выражение или нет
Все равно не понятно. В выражении нет ничего что может вызывать такой вопрос. Просто складываются два числа которые возвращают функции H и L
Давайте договоримся что Вы запустите код через "Сервисы" - "Lua скрипты" и если он вдруг не заработает тогда Вы вернетесь и сообщите текст ошибки. Если ошибки нет, значит согласно синтаксису всё правильно.
Проверьте, не пытаетесь ли Вы с помощью li+ 1 заглянуть в будущее. Простейший прием - вставить временную отладочную выдачу li+ 1 и H(li+ 1) с помощью Message перед ее использованием. Сравните с фактическими границами доступных индексов..
Подскажите, как получать сообщение 10 с конца, таблицы обезличенных сделок (например: qty) через getItem(). Пробовал, но увы не вышло. Если не трудно покажите полностью код с данной функцией.
vit10052 написал: Подскажите, как получать сообщение 10 с конца, таблицы обезличенных сделок (например: qty) через getItem(). Пробовал, но увы не вышло. Если не трудно покажите полностью код с данной функцией.
Например в таблице транзакций есть стоп заявки или рыночные заявки. Возможно ли написать такой скрипт что бы при выполнении нужного условия скрипт доставал и выставлял нужные заявки?
Порядковый номер строки, который мы видим в таблице Рабочего месте QUIK, не совпадает с индексом этой строки, да? (Замучилась искать ошибку в
Код
for n=getNumberOf("all_trades")-1,0,-1 do
local trade = getItem("all_trades", n)
if trade then
last = last or n
end
end
message("№ последней сделки: "..last)
Ирина написал: Порядковый номер строки, который мы видим в таблице Рабочего месте QUIK, не совпадает с индексом этой строки, да?
Это вообще разные таблицы... Таблица с именем «all_trades» это внутренняя таблица Quik, которую вы не видите в ГПИ, а обращаетесь к ней через скрипт. А таблицы которые вы создаёте через «Создать окно / Таблица обезличенных сделок...» это ГПИ таблицы, в которые вы добавляете фильтры, какие инструменты показывать в них. Поэтому, если создадите две таблицы обезличенных сделок по двум инструментам, то будете видеть в них только каждый инструмент по отдельности. А внутренняя таблица «all_trades» будет содержать сделки для обоих этих инструментов вперемешку.
Suntor написал: А внутренняя таблица «all_trades» будет содержать сделки для обоих этих инструментов вперемешку.
У меня в коде нет фильтра по инструменту, но есть в "Заказ данных/ Поток котировок", и код выдает индекс аккурат на 1 меньше номера последней строки в QUIK. Т.е. если ничего не делать с полученной через "Создать окно" таблицей, связь всё-таки есть...
Ирина написал: У меня в коде нет фильтра по инструменту, но есть в "Заказ данных/ Поток котировок", и код выдает индекс аккурат на 1 меньше номера последней строки в QUIK. Т.е. если ничего не делать с полученной через "Создать окно" таблицей, связь всё-таки есть...
Просто при ваших условиях, у вас эти индексы совпали с точностью до единицы. Но это разные таблицы с разными индексами. Связь там есть в том смысле, что сами ГПИ таблицы как бы берут информацию из главной таблицы «all_trades». Вы попробуйте настроить несколько разных таблиц всех сделок для разных инструментов, у сразу увидите, что там ничего не совпадает. У вас в одной таблице будет 100'000 элементов, в другой 200'000, в третьей 350'000, а в таблице «all_trades» будет при этом сразу 650'000 элементов. И соответственно номера строк в ГПИ таблицах и индекс в «all_trades» совершенно никак не совпадут между собой.
OnStop() не срабатывает при выключении QUIK. Даже после перезагрузки компьютера при повторном включении QUIK у скрипта горит зеленая стрелочка. В чем может быть дело? На кнопку "Остановить" реагирует правильно.
Код
local fRun = true
function main()
while fRun do
message("Прошла минута")
sleep(60000)
end
end
function OnStop()
fRun = false
message("Вызван OnStop")
end
Ирина написал: OnStop() не срабатывает при выключении QUIK. Даже после перезагрузки компьютера при повторном включении QUIK у скрипта горит зеленая стрелочка. В чем может быть дело?На кнопку "Остановить" реагирует правильно.
OnStop срабатывает. Но не срабатывает message если OnStop случился при закрытии квика. Почему не выяснял, это к разработчикам. То же самое и с OnClose. Если запустите логирование, увидите что события случаются и из них можно например данные по файлам сохранить. Я на днях приводил пример скрипта и лога в соседней теме. https://forum.quik.ru/messages/forum10/message34120/topic3979/#message34120
Предполагаю что message уже просто в "никуда" уходит хотя и вызывается.
В догонку, то что "Даже после перезагрузки компьютера при повторном включении QUIK у скрипта горит зеленая стрелочка" - так и быть должно. Ссылку уже потерял но тоже в одной из соседних тем есть ответ разработчиков, если закрыть квик с запущеным скриптом он перезапустится при запуске квика.
BlackBoar, а сами скрипты у Вас останавливаются? У меня - нет. Т.е. тут и fRun в "никуда" уходит... Спасибо за ваши эксперименты по теме - интересно. В моем случае, думаю, просто что-то неправильно функционирует...
BlackBoar написал: В догонку, то что "Даже после перезагрузки компьютера при повторном включении QUIK у скрипта горит зеленая стрелочка" - так и быть должно. Ссылку уже потерял но тоже в одной из соседних тем есть ответ разработчиков, если закрыть квик с запущеным скриптом он перезапустится при запуске квика.
Опередили. Спасибо! Ну и дела! И зачем тогда этот OnStop()...
1. Наш IsRun=false срабатывает хотя вы этого возможно не замечаете и поток мэйн останавливается "честно", квику не приходится его убивать. 2. Выше писал уже, можете сохранить все свои данные, освободить обьекты, сбросить логи, тд, тп. А при старте квика на следующее утро подгрузить все обратно. Для того и события же в общем то придумали
Возник очередной нубский вопрос. Какие максимальные значения может принимать тип Number? Из документации и гугла однозначно понятно что для чисел с плавающей точкой используется сишный 8-битовый double.
По целочисленным наткнулся на ряд комментариев типа "может зависить от реализации луа".
Поэтому уточненный вопрос звучит так, какое максимальное допустимое целое число в луа-машинке QUIK? Если такого рода вещи есть где-то в документации по QLua подскажите пожалуйста где именно, я не нахожу. А документация по луа "вообще" в свете комментариев "может зависеть от реализации" как-то не вызывает доверия ))
BlackBoar написал: Возник очередной нубский вопрос. Какие максимальные значения может принимать тип Number? Из документации и гугла однозначно понятно что для чисел с плавающей точкой используется сишный 8-битовый double.
По целочисленным наткнулся на ряд комментариев типа "может зависить от реализации луа".
Поэтому уточненный вопрос звучит так, какое максимальное допустимое целое число в луа-машинке QUIK? Если такого рода вещи есть где-то в документации по QLua подскажите пожалуйста где именно, я не нахожу. А документация по луа "вообще" в свете комментариев "может зависеть от реализации" как-то не вызывает доверия ))
В QUIK 32-битная Lua 5.1. Максимальное целое знаковое число, соответственно, 2^31 - 1
Надо понимать, что в Lua 5.1 нет понятия целого числа (Integer). Есть только Number, который маппится нативно на что-нибудь типа ptrdiff_t или double. Например, в исходниках LuaForWindows 5.1.5-52 в luaconf.h:
Enfernuz написал: Надо понимать, что в Lua 5.1 нет понятия целого числа (Integer). Есть только Number, который маппится нативно на что-нибудь типа ptrdiff_t или double. Например, в исходниках LuaForWindows 5.1.5-52 в luaconf.h:
Код
# define LUA_NUMBER double
О. По ходу, я ошибаюсь. В том же файле есть:
Код
/*
@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger.
** CHANGE that if ptrdiff_t is not adequate on your machine. (On most
** machines, ptrdiff_t gives a good choice between int or long.)
*/
#define LUA_INTEGER ptrdiff_t
Насчёт ptrdiff_t есть хорошая статья: https://www.viva64.com/ru/a/0050/#ID0EUGAC На 32-битной сборке размер LUA_INTEGER, по сему, будет 32 бита. Опять же, с учётом знаковости, максимально можно представить 2^31-1.
Enfernuz написал: Надо понимать, что в Lua 5.1 нет понятия целого числа (Integer). Есть только Number, который маппится нативно на что-нибудь типа ptrdiff_t или double.
Это я как раз прекрасно понимаю. Тут нюанс в том что исходники QLua в отличие от исходников луа не раскрываются и прямой вопрос об их содержимом скорее всего будет проигнорирован поэтому я задал вопрос "вообще". Что касается исходников Lua 5.1.5.
Код
// luaconf.h
#define LUA_NUMBER double
typedef LUA_NUMBER lua_Number;
// lobject.h
/*
** Union of all Lua values
*/
typedef union {
GCObject *gc;
void *p;
lua_Number n;
int b;
} Value;
Далее цитировать не буду, из того что я там накопал и наэкспериментировал сам вроде бы следует что лушный Number всегда хранится как Value.n Value.b как ни странно равно 0 даже в том случае когда я в луа явно запихнул в этот Number число без плавающей точки и достаточно маленькое чтобы поместиться даже в byte.
Но я до конца в правильности своих выводов не уверен поэтому и задаю тут всякие дурацкие вопросы ))
Еще дилетантский вопросик. Перечитывал в очередной раз "Руководство пользователя QLua", сложилось такое впечатление что в талицах которые возвращает API QUIK ключи (названия параметров) всегда имеют строковый тип. Подскажите пожалуйста так ли это или я где-то что-то пропустил? Речь только про таблицы которые возвращает (или присылает в коллбэк) сам терминал, не про вообще обьекты луа которые можно раскопать внутри луа-машинки.
BlackBoar написал: Перечитывал в очередной раз "Руководство пользователя QLua", сложилось такое впечатление что в талицах которые возвращает API QUIK ключи (названия параметров) всегда имеют строковый тип. Подскажите пожалуйста так ли это или я где-то что-то пропустил?
Совсем дурной вопрос к опытным... Подскажите, пожалуйста, как быстрее для выполнения кода и грамотнее с т.з. программирования: задавать неизменные параметры транзакции каждый раз при вызове функции, зато локализованные внутри неё, или обращаться к внешним параметрам, локальным для внешнего блока? Пример:
Код
local function OpenOrders(order_op)
local order_ps = { ['Торговый счет'] = 'SPBFUTXXXXX',
['CLASSCODE'] = 'SPBFUT',
['Инструмент'] = 'SiZ8',
['TRANS_ID'] = '333',
['ACTION'] = 'Ввод заявки',
['К/П'] = order_op,
['Количество'] = '1',
['Переносить заявку'] = 'Да',
['Дата экспирации'] = '20181221' }
for i=price1,price2,step do
order_ps['Цена'] = tostring(i)
local res = sendTransaction(order_ps)
end
end
--ИЛИ
local order_ps = { ['Торговый счет'] = 'SPBFUTXXXXX',
['CLASSCODE'] = 'SPBFUT',
['Инструмент'] = 'SiZ8',
['TRANS_ID'] = '333',
['ACTION'] = 'Ввод заявки',
['Количество'] = '1',
['Переносить заявку'] = 'Да',
['Дата экспирации'] = '20181221' }
local function OpenOrders(order_op)
order_ps['К/П'] = order_op
for i=price1,price2,step do
order_ps['Цена'] = tostring(i)
local res = sendTransaction(order_ps)
end
end
Ирина написал: Подскажите, пожалуйста, как быстрее для выполнения кода и грамотнее с т.з. программирования: задавать неизменные параметры транзакции каждый раз при вызове функции, зато локализованные внутри неё, или обращаться к внешним параметрам, локальным для внешнего блока?
Теория говорит о том что в первом варианте таблица выходит из области видимости каждый раз при завершении функции. И соответственно может быть прибрана сборщиком мусора. Если вам надо чтобы экземпляр таблицы точно сохранялся тот же между вызовами то вариант 2 разумеется. Логика примера КМК подразумевает именно это
На практике же время на формирование этой таблицы не так чтобы было заметно на фоне времени обработки заявки ))
BlackBoar, т.е. получается, 1 вариант - освобождение памяти; 2 - уменьшение работы ф-ции. Ясненько, спасибо.
Цитата
BlackBoar написал: Если вам надо чтобы экземпляр таблицы точно сохранялся тот же между вызовами
Да нет, параметры нужны только этой ф-ции. Но таблица сама по себе ссылочный тип данных (на них локализация вообще эффект оказывает?) - не размножается, не мусорит. Вот я и подумала, зачем её при каждом вызове заново создавать...
Цитата
BlackBoar написал: На практике же время на формирование этой таблицы не так чтобы было заметно на фоне времени обработки заявки ))
Ирина написал: Да нет, параметры нужны только этой ф-ции. Но таблица сама по себе ссылочный тип данных (на них локализация вообще эффект оказывает?) - не размножается, не мусорит. Вот я и подумала, зачем её при каждом вызове заново создавать...
А вот для такой постановки вопроса следует отметить нюансик. В вашем варианте 1 параметры таблицы при каждом вызове гарантировано будут такие как вы написали. Потому что в начале вызова луа их заново установит. В варианте же 2 есть какой-то риск что таблица будет изменена между вызовами, в результате той или иной ошибки в коде. Ощибка копипаста типичное дело в общем то :)
Кстати про local. Давно подозревал что это больше домыслы чем факт. Собрался наконец посмотреть, в вашем варианте 2 менял local на global (то есть просто на отсутствие спецификатора разумеется). Разница в скорости пару процентов ))))
Ирина написал: BlackBoar , т.е. получается, 1 вариант - освобождение памяти; 2 - уменьшение работы ф-ции. Ясненько, спасибо.
Не обратил спросонья внимания на эту фразу ) Об эффективности использования памяти я вообще ничего не имел в виду. На самом деле с точки зрения памяти как правило лучше один раз распределить и потом 100500 раз использовать чем каждый раз дергать распределять. Но это отдельная необьятная тема, если вдруг надо жестко вручную управлять распределением памяти то вообще говоря под шкаф этот луа, надо использовать С/С++. Я же речь вел только о том что вариант 1 гарантирует идентичность данных в обьекте (несмотря на формальное нарушение принципа отделять данные от кода), а вариант 2 гарантирует идентичность именно обьекта а не данных в нем )
Думаю на эту тему не один десяток диссеров защитили )))) На практике, над вами же не висят какие-то корпоративные нормы разработки. Поэтому так как вы сами не запутаетесь. Например выделять их в отдельные луа-файлы и прицеплять по мере необходимости. А будет их количество расти по мере развития вашего робота - переходить на файлы данных, базы данных и тд ))