QLUA

Страницы: Пред. 1 2 3 4 5 След.
RSS
QLUA, вопросы начинающих.
 
Aidar,

Приведенный код не является рабочим примером, он показывает только часть по заданному вопросу.
Если нужен полный рабочий код то выглядит примерно так:
Код
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

 
В фунцкции main, в цикле for объявляю переменные

function main()

Li_3 = NUMBER_OF_BARS  --количество баров,переменная была объявлена ранее со значением например 200

 for Li_4 = Li_3,0,-1 do

 Ld_0= H(Li_4 + 1) - L(Li_4 + 1), --Ld_0 по задумке равняется  High(Li_4 + 1) - (Low(Li_4 + 1)
 Ld_1= H(Li_4 + 2) - L(Li_4 + 2),

.........................................................

end
end

При запуске выводит unexpected symbol near '='

При  том ошибку выводит на строку  Ld_1= H(Li_4 + 2) - L(Li_4 + 2), а на  строку с Ld_0= H(Li_4 + 1) - Low(Li_4 + 1) ошибку не выводит
 
Цитата
Aidar написал:
В фунцкции main, в цикле for объявляю переменные

function main()

Li_3 = NUMBER_OF_BARS  --количество баров,переменная была объявлена ранее со значением например 200

 for Li_4 = Li_3,0,-1 do

 Ld_0= H(Li_4 + 1) - L(Li_4 + 1), --Ld_0 по задумке равняется  High(Li_4 + 1) - (Low(Li_4 + 1)
 Ld_1= H(Li_4 + 2) - L(Li_4 + 2),

.........................................................

end
end

При запуске выводит unexpected symbol near '='

При  том ошибку выводит на строку  Ld_1= H(Li_4 + 2) - L(Li_4 + 2), а на  строку с Ld_0= H(Li_4 + 1) - Low(Li_4 + 1) ошибку не выводит
Вопрос не актуален.Нашел причину ошибки
 
Цитата
Арсений написал:
Я тогда изучу внимательнее и отпишусь позже, если будет резон.
Изучил. В принципе, проблема разбилась на две. По первой очень хотелось бы вашего мнения

1) Я сравнивал свои тиковые данные с данными с сайта Финама. Встречается одна и та же особенность - очень небольшой процент сделок, меньше 0.5%, имеет расхождение по времени в одну секунду
Вот как это выглядит. Список таких сделок из моего файла (ТОС):
Скрытый текст

Из файла Финама:
Скрытый текст

Во всех файлах количество сделок (без учета мусора) совпадает. Я не сохранял id сделок у себя, но думаю хорошо видно, что сделки совпадают с точностью до секунды. Остальные сделки скриптом нашлись в обоих файлах.

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

Что это может быть? Из-за чего так?

2) В почти все файлы добавилась история какой-то предположительно акции. Я не проверял на 100%, но очень похоже на Газпром или НЛМК.
Я посчитал, я сохранил историю 18ти инструментов в тот день, и только в один из них это не добавилось. Во всех остальных 17ти есть.
Количество строк разное, в некоторых совпадает, но в целом какой-то рандом, колеблется от  32475 до 39738. С 39738, кажется, 5 файлов и визуально совпадает начало и конец
Время торгов тоже характерное , с 10 до 18.48
Первые 300+ сделок действительно отображаются в неправильное время
Скрытый текст

Но учитывая, что у меня какие-то расхождения в секунду обнаружились выше, может дело в этом
Не знаю, говорит ли вам о чем-то эта информация, но вот на всякий случай описываю.
Для себя я эту часть проблемы "закрыл", бо в дальнейшем все равно буду получать котировки скриптом. Да и нужные котировки все загрузились :)
 
Качнул историю Газпрома за 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

Ld_0= H( li+ 1) - L(li + 1), --Ld_0 по задумке равняется  High(li + 1) - Low(li + 1)
 Ld_1= H(li + 2) - L(li + 2)
...........................................................
end

не совсем могу понять как лучше в qlua записать следующее выражение

Ld_0= H( li+ 1) - L(li + 1), --Ld_0 по задумке равняется  High(li + 1) - Low(li + 1)
 Ld_1= H(li + 2) - L(li + 2)

