nikolz (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 26 След.
Удаления всех комментариев из скрипта.lua
 
вот вариант учитывающий вроде бы ваши желания.
nk_com_v1.lua
-----------------
-- удаляем комментарии и лишние пробелы
--пример вызова для файла C:\NK\nk_bot.lua:
--lua  nk_com_v1.lua C:\NK\nk_bot
--------------------
if arg[1] then out=io.open(arg[1].."_.lua","w")
----------------
for s1 in io.lines(arg[1]..".lua") do
len=string.len(s1); s=""; x1=0;
m=1; while len>=m do x=string.byte(s1,m)
if x==59 then x=32 end
if x==32 and x==x1 then x1=x; x=0 else
if f==nil then
if n==nil then if x==34 or x==39 then n=x end
else if x==n then n=nil end end
end
if n==nil then z0=string.byte(s1,m+1);
if x==45 and z0==x then
z=string.byte(s1,m+2);   z1=string.byte(s1,m+3);
if f then
if f==1 then if z==93 and z==z1 then f=nil m=m+3; x=0; end end
else if z==91 and z==z1 then f=1 end break;end end
if f then x=0; end
end
x1=x;
end
if x and x>=32 then s=s..string.char(x);x=x1; end
m=m+1;
end
if s and s~="" then out:write(s.."\n") end
end
out:close();
end
--------------------------------------------
если что-то не учитывает то напишите
это тест:
Удаления всех комментариев из скрипта.lua
 
Цитата
Archie_ написал:
nikolz, А теперь обработайте все эти примеры вот этой функцией
Код
       local   function   DeleteAll_Comments (text);
         ---- 
        text  =  text .. '\n';
         local  t,t2,t3,one,two,cmt,x,Rem  =  {},{},{}, 0 , 0 , 0 , 1 , nil ;
         local  boxOpens,box Close ,RemStr  =   0 , 0 , nil ;
         local  SingleLine,boxActiv  =   nil , nil ;
         local  LineCom,LineComM,LineComRemove  =   0 , nil , nil ;
         ---- 
         for  val  in  text:gmatch( ".-\n" ) do ;
            t3[ # t3 +  1 ] = val:gsub( '\n' ,( ' ' ):rep( 2 ) .. '\n');
         end ;
        text  =   table.concat (t3);
         ---- 
         for  val  in  text:gmatch( "." )  do ;
            t[ # t +  1 ]  =  val;
         end ;
         ---- 
         for  i  =   1 , # t  do ;
             -------------------- 
             if  Rem  then ;
                 local  Cls  =  RemStr:match( '.' ,x);
                 if  Cls  =  =  t[i]  and  x  =  =   # RemStr  then  RemStr  =   nil  Rem  =   nil  Cls =  nil   end ;
                 if  Cls  =  =  t[i]  then  x  =  x  +   1   end ;
                 if  Cls ~ =  t[i]  then  x  =   1   end ;
                t[i]  =   "" ;
             end ;
             -------------------- 
             -------------------- 
             if  LineComRemove  then ;
                 if  t[i] ~ =   '\n'   then ;
                    t[i]  =   "" ;
                 else ;
                    LineComRemove  =   nil ;
                 end ;
             end ;
             -------------------- 
             if  LineCom  =  =   1   and  t[i] ~ =   "-"   then  LineCom  =   0   end ;
             if  one =  =  0   and  two =  =  0   and   not  boxActiv  and   not  Rem  and   not  LineComRemove  then ;
                 if  LineCom  >  =   3   then ; --4 simb>= 
                     if  t[i]  =  =   "["   or  t[i]  =  =   "="   and  LineComM  =  =   1   then ;
                         if  t[i]  =  =   "["   then ;
                            LineCom  =   0 ;
                            LineComM  =   nil ;
                         end ;
                     else ;
                        t[i -  0 ],t[i -  1 ],t[i -  2 ],t[i -  3 ]  =   '' ,'','','';
                        LineComRemove  =   true ;
                        LineCom,LineComM  =   0 , nil ;
                        boxOpens,box Close ,SingleLine,cmt,t2  =   0 , 0 , nil , 0 ,{};
                     end ;
                 end ;
                 if  LineCom  =  =   2   then ;
                    LineCom  =  LineCom +  1 ;
                     if  t[i]  =  =   "["   then  LineComM  =   1   end ;
                 end ;
                 if  t[i]  =  =   "-"   and  LineCom  <   2   and   not  LineComRemove  then ;
                    LineCom  =  LineCom +  1 ;
                 end ;
             end ; 
             if   not  LineComRemove  then ;
             -------------------------------------------------- 
                 -------------------------------------------------- 
                 if  t[i]  =  =   "'"   and  two  =  =   0   and   not  boxActiv  then ;
                     if  one  >   0   then  one  =   0   else  one  =   1   end ;
                 end ;
                 --- 
                 if  t[i]  =  =   '"'   and  one  =  =   0   and   not  boxActiv  then ;
                     if  two  >   0   then  two  =   0   else  two  =   1   end ;
                 end ;
                 --- 
                 if  t[i] ~ =   '['  then  boxOpens  =   0   end ;
                 if  t[i] ~ =   ']'  then  box Close   =   0   end ;
                 if  t[i] ~ =   "-"   then  cmt  =   0   end ;
                 --- 
                 if  t[i]  =  =   '['   and  one  =  =   0   and  two  =  =   0   and   not  boxActiv  and   # t2  <   2   then ;
                    boxOpens  =  boxOpens +  1 ;
                     if  boxOpens  >  =   2   then ;
                        boxOpens  =   0 ;
                        boxActiv  =   true ;
                     end ;
                 end ;
                 ---  
                 if  t[i]  =  =   ']'   and  one  =  =   0   and  two  =  =   0   and  boxActiv  then ;
                    box Close   =  box Close  +  1 ;
                     if  box Close   >  =   2   then ;
                         box Close   =   0 ;
                         boxActiv  =   nil ;
                     end ;
                 end ;
                 --- 
                 if  SingleLine  then  t2[ 1 ],t2[ 2 ]  =   '-' ,' - ' end ;
                
                 if  one  =  =   0   and  two  =  =   0   and   not  boxActiv  and  t[i]  =  =   '-'   then ;
                   cmt  =  cmt  +   1 ;
                    if  cmt  >  =   2   then ; SingleLine  =   true ; cmt =  0   end ;
                 end ;
                 --- 
                 if  SingleLine  and   # t2 >  =  2   then ;
                     if  (t[i]  =  =   '['   or  t[i]  =  =   '=' )  and   # t2  >  =   3   then ;
                        t2[ # t2 +  1 ]  =  t[i];
                     elseif  t[i] ~ =   '['   and  t[i] ~ =   '='   and   # t2  >  =   3   then ;
                       t2  =  {};
                       SingleLine  =   nil ;
                     end ;
                     --- 
                     if  t[i]  =  =   '['   and   # t2 =  =  2   then ;
                        t2[ 3 ]  =  t[i];
                     elseif   # t2  =  =   2   and  t[i] ~ =   '['   then ;
                        t2  =  {};
                        SingleLine  =   nil ;
                     end ;
                     --- 
                     if   # t2  >   3   and  t[i]  =  =   '['   then ;
                        Rem  =   true ;
                         for  ii  =   1 , # t2  do ;
                            t[i - (ii -  1 )]  =   '' ;
                         end ;
                        RemStr  =   table.concat (t2):gsub( '%s' ,''):gsub( '%-' ,''):gsub( '%[' ,']');
                        t2  =  {};
                        SingleLine  =   nil ;
                         if   not  RemStr  or  RemStr =  =  ''   then  Rem  =   nil   end ;
                     end ;
                 end ;
             ------- 
             end ; --LineComRemove 
         end ; --End for #t 
        text  =   table.concat (t);
         ---- 
        t3  =  {};
         for  val  in  text:gmatch( ".-\n" ) do ;
            t3[ # t3 +  1 ] = val:gsub( '%s%s\n' ,'\n');
         end ;
         ---- 
         return   table.concat (t3);
     end ;
     --=================================== 
    
    
    
     --filename = [[C:\\...]] 
    
     local  file  =   io.open (filename .. '.lua','r');
     if   not  file  then   return   end ;
     local  text  =  file:read( 'a' );
    file:close();
     ----- 
    text  =  DeleteAll_Comments(text);
     ----- 
    file  =   io.open (filename .. '_.lua','w');
    file:write(text)
    file:close();
     --===================================  
  
начнем по порядку
Зачем так агрессивно вести беседу?
Я Вам ничего не должен.
--------------------
теперь по существу.
Сравните размер кода вашего и моего.
------------------
Я написал его за 20 минут на основе своих привычек размещать коммент
--------------------------
Выше я привел как я ставлю многострочный
Ставить закрытие в конце строки как у Вас  по-моему мнению это не красиво и не наглядно. поэтому у меня даже мысли не возникало так  ставить
-------------------------
Но если такие чудики есть, то это легко исправить
Вариант с тестом, содержащим символы выделения, тоже решается просто,
Так как никогда не было такой надобности в таких кусках текста, то об этом не заморачивался
----------------
Удаления всех комментариев из скрипта.lua
 
одно замечание
я выделяю многострочные  коммент и так именно обрабатывается коммент в данной программе:
--[[  ......
.......
......
--]]
т е символы выделения всегда в начале строки
у Вас в первом примере завершающий символ в конце строки
Удаления всех комментариев из скрипта.lua
 
вот пример удаления
Удаления всех комментариев из скрипта.lua
 
могу выложить скрипт до и после
объем скрипта 1000 операторов
--------------------------
напишите конкретно что у вас не работает
или выложите свой файл я вам его обработаю и опубликую.
если  есть у вас потребность в таком скрипте.
---------------------
если не умеете запускать то могу выложить скомпилированный или exe файл например для Luajit.
Индикатор с уровнями для 3 таймфреймов
 
Цитата
Иван написал:
Цитата
Andrey Bezrukov написал:
Иван ,

Нет, такой возможности нет - MA привязан к текущему интервалу графика, который может быть только один для одного окна графика.

Наиболее вероятно, Вашу задачу можно решить пользовательским индикатором на LUA. Необходимую информацию и примеры для написания собственных индикаторов Вы можете найти по следующей   ссылке  .
Вопрос немного в другом.
1) Можно ли на принципах индикатора нарисовать линию и после двигать ее мышкой на графике.
2) Можно ли запомнить ее ID что бы не отрисовывать дважды?
двигать мышкой нельзя
запомнить можно  в массиве
Удаления всех комментариев из скрипта.lua
 
Цитата
Archie_ написал:
Привет всем!
Ребят подскажите пожалуйста, как удалить все комментарии из файла lua, может быть есть у кого уже написанная функция. Поиск  в Google не дал результатов.
Попытался написать сам, на первый взгляд вроде бы просто, но оказалось не все так просто, потому как в середине строки может встретится что то типа того ***   или еще чего и это оказалось выше моих сил.
Спасибо!

***
Код
   if  bla  then  bla  =   '--'   end   -  -  коммент
 if  bla  then  bla  =   'D --'   end   -  -  коммент


или

 --[[ bla bla bla bla bla --[==[ bla bla bla  
bla bla bla bla  -- bla bla bla  -- bla bla --]=] bla  
bla bla bla bla  --]] 

  
выкладываю скрипт (nk_com.lua):
Код
-- удаляем комментарии и лишние пробелы
--пример вызова для файла C:\NK\nk_bot.lua: nk_com.lua C:\NK\nk_bot
--результат в  C:\NK\nk_bot_.lua:
--------------------
if arg[1] then
out=io.open(arg[1].."_.lua","w")
----------------
for s1 in io.lines(arg[1]..".lua") do
   local len=string.len(s1);    local s="";
   for m=1,len do
      local x=string.byte(s1,m)
      if x==59 then x=32 end
      if x==32 then
         if s~="" and m~=len then
            if f==nil then s=s..string.char(x) f=1 end
         end
      else if x>=32 then s=s..string.char(x); f=nil; end  end
   end
   if  e then s=nil;end
   if s2=="--]]" then e=nil; else   if s2=="--[[" then e=1; s=nil; end end    --многострочный комментарий
   if s then
      local m=string.find(s,"%-%-")
      if m then
      if m==1 then s=nil else  s=string.sub(s,1,m-1)
      end  end
      if s and s~="" then out:write(s.."\n")    end
     end
end
out:close();
end
Список всех идентификаторов графиков на текущий момент в Quik
 
Цитата
Иван написал:
Цитата
Sergey Gorokhov написал:
Здравствуйте,
Такой возможности не предусмотрено.
А можно как-то проверить существует такой идентификатор или нет?
Можно сделать так:
перечень встроенных индикаторов не меняется.
поэтому его можно записать в текстовый файл
------------------------
все самопальные индикаторы размещаются в папке LuaIndicators.
Читаем имена файлов в этой папке.
 
очереди
 
На самом деле, правильный ответ такой
для айсберг заявки -поставит 1
для обычной 101
т е оба варианта верны.
всем спасибо
очереди
 
Разве айсберг заявка не реализует этот алгоритм?
очереди
 
Цитата
Andrey Bezrukov написал:
Здравствуйте, Николай Камынин.

Новая заявка встанет в очередь с номером 101.
просьба пояснить, Вы знаете алгоритм работы сервера или это ваше предположение?
----------------------------------
Я тоже так полагал,
Но, предлагаю вам посмотреть в стакан.
Там можно наблюдать как маркет-мейкер ставит заявки по одной акции.
Если поставить туда же  свои заявки то при исполнении
число заявок на этой позиции увеличится
и свои исполнятся не второй а гораздо позже.
----------------
Знаю, что такой прием раньше использовался на форексе.
Жизнеспособность идеи - 100 контрактов = 100 стоп-ордеров по 1 контракту каждый
 
Цитата
Иван написал:
Не совсем понял при чем здесь HFT роботы (высокочастотники как понимаю)?

Сейчас у меня стоп выставляется через функцию OnTrade().
Прошла сделка объемом 7 = выставился стоп объемом 7.

Сложность начинается тогда, когда мне нужно сделать закрытие частями.
К примеру хочу закрыть 30% сделки - это будет 3 контракта.

Соответственно сделка прошла и OnTrade() вижу что мне нужно изменить стоп на 7 контрактов. И здесь начинаются сложности - удали стоп 7, выставь стоп 4.
Это хорошо сработает если исполнится 3 контракта сразу. А если они исполнятся по 1, 1 и 1. Т.е. мне нужно удалить стоп 7, выставить стоп 6. Удалить стоп 6 (которого возможно еще нет в живых), поставить стоп 5, удалить стоп 5 (которого также еще нет), поставь стоп 4. Сложность в этом.
поясню
Проблема в скорости поступления в терминал(ваш комп)  информации с сервера биржи и в скорости исполнения сервером квика поручений с терминала
В HFT  задержки составят десятки микросекунд
а в квике сотни миллисекунд.
Поэтому пока вы снимаете старый стоп и выставляете новый - это все будет исполнять сервер квика, сервер биржи уже продаст следующую часть в вашей заявке.
-----------------
Поэтому для высоколиквидного инструмента квик не обеспечит нужной скорости исполнения
------------------
поэтому для конкретного ответа надо рассматривать конкретный алгоритм конкретный инструмент
иначе это лишь теория.
Программу можете написать, но реально это не всегда будет работать как хочется.
очереди
 
Добрый день,
вопрос к разработчикам.
----------------------
Рассмотрим такую ситуацию.
На сервере есть очередь заявок длинною 100
первой стоит заявка клиента1
в текущий момент этот клиент подает точно такую же заявку, но с другим количеством
-----------------------
Внимание вопросы:
1) как данную ситуацию обработает сервер квика
2) как данную ситуацию обработает сервер биржи
---------------------
Варианты ответов
1) поместит заявку в очередь с номером 101
2) добавит заявку в очередь с номером 1
------------
Спасибо
Какая кодировка используются в Lua?
 
