Начал запускать свой старый скрипт. Он был 100% рабочим. Теперь на версии КВИКа 8.8.4.3 вылазит ошибка: смысл понятен - мне надо 32 битную, а тут 62. Но как с этим бороться, - не понимаю. Скрипт пытается сделать
работает и без указания полного пути к Питону. Я не знал, что так можно! Это решает мою проблему, я задал этот вопрос, так как думал, что нужен полный путь к python.exe
Но мне нужен именно мелкий таймфрейм. Эти искажения влияют на работу луа-индикатора. Я сразу понял, что брокер не прав, говоря, что это проблема у меня в КВИКе. Значит, это они транслируют эти уродливые графики. Как это исправить?
Да код класса FEN. Это касается всех инструментов из него. Как видно на графике, эта проблема была всегда, а не только после указанной вам даты. Я уже неоднократно перезаказывал архив графиков, чистил .dat файлы, в которых они хранятся. Эти пустые свечки не пропадают с графика. Брокер ведёт себя так, словно это проблема у меня на КВИКе, но мой знакомый заходил под моей учёткой в новый скачанный квик на другом конце земного шара, и это проблема выглядела так же. Это брокер транслирует в КВИК эту ерунду, но почему-то ведёт себя странно и не признаёт этого.
Добрый день. Подписан у брокера Открытие на трансляцию мировых рынков. График по иностранным инструментам выглядит так: Искусственно заполняются неторговые часы. Брокер говорит, что эта проблема есть только у меня. По просьбе брокера я удалил все .dat файлы отовсюду, даже на всякий случай удалил info.wnd. Проблема осталась. Более того, она также воспроизводится на других экземплярах КВИКА. А у брокера (со слов менеджера) её нет. Верится с трудом. Теперь брокер просит выслать им архив КВИКа. Я не против, но прошу всё же ответа от компетентного специалиста-разработчика. Для сравнения, то же самое на других акциях - NVIDIA (ранее я их НЕ скачивал, этот график прилетел ко мне в терминал впервые)
А как это лучше сделать? Ведь при первом запуске скрипта в, скажем 13 часов, КВИК сначала загружает историю сегодняшних сделок, и они выглядят как свежие, хотя они старые
Я подписываюсь на новые сделки через INTERVAL_TICK и обрабатываю их в OnAllTrade Хочу анализировать только новые сделки. Старые сделки, уже прошедшие за сегодня, обрабатывать не хочу. Есть ли риски, что в OnAllTrade прилетит старая сделка из сегодняшних? Ну например при первом старте КВИКа в 13 часов в КВИК начнут сыпаться ранее прошедшие сделки. Они мне не нужны. И только потом начнут поступать новые.
В последующих версиях Lua есть функция continue, но КВИК работает на древней версии Луа, где такой опции нет. можно ли как то силами Lua написать свою функцию continue и легко вставлять её в нужные куски кода, например:
Код
function continue ()
--бла-бла-бла
end
for i=1, 10 do
if i==5 then continue() end
--бла-бла
end
Вот рабочий вариант, внедрённый в робота. Увы, приходится объявлять переменную paper как глобальную, потому что sec внутри fn не видна.
Код
function fn(t)
if stop_search then return nil end --stop_search - это флаг. Изначально равен nil
if t.sec_code == paper and t.client_code==client_code and t.limit_kind==2 then
stop_search=true
return true
else
return false
end
end
function get_position (sec)
paper=sec
stop_search=nil --убиваем флаг, выставленный на прежних запусках функции.
tbl_indxs=SearchItems('depo_limits', 0, getNumberOf("depo_limits")-1, fn)
if tbl_indxs then
limit = getItem("depo_limits", tbl_indxs[1]) --найден 1 индекс, его и берём.
local lot=lot[sec]--lot[sec] ранее определена
return limit.currentbal/lot,limit.locked_buy/lot, limit.locked_sell/lot, limit.awg_position_price
else
return 0,0,0,0
end
end
function fn(t)
if stop_search then return nil end --stop_search - это флаг. Изначально равен nil
if t.sec_code == sec and t.client_code==client_code and t.limit_kind==2 then
stop_search=true
return true
else
return false
end
end
function get_position (sec)
stop_search=nil --убиваем флаг, выставленный на прежних запусках функции.
tbl_indxs=SearchItems('depo_limits', 0, getNumberOf("depo_limits")-1, fn)
limit = getItem("depo_limits", tbl_indxs[1]) --найден 1 индекс, его и берём.
local lot=lot[sec]--lot[sec] ранее определена
return limit.currentbal/lot,limit.locked_buy/lot, limit.locked_sell/lot, limit.awg_position_price
end
Nikolay Pavlov, спрошу про другой случай. Я знаю, что в нужной мне таблице только один элемент с нужным параметром. Например, я ищу в depo_limits текущий остаток по SBER. Как мне в SearchItems оборвать поиск сразу после того как SBER был найден?
Я делаю что-то в таком духе:
Код
function fn(t)
if t.sec_code == sec and t.client_code==client_code and t.limit_kind==2 then
return true
else
return false
end
end
tbl_indxs=SearchItems('depo_limits', 0, getNumberOf("depo_limits")-1, fn)
и второй вопрос, как мне в функцию fn передать переменную sec?
функция для снятия всех заявок. в неё передаётся таблица с тикерами.
Код
function CleanActive (ticker_list) --переписать её, чтобы искать с конца.
local row={}
for i=0,getNumberOf("orders")-1,1 do
row=getItem("orders",i)
local sec=row.sec_code
if table_contains(ticker_list, sec) and orderflags2table(row.flags).active then
res,ms=killOrder(tostring(row.order_num),sec,row.class_code)
end
end
end
Код
function table_contains(table, element)
for _, value in pairs(table) do
if value == element then return true end
end
return nil
end
Я запускаю CleanActive из OnStop и из самого начала функции main. Это очень часто вешает квик, приходится его убивать через окно с процессами.
Заметил, что отправка транзакций - выставление и снятие заявок - трудоёмкая операция. Торгую 50-ю акциями. Если у меня висит 50 заявок, то при их массовом одновременном снятии квик подвисает на несколько секунд. При быстром выставлении такого же числа заявок он тоже зависает. Поэтому вопросы. 1. Наблюдения верны? Отправка транзакций - ресурсоёмкая процедура? 2. Хочу отправлять транзакции из OnParam. Это плохая идея? С точки зрения логики работы программы это было бы очень удобно. Сейчас у меня отправка заявок идёт в функции main, там в бесконечном цикле перебираются одна за другой 50 акций на соблюдение условия выставления/снятия. Хочу перенести этот блок в OnParam. Заявок ставится много, они всё время перевыставляются. В день отправляется до 10 тысяч заявок, то есть с учётом снятия это 20 000 транзакций.
Вопрос, связанные с троекратным приходом сделки. Если у меня заключается много сделок, в том числе почти одновременно, возможно ли, что три колбека перемежаются колбеками от соседних сделок. Ну например прилетает первый колбек по Сберу, потом один по Газпрому, а потом долетают ещё по два колбека от Газпрома и Сбера? Или они приходят строго очередями? Сначала три по одной бумаге, потом три по другой? --- Ну и раз вам эта проблема знакома, то какой лучший способ с нею бороться?
Как с помощью колбека OnTrade понять, что заявка с известным номером исполнилась полностью или частично? Как то же самое узнать с помощью колбека OnOrder?
Скрипт организован вот так: То есть он не видит файл в той же папке где лежит запускаемый скрипт. Но стоит запускамый скрипт 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
Мне нужна непрерывная запись изменяющегося лучшего бида. Объясните пожалуйста, как мне его получить с помощью CreateDataSource. Или всё-таки придётся писать онлайн лог изменения текущей таблицы?
Let_it_go написал: Записываю лучшие биды и аски по акциям средней ликвидности, например Распадская RASP. Что лучше выбрать: OnParam или OnQuote? Сомнения связаны с тем, что текущая таблица транслируется срезами раз в 50 миллисекунда, то есть будут пропущенные данные. А стакан? Он транслируется срезами или безостановочно?
получать историю параметра 'лучший бид' через createdatasource
Майк, спасибо за ответ. Не первый раз выручаете. Но я не понимаю как это сделать. Документация не раскрывает подробности:
Записываю лучшие биды и аски по акциям средней ликвидности, например Распадская RASP. Что лучше выбрать: OnParam или OnQuote? Сомнения связаны с тем, что текущая таблица транслируется срезами раз в 50 миллисекунда, то есть будут пропущенные данные. А стакан? Он транслируется срезами или безостановочно?
Есть цикл, внутри которого качаются котировки с финама по многим инструментам. for i=start_year,cur_year,1 do
end В начале почти по всем акциям прилетают пустые годы (котировок ещё нет) Первый НЕпустой год я брать не хочу, потому что котировки ещё не адекватные. Я хочу брать второй не пустой год. То есть цикл должен быть таким
Код
for i=start_year,cur_year,1 do
--если размер таблицы нулевой, шагаем на 2 шага
--после этого всегда шагаем 1 шагом
end
sergei написал: data mining вряд ли целесообразно на lua делать, особенно в таких масштабах производительность должна быть в разы (если не на порядки) ниже более целесообразного варианта
при сбое в электропитании даже промежуточных результатов не будет, да?