Let_it_go (Автор тем)

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

Страницы: 1 2 3 След.
Плановые чистые позиции
 
Как рассчитывается поле "Плановые чистые позиции"?
Учитывает ли оно вар.маржу и накопленный доход?
Перестала работать getQuoteLevel2
 
После обновления квика до 8.6.0.97 перестала работать функция
getQuoteLevel2
строка
Код
qt = getQuoteLevel2 ('SPBFUT','SRU0')

на вечерней сессии возвращает


С другим запросом
Код
qt = getQuoteLevel2 ('TQBR','GAZP')

та же картина.
Сейчас идёт вечорка, про другие сессии не знаю пока.
getCandlesByIndex - разница в свечах
 
Почему такая разница в выводимых значениях:
Код
--save IMOEX quotes
t,n,_ = getCandlesByIndex("IMOEX",0,0,getNumCandles ('IMOEX'))
mm (#t) =>3008
mm (getNumCandles ('IMOEX')) =>3009
mm (n) =>3009
Большие иконки
 
Я удалил все .dat файлы. В итоге сильно изменился внешний вид иконок. Они стали очень большими.
Как регулировать их размер?
Версия квика 8.3.2.4
Обращение к элементу большой таблицы
 
У меня огромная таблица big_base с миллионом свечей.
в течение итерации происходит обращение к отдельным её элементам:
Код
перебор candle, начало итерации:
big_base[candle][1]
потом снова
big_base[candle][1]
потом
big_base[candle][2]
является ли это обращение долгим?
Возможно, лучше написать:
Код
перебор candle, начало итерации:
current_candle = big_base[candle]
а потом писать
current_candle[1]
current_candle[1]
current_candle[2]
Ускорит ли это работу скрипта, или Луа настолько хорош, что обращение к индексу многомиллионной таблицы идёт быстро?
Получить путь к python.exe
 
Пытаюсь получить путь к файлу python.exe
Строка на Луа
Код
os.getenv("PYTHON_PATH") 
выдаёт nil
Питон свежей версии установлен в необычную папку: C:\InstallPython\python.exe
Подскажите, как средствами Луа получить путь к python.exe
не является приложением Win32
 
Робот на Луа использует dll на С++
В версии КВИКа 7 всё работает как надо, в версии квика 8 выдаёт ошибку:

error loading module 'socket.core' from file 'C:\Program Files (x86)\Lua\5.1\clibs\socket\core.dll': не является приложением Win32.

Как с этим бороться?
Заполнение пропусков на графике
 
Добрый день.
Подписан у брокера Открытие на трансляцию мировых рынков.
График по иностранным инструментам выглядит так:

Искусственно заполняются неторговые часы.
Брокер говорит, что эта проблема есть только у меня. По просьбе брокера я удалил все .dat файлы отовсюду, даже на всякий случай удалил info.wnd.
Проблема осталась. Более того, она также воспроизводится на других экземплярах КВИКА. А у брокера (со слов менеджера) её нет. Верится с трудом.
Теперь брокер просит выслать им архив КВИКа. Я не против, но прошу всё же ответа от компетентного специалиста-разработчика.
Для сравнения, то же самое на других акциях - NVIDIA (ранее я их НЕ скачивал, этот график прилетел ко мне в терминал впервые)
Вопрос про OnAllTrade
 
Я подписываюсь на новые сделки через INTERVAL_TICK и обрабатываю их в OnAllTrade
Хочу анализировать только новые сделки. Старые сделки, уже прошедшие за сегодня, обрабатывать не хочу.
Есть ли риски, что в OnAllTrade прилетит старая сделка из сегодняшних?
Ну например при первом старте КВИКа в 13 часов в КВИК начнут сыпаться ранее прошедшие сделки. Они мне не нужны. И только потом начнут поступать новые.  
Имитировать continue
 
В последующих версиях Lua есть функция continue, но КВИК работает на древней версии Луа, где такой опции нет.
можно ли как то силами Lua написать свою функцию continue и легко вставлять её в нужные куски кода, например:
Код
function continue ()
--бла-бла-бла

end

for i=1, 10 do

   if i==5 then continue() end
--бла-бла

end
Отправка транзакций из OnParam
 
Заметил, что отправка транзакций - выставление и снятие заявок - трудоёмкая операция.
Торгую 50-ю акциями. Если у меня висит 50 заявок, то при их массовом одновременном снятии квик подвисает на несколько секунд. При быстром выставлении такого же числа заявок он тоже зависает.
Поэтому вопросы.
1. Наблюдения верны? Отправка транзакций - ресурсоёмкая процедура?
2. Хочу отправлять транзакции из OnParam. Это плохая идея? С точки зрения логики работы программы это было бы очень удобно. Сейчас у меня отправка заявок идёт в функции main, там в бесконечном цикле перебираются одна за другой 50 акций на соблюдение условия выставления/снятия. Хочу перенести этот блок в OnParam.
Заявок ставится много, они всё время перевыставляются. В день отправляется до 10 тысяч заявок, то есть с учётом снятия это 20 000 транзакций.  
Выставить кодировку
 
Пишу код в Notepad++
Стоит эта кодировка:


Строка
Код
send_msg ("Снята: "..k)
, где k - тикер, в  квике выглядит так:


Как с этим бороться?
Критерий исполнения заявки OnTrade
 
Как с помощью колбека OnTrade понять, что заявка с известным номером исполнилась полностью или частично?
Как то же самое узнать с помощью колбека OnOrder?
Локальность переменной
 
Я хочу, чтобы таблица (или любая переменная) была локальной ради скорости её обработки

local row={}
for i=0,getNumberOf("orders")-1,1 do
row=getItem("orders",i)
end

является ли в этом примере row локальной?
Строка row=getItem("orders",i) не превращает ли её в глобальную? Ведь здесь идёт повторное объявление.
No such file
 
Получаю ошибку


Скрипт организован вот так:

То есть он не видит файл в той же папке где лежит запускаемый скрипт.
Но стоит запускамый скрипт Unitas 3.0.lua удалить а потом добавить, как всё начинает работать:


Запустил КВИК, нажал кнопку Запустить - не работает.
Удалил скрипт из списка, добавил снова, запустил - работает.
биржа или брокер?
 

биржа штрафует за ошибочные транзакции.
хочу уточнить - если я вижу такое сообщение, значит моя транзакция не долетела до биржи и отбита сервером брокера?
Индикатор фрактал
 
Пытаюсь переписать на Питоне индикатор Фрактал (код ниже). Но не могу понять что в этом коде происходит. Помогите пожалуйста написать на питоне индикатор фрактал для самого простого случая - список цен:
Например, как найти верхний фрактал (для пиков)?
price=[186.99,190.99,191.24,197,196.75,196.8,196.8,198,201.26,203.32,208.44,207.17,207.95,210.4,212.2,212,209.7,213.61,213.14,217.9,216.29,215.5,217.85,216.59,211.01,210.43,214,219.1,213.9,204.43,208,204.19,202.08,206.89,203.41,205.25,205.86,205.8,205.4,207.8,206.54,205.5,202.92,205,203.95,205.25,205.1,206,203.66,203.55,205.9,207.7,209.8,210.61,207.7,214,218,214.1,215.07,214.42,217.7,218.23,219.05,221.8,227.5,232.3,238,243.68,238.86,239.5,237.8,233.24,234.3,232.79,232.6,235.41,235.67,236,227.8,223.18,228.8,225.17,229.1,232.52,232.8,231.49,230,227,224.22,227.88,228.69,228.19,226.94,226]

Код
Settings = {
Name = "*FRACTALS (Fractals)", 
Period = 5,
line = {{
      Name = "Horizontal line",
      Type = TYPE_LINE, 
      Color = RGB(140, 140, 140)
      },
      {
      Name = "FRACTALS - Up", 
      Type = TYPE_TRIANGLE_UP, 
      Color = RGB(0, 206, 0)
      },
      {
      Name = "FRACTALS - Down", 
      Type = TYPE_TRIANGLE_DOWN, 
      Color = RGB(221, 44, 44)
      }
      },
Round = "off",
Multiply = 1,
Horizontal_line="off"
}
         
function Init()
   func = FRACTALS()
   return #Settings.line
end

function OnCalculate(Index)
local Out1,Out2 = func(Index, Settings)
   SetValue(Out1, 2, ConvertValue(Settings,H(Out1)))
   SetValue(Out2, 3, ConvertValue(Settings,L(Out2)))
   return tonumber(Settings.Horizontal_line),nil,nil
end

function FRACTALS() --Fractals ("FRACTALS")
   local H_tmp={}
   local L_tmp={}
   local it = {[1]=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 5)
if (P>0) then
   if I == 1 then
      H_tmp={}
      L_tmp={}
      it = {[1]=0, l=0}
   end
   if CandleExist(I,ds) then
      if I~=it[Squeeze(it.l,P)] then
         it.l = it.l + 1
         it[Squeeze(it.l,P)] = I
      end
      local Ip,Ipppp = Squeeze(it.l,P),Squeeze(it.l,P-1)+1
      local nP = math.floor(P/2)*2+1
      H_tmp[Ipppp] = GetValue(it[Ip],HIGH,ds)
      L_tmp[Ipppp] = GetValue(it[Ip],LOW,ds)
      if it.l >= nP then
         local S = it[Squeeze(it.l-nP+1+math.floor(nP/2),P)]
         local val_h=math.max(unpack(H_tmp))
         local val_l=math.min(unpack(L_tmp))
         local L = GetValue(S,LOW,ds)
         local H = GetValue(S,HIGH,ds)
         if (val_h == H) and (val_h >0) 
            and (val_l == L) and (val_l > 0) then
               return S,S
         else
            if (val_h == H) and (val_h > 0) then
               return S,nil
            end
            if (val_l == L) and (val_l > 0) then
               return nil,S
            end
         end
      end
   end
end
return nil,nil
end
end


SMA,MMA,EMA,WMA,SMMA,VMA = "SMA","MMA","EMA","WMA","SMMA","VMA"
OPEN,HIGH,LOW,CLOSE,VOLUME,MEDIAN,TYPICAL,WEIGHTED,DIFFERENCE,ANY = "O","H","L","C","V","M","T","W","D","A"

function CandleExist(I,ds)
return (type(C)=="function" and C(I)~=nil) or
   (type(ds)=="table" and (ds[I]~=nil or (type(ds.Size)=="function" and (I>0) and (I<=ds:Size()))))
end

function Squeeze(I,P)
   return math.fmod(I-1,P+1)
end

function ConvertValue(T,...)
local function r(V, R) 
   if R and string.upper(R)== "ON" then R=0 end
   if V and tonumber(R) then
      if V >= 0 then return math.floor(V * 10^R + 0.5) / 10^R
      else return math.ceil(V * 10^R - 0.5) / 10^R end
   else return V end
end
   if arg.n > 0 then
      for i = 1, arg.n do
         arg[i]=arg[i] and r(arg[i] * ((T and T.Multiply) or 1), (T and T.Round) or "off")
      end
      return unpack(arg)
   else return nil end
end

function GetValue(I,VT,ds) 
VT=(VT and string.upper(string.sub(VT,1,1))) or ANY
   if VT == OPEN then         --Open
      return (O and O(I)) or (ds and ds:O(I))
   elseif VT == HIGH then       --High
      return (H and H(I)) or (ds and ds:H(I))
   elseif VT == LOW then      --Low
      return (L and L(I)) or (ds and ds:L(I))
   elseif VT == CLOSE then      --Close
      return (C and C(I)) or (ds and ds:C(I))
   elseif VT == VOLUME then      --Volume
      return (V and V(I)) or (ds and ds:V(I)) 
   elseif VT == MEDIAN then      --Median
      return ((GetValue(I,HIGH,ds) + GetValue(I,LOW,ds)) / 2)
   elseif VT == TYPICAL then   --Typical
      return ((GetValue(I,MEDIAN,ds) * 2 + GetValue(I,CLOSE,ds))/3)
   elseif VT == WEIGHTED then   --Weighted
      return ((GetValue(I,TYPICAL,ds) * 3 + GetValue(I,OPEN,ds))/4) 
   elseif VT == DIFFERENCE then   --Difference
      return (GetValue(I,HIGH,ds) - GetValue(I,LOW,ds))
   else                     --Any
      return (ds and ds[I])
   end
return nil
end
Стакан или Текущая таблица
 
Записываю лучшие биды и аски по акциям средней ликвидности, например Распадская RASP.
Что лучше выбрать: OnParam или OnQuote?
Сомнения связаны с тем, что текущая таблица транслируется срезами раз в 50 миллисекунда, то есть будут пропущенные данные.
А стакан? Он транслируется срезами или безостановочно?
attempt to concatenate field '?' (a nil value)
 
Строка
Код
" sd="..(t_big[candle][6] or "nil")

выдаёт ошибку attempt to concatenate field '?' (a nil value)
6-поле действительно нил. Как правильно написать эту фразу?
Шаг вперёд в цикле
 
Есть цикл, внутри которого качаются котировки с финама по многим инструментам.
for i=start_year,cur_year,1 do

end
В начале почти по всем акциям прилетают пустые годы (котировок ещё нет)
Первый НЕпустой год я брать не хочу, потому что котировки ещё не адекватные.
Я хочу брать второй не пустой год.
То есть цикл должен быть таким
Код
for i=start_year,cur_year,1 do
  --если размер таблицы нулевой, шагаем на 2 шага
  --после этого всегда шагаем 1 шагом
end
как это написать?
доступ к большим таблицам
 
Есть две огромных таблицы, которые описывают одни и те же свечки
Код
t_big[candle] --хранит цены: {1=open,2=high,3=low,4=close}
sd[candle]--хранит стандартные отклонения для этих свечек: sd[candle]=4.6432234444
Брут форс многкратно обращается к этим полям в поисках наилучших параметров. Крутит цикл, внутри него ещё цикл, а потом ещё цикл. На просчёт пятиминуток за 12 лет по 21 акции у меня ушла неделя.
Объединение этих таблиц в одну приведёт ли к ускорению доступа к их полям? Хотя бы небольшому. Или это нейтрально?
Код
t_big[candle] --хранит цены: {1=open,2=high,3=low,4=close, 5=sd}
Загрузить одну функцию
 
Хочу загрузить из большой библиотеки "QL.lua" только одну функцию
Пытаюсь сделать так:
Код
local f = package.loadlib("C:/Program Files (x86)/Lua/5.1/lua/QL.lua", "math_round")
появляется странное окошко:

подскажите, что делать.
Данная идея возникла по прочтении Иерусалимскиса здесь:

Чёрное окошко (Питон, Луа)
 
У меня из скрипта Луа вызывается питоновский скрипт. Это происходит так:
Код
os.execute("C:\\InstallPython\\python.exe C:\\FINAM\\py+lua\\Finam_parser.py")
Когда всё работает нормально, в чёрном окошке пишется то, что задумано.

Это пишет питоновская функция print:

Lua-функция os.execute возвращает 0 (признак успеха).
Но часто бывает такая ерунда. Чёрное окошко появляется, в нём ничего не пишется. До print в 14 строчке не доходит.

И так навеки, пока это окошко не закрыть. После закрытия окошка функция os.execute раздупляется и возвращает огромное отрицательное число, например -1073741510
Данные не получены, надо запускать скрипт заново.
Помогите побороть этот глюк. Самое обидное то, что функция os.execute на время пустого чёрного окошка оказывается в подвешенном состоянии. Пока висит чёрное окошко, она ничего не возвращает, а значит нельзя обработать ошибку.  
Задать градиент
 
Есть ряд чисел от 0 до 10 с шагом 0,1
0 - белый цвет (точнее розовый, доведённый до стадии белого)
промежуточные цвета - розовые разной насыщенности
10 - красный цвет
Чем ближе к 10, тем сильнее розовый превращается в красный.
помогите пожалуйста задать это на Луа.
Это будет работать в таблице КВИКа и задаваться через SetColor
Если по простому, мне это надо, чтобы сильно упавшие акции были ярко-красными, а слабо упавшие были розовыми. Чем сильнее упала акция, тем интенсивнее красный цвет.
Надеюсь, понятно выразил мысль.  
Итераторы на Луа
 
Читаю книжку Иерусалимскиса про Луа.
Вот код оттуда.
Код
function values (t)
   local i = 0
   return function () i = i + 1; return t[i] end
end

t = {10, 20, 30}
iter = values(t) -- создает итератор
while true do
   local element = iter() -- вызывает итератор
   if element == nil then break end
   print(element)
end
Код работает как запланировано:


Почему всё становится плохо, если строку
Код
local element = iter() -- вызывает итератор
заменить на
Код
local element = values(t)

Чем отличаются эти варианты?
откуда x
 
Иду по книжке иерусалимскиса "Программирование на Луа"
Поясните пожалуйста этот пример
Код
function derivative (f, delta)
   delta = delta or 1e-4
   return function (x) return (f(x + delta) - f(x))/delta end
end

c = derivative(math.sin)
print(math.cos(5.2), c(5.2))
Откуда function (x) return (f(x + delta) - f(x))/delta end берёт свой аргумент x?
http://dl4.joxi.net/drive/2018/12/28/0011/1313/742689/89/736976d5d2.pnghttp://dl4.joxi.net/drive/2018/12/28/0011/1313/742689/89/736976d5d2.png
Вопрос по книге Луа
 
Подскажите пожалуйста, что в этом коде делает _Window и чем она отличается от Window?
Код
function Window (options)
-- проверка обязательных опций
if type(options.title) ~= "string" then
error("no title")
elseif type(options.width) ~= "number" then
error("no width")
elseif type(options.height) ~= "number" then
error("no height")
end
-- everything else is optional
_Window(options.title,
options.x or 0, -- значение по умолчанию
options.y or 0, -- значение по умолчанию
options.width, options.height,
options.background or "white", -- по умолчанию
options.border -- по умолчанию false (nil)
)
end
Это код из Главы 5.3. книги Иерусалимскиса Программирование на Луа.
Речь идёт про именованные аргументы.
Перед приведённым кодом идёт текст:

os.clock проблема
 
Добрый день.
Функция os.clock() почему то вернула неадекватное значение, хотя всегда работала нормально согласно ожиданиям.

Терминал стоит на виртуалке, не выключался несколько недель. Произошёл "перешаг" в новый месяц с ноября на декабрь... Не знаю важно ли это для установления проблемы. Из за чего это может быть?
функция Unpack
 
Здравствуйте.
У меня работает эта функция в таком виде:
print(unpack{10,20,30})

Но в том виде как в книжке по Луа, она выдаёт ошибку


map или чтение файла (dll на c++)
 
пишу dll на C++ для КВИКа (вызывается через Lua)
Схема действий такая.
Десятки файлов, каждый по 50-100 тысяч строк хранят биржевую информацию, которую я каждый день записываю. Тестер будет прочёсывать множество таких накопленных файлов.
Поиск наилучшего параметра будет проходить обычным брутфорсом, например,
параметр А прогнать на каждом из файлов, меняя значение параметра с 1 до 100, то есть сто итераций.
Какой путь лучше избрать с точки зрения скорости исполнения?
1. Значения из файла (те самые 50 тысяч строк) считываются в оперативную память и хранятся в массиве map. Робот прогоняет 100 значений параметра на содержимом этого map.
2. На каждой итерации робот читает файл строчку за строчкой, то есть каждый раз обращается к тексту, не запоминая содержимое файла.
Что будет быстрее?
Попробовать оба варианта мне будет сложно из-за слабых программистских навыков, поэтому прошу опытных людей подсказать лучший путь.  
Фильтр премаркета
 
Уже не первый год работаю с индикаторами INDICATORS.ZIP, написанными Сергеем Гороховым.
https://arqatech.com/upload/iblock/2eb/INDICATORS.zip
Как в этих индикаторах, на примере Moving Average отсекать свечки премаркета (те которые 9:59)?
Где ставить проверку
"Если время меньше 10 часов, то игнорировать свечу?"
Спасибо.
Исполнить скрипт питона в Луа
 
Пытаюсь из кода Lua исполнить питоновский скрипт.
для этого вызываю
Код
os.execute("C:\\py+lua\\parser.py")
на мгновение появляется чёрное окошко, сразу исчезает и ничего не происходит
os.execute возвращает 0.
профилирование кода Lua+dll
 
Сижу туплю, не пойму как мне профилировать dll на Си++ с помощью Visual Studio 2017.
dll вызывается из Луа

Что писать в Command-line arguments и Working directory?
При попытке запустить профилирование появляется ошибка:

Это сопровождается текстом:
Profiling started.
Instrumenting D:\_c++\runfast\Release\runfast.dll in place
Info VSP3049: Small functions will be excluded from instrumentation.
Microsoft ® VSInstr Post-Link Instrumentation 15.8.18219.1 x86
Unable to obtain debug information. Link with the /PROFILE linker switch.
PRF0002: Instrumentation failed with these options: /u "D:\_c++\runfast\Release\runfast.dll"   /excludesmallfuncs.  Please check the output window for additional details.
Data written to D:\_c++\runfast\info181001(3).vsp.
Profiling finished.
Profiling complete.

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


Сама luarocks работает. Команды выполняет:
% lua hello.lua
 
Хочу систематизировать знания по Луа, читаю книгу Иерузалмиски
Сразу какие-то непонятки:


у меня возникает такая проблема. Почему?


файл лежит в корне луа там где lua.exe
dofile в защищённом режиме
 
В файле tbl.lua лежит небольшая таблица вида:
Код
t={
a=100
b=200
}

Но иногда в этом файле могут быть кривые данные. Если вызывать этот файл с помощью dofile (tbl.lua), могут быть ошибки и основной скрипт остановится с ошибкой.
Как написать в духе:

dofile (tbl.lua), но если там нечитаемый бред, то идти дальше и не обновлять таблицу t (пользоваться старой).
Глобальные таблицы Lua на C++
 
Прошу подсказать какой аналог глобальной таблицы Луа для Си++
Совсем точноЙ формулировкой вопроса будет, как то же самое написать на Си++
Код
ticker_list="GAZP,SBER,GMKN"
period_muvinga={}
period_muvinga.GAZP=23
period_muvinga.SBER=19
period_muvinga.GMKN=20
for sec in string.gmatch(ticker_list,"%a+") do
   local period=period_muvinga[sec]
end
и второй вопрос.
Когда дойдёт дело до объявления чего-то глобального в Си++ (то что является ответом на первый вопрос), в какой части кода это объявлять?
Я пока не могу придумать ничего лучше кроме как здесь. Речь идёт про dll, написанную на Си++:
Код
// стандартная точка входа для DLL
BOOL APIENTRY DllMain(HANDLE hModule,
   DWORD  ul_reason_for_call,
   LPVOID lpReserved
)
{
        //ОБЪЯВЛЕНИЕ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ
   return TRUE;
}
lua_rawgeti прерывает цикл
 
Тестирую dll, привязанную к Луа.
Происходит загадочная вещь, прошу помочь.
Привожу код внутри dll
Этот цикл работает правильно.
Код
for (int i = 1; i<=4; i++){            
printf("%i", i);
printf("\n");   
//lua_rawgeti(L, -2, i); закомментировано   
//lua_getfield(L, -1, "quantity"); закомментировано
//auto q = lua_tonumber(L, -1); закомментировано
}
Пишет в консоль
1
2
3
4
Код
А этот цикл обрывается на второй итерации:
for (int i = 1; i<=4; i++){            
printf("%i", i);
printf("\n");   
lua_rawgeti(L, -2, i); 
lua_getfield(L, -1, "quantity"); 
auto q = lua_tonumber(L, -1); 
}
Пишет
1
2

Путём опытов я понял, что проблема в функции lua_rawgeti(L, -2, i);  Она обрывает цикл на второй итерации.
Почему?
П.С. Если это важно, то всё это происходит внутри обработки колбека OnQuote
Передать getQuoteLevel2 в dll
 
Спасибо этому форуму за советы и подсказки.
Как принять в dll таблицу с целочисленными ключами, разобрался.
Прошу подсказать как внутри dll разобрать по полям более сложную таблицу.
Код
qt=getQuoteLevel2(class, sec)
Согласно документации она возвращает таблицу, в которой два стринга и две вложенных таблицы.

Мне нужны для работы все четыре.
Как мне, к примеру, получить объём из 3-й котировки на покупку?

Для разбора таблицы с целочисленными индексами мой код внутри dll выглядит так:
Код
static int forLua_SumArray(lua_State* L) {
   // Get the length of the table (same as # operator in Lua)
   int n = lua_objlen(L, 1);
   double sum = 0.0;

   // For each index from 1 to n, get the table value as a number and add to sum
   for (int i = 1; i <= n; ++i) {
      lua_rawgeti(L, 1, i);
      sum += lua_tonumber(L, -1);
      lua_pop(L, 1);
   }

   lua_pushnumber(L, sum);
   return 1;
}
dll против Луа. Странности
 
Вот функция на Си++ внутри dll. Она принимает таблицу и выдаёт обратно в Луа сумму элементов этой таблицы.
Код
static int forLua_SumArray(lua_State* L) {
   // Get the length of the table (same as # operator in Lua)
   int n = lua_objlen(L, 1);
   double sum = 0.0;
   // For each index from 1 to n, get the table value as a number and add to sum
   for (int i = 1; i <= n; ++i) {
      lua_rawgeti(L, 1, i);
      sum += lua_tonumber(L, -1);
      lua_pop(L, 1);
   }

   lua_pushnumber(L, sum);
   return 1;
}
Я ожидаю, что чем больше элементов будет в таблице, тем сильнее dll должна опережать аналогичные подсчёты в Луа.
Написал код для сравнения скорости.
Код
iterations=1000000
function main ()
   t={}
   for i=1,20 do--вставляем в таблицу 20 элементов
      table.insert(t,i)
   end
--гоняем цикл миллион раз
   start=os.clock()
   for i=1,iterations do
      s=runfast.SumArray(t)
   end
   finish_dll=os.clock()-start
   mm("dll:"..finish_dll)
--гоняем цикл миллион раз
   start=os.clock()
   for i=1,iterations do
      s=sum(t)
   end
   finish_lua=os.clock()-start
   mm("Lua:"..finish_lua)
   mm("Lua slower:"..math_round((finish_lua/finish_dll),1))
end

Луа медленнее в 2,4 раза. Я мучаюсь с Си ради роста скорости в 100 раз, ну да ладно. В 2,5 раза тоже кое-что. Сказываются транспортные издержки при перекидывании данных между Си и Луа.
************************
А теперь удивительное для меня. Заполняю таблицу 40 элементами.
Код
        t={}
   for i=1,40 do
      table.insert(t,i)
   end
Значит внутри Си++ будет производиться в 2 раза больше операций и она сможет лучше проявить своё преимущество в скорости по сравнению с Луа.
Но нет: при 40 элементах в таблице преимущество Си в скорости такое же.



Почему?
Я думал, что чем больше таблица, тем быстрее будет работать вариант кода с dll.
Объясните пожалуйста.
luaL_len отсутствует в Lua 5.1
 
Пытаюсь в моей dll применить код на Си
Код
static int forLua_SumArray (lua_State* L) {    // Get the length of the table (same as # operator in Lua)
    int n = luaL_len(L, 1);
    double sum = 0.0;

    // For each index from 1 to n, get the table value as a number and add to sum
    for (int i = 1; i <= n; ++i) {
      lua_rawgeti(L, 1, i);
      sum += lua_tonumber(L, -1);
      lua_pop(L, 1);
    }

    lua_pushnumber(L, sum);
    return 1; 
}
всё хорошо, но в Луа 5.1. нет функции luaL_len. Она появилась в более поздних версиях.
Вот код этой функции в Луа 5.3.




Как мне это внедрить в свою dll?
Как дописать строку в lauxlib.h - это понятно.  А вот файла lauxlib.c в моей Луа 5.1.5 вообще нет.
Стек при 2 функциях (dll)
 
У меня в dll две функции. Обе постоянно что то делают со стеком. Есть ли риски того, что они будут по ошибке брать элементы друг друга? Или для каждой из них свой стек и путаница не грозит?
Поместить колбек в dll
 
Как делать простые вещи с dll вроде разобрался.
Прошу проконсультировать, как поместить в dll колбек OnQuote
Чтобы это выглядело как то так:
package.cpath = "C:\\runfast.dll"
require "runfast"
runfast.OnQuote()
...
и так далее.
Ума не приложу где мне эту строчку runfast.OnQuote()  размещать. За пределами main как и сейчас?
подскажите пожалуйста
Арифметические операции со временем
 
Я совершаю в Луа арифметические операции со временем. Например 124500+5=124505 (12:45:05).
По какой формуле я могу избежать проблемы с 60 минутами/секундами?
124459+5=124504 (не 124464)
Как этого добиться?
Lua и dll на C
 
Написал dll, в которой одна функция: сложение двух чисел.
Вот она внутри проекта C++ (пример взят с сайта quik2dde.ru)
Код
static int forLua_AddTwoNumbers(lua_State *L) {
   // получаем первый и второй параметры вызова функции из стека с проверкой каждого на число
   double d1 = luaL_checknumber(L, 1);
   double d2 = luaL_checknumber(L, 2);
   // помещаем в стек результат сложения
   lua_pushnumber(L, d1 + d2);
   return(1);  // эта функция возвращает одно значение
}
Теперь тестирую эту функцию в Луа. Сравниваю скорость:
1) как быстро складывает dll
2) как быстро складывает Lua
Код
package.cpath = "C:\\runfast.dll"
require("runfast")
iterations=10000000
function main()
   start=os.clock()
   for i=1,iterations do
      r = runfast.AddTwoNumbers(i, i)
   end
   finish=os.clock()-start
   message ("C dll:"..tostring(finish), 1)
   start=os.clock()
   for i=1,iterations do
      r = i+i
   end
   finish=os.clock()-start
   message ("Lua:"..tostring(finish), 1)