Цитата
Anton написал:
Цитата
Николай Камынин написал:
текст в любой кодировке - это массив байт
Вообще все в компьютере это массив байт. Остальное все неверно. Ноль в конце это чисто сишная фишка, в паскале их нет например. Строка это не байты, а codepoints, каждая из которых может быть больше байта (до четырех например в utf8). Если вы разрежете строку посреди codepoint, обе половины уже не будут строками или, в лучшем случае, будут битыми строками. Отображение это вообще отдельная тема, там не только codepoints действуют, композиция включается, а еще куча параметров конкретного шрифта. Знание кодировки нужно для любых действий со строкой, отличных от простого копирования. Это если говорить о строках, а не о кучке мусора с приделанным ноликом. Прежде чем пояснять, стоит все же хоть немного тему изучить.
ну почитайте хотя бы документацию:
цитата:
------------------------------------
lua_tolstring[-0, +0, e]const char *lua_tolstring (lua_State *L,
                          int index,
                          size_t *len);Конвертирует Lua значение по заданному индексу в C строку. Если len не является NULL, она также устанавливает указатель *len с длиной строки. Lua значение должно быть строкой или числом; в противном случае функция возвращает NULL. Если значение является числом, то lua_tolstring также изменяет действительное значение в стеке на строку. (Такое изменение дезориентирует функцию lua_next, когда lua_tolstring применяется для ключей во время обхода таблицы.)

