Владимир Киселев (Все сообщения пользователя)

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

Страницы: 1
Какая судьба языка QPILE
 
Цитата
Sergey Gorokhov написал:
kbrobot.ru  ,
С тех пор ничего не изменилось.
https://forum.quik.ru/messages/forum9/message16204/topic1792/#message16204

Из шапки темы по ссылке (от 17.05.2016 10:30:49):
Цитата
В 2012г. мы приняли решение об отсутствии перспектив его дальнейшего развития,
в результате чего в Рабочее место QUIK был встроен интерпретатор скриптового
языка LUA. QPILE прекратил свое развитие, но поддержка была сохранена.
Последующие 4 года мы пропагандировали применение LUA,
который в текущий момент является основным инструментом, используемым
для разработки клиентских скриптов в QUIK.

Из "Руководство пользователя QUIK v.7.11" (недавно обновили).

Про QPILE:
Цитата
Раздел 8. Алгоритмический язык QPILE

Про "основной инструмент разработки клиентских скриптов с 2012" QLUA:
Цитата
  1. «Идентификатор» – уникальный строковый идентификатор, присваиваемый  графику. Идентификатор используется при получении доступа к указанному графику  средствами языка QLua или QPILE.
Перевод каретки на Луа
 
Цитата
Let_it_go написал:      
Код
  cf=io.open(file_path,"a+")
  cf:write(value)
Код
 cf=io.open(file_path,"a")
  cf:write(value ..'\n')
подписаться на 2 таймфрейма
 
Цитата
Let_it_go написал:
Владимир, спасибо за ответ. Но это старая ветка. Вопрос изложенный в начале давно решён.
Сейчас на повестке дня две других проблемы:
1. После обновления функций из INDICATORS.ZIP перестали работать скрипты.
Вы запускали мой скрипт из  сообщения №20.
У меня им корректно рассчитались RSI и SD для двух бумаг на последних версиях INDICATORS.ZIP

подписаться на 2 таймфрейма
 
Цитата
Let_it_go написал:
2. Так и не получается передавать в индикатор только последний элемент.
В приведённом вами примере используется прежний (нерациональный) способ передачи, от которого я хочу отказаться.
dev = sec1.SD(i, {Period=mov_period, VType="Typical"}, ds_mov)
Вы совсем не правы именно передача всего массива наиболее оптимальна.
При этом не делается копия исходного массива, а передается только одно число - ссылка на исходный массив.
А попытки создать урезанный массив с последними значениями приводят к лишним накладным расходам

Запустите скрипт
Код
function privet(t)
   message('function privet : t  = '.. tostring(tab1))
   t.privet = 'Привет из функции'
end

function main()
   message('*** start')
   tab1 = {o='1', h='2'}
   message('tab1 = '.. tostring(tab1))
   privet(tab1)
   message('tab1.privet = '.. tostring(tab1.privet))

   message('*** end')
   kvLogClose()
end

и посмотрите сообщения
подписаться на 2 таймфрейма
 
Let_it_go,Вот рабочий набросок вашей задумки
Код
dofile(getWorkingFolder().."\\LuaIndicators\\SD.lua")
dofile(getWorkingFolder().."\\LuaIndicators\\RSI.lua")

rsi_tf=INTERVAL_M5
mov_tf=INTERVAL_M1

class = 'TQBR'
fut_list = {'SBER','GAZP'}
rsi_period = 14
mov_period = 14

secs = {}

function OnInit(script)
   is_run = true
end

function OnStop()
is_run = false
return 2000
end

function main()
   for _,sec in pairs(fut_list) do
      DataSource(class,sec,rsi_tf)    
      DataSource(class,sec,mov_tf)    
   end

   local sec1, ds_rsi, ds_mov, num_rsi, num_mov, dev
   while is_run do
      sleep(1000)
      for _,sec in pairs(fut_list) do
         sec1   = secs[sec]
         ds_rsi = sec1[rsi_tf]
         ds_mov = sec1[mov_tf]
         
         num_rsi = ds_rsi:Size()
         for i = ds_rsi.lastI, num_rsi do 
         -- lastI надо пересчитывать т.к. последняя свеча будет изменяться неоднократно
            sec1.rsi_count[i] = sec1.RSI(i, {Period=rsi_period, VType="Typical"}, ds_rsi)
            message(sec ..' rsi_count - '.. i ..' : '.. tostring(sec1.rsi_count[i]))
         end
         ds_rsi.lastI = num_rsi

         num_mov = ds_mov:Size()
         for i = ds_mov.lastI, num_mov do 
         -- lastI надо пересчитывать т.к. последняя свеча будет изменяться неоднократно
            dev = sec1.SD(i, {Period=mov_period, VType="Typical"}, ds_mov)
            message(sec ..' dev - '.. i ..' : '.. tostring(sec1.rsi_count[i]))
         end
         ds_mov.lastI = num_mov
      end
      
   end