end
результат:

Луа быстрее в 3,6 раза.
Почему?
Из-за всех этих телодвижений со стеком?
Но как тогда извлекать преимущество от скорости Си++?
Мне надо переместить в dll из Луа кучу трудоёмких функций, чтобы быстро считалось.
string.lower()
 
пытаюсь оптимизировать строку
Код
if string.find(reply.result_msg, "Снят") or string.find(reply.result_msg, "снят") then

end
Для этого использую string.lower(reply.result_msg)
Но он не понимает русские буквы. Текст всё равно остаётся "Заявка 89900000 снята" или "Снято заявок". Большие буквы не становятся маленькими.
Дело в русских буквах? Как с этим справиться?
Ошибка dll для Lua
 
Этот код в одной из предыдущих веток написал Suntor. Это простая dll для КВИКа.
Код
#include <windows.h>
#define LUA_LIB
#define LUA_BUILD_AS_DLL
#ifdef __cplusplus
extern "C" {
#endif
#include <D:\_c++\contrib\lua.h>
#include <D:\_c++\contrib\lualib.h>
#include <D:\_c++\contrib\lauxlib.h>
#ifdef __cplusplus
}
#endif

static int spread(lua_State *L)
{
    double bid   = luaL_checknumber(L, 1);
    double offer = luaL_checknumber(L, 2);

    /* здесь наши вычисления */

    lua_pushnumber(L, offer-bid);
    return 1;
}

static const luaL_Reg mylib_funcs[] = {
    {"spread", spread},
    {NULL, NULL}
};

#ifdef __cplusplus
extern "C" 
#endif
LUALIB_API int luaopen_mylib(lua_State *L)
{
    luaL_register(L, "mylib", mylib_funcs);
    return 1;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {return TRUE;}
пытаюсь его откомпилировать, но он выдаёт ошибки:

файлы Lua в проект включены

спасибо за помощь.
Странность в ленте обезличенных сделок
 
Здравствуйте.
как объяснить такой феномен в таблице обезличенных сделок?

время скачет
вывод отладочной информации
 
Подскажите пожалуйста, как выводить отладочную информацию из скрипа в окошко командной строки?
в это


или в это (без разницы)
Срабатывание OnQuote
 
Возможна ли такая ситуация:
в стакане произошли два изменения одновременно, и колбек OnQuote сработал только один раз?
Или раз заявки идут одна за другой очередью, то будет гарантированно два срабатывания колбека?
Страницы: 1 2 3 След.
Наверх