lua_tolstring возвращает полностью согласованный, внутри Lua состояния, указатель на строку.
В этой строке всегда имеется нуль ('\0'), после последнего символа (как в C).
Жизнеспособность идеи - 100 контрактов = 100 стоп-ордеров по 1 контракту каждый
 
Цитата
Иван написал:
Обычно выставление стоп-лосса затачивается на то какой объем был куплен или продан. Продали 100 контрактов = 1 стоп на 100 контрактов
Учитывая то что продажа 100 контрактов может происходить частями по 45 по 5 и по 50 контрактов, то соответственно можно и стопы также выставить по 45 по 5 и по 50. И здесь при закрытии позиции начинаются сложности - закрытие также может произойти частями по 30, по 20 и по 50. И сложно пересчитать каждый из ордеров.

Другое дело если каждый ордер это 1 контракт. Продалось 30 контрактов - сняли 30 стопов. Продалось еще 20 - сняли 20 и т.д.
Насколько вообще в принципе жизнеспособна идея купив к примеру 100 контрактов выставить не 1 стоп, а 100 стопов по 1 контракту.

При торговле на 10 контрактов по инструменту допускаю что все это допустимо 10 продано = 10 ордеров.
А вот когда число контрактов 100, 500?
теоретически можно сколько душе угодно.
практически - трудно придумать смысл этому.
----------------
Надо учитывать следующее:
-----------------
стопы хранятся в очереди стопов на сервере брокера и отсылаются им на биржу,
если условие true
------------------
ордер находится на бирже
-----------------
Если вы хотите выставить ордер на продажу на 100,  а стопы выставлять по мере исполнения ордера,
то надо делать HFT робот и ставить максимально близко к бирже.
---------------
на квике -  как на велосипеде обгонять самолет. Упаритесь.
Какая кодировка используются в Lua?
 
