Stivins (Все сообщения пользователя)

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

Страницы: 1
Количество свечей
 
Цитата
nikolz написал:
Цитата
Stivins написал:
С помощью CreateDataSource выгружаем свечи по инструменту
Но как запросить не все, а только к примеру 20 последних свечей

Если невозможно то как можно урезать полученный массив со свечами, оставив 20 последних.
CreateDataSource - это подписка, а не выгрузка,  на сервере для получения свечей
После подписки в терминал будут приходить все новые свечи.
Принимаемые свечи помещаются в архив терминала
------------------------
Прочитать из архива можно с помощью :
-------------------------
getCandlesByIndex
      Функция предназначена для получения информации о свечках по идентификатору  (заказ данных для построения графика плагин не осуществляет, поэтому для  успешного доступа нужный график должен быть открыт).      Формат вызова:    TABLE t, NUMBER n, STRING l getCandlesByIndex (STRING tag, NUMBER
line, NUMBER first_candle, NUMBER count)
Вот уже нужен график обязательно открытый.
Как тогда принятый через  CreateDataSource  массив уменьшить до последних 20 свечей?
Количество свечей
 
С помощью CreateDataSource выгружаем свечи по инструменту
Но как запросить не все, а только к примеру 20 последних свечей

Если невозможно то как можно урезать полученный массив со свечами, оставив 20 последних.
Работа индикатора вне графика.
 
Вот сделал так, но естественно получаю ошибку(test2.lua:9: attempt to compare nil with number):
Код
function OnInit()

   Period_ATR=14
   old_idx=0
   long=false
   short=false
   revers=false
   function PSAR(idx)
      if idx<Period_ATR then
      return nil
      else
         if idx==Period_ATR  then
            psar={}
            psar[idx]=L(idx)
            long=true
            hmax=H(idx)
            per_ATR=Period_ATR
            local TR=0
            for js=(idx-per_ATR+1),idx do
               TR=(TR+H(js)-L(js))
            end
            Old_ATR=TR/per_ATR
            revers=true
         else
            if idx~=old_idx then
               local TR=0
               for js=(idx-per_ATR+1),idx do
               TR=(TR+H(js)-L(js))
               end
               local ATR=TR/per_ATR
               af=ATR/(Old_ATR+ATR)
               af=af/10
               Old_ATR=ATR
               if long then
               if hmax<H(idx-1) then
               hmax=H(idx-1)
               end
               psar[idx]=psar[idx-1]+af*(hmax-psar[idx-1])
               end
               if short then
               if lmin>L(idx-1) then
               lmin=L(idx-1)
               end
               psar[idx]=psar[idx-1]+af*(lmin-psar[idx-1])
               end
               revers=true
            end
            if long and L(idx)<psar[idx] and revers then
               psar[idx]=hmax
               short=true
               long=false
               lmin=L(idx)
               af=Step
               revers=false
            end
            if short and H(idx)>psar[idx] and revers then
               psar[idx]=lmin
               long=true
               short=false
               hmax=H(idx)
               af=Step
               revers=false
            end
         end

      old_idx=idx

      return psar[idx]
      end
   end
end
   
function getCandles(ds, count)
    local candles = {}
    local size = ds:Size()
    for i = 0, count do
        if size >= 1 then
            candles[i] = {
                high = ds:H(size - i) or 0,
                low = ds:L(size - i) or 0,
                open = ds:O(size - i) or 0,
                close = ds:C(size - i) or 0
            }
        end
    end
    return candles
end   
   
function main()

   ds = CreateDataSource('TQBR', 'SBER', INTERVAL_M5)
   local Candles = getCandles(ds, 20)
   
   for i=1,ds:Size() do
      message("Значение индикатора:" ..tostring(PSAR()))
   end 

end
Работа индикатора вне графика.
 