Или же в таком виде будет корректно?
 
Цитата
Aidar написал:
как лучше в qlua записать

куда записать?
 
Цитата
Sergey Gorokhov написал:
Цитата
Aidar   написал:
как лучше в qlua записать
куда записать?
Имелось ввиду что на языке lua корректно следующее выражение или нет

Ld_0= H( li+ 1) - L(li + 1), --Ld_0 по задумке равняется  High(li + 1) - Low(li + 1)  
 Ld_1= H(li + 2) - L(li + 2)
 
Цитата
Aidar написал:
Имелось ввиду что на языке lua корректно следующее выражение или нет

Все равно не понятно.
В выражении нет ничего что может вызывать такой вопрос.
Просто складываются два числа которые возвращают функции H и L

Давайте договоримся что Вы запустите код через "Сервисы" - "Lua скрипты" и если он вдруг не заработает тогда Вы вернетесь и сообщите текст ошибки.
Если ошибки нет, значит согласно синтаксису всё правильно.
 
Цитата
Aidar написал:
Ld_0= H( li+ 1) - L(li + 1),

хотя, смущает запятая в конце строки, ее не должно быть
 
Запустил  через "Сервисы" - "Lua скрипты",ошибку не выдает . Добавил в папку LuaIndicators и попробовал добавить на график через терминал.Вышла ошибка

Ошибка создания индикатора "VS". Function Init(): ...iles\QUIK-Junior\LuaIndicators\quik_ind.lua:50: attempt to perform arithmetic on a nil value

50 строка :

Ld_0= H(li+ 1) - L(li + 1) --Ld_0 по задумке равняется High(li + 1) - Low(li + 1)
 
Проверьте, не пытаетесь ли Вы с помощью 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)
)
 
Да.
Открыта ли сама таблица? Что пишет?
 
Цитата
Игорь Б написал:
Да.
Спасибо за подтверждение.
Цитата
Игорь Б написал:
Открыта ли сама таблица? Что пишет?
Да нет там ошибки, искала её из-за несовпадения message с последним номером в открытой таблице в QUIK.
 
Цитата
Ирина написал:
Порядковый номер строки, который мы видим в таблице Рабочего месте QUIK, не совпадает с индексом этой строки, да?
Это вообще разные таблицы... Таблица с именем «all_trades» это внутренняя таблица Quik, которую вы не видите в ГПИ, а обращаетесь к ней через скрипт. А таблицы которые вы создаёте через «Создать окно / Таблица обезличенных сделок...» это ГПИ таблицы, в которые вы добавляете фильтры, какие инструменты показывать в них. Поэтому, если создадите две таблицы обезличенных сделок по двум инструментам, то будете видеть в них только каждый инструмент по отдельности. А внутренняя таблица «all_trades» будет содержать сделки для обоих этих инструментов вперемешку.
 
Suntor, у Вас талант прояснять и разжевывать.

Цитата
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()...
 
Цитата
Ирина написал:
зачем тогда этот OnStop()
Совсем разобралась. Вопросы сняты.
BlackBoar, ещё раз спасибо. "Leaving Main" - гениально! :)
 
Цитата
Ирина написал:
И зачем тогда этот OnStop()
1. Наш IsRun=false срабатывает хотя вы этого возможно не замечаете и поток мэйн останавливается "честно", квику не приходится его убивать.
2. Выше писал уже, можете сохранить все свои данные, освободить обьекты, сбросить логи, тд, тп. А при старте квика на следующее утро подгрузить все обратно. Для того и события же в общем то придумали  :smile:  
 
Возник очередной нубский вопрос. Какие максимальные значения может принимать тип Number?
Из документации и гугла однозначно понятно что для чисел с плавающей точкой используется сишный 8-битовый double.

По целочисленным наткнулся на ряд комментариев типа "может зависить от реализации луа".

Поэтому уточненный вопрос звучит так, какое максимальное допустимое целое число в луа-машинке QUIK?
Если такого рода вещи есть где-то в документации по QLua подскажите пожалуйста где именно, я не нахожу. А документация по луа "вообще" в свете комментариев "может зависеть от реализации" как-то не вызывает доверия ))
 
Цитата
BlackBoar написал:
сишный 8-битовый double
Очередная ачипятка, 8-байтовый разумеется.
Суть вопроса прежняя ))
 
Цитата
BlackBoar написал:
Возник очередной нубский вопрос. Какие максимальные значения может принимать тип Number?
Из документации и гугла однозначно понятно что для чисел с плавающей точкой используется сишный 8-битовый double.

По целочисленным наткнулся на ряд комментариев типа "может зависить от реализации луа".

Поэтому уточненный вопрос звучит так, какое максимальное допустимое целое число в луа-машинке QUIK?
Если такого рода вещи есть где-то в документации по QLua подскажите пожалуйста где именно, я не нахожу. А документация по луа "вообще" в свете комментариев "может зависеть от реализации" как-то не вызывает доверия ))
В QUIK 32-битная Lua 5.1. Максимальное целое знаковое число, соответственно, 2^31 - 1
 
* Но это не точно. Просто здравый смысл  :lol:  
 
Надо понимать, что в Lua 5.1 нет понятия целого числа (Integer). Есть только Number, который маппится нативно на что-нибудь типа ptrdiff_t или double.
Например, в исходниках LuaForWindows 5.1.5-52 в luaconf.h:
Код
#define LUA_NUMBER    double
 
Цитата
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.

Но я до конца в правильности своих выводов не уверен поэтому и задаю тут всякие дурацкие вопросы ))
 
Добрый день.
В Lua все числа хранятся как double, соответственно целые числа до 2^53 хранятся без потери точности.
 
Цитата
Michael Bulychev написал:
В Lua все числа хранятся как double, соответственно целые числа до 2^53 хранятся без потери точности.
Спасибо.
Сплетни из гугла как обычно оказались сплетнями )))
Ну зато теперь точно уверен.
 
Спасибо, Михаил. По Вашей наводке наткнулся на обсуждение на stackoverflow: https://stackoverflow.com/a/945935/2031954
 
Еще дилетантский вопросик.
Перечитывал в очередной раз "Руководство пользователя QLua", сложилось такое впечатление что в талицах которые возвращает API QUIK ключи (названия параметров) всегда имеют строковый тип. Подскажите пожалуйста так ли это или я где-то что-то пропустил?
Речь только про таблицы которые возвращает (или присылает в коллбэк) сам терминал, не про вообще обьекты луа которые можно раскопать внутри луа-машинки.
 
Цитата
BlackBoar написал:
Перечитывал в очередной раз "Руководство пользователя QLua", сложилось такое впечатление что в талицах которые возвращает API QUIK ключи (названия параметров) всегда имеют строковый тип. Подскажите пожалуйста так ли это или я где-то что-то пропустил?
Именно названия параметров, всегда строка.
 
Возможно из таблицы обезличенных сделок получить сделки за предыдущие торговые сессии?
 
Цитата
Ирина написал:
Возможно из таблицы обезличенных сделок получить сделки за предыдущие торговые сессии?
Здравствуйте,
Такой возможности нет.
Цены Вы можете получить с графиков.
 
Цитата
Sergey Gorokhov написал:
Такой возможности нет.Цены Вы можете получить с графиков.
Спасибо.
 
Совсем дурной вопрос к опытным... Подскажите, пожалуйста, как быстрее для выполнения кода и грамотнее с т.з. программирования: задавать неизменные параметры транзакции каждый раз при вызове функции, зато локализованные внутри неё, или обращаться к внешним параметрам, локальным для внешнего блока?
Пример:
Код
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 гарантирует идентичность именно обьекта а не данных в нем )
 
BlackBoar, спасибо большое за объяснения! Уже раза 3 всё перепоняла... :)
А как
Цитата
BlackBoar написал:
отделять данные от кода
?
 
Цитата
Ирина написал:
А как
Думаю на эту тему не один десяток диссеров защитили ))))
На практике, над вами же не висят какие-то корпоративные нормы разработки. Поэтому так как вы сами не запутаетесь. Например выделять их в отдельные луа-файлы и прицеплять по мере необходимости. А будет их количество расти по мере развития вашего робота - переходить на файлы данных, базы данных и тд ))
Страницы: Пред. 1 2 3 4 5 След.
Читают тему (гостей: 1)
Наверх