поясняю для тех кто в танке
--------------------------
текст в любой кодировке - это массив байт
конец массива обозначается нулевым байтом,
поэтому в массивах с текстом запрещен нулевой байт
но если в массиве байтов нет нуля то это может быть массив не текста
---------------------
знание кодировки требуется лишь генератору символов на устройстве отображения
------------------
поэтому если отображения нет , то кодировка не имеет значение, если все строки текста в программе имеют одинаковую кодировку
то с ними можно работать как с массивами байт
----------------------
оператору tostring  вообще не требуется знать кодировки так как его задача заменить хеш указателем на  массив байт с нулем в конце
Какая кодировка используются в Lua?
 
Цитата
Anton написал:
Цитата
Николай Камынин написал:
tostring работает со строками в коде ASCII (American Standart Code for Inmormation Interchange)  
вернее ASCIIZ
Абсолютно неверное утверждение. В случае автоматического преобразования числа в строку да, получается ASCIIZ (а можно сказать, что получается utf-8 или win-1251 или что угодно, т.к. первая страница у всех codepage одинаковая, если не учитывать экзотику), но в случае строки возвращается строка как она есть, ровно в том виде, в каком ее туда засунули, в том числе со внутренними нулями (что автоматически отвергает ASCIIZ и, кстати, позволяет при некоторой осторожности впихнуть даже utf-16).
Цитата
Николай Камынин написал:
tostring вообще-то  все  равно какая кодировка
Передача массива в функцию - теряется последовательность ключей
 
Цитата
Иван написал:
LogWrite("report", comment, {Trade=100, Code=Si, Q="-"..10, Price=10000, Pips=1});
В функции делаю чтение массива:Код
function LogWrite(name, log_type, log_array)

  local content = "";
  local i = 1;
  for key, value in pairs(log_array) do
     content = content.."\t"..value..";";
     content = string.gsub(content,"([.]+)",",");
     i = i + 1;
  end;
  message(tostring(content));
 
end;
function LogWrite(name, log_type,t)
  local content = "";
  local i = 1;
  for m=1,#t do
