func = RSI() ;
local rsi_count={}
nk=ds[real]:Size()
for i=1,nk do rsi_count[i]=func(i, {Period=rsi_period, VType="Typical"}, ds[real]) end
if rsi_count[nk]~=nil then
rsi0=rsi_count[nk]
rsi1=rsi_count[nk-1]
rsi2=rsi_count[nk-2]
rsi3=rsi_count[nk-3]
rsi4=rsi_count[nk-4]
max_rsi=math.max(rsi0,rsi1,rsi2,rsi3,rsi4)
in_rsi=math.min(rsi0,rsi1,rsi2,rsi3,rsi4)
else
mm (real.." "..nk.." rsi_count[num_candles]=nil") ; sleep (100)
end
func = RSI() ;
local rsi_count={}
nk=ds[real]:Size()
for i=1,nk do rsi_count[i]=func(i, {Period=rsi_period, VType="Typical"}, ds[real]) end
if rsi_count[nk]~=nil then
rsi0=rsi_count[nk]
rsi1=rsi_count[nk-1]
rsi2=rsi_count[nk-2]
rsi3=rsi_count[nk-3]
rsi4=rsi_count[nk-4]
max_rsi=math.max(rsi0,rsi1,rsi2,rsi3,rsi4)
in_rsi=math.min(rsi0,rsi1,rsi2,rsi3,rsi4)
else
mm (real.." "..nk.." rsi_count[num_candles]=nil") ; sleep (100)
end
Добрый день. Давно пользуюсь этой библиотекой. Спустя два года запустил старый скрипт. Цель - получить последнюю свечу на графике.
В таком виде перестало работать.
Код
func1 = MA()
local num_candles=ds[instr]:Size()
last=func1(num_candles, {Period=mov_period, Metod = "SMA", VType="Typical"}, ds[instr])
А в таком почему-то работает. Главное отличие второго варианта: в нём рассчитываются все значения мувинга слева направо и потом берётся нужный. А в первом варианте я сразу обращался к нужной мне свече.
Код
func1 = MA()
local ma_count={}
local num_candles=ds[instr]:Size()
for i=1, num_candles do
ma_count[i]=func1(i, {Period=mov_period, Metod = "SMA", VType="Typical"}, ds[instr])
end
last = ma_count[#ma_count]
BlaZed, перечитайте мои два сообщения ещё раз. Egor Zaytsev ответил на мой вопрос, хотя я почему-то и правда был уверен, что main каждое утро в обязательно порядке САМ перезапускается. А в его начале у меня стоит функция чтения файла, который лежит на ноутбуке.
Уточню Я запустил скрипт, скрипт считал данные. Я надеюсь, что они лежат в памяти "вечно". Но по утрам всё обнуляется из-за повторного запуска main? КВИК на виртуалке не имеет постоянного доступа к ноутбуку. Я вышел с виртуалки, и связь с ноутбуком пропала. Но я рассчитываю, что считанные данные останутся в памяти.
Квик стоит на виртуалке. Скрипт лежит на моём ноутбуке. Скрипт читает файлик с сигналами, который тоже лежит на ноутбуке. Вид файла с сигналами: 01.02.2021 at 11:00 open_long SBER
Эта строка парсится и записывается в Луа-таблицу. Я надеюсь, что она вечно хранится в памяти. Но выходит что нет? Каждое утро Квик по новой запускает main и обнуляет все переменные? Уточните пожалуйста что происходит утром в плане: -работы main -существования переменных и таблиц скрипта.
Начал запускать свой старый скрипт. Он был 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 транзакций.
Вопрос, связанные с троекратным приходом сделки. Если у меня заключается много сделок, в том числе почти одновременно, возможно ли, что три колбека перемежаются колбеками от соседних сделок. Ну например прилетает первый колбек по Сберу, потом один по Газпрому, а потом долетают ещё по два колбека от Газпрома и Сбера? Или они приходят строго очередями? Сначала три по одной бумаге, потом три по другой? --- Ну и раз вам эта проблема знакома, то какой лучший способ с нею бороться?