end

--[[ -- если автомат работает в цыкле можно применить SetEmptyCallback()
function mycallbackforallstocks(ds, I) -- ds = self, I = Index
   local class = ds.class
   local sec   = ds.sec
   local interval = ds.interval

end
--]]

function DataSource(class,sec,interval)
   local ds = CreateDataSource(class,sec,interval)
   ds.class = class
   ds.sec = sec
   ds.interval = interval
   ds.lastI = 1
    -- ds:SetUpdateCallback(function(...) mycallbackforallstocks(self.class,self.sec,...) end)
   ds:SetEmptyCallback()
   if not secs[sec] then secs[sec] = {} end
   secs[sec][interval] = ds
   secs[sec].RSI = RSI()
   secs[sec].rsi_count = {}
   secs[sec].SD = SD()
   return
end

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

Можно из цыкла перенести обработку в функцию
mycallbackforallstocks но надо учитывать что она будет вызываться для каждого набора по мере его изменения (в том числе неоднократно для последней свечи
подписаться на 2 таймфрейма
 
Цитата
Sergey Gorokhov написал:
Речь о том что надо написать так:
dev=func(num_candles_mov, {Period=mov_period, VType="Any"}, {[num_candles_mov] = ds_main[sec]:C(num_candles_mov)})
В Lua переменные типа таблицы являются ссылочными и поэтому передаются в функции по ссылке (без создания новой таблицы)
А вот Ваш код как раз  тратит лишнюю память на создание новой таблицы.
повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
 
P.S.: и парный OnDestroy() совсем не мешает
Цитата
Владимир Киселев написал:
удалению и повторному добавлению на график
на график
повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
 
Старатель написал:
Цитата
А вот обнуление значений переменных - это проблема: теряются хендлеры файлов, меток и пр.
Об этом и тема, поднятая мной.
А ваш плюс?:
Цитата
Старатель написал:
В этом есть свой плюс: при изменении кода индикатора не нужно выполнять кучу манипуляций по его удалению и повторному добавлению на график. Достаточно переключить инструмент в режиме связанных окон туда-обратно.
Вы используете Quik для "изменения кода"? или Вы пишите для более удобной работы в Quik?
повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
 
Цитата
Egor Zaytsev написал:
Пришлите вот этот файл
dofile(getWorkingFolder().."\\LuaScripts\\kv_log.lua")
Мы проверим у себя.
Его текст в первом сообщении под спойлером (скрытый текст).
пока не разобрался как у вас прикреплять файлы.
повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
 
версия 7.9.1.1 - последняя на серверах Открытие Брокер.
Не будет конфликтов если обновлюсь с вашего сайта?
повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
 
Есть Таблица текущих торгов и связанный с ней график.
На график добавлен индикатор за основу взят пример индикатора ATR.
Изменения:
Код
dofile(getWorkingFolder().."\\LuaScripts\\kv_log.lua")

inited = false
            
function Init()
    if not inited then
        kvLogOpen()
        kvLog("ATR Price Init")
        func = ATR()
        inited = true
    end
    return #Settings.line
end

function OnDestroy() 
    if inited then
        kvLog("ATR Price OnDestroy")
        kvLogClose()
        inited = false
    end
end

function OnCalculate(Index) 
    if Index == 1 then kvLog("ATR Price OnCalculate(Index == 1)") end
    return func(Index, Settings)
end
При смене инструмента срабатывает
Код
kvLog("ATR Price Init")
из лога:
Цитата
: ATR Price Init
: ATR Price OnCalculate(Index == 1)
14:50:28 : ATR Price OnCalculate(Index == 1)
< Меняем инструмент >
14:50:43 : ATR Price Init
14:50:43 : ATR Price OnCalculate(Index == 1)
Соответственно теряется дескриптор открытого в первый раз файла лога.
Как можно этого избежать?

Скрытый текст
Страницы: 1
Наверх