Все равно мало что понял. Код индикатора:
Код
function OnCalculate(idx)
   if idx<Settings.Period_ATR then
   return nil
   else
      if idx==Settings.Period_ATR  then
         psar={}
         psar[idx]=L(idx)
         long=true
         hmax=H(idx)
         per_ATR=Settings.Period_ATR
         local TR=0
         for js=(idx-per_ATR+1),idx do
            TR=(TR+H(js)-L(js))
         end
         Old_ATR=TR/per_ATR
         revers=true
      else
         if idx~=old_idx then
            local TR=0
            for js=(idx-per_ATR+1),idx do
            TR=(TR+H(js)-L(js))
            end
            local ATR=TR/per_ATR
            af=ATR/(Old_ATR+ATR)
            af=af/10
            Old_ATR=ATR
            if long then
            if hmax<H(idx-1) then
            hmax=H(idx-1)
            end
            psar[idx]=psar[idx-1]+af*(hmax-psar[idx-1])
            end
            if short then
            if lmin>L(idx-1) then
            lmin=L(idx-1)
            end
            psar[idx]=psar[idx-1]+af*(lmin-psar[idx-1])
            end
            revers=true
         end
         if long and L(idx)<psar[idx] and revers then
            psar[idx]=hmax
            short=true
            long=false
            lmin=L(idx)
            af=Step
            revers=false
         end
         if short and H(idx)>psar[idx] and revers then
            psar[idx]=lmin
            long=true
            short=false
            hmax=H(idx)
            af=Step
            revers=false
         end
      end

   old_idx=idx

   return psar[idx]
   end

Дальше я хочу поместить его в свой скрипт, чтобы получилось примерно следующее:
Код
function OnInit() 
function PSAR(idx)   
if idx<Settings.Period_ATR then
   return nil
   else
      if idx==Settings.Period_ATR  then
         psar={}
         psar[idx]=L(idx)
         long=true
         hmax=H(idx)
         per_ATR=Settings.Period_ATR
         local TR=0
         for js=(idx-per_ATR+1),idx do
            TR=(TR+H(js)-L(js))
         end
         Old_ATR=TR/per_ATR
         revers=true
      else
         if idx~=old_idx then
            local TR=0
            for js=(idx-per_ATR+1),idx do
            TR=(TR+H(js)-L(js))
            end
            local ATR=TR/per_ATR
            af=ATR/(Old_ATR+ATR)
            af=af/10
            Old_ATR=ATR
            if long then
            if hmax<H(idx-1) then
            hmax=H(idx-1)
            end
            psar[idx]=psar[idx-1]+af*(hmax-psar[idx-1])
            end
            if short then
            if lmin>L(idx-1) then
            lmin=L(idx-1)
            end
            psar[idx]=psar[idx-1]+af*(lmin-psar[idx-1])
            end
            revers=true
         end
         if long and L(idx)<psar[idx] and revers then
            psar[idx]=hmax
            short=true
            long=false
            lmin=L(idx)
            af=Step
            revers=false
         end
         if short and H(idx)>psar[idx] and revers then
            psar[idx]=lmin
            long=true
            short=false
            hmax=H(idx)
            af=Step
            revers=false
         end
      end

   old_idx=idx

   return psar[idx]
   end
end
function main() 

function getCandles(ds, count)    local candles = {}
    local size = ds:Size()
    for i = 0, count do
        if size >= 1 then
            candles[i] = {
                high = ds:H(size - i) or 0,
                low = ds:L(size - i) or 0,
                open = ds:O(size - i) or 0,
                close = ds:C(size - i) or 0
            }
        end
    end
    return candles
end
local ds_H1 = CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL_H1)    
local h1Candles = getCandles(ds_H1, 5)

psar=PSAR(h1Candles) --только в цикле по количеству свечей

end

Но,  не понимаю как передавать свечи в функцию индикатора, да еще и в цикле получается.
Работа индикатора вне графика.
 
VPM, или может я не правильно высказался.
Мне по сути нужно поменять Oncalculate() индикатора на function psar() и подать уже на эту функцию свечи.
Работа индикатора вне графика.
 
Цитата
VPM написал:
Вот ссылка на индикатор,   https://forum.quik.ru/messages/forum10/message78143/topic8506/#message78143 , на что нужно обратить внимание, это в анонимной функции на передачу ds!
ds  = CreateDataSource, то есть мы передаем методы на которые подписаны, это делается именно для того, чтоб без извинений и переделок можно было индикатор использовать в алгоритмах, через наследование.
Чисто не понял вас:) По ссылке по-моему вообще о другом пишут.
Работа индикатора вне графика.
 
Есть простой индикатор по типу parabolic.
на вход принимает свечи и отдает свой результат в виде цены.
function Oncalculate(idx)
— блаблабла
return psar
end

Хочу без добавления индикатора на график, добавить его код в свой скрипт и
скормить ему 20-30 последних свечей и получить ответы.

Подскажите, как можно реализовать?
Понимаю, что нужно делать через CreateDataSource, но навыка не хватает.
Страницы: 1
Наверх