Есть ли возможность продлевать демо доступ, чтобы не регистрироваться каждый раз и не создавать отдельные ветки каждый месяц? Может быть стоит создать одну ветку где все желающие могли бы просить продлиться и закрепить ее вверху? Мой аккаунт U0132383 Спасибо!
В демо квике на демо сервере при запросе параметра получаю 0. Если открыть таблицу текущих торгов, то там тоже 0. Не смотря на то, что этот 0 подсвечивается то зеленым, то красным, что означает изменение параметра.
Код
function main()
local last_change = getParamEx('QJSIM', 'GAZP', "LASTCHANGE")
message("result:" .. tostring(last_change.result) .. ", value = " .. tostring(last_change.param_value) .. ", image = " .. tostring(last_change.last_change))
end
Значение "OPEN" возвращает корректно, а вот "CHANGE" опять 0. Это ограничения демо?
Пытаюсь применить условное форматирование как на скрине. И результат тоже не скрине.
Т.е. Крик считает все числа больше 10.5. То же самое с фильтром. Ставлю на эту же колонку условие "Меньше 500", но ни одна строка не исчезает. Ставлю "Больше 500" и исчезают все строки.
Еще такой вопрос: почему не смотря на то, что при инициализации таблицы я указал, что тип колонки double, перед установкой значения ячейки необходимо преобразовывать значение в строку иначе она в таблице не появляется?
stopped = false
function main()
ds, err = CreateDataSource('QJSIM', 'GAZP', INTERVAL_M1, 'bid')
while (err == "" or err == nil) and ds:Size() == 0 do
sleep(5)
end
if err ~= "" and err ~= nil then
message("Error: " .. err)
return
end
message("size:" .. tostring(ds:Size()))
ds:SetUpdateCallback(myFunc)
while stopped ~= true do
sleep(50)
end
end
function myFunc(index)
message(tostring(index))
end
На любой тикер и любой параметр param сервер возвращает пустую таблицу (т.е. ds:Size() всегда 0) пробовал выставлять sleep больше - не помогает. В любом случае должен был бы сработать callback, но ожидание в 5 минут после старта ничего не дало. Тот же самый код в версии 6 в демо quik возвращает таблицу с данными.
Написал собственную библиотеку для работы с Quik через lua. На компьютере, где велась разработка (Win7), все работает отлично. На другом компьютере с тем же квиком (WinServer 2012R2) получаю ошибку "error loading module 'MyDll' from file '.\MyDll.dll':The specified module could not be found." Проект собирал с конфигурацией "Release", "Win32", "Runtime libriry = Multi-threaded". Прошелся программой Dependency Walker - почти все зависимости есть (http://take.ms/6Knry). Тот же release на компьютере, где писалась библиотека работает на ура. На сервере устанавливал vcredist_x64.exe и vcredist_x86.exe. Что еще я не сделал или сделал не так?
Вопрос в названии темы. При постановке заявки я могу посчитать какое количество контрактов до меня по этой же цене. Но стакан ведь "живой", данные меняются, кто-то снимает заявки, кто-то ставит. Как в любой момент времени посчитать сколько контрактов передо мной?
Как "280" разбивать на флаги, если максимум, что мы должны получить - это 255? Иногда проскальзывает "284". Проблема только с маркетными заявками отправляемыми программно. Код отправки:
Код
--Send limit or market order
function SendOrder(operation, price, quantity, type_order, comment)
-- Если это маркет заявка и цена не указана, то подставим цену в зависимости от типа заявки
if type_order == "M"
and price == 0 then
if operation == "B" then
price = tonumber(getParamEx(params.p_classcode, params.p_seccode, "pricemax").param_value)
elseif operation == "S" then
price = tonumber(getParamEx(params.p_classcode, params.p_seccode, "pricemin").param_value)
end
end
transaction = {
["CLASSCODE"] = params.p_classcode,
["ACTION"]="NEW_ORDER",
["ACCOUNT"]=params.account,
["OPERATION"] = operation,
["SECCODE"] = params.p_seccode,
["PRICE"] = tostring(round(price)),
["QUANTITY"] = tostring(quantity),
["TYPE"] = tostring(type_order),
["Условие исполнения"]=tostring("Поставить в очередь"),
["Переносить заявку"] = tostring("Да"),
["Дата экспирации"] = os.date("%Y%m%d", os.time() + 60 * 60 * 24),
}
--Check connection
if isConnected == 0 then
WriteLog("SendOrder", "Try to send limit in offline mode")
else
transaction.TRANS_ID = tostring(trans_id)
transaction.CLIENT_CODE = comment
res = sendTransaction(transaction)
end
if string.len(res) ~= 0 then
message(res)
end
end
Здравсвтуйте. Вопрос по индикатору EMA, описанному в примере по ссылке. Все что описано работает. Но в моей задаче, я вычисляю среднюю EMA по нескольким периодам. Пример: averEMA = (EMA(index, 3) + EMA(index, 4) + EMA(index, 5)) / 3. Так как это функция, при расчете EMA с периодом 4 я затираю значение рассчитаной ЕМА3, на этой же итерации. А оно будет нужно на следующем баре. Код индикатора:
Код
Settings= {
Name = "averEMA",
startPeriod = 3,
endPeriod = 6,
line =
{
{
Name = "AverEMA",
Color = RGB(90, 110, 200),
Type = TYPE_LINE,
Width = 1
}
}
}
function Init()
return 1
end
function OnCalculate(index)
local s
if index == 1 then
EMA = _EMA()
line = {}
end
s = 0
for i = Settings.startPeriod, Settings.endPeriod do
local k
k = EMA(index, i)
s = s + k
end
if index <= Settings.endPeriod then
line[index] = 0
else
line[index] = s / (Settings.startPeriod - (Settings.endPeriod - 1))
end
message("---- message 1 -----")
message("EMA3 = "..tostring(EMA(index, 3)))
--message("---- message 2 -----")
--message("EMA3 = "..tostring(EMA(index, 3))..", EMA4 = "..tostring(EMA(index, 4)))
return line[index]
end
function _MA()
local cache={}
return function(iIndex, iPeriod)
local sum = 0
local p = 0
local period = iPeriod
local index = iIndex
local result = 0
local str = ""
if index == 1 then
cache = {}
end
if index < period then
cache[index] = 0
return 0
end
for i = index - period + 1, index do
sum = sum + C(i)
end
result = sum / period
cache[index] = result
return result
end
end
function _EMA()
local cache={}
local MA = _MA()
return function(ind, _p, kk)
local n = 0
local p = 0
local period = _p
local index = ind
local k = kk or 2/(period + 1)
if index == 1 then
cache = {}
end
if index <= period then
cache[index] = 0
return 0
end
if cache[index - 1] == 0
or cache[index - 1] == nil then
p = MA(index - 1, period)
else
p = cache[index - 1]
end
n = C(index) * k + (1-k)*p
cache[index] = n
return n
end
end
Результаты теста можно увидеть на скринах. В коде изменяется только строка вывода сообщения. Первый вариант: Одна строка содержит только ЕМА3 и она выводится корректно. И второй вариант, когда выводится результата вычисления ЕМА3 и ЕМА4. И в этом случае ЕМА3 корректна только на первой итерации, дальше она считается не верно. Как такого избежать?