local value=tostring(t[m])
     content = content.."\t"..value..";";
     content = string.gsub(content,"([.]+)",",");
     i = i + 1;
  end;
  message(tostring(content));
end;
local Si=123
LogWrite("report", "", {100,Si,"-"..10,10000,1});
-------------------
100; 123; -10; 10000; 1;
>Exit code: 0
Удаление элементов в больших таблицах., Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц.
 
исправлено:
--------------------------
-Новая  реализация 2
tab1 = tabInit  (N)
numElement = #tab1
startElement = numElement - ElemToKeep
minus = numElement - ElemToKeep
start=hrt.clock()
for i=1, ElemToKeep do  tab1[i] = tab1[startElement+i]  end
tab1[ ElemToKeep+1] =nill
time=t_mcs(hrt.clock()-start)
ne1 = tabCount2 (tab1)
print ("Новая2="..time..";"..ne1)
--------------------------
Первая=1.566;5000
Вторая=0.783;5000
Новая1=0.756;5000
Новая2=0.718;5000
>Exit code: 0
Удаление элементов в больших таблицах., Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц.
 
в рассмотренных примерах для удаления данных требуется создание еще одной таблицы
можно уменьшить требуемый объем памяти если переписывать данные в туже таблицу а в конце ставить nil
при этом методе надо после записи последнего элемента записывать nil
например так:
--Новая  реализация 2
tab1 = tabInit  (N)
numElement = #tab1
startElement = numElement - ElemToKeep + 1
minus = numElement - ElemToKeep
start=hrt.clock()
for i=1, ElemToKeep do  tab1[i] = tab1[startElement+i]  end
tab1[ ElemToKeep+1] =nill
time=t_mcs(hrt.clock()-start)
ne1 = tabCount2 (tab1)
print ("Новая2="..time..";"..ne1)
--------------------------

для точного измерения времени исполнения надо отключать сборщик мусора
----------------
в итоге получим следующий результат время в  мс:
Первая=1.661;5000
Вторая=0.777;5000
Новая1=0.758;5000
Новая2=0.704;4999
>Exit code: 0
Какая кодировка используются в Lua?
 
tostring вообще-то  все  равно какая кодировка
Какая кодировка используются в Lua?
 
на самом деле переменная в которую записываем строку не содержит указатель на строку,
а содержит хэш  строки.
поэтому сравнение строк в луа делается быстро как и для числе,
так как сравниваются числа  хэш
Какая кодировка используются в Lua?
 
tostring работает со строками в коде ASCII (American Standart Code for Inmormation Interchange)  
вернее ASCIIZ
Получить только текущие данные
 
если не сложно то выложите историю
мне как раз надо большую
Получить только текущие данные
 
надо удалить историю в квике
это файлы в каталоге QUIK/archive
файлы с именем инструмента и расширением dat
Удаление элементов в больших таблицах., Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц.
 
Цитата
Иван Ру написал:
Пока что вижу для себя такое решение -- формируем временную таблицу куда записываем только те элементы большой таблицы, которые нужно сохранить. Затем ставим знак равенства между большой нуждающейся в "обрезке" таблицей и временным вариантом (второй вариант, см. код ниже). Быстрее стандартного варианта в несколько сотен раз.


function tabInit (number)
local tab ={}
for i =1,number do
tab=i
end
return tab
end

function tabCount2 (Thetab)
local count = 0
for k,v in ipairs (Thetab) do
count = count+1
end
return count
end


-- ОЦЕНКА ПРОИЗВОДИТЕЛЬНОСТИ
local ElemToKeep = 5000
tab1 = tabInit  (10000)
tab2 = tabInit    (10000)

-- Первая реализация
local start = os.clock()
while #tab1 > ElemToKeep do
table.remove (tab1,1)
end
local ne1 = tabCount2 (tab1)
local finish1 = os.clock()
local time1 = finish1 - start
message (tostring(time1).."-"..tostring(ne1))

-- Вторая реализация
local tempTab = {}
local numElement = #tab2
local startElement = numElement - ElemToKeep + 1
local minus = numElement - ElemToKeep

for i=startElement, numElement do
tempTab[i-minus] = tab2
end
tab2 = tempTab
local ne2 = tabCount2 (tab2)
local finish2 = os.clock()
local time2 = finish2 - finish1
message (tostring(time2).."-"..tostring(ne2))

У меня на машине обрезка первым способом заняла 1,69 сек, а вторым - 0,002 сек.
У вас ошибка в подсчете времени
вы включили в него время подсчета числа элементов - local ne2 = tabCount2 (tab2)
кроме того вместо удаления одного элемента можно удалять например половину копированием в новый массив и переприсвоением
время будет таким же как во втором случае
local ElemToKeep = 5000
local N=10000
--Новая  реализация
tab1 = tabInit  (N)
local tempTab = {}
local numElement = #tab1
local startElement = numElement - ElemToKeep
start = os.clock()
for i=1, ElemToKeep do tempTab[i] = tab1[startElement+i] end
tab1 = tempTab
time1 = os.clock() - start
ne1 = tabCount2 (tab1)
print ("Новая="..tostring(time1)..";"..tostring(ne1))
------------------
Первая=1.682;5000
Вторая=0.00099999999999989;5000
Новая=0.0010000000000001;5000
Баг с выводом времени в таблицу QLua
 
