Индикатор Lua

Страницы: 1
RSS
Индикатор Lua
 
Здравствуйте коллеги! Подскажите пожалуйста как реализовать такую штуку?
Есть функция в индикаторе которая возвращает значения 4 линий, хочу модифицировать его и сделать 2 такие функции одновременно, чтобы они возвращали уже 8 линий.

Объединить эти функции в одну нельзя, а вот как сделать так чтобы индикатор  возвращал 8 значений линий?
Например обе функции возвращают по 4 линии, а потом уже индикатор выдает 8, как это сделать?

Я думаю что вот так как то:

В расчетную функцию вставить вызов этих двух функций и получать возвращаемые  ими значения, вставлять эти значения в буфер (отдельную таблицу), а уже из таблицы доставать и возвращать из расчетной функции OnCalculate

Код
function OnCalculate(index)
G={}
local a,b,c,d = glo1(index)
local e,f,g,h = glo2(index)
G[1]=a и тд

return G
end 
                       
 
Индикатор должен вернуть значения, не таблицу, число которых равно числу линий.

Поэтому с тем же успехом можете просто перечислить возвращаемые значения

return a, b, c, d ,e ,f и т.д.

Когда число линий действительно больше, то тогда уже лучше хранить значения в таблице, а возвращать через unpack(table).
 
Цитата
Nikolay написал:
Когда число линий действительно больше, то тогда уже лучше хранить значения в таблице, а возвращать через unpack(table).

Не придумал ничего лучше, чем упаковать значения в две таблицы, а потом объединить их
Код
function OnCalculate(index)
  local G = {glo1(index)}
  local n = #G
  local G_ = {glo2(index)}
  for i = 1, #G_ do
    n = n + 1
    G[n] = G_[i]
  end
  return table.unpack(G)
end

Может, есть более красивое решение
 
Цитата
Незнайка написал:
упаковать значения в две таблицы, а потом объединить их

Но есть косяк: если функции могут возвращать nil, то unpack работает криво.
Когда таблица сразу заполняется при создании, то распаковывается нормально:
Код
  local G = {1, 2, nil, 4, nil, 6}
  return print(unpack(G))  -->  1       2       nil     4       nil     6

А когда значения дописываются после, то работает криво
Код
local G = {1, 2, nil}
G[4] = 4
G[5] = nil
G[6] = 6
print(unpack(G))   -->   1       2       nil     4
 
Цитата
Незнайка написал:
Цитата
Незнайка написал:
упаковать значения в две таблицы, а потом объединить их

Но есть косяк: если функции могут возвращать nil, то unpack работает криво.
Когда таблица сразу заполняется при создании, то распаковывается нормально:
Код
     local  G  =  { 1 ,  2 ,  nil ,  4 ,  nil ,  6 }
   return   print (unpack(G))   -->  1       2       nil     4       nil     6   

А когда значения дописываются после, то работает криво
Код
   local  G  =  { 1 ,  2 ,  nil }
G[ 4 ]  =   4 
G[ 5 ]  =   nil 
G[ 6 ]  =   6 
 print (unpack(G))    -->   1       2       nil     4   
не ставьте перед переменными local.
они будут глобальными
в первой функции считаете 4 параметра  которые изначально не определены
во второй функции считаете следующие 4 параметра
при выводе просто перечисляете их
например так :
-----------------------------
function fun1(k)
x1=k+1;
x2=k+2;
x3=k+3;
x4=k+4;
end
------------------------------
function fun2(k)
x5=k+5;
x6=k+6;
x7=k+7;
x8=k+8;
end
----------------------------
function onCalculate(i)
....
fun1(i);
fun2(i);
return x1,x2,x3,x4,x5,x6,x7,x8;
end
 
Цитата
nikolz написал:
при выводе просто перечисляете их
Спасибо, Кэп, для 8 значений задача решена во втором сообщении.

Я немного усложнил задачу: написать вывод для бОльшего числа значений, какого угодно количества.
 
Подскажите пожалуйста в индикаторе можно получить значение другого индикатора ?
вот по этой функции как то не получается getCandlesByIndex
                       
 
Цитата
Евгений написал:
Подскажите пожалуйста в индикаторе можно получить значение другого индикатора ?
вот по этой функции как то не получается getCandlesByIndex
Да, можно. (Правда, если не сломали в 9.* версиях)

Вот, для примера:
https://github.com/nick-nh/qlua/blob/master/bigPeriodLines.lua
 
Nikolay, спасибо!
                       
 
Интересный результат

local t,n,l = getCandlesByIndex(Settings.indicator,0,0,5)
0={high=0.0 doesExist=0 close=0.0 open=0.0 volume=0.0 datetime={min=30 sec=0 week_day=4 day=27 month=5 ms=0 hour=14 year=2021 } low=0.0 } 1={high=0.0 doesExist=0 close=0.0 open=0.0 volume=0.0 datetime={min=0 sec=0 week_day=4 day=27 month=5 ms=0 hour=15 year=2021 } low=0.0 }
2={high=0.0 doesExist=0 close=0.0 open=0.0 volume=0.0 datetime={min=30 sec=0 week_day=4 day=27 month=5 ms=0 hour=15 year=2021 } low=0.0 }
3={high=0.0 doesExist=0 close=0.0 open=0.0 volume=0.0 datetime={min=0 sec=0 week_day=4 day=27 month=5 ms=0 hour=16 year=2021 } low=0.0 }
4={high=0.0 doesExist=0 close=0.0 open=0.0 volume=0.0 datetime={min=30 sec=0 week_day=4 day=27 month=5 ms=0 hour=16 year=2021 } low=0.0 }
                       
 
Цитата
Евгений написал:
Подскажите пожалуйста в индикаторе можно получить значение другого индикатора ?
вот по этой функции как то не получается getCandlesByIndex
Техподдержка проясните пожалуйста почему не работает?
                       
 
Цитата
Евгений написал:
Цитата
Евгений написал:
Подскажите пожалуйста в индикаторе можно получить значение другого индикатора ?
вот по этой функции как то не получается getCandlesByIndex
Техподдержка проясните пожалуйста почему не работает?
я не техподдержка, Но скажу , что индикаторы рассчитываются последовательно друг за другом, порядок расчета не регламентирован, и ваш индикатор может рассчитываться раньше, чем тот, с которого вы хотите получить значения.

решить проблему можно, но через (ухо). Возможно, вам подойдёт готовое решение:
http://www.bot4sale.ru/download-categories/2012-06-13-15-10-36/item/juggler.html
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Спасибо понятно, что ничего непонятно
                       
 
Код
function main()
    while is_run do
       
      
      local identifier = "Si_macd_long"
      local count = 10
      local offset
      local n
      local t,n,l = getCandlesByIndex("Si_macd_long",0,0,count,offset)
      if #t > 1 then 
         message("   #t = "..#t,2)
      end 
      
      
       sleep(500)
    end
end
Что не так тут почему таблица нил, все проверил
                       
 
аномалия какая то, кол-во свечек 3180, а таблица нил
                       
 
Понятно. Вы вызываете эту функцию не из индикатора, а из скрипта.

проверьте количество передаваемых ей параметров. Что есть offset?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
пипец это же сколько надо костылей написать к этому квику?
                       
 
Все разобрался из индикатора так и не получилось, сделал отдельный скрипт который получает данные, а уже из него буду передавать в индикатор
                       
 
Цитата
s_mike@rambler.ru написал:
Понятно. Вы вызываете эту функцию не из индикатора, а из скрипта.

проверьте количество передаваемых ей параметров. Что есть offset?
Да из скрипта было нил
                       
 
Цитата
Евгений написал:
Код
   function   main ()
     while  is_run  do 
       
      
       local  identifier  =   "Si_macd_long" 
       local  count  =   10 
       local  offset
       local  n
       local  t,n,l  =   getCandlesByIndex ( "Si_macd_long" , 0 , 0 ,count,offset)
       if   # t  >   1   then  
          message ( "   #t = "  ..  # t, 2 )
       end  
      
      
        sleep ( 500 )
     end 
 end   
Что не так тут почему таблица нил, все проверил
У вас в этом примере не задано значение offset - и оно будет nil  - а это число запрашиваемых свечек.
Ну Вы  получаете, то что запросили.
Все верно?
Страницы: 1
Читают тему
Наверх