Строковые шаблоны

At the foundation of patterns are character classes. These classes represent sets of characters. Lua's classes are
x (where x is not one of the magic characters ^$()%.[]*+-?) --- represents the character x itself.
. --- represents all characters.
%a --- represents all letters.
%c --- represents all control characters.
%d --- represents all digits.
%l --- represents all lowercase letters.
%p --- represents all punctuation characters.
%s --- represents all space characters.
%u --- represents all uppercase letters.
%w --- represents all alphanumeric characters.
%x --- represents all hexadecimal digits.
%z --- represents the character with representation 0. Note that embedded zeroes in a pattern will not work. Use this instead.

The upper cased version of the above reverses the meaning of said (i.e. %A --- represents all non-letters).
%x (where x is any non-alphanumeric character) --- represents the character x. This is the standard way to escape the magic characters. Any punctuation character (even the non magic) can be preceded by a '%' when used to represent itself in a pattern.
[set] --- represents the class which is the union of all characters in set. A range of characters may be specified by separating the end characters of the range with a '-'. All classes %x described above may also be used as components in set. All other characters in set represent themselves. For example, [%w_] (or [_%w]) represents all alphanumeric characters plus the underscore.
[^set] --- represents the complement of set, where set is interpreted as above.

All patterns are made up of a sequence of these classes. For example, if you wanted to match the string "###Abc" (# designates a digit), you would use the pattern "%d%d%dAbc". By adding modifiers, you can change the meaning of these classes. Let x be the class we want to modify.
x* -- matches 0 or more repetitions of x. Will always match the longest possible chain.
x+ -- matches 1 or more repetitions of x. Will always match the longest possible chain.
x- -- matches 0 or more repetitions of x. Will always match the shortest possible chain.
x? -- matches 0 or 1 occurrence of x.

There are also four special pattern elements
%n -- n must be a number between 1 and 9. Matches the nth captured substring (see below)
%bxy -- matches a substring starting with x and ending with y. The substring must also have the same number of x and y.
^ -- When at the beginning of a pattern, it forces the pattern to match the beginning of a string
$ -- When at the end of a pattern, it forces the pattern to match the end of a string

When ^ or $ is anywhere else in a pattern, it has no special meaning.

Patterns may also have subpatterns. These are enclosed with () and are counted as matches are found. They can be accessed using the %n element mentioned above. Using the empty capture "()" will return the string position where a match is found.

 

Примеры использования:

msg:gsub('"?%w+_?%w*_?%w*"?:',function(w) t_nm[#t_nm+1]=w:gsub('"?:?','') end)

msg:gsub(':"?%w+\+?_?%w*_?%w*"?%.?%d*',function(w) t_val[#t_val+1]=w:gsub('"?:?','') end)

gsub ищет вхождения по шаблону и для каждого найденного применяет анонимную функцию.

Разбор строки JSON:

js_dec:match(':{%p%w+%p+%w+%p+%w+%p+%w+%p}'):gsub('%p%w+%p:',function(w) t_nm[#t_nm+1]=w:gsub('%p','') end)
js_dec:match(':{%p%w+%p+%w+%p+%w+%p+%w+%p}'):gsub(':%p%w+%p',function(w) t_val[#t_val+1]=w:gsub('%p','') end)

Работа с графиками в Quik

Сегодня хочу рассказать немного о том, как работать с графиками Квика в Lua скриптах.
И так как написано в документации, для работы с графиками разработчики нам предоставили 3 функции :
getNumCandles()
getLinesCount()
getCandlesByIndex()
Вначале расскажу немного подробнее про каждую из них.

getNumCandles (строковый идентификатор графика)
Даная функция возвращает нам количество свечей (точек, если линия) для графика с идентификатором, который мы туда передали в качестве аргумента. Напомню, идентификаторы для графиков задаются в настройках графика: вкладка Дополнительно. К сожалению, в отличии от qpile, где мы могли не задавать идентификатор для графиков цен инструментов, в луа идентификатор необходимо задавать для всех графиков.

getLinesCount (строковый идентификатор графика)
Данная функция возвращает количество линий для графика с идентификатором указанным в качестве аргумента. Актуальна для индикаторов состоящих из более чем одной линии, например Аллигатор. Для графика цены данная функция вернет нам 1.

getCandlesByIndex (STRING tag, NUMBER line, NUMBER first_candle, NUMBER count)
Это главная функция для работы с графиками в Квик. Она нам возвращает, собственно, свечки, а если точнее — таблицу с свечами.
Параметры которые мы передаем в функцию :

tag – строковый идентификатор графика или индикатора;
line – номер линии графика или индикатора, первая линия имеет номер 0;
first_candle – индекс первой свечки, первая (самая левая) свечка имеет индекс 0;
count – количество запрашиваемых свечек.

Возвращаемые значения:

t – таблица содержащая запрашиваемые свечки,
n – количество свечек в таблице t ,
l – легенда (подпись) графика.

Приведу немного примеров. В качестве запрашиваемого графика подразумеваю график цены инструмента. Для графиков с большим числом линий необходимо будет просто указывать другой номер линии.
С помощью следующего кода получаем последнюю свечку графика с идентификатором price и выводим несколько ее параметров с помощью сообщения терминала Quik

t={}
number_of_candles=getNumCandles('price')
t,_,legend=getCandlesByIndex('price',0,number_of_candles-1,1)
message(legend.."Close="..t[0].close.." Open="..t[0].open.." Vol="..t[0].volume,1)

Как мы видим по описанию, данная функция возвращает нам 3 значения. 2 из них мы принимаем, второе пропускаем с помощью «глупой переменной» (dummy variable). Первое значение — таблица Луа, содержащая свечки. Если наш запрос к графику прошел успешно, то данная таблица будет не пустой. Ключом в данной таблице являются целые числа и начинается нумерация с 0. Так что первая и единственная, запрошенная нами свеча запрашивается вот так

t[0]

Так как свеча также является таблицей, то для получения, собственно, интересующей нас информации, мы должны обратится к нужным нам полям. Открываем документацию и читаем :

Свечки графика

Описание параметров свечки графика:

Параметр Тип            Описание
open          NUMBER   Цена открытия
close         NUMBER   Цена закрытия
high           NUMBER   Максимальная цена сделки
low            NUMBER   Минимальная цена сделки
volume      NUMBER   Объем последней сделки
datetime    TABLE       Дата и время
doesExist  NUMBER   Признак расчета индикатора при наличии свечки. Возможные значения: «0» – индикатор не рассчитан,«1» – индикатор рассчитан

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

Рассмотрим следующий пример. Запросим несколько свечей, а именно, количество указанное в переменной amount:

t={}
res=0
legend=""
number_of_candles=getNumCandles('price')
amount=10
t,res,legend=getCandlesByIndex('price',0,number_of_candles-amount-1,amount)
message(" Получили "..res.." свечек",1)
message(legend.."Close="..t[0].close.." Open="..t[0].open.." Vol="..t[0].volume,1)
message(legend.."Close="..t[res-1].close.." Open="..t[res-1].open.." Vol="..t[res-1].volume,1)

Запрашивая несколько свечей стоит всегда помнить, что в качестве параметра first_candle нужно всегда указывать индекс самой «левой» свечки. И помнить, что нумерация начинается с 0 ;)
На выходе, если все удалось, мы получим таблицу с ровно 10 свечками. В данном примере я, также, принял от вызываемой функции значение n – количество свечек в таблице tи присвои его переменной res.

Источник: http://www.qlua.org/blog/rabota-s-grafikami-v-quik/

Администрирование

Сегодня
Вчера
Эта неделя
Прошлая неделя
Этот месяц
Прошлый месяц
Вся статистика
50
3
50
26686
105
219
26766

IP: 3.135.191.223
Время: 2024-09-16 18:45:09
Счетчик joomla