Цитата
Дмитрий написал:
Цитата
Игорь Б написал:
Дмитрий , могу лишь предложить свой работающий вариант, от которого можно оттолкнуться.  
Код
      if    string.len (Tl.hour)   =    =     1     then   Tl.hour   =     "0"    ..  Tl.hour;   end  ;
              if    string.len (Tl.min)   =    =     1     then   Tl.min   =     "0"    ..  Tl.min;   end  ;
                 if    string.len (Tl.sec)   =    =     1     then   Tl.sec   =     "0"    ..  Tl.sec;   end  ;    
 Его же Вам предлагал  Sergey Gorokhov
спасибо, всё получилось
Это просто ужас какой-то.
-----------------------------------
У вас изначально  таблица Ti содержит  время в формате чисел.
----------------------------
Вы их превращаете для сравнения в строки,
а потом записываете в виде строк в таблицу
----------------------
В итоге у вас для отображения времени в виде строки 6 раз вызывается преобразование числа в строку
а потом вы еще и уничтожаете числа в таблице Ti, заменяя их строками
----------------------
Куча операций и дополнительной памяти чтобы вывести на экран строчку.
----------------------
Мазохизм какой-то
Помогите разобраться с ошибкой голосового движка luacom
 
Цитата
Sergey Denegin написал:
Цитата
Николай Камынин написал:
if text~=nil and string.len(text)>0 and  vObj:Speak~=nil   then vObj:Speak (text) end
Данная функция запускается всего из нескольких мест, и там по определению не может содержание текст быть пустым или нулевым.
И не совсем понятно, как объяснить, что при одних и тех же условиях, при запуске из одних и тех же процедур, все работает хорошо, до тех пор, пока что-то не произойдет, после чего начинает выдавать ошибку. Т.е. условия запуска одинаковые, а результат иногда происходит ошибочный.
Что конкретно лечит ситуацию, перезагрузка компа или достаточно перегрузить терминал, не выяснял.

Возможно ситуация уже решилась за счет функции pcall, во всяком случае уже теперь весь скрипт не виснет, так что ситуация перестала напрягать
проблема ваша не решилась а просто заблокировалось сообщение об ошибке
без pcall сообщение об ошибке получает система и так как нет обработки реагирует на нее зависанием
pcall перехватывает ошибку, но вы эту ошибку не обрабатываете.
Т е когда у Вас возникает ошибка эта строка просто не работает т е вы не получаете звука, но система не виснет
В таком случае зачем вам звук если вы его можете и не получить когда надо?
------------------
если хотите исправить ошибку то поставьте вывод кода завершения pcall  в lopg или печать и определите причину
Баг с выводом времени в таблицу QLua
 
Цитата
Дмитрий написал:
t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);
local h = alltrade.datetime.hour;   if h<10 then h="0"..h end
local m=alltrade.datetime.min;   if m<10 then m="0"..m end
local t=h..":"..m
[BUG] Крах Квика при работе скрипта, версия 8.5
 
Цитата
Latrop написал:
В соседних ветках много сообщений о проблемах с версией 8.5, но системы у всех сложные, грешить не понятно на что..

Вот очень простой скрипт, который рушит Квик во время торгов.  
Упасть может и не сразу, поработав недолго, видимо зависит от интенсивности потока тиков.
Ошибок в скрипте нет, он элементарный. Да если бы и были ошибки, то рушиться весь Квик не должен, только скрипт.
Для 100% краха можно перезаказать данные текущей сессии. Тогда упадет сразу.

Код
   local  ticksIn  =   0 
 
 function   OnAllTrade (tick)
    if  ( math.fmod (ticksIn,  5000 ) =  =  0 )  then 
       message ( "OnAllTrade "   ..  ticksIn  ..   "  tick: "   ..  tostring(tick.trade_num))
    end 
   ticksIn  =  ticksIn  +   1 
 end 
 
mainRun  =   false 
 
 function   OnStop (flag) 
    message ( "OnStop" )
   mainRun  =   false 
    return   3000 ;
 end 
 
 function   main ()
   mainRun  =   true 
    message ( "main run..." )
   
    local  n  =   0 
    while  mainRun  do 
       local  ticksNum  =   getNumberOf ( "all_trades" )
       if  (ticksNum  >   0 )  then 
          local  tick  =   getItem ( "all_trades" , ticksNum  -   1 );
          if  ( math.fmod (n,  1000 )  =  =   0 )  then 
             message ( "AllTrades  num: "   ..  ticksNum  ..   "  tick: "   ..  tostring(tick.trade_num))
          end 
       end 
      n  =  n  +   1 
       sleep ( 1 )
    end 
 
    message ( "main exit" )
 end 
  
1) mainRun  =   false --  оператор лишний, так как если mainRun не определен, то он false
2) значение n может переполниться когда-нибудь , а вычислять остаток - долго
вот вариант без этих проблем:
-------------------------
   local  n  =   0
   while  mainRun  do
      local  ticksNum  =   getNumberOf ( "all_trades" )
      if  ticksNum  >   0   then
         local  tick  =   getItem ( "all_trades" , ticksNum  -   1 );
         if  n==0  then  message ( "AllTrades  num: "   ..  ticksNum  ..   "  tick: "   ..  tostring(tick.trade_num))  end
      end
     n  =  n  +   1  if n>=1000 then n=0   end
sleep ( 1 )
   end
------------------
проверка условия в два раза быстрее.
Помогите разобраться с ошибкой голосового движка luacom
 
полагаю что ошибка не связана с luacom, а вероятнее связана с неправильной работой с движком Speak
Помогите разобраться с ошибкой голосового движка luacom
 
надо проверять не только на нил но и длину сообщения на ноль
если мало, то добавим:
------------------
if text~=nil and string.len(text)>0 and  vObj:Speak~=nil   then vObj:Speak (text) end
Вам запрещена работа по данному инструменту., Данное сообщение появляется после перемещения заявки.
 
Цитата
Александр написал:
Добрый день.
Столкнулся с багом.
Суть и последовательность действий, приводящих к багу.
1. Ставлю лимитную заявку на фьючерс SRM0 на продажу, выше рыночной цены. Всё прекрасно.
2. Ставлю через lua скрипт аналогичную лимитную заявку.
3. Двигаю эту заявку по цене, неважно вверх или в низ, можно даже со старой ценой. Заявка двигается нормально.
4. После этого блокируется возможность выставления заявок по текущему инструменту на продажу (так как изначально выставлял заявку на продажу, см. п.1).
5. В Quik возможность выставления заявок тоже блокируется даже вручную, до окончания текущего дня.
Так с любым инструментом (пробовал SRM0, GZM0, RIM0, SiM0).
Записал всё на видео. Исходные коды тоже прилагаю.
Помогите пожалуйста, так как сижу уже 2 дня и не могу побороть эту напасть.
Раньше всё работало, на этих же исходниках.
Перестало работать после обновления утром 23 апреля.
https://cloud.mail.ru/public/3GLt/4615oogiY/

Заранее спасибо за помощь!!!
такое сообщение вы получите, если неправильно указали торговый Счет либо указали "пусто".
Т е пытаетесь выставить торговую операцию не от своего  счета.
Помогите разобраться с ошибкой голосового движка luacom
 
Цитата
Sergey Denegin написал:
Цитата
Николай Камынин написал:
и еще
что у вас в 31 строке  library.lua ?
Вот полная функция
function speak_only (text)
   w32.CoInitialize()
   local vObj = luacom.CreateObject("Sapi.SpVoice")
   vObj:Speak (text)
   w32.CoUninitialize()
end --speak_only

строка 31 содержит оператор
vObj:Speak (text)

А каким образом остальной код может влиять на абсолютно независимую от остального кода функцию?
тут все переменные локальны.
Текст всегда передается строковой переменной из одной и той же другой функции, в которой физически не может быть не строковой переменной.
И главная проблема в том. что бОльшую часть времени все работает.

В общем на данный момент пока вопрос закрыл с помощью оператора pcall, если будут снова проблемы, опишу ситуацию.

Благодарю всех, кто откликнулся на помощь!
напишите  строку 31 так:
if text~=nil and string.len(text)>0 then vObj:Speak (text) end
-------------------------------
и будет Вам счастье.
какой смысл замены lua5.1 на lua5.3
 
т е Lua 5.1 и Lua 5.3 многопоточность не мешает, а Luajit - мешает?
Верно?
какой смысл замены lua5.1 на lua5.3
 
Цитата
swerg написал:
luajit мешает многопоточность
Поясните подробнее Вашу мысль.
Спасибо.
какой смысл замены lua5.1 на lua5.3
 
Добрый день,
Просьба пояснить почему в качестве новой версии в QUIK выбрана lua5.3
мое тестирование показывает, что версия 5.3 работает так же медленно как и 5.1
------------------
а вот luajit, которая основана на Lua5.1 работает в 2 раза быстрее при исполнении скриптов
и позволяет исполнять  очень быстро и просто вставки на СИ
увеличивая скорость исполнения до 50 раз.
----------------------------
кроме того версия LuaVela на основе luajit решает проблему ограничения памяти 2Гб.
--------------------
Так в чем же тайный смысл замены 5.1 на 5.3?
Спасибо
Проблема вычисления выражений с дробными числами, message(''..1.100-1.099) -----> 0.0010000000000001
 
Цитата
Игорь написал:
Ничего умнее не придумал для округления до 4 знаков:
math.floor(num * 10000+ 0.5) / 10000

Только жалко время на расчеты тратится..
так будет быстрее:
0.0001*math.floor(num * 10000+ 0.5)  
Помогите разобраться с ошибкой голосового движка luacom
 
и еще
что у вас в 31 строке  library.lua ?
Помогите разобраться с ошибкой голосового движка luacom
 
Цитата
Sergey Denegin написал:
Цитата
Николай Камынин написал:
это ошибка в вашей  library.lua  строка 31
в этой строке оператор vObj:Speak (text)
Цитата
Николай Камынин написал:
оператор 386 выдает сообщение  об ошибке, если она есть
так ведь ситуация в том. что бОльшинство раз все работает нормально, а потом что-то происходит, и начинает выдаваться ошибку. Возможно память не очищается и забивается. посмотрим что будет с добавленной командой CoUninitialize() и использованием pcall
сказать что-то конкретнее без текста скрипта сложно.
могу предположить что какие-то данные в какой-то момент отсутствуют
У вас скорее всего это не проверяется и возникает ошибка например сравнение с nil
в итоге происходит вылет скрипта (по такой ошибке бывает пропуск операторов) и в итоге кирдык
еще хуже если попадаете в память вне области массивов
короче надо ставить контрольные точки и искать что и где
можете выложить код, попробую что-то сказать конкретнее  
Проблема вычисления выражений с дробными числами, message(''..1.100-1.099) -----> 0.0010000000000001
 
Цитата
Игорь написал:
Ничего умнее не придумал для округления до 4 знаков:
math.floor(num * 10000+ 0.5) / 10000

Только жалко время на расчеты тратится..
с какой целью Вы это делаете?
В исходном варианте у Вас погрешность 0.0000000000000001
а в вашем - погрешность 0.00005 т е в 10000000000 раз больше.
Оно Вам надо?
----------------------
Вам "шашечки" или ехать?
Помогите разобраться с ошибкой голосового движка luacom
 
Цитата
Sergey Denegin написал:
В макросе использую произнесение голосом разных событий.

Функция чтения голосом выглядит вот так:

text = "тест"


w32.CoInitialize()              

local vObj = luacom.CreateObject("Sapi.SpVoice")vObj:Speak (text)

Как правило все работает без проблем. Но иногда, почему-то данная функция выдает ошибку
...\Program\QuikRobots\автостоп\. .\автостоп\library.lua:31: COM exception:(..\src\library\tLuaCOM.cpp,386):

Самое неприятное, что весь скрипт после этого останавливается, и это напрягает.
Как правило, если потом перезапустить скрипт, ошибка уже повторяется. пока терминал не перезагрузишь или даже компьютер.

Может кто-то знает как решить проблему?
1) либо устранить ошибку совсем
2 ) либо научиться определять, что эта ошибка есть, и как-то не давать скрипту останавливаться
это ошибка в вашей  library.lua  строка 31
на всякий случай, вот исходник tLuaCOM.cpp
https://github.com/davidm/luacom/blob/9962eb574ddb34692eb4503fe67fd7d363ff2­0a0/src/library/tLuaCOM.c...
оператор 386 выдает сообщение  об ошибке, если она есть
 
Проблема вычисления выражений с дробными числами, message(''..1.100-1.099) -----> 0.0010000000000001
 
чтобы было точно надо исчислять в двоично-десятичном формате.
Проблема вычисления выражений с дробными числами, message(''..1.100-1.099) -----> 0.0010000000000001
 
Цитата
Igor Ankudinov написал:
Здравствуйте.

Запускаю простейший скрипт:

message(''..1.100-1.099)  -----> 0.0010000000000001

Как так? Большое недоумение у меня...
комп исчисляет в двоичной
чел - в десятичной
из десятичной в двоичную и обратно не всегда можно точно.
вот и получаем приближенно.
-----------------------
проблема с w32.dll на quik 8.5
 
Цитата
Sergey Denegin написал:
Здравствуйте.
Для работы одного из луа скриптов (автологин) использую внешнюю dll - w32.dll
Раньше все работало
С переходом на 64х разрядную версию старая dll перестала работать, но на сайте разработчика  https://quik2dde.ru/viewtopic.php?id=80  появилась версия для 64х битной винды.
Заменил ею старую версию, но все равно на квике 8.5 выдает ошибку:

error loading module 'w32' from file 'M:\Sergey\Program\QuikFinam-bid\w32.dll':
   Не найдена указанная процедура.


Взял самый примитивные луа скрипт с одной строкой:

local w32 = require("w32")

Уже на ней выдает ошибку.

История повторяется на двух компьютерах с 6х разрядной виндой

Может кто-то знает в чем дело?
ошибка: Не найдена указанная процедура.
обычно указывает что требуемая в вашем приложении функция  отсутствует на вашем компе
эта функция обнаруживается с помощью dependency
https://freesoft.ru/windows/dependency_walker
Индикатор работает, но выдает ошибку, Просьба поправить код, чтобы не было ошибок
 
  local TecPos=FuncPops(Emit,MyAccount)  -- далее
у нас открылась длинная позиция,
пишем позицию и бар (bar) в переменную Tpos
Tpos={TecPos,bar}
и вот теперь что бы из неё выйти мы делаем проверку
  if Tpos[1] > 0 then --если тек позиция больше нуля то...
вот если это условие выполнено, то у нас открыта длинная позиция
и теперь
переменная Tpos[2] - содержит бар этой позиции
Индикатор работает, но выдает ошибку, Просьба поправить код, чтобы не было ошибок
 
Цитата
Денис Лихачев написал:
Цитата
Николай Камынин написал:
У вас выводится  V(index),   а оно есть.
-----------------
Да, это я усвоил)) Нужно выполнять проверку на отсутствие значений.  
отвечаю на ваш вопрос в письме.
Если надо лишь последнее значение бара открытия позиции, то проще  
присвоить  номер бара переменной и сравнивать это значение с текущим номером бара
Индикатор работает, но выдает ошибку, Просьба поправить код, чтобы не было ошибок
 
Цитата
Денис Лихачев написал:
function OnCalculate(index)
local VolUp = nil
local VolDn = nil
if V(index)>V(index-1) then VolUp=V(index); else VolDn=V(index); end
 return VolUp,VolDn;
end
У вас выводится  V(index),   а оно есть.
-----------------
Получить в индикаторе значение цены ещё до OnCalculate()
 
можно так:
----------------
function oncalculate(indx)
if bar1 then
-- основное тело
else
bar1 = C(1)
end
--------------
Удаление элемента из массива, который прошёл проверку
 
...
         table.remove(sec_code,k)
...
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 26 След.
Наверх