помогите написать kijun-sen line lua QUIK

Страницы: 1
RSS
помогите написать kijun-sen line lua QUIK
 
помогите написать kijun-sen line lua QUIK, есть индикатор ишимоку и как из него все убрать и оставить только kijun-sen line,в сети ничего нет есть такой индюк для многих терминалов а для квика нет, то есть нужен мувинг который построен по формуле линий ишимоку, но только один мувинг, заранее спасибо-)
 
https://forum.quik.ru/messages/forum17/message79543/topic9257/?result=reply#message79543
 
Спасибо за ответ ---- НО - Вот что квик сообщает ------- C:\QUIK_SBER\LuaIndicators\Kijun-sen.lua:24: attempt to call a nil value (global 'High')
 
Не проще ли сделать цвет линий встроенного индикатора = цвету фона окна и сдвинуть бары выше индикатора, чтобы линии не были видны на барах.
 
Цитата
Nikolay написал:
Не проще ли сделать цвет линий встроенного индикатора = цвету фона окна и сдвинуть бары выше индикатора, чтобы линии не были видны на барах.
спасибо за ответ я так пробовал не понравилось белый цвет иногда на линиях мешает цвету других линий ,хочется как то нормально все сделать , тем более что линия одна нужна только киджун
может как то можно ваш код подправить -)
 
Ну ошибка же очевидна - В Квике нет методов High и Low, есть H и L.Открываете любой, так всеми рекламируемый ИИ, и просите исправить. С такой простой задачей он справится. Хотя терминал Квик для него, конечно, совсем экзотика.
 
Цитата
Nikolay написал:
Ну ошибка же очевидна - В Квике нет методов High и Low, есть H и L.Открываете любой, так всеми рекламируемый ИИ, и просите исправить. С такой простой задачей он справится. Хотя терминал Квик для него, конечно, совсем экзотика.
Settings = {    Name = "*Kijun-sen",
   line = {{
       Name = "Kijun-sen",
       Color = RGB(0, 0, 255),
       Type = TYPE_LINE,
       Width = 2
   }}
}

function Init()
   return 1
end

local kijun_period = 26  -- Период Kijun-sen (можно изменить)

function OnCalculate(index)
   -- Проверяем, достаточно ли данных для расчета
   if index < kijun_period - 1 then
       return nil
   end
   
   -- Инициализация переменных для экстремумов
   local max_high = High(index - kijun_period + 1)
   local min_low = Low(index - kijun_period + 1)
   
   -- Поиск максимума и минимума за период
   for i = index - kijun_period + 2, index do
       local current_high = High(i)
       local current_low = Low(i)
       
       if current_high > max_high then
           max_high = current_high
       end
       
       if current_low < min_low then
           min_low = current_low
       end
   end
   
   -- Расчет Kijun-sen
   return (max_high + min_low) / 2
end
 
Цитата
Roman Koledin написал:
Цитата
Nikolay написал:
Ну ошибка же очевидна - В Квике нет методов High и Low, есть H и L.Открываете любой, так всеми рекламируемый ИИ, и просите исправить. С такой простой задачей он справится. Хотя терминал Квик для него, конечно, совсем экзотика.
Settings = {    Name = "*Kijun-sen",
   line = {{
       Name = "Kijun-sen",
       Color = RGB(0, 0, 255),
       Type = TYPE_LINE,
       Width = 2
   }}
}

function Init()
   return 1
end

local kijun_period = 26  -- Период Kijun-sen (можно изменить)

function OnCalculate(index)
   -- Проверяем, достаточно ли данных для расчета
   if index < kijun_period - 1 then
       return nil
   end
   
   -- Инициализация переменных для экстремумов
   local max_high = High(index - kijun_period + 1)
   local min_low = Low(index - kijun_period + 1)
   
   -- Поиск максимума и минимума за период
   for i = index - kijun_period + 2, index do
       local current_high = High(i)
       local current_low = Low(i)
       
       if current_high > max_high then
           max_high = current_high
       end
       
       if current_low < min_low then
           min_low = current_low
       end
   end
   
   -- Расчет Kijun-sen
   return (max_high + min_low) / 2
end
простите я дилетант могли бы вы исправить эту ошибку ,вод код пожалуйста -)
 
   local max_high = High(index - kijun_period + 1)
  local min_low = Low(index - kijun_period + 1)

Вот строки. Вместо High и Low, H и L
 
Цитата
Nikolay написал:
  local max_high = High(index - kijun_period + 1)
  local min_low = Low(index - kijun_period + 1)

Вот строки. Вместо High и Low, H и L
Спасибо я исправил сроки
-- Инициализация переменных для экстремумов
  local max_high = High(index - kijun_period + 1)
  local min_low = Low(index - kijun_period + 1)

и
-- Поиск максимума и минимума за период
  for i = index - kijun_period + 2, index do
      local current_high = High(i)
      local current_low = Low(i)

скрин прилагаю вылезла ошибка
 
Это уже сложнее, т.к. если график дырявый, то необходимы проверки. Советую Вам все же погрузится в тему или пойти простым путем. Время - это самое ценное, что есть.
 
Цитата
Nikolay написал:
Это уже сложнее, т.к. если график дырявый, то необходимы проверки. Советую Вам все же погрузится в тему или пойти простым путем. Время - это самое ценное, что есть.
То есть эту ошибку не исправить в этом коде , другие индюки как и ишимоку нормально у меня в квике работают,
я как понял там строчка 32

       if current_high > max_high then
           max_high = current_high
       end



что там исправить?
 
Ошибка заключается в том, что если график содержит дырку, т.е. нет бара в отсечку времени, то H и L выдадут nil.
А nil нельзя сравнивать с числом. Поэтому необходимо проверять, что вернули H и L. И если это nil, то пропускать такое, переходя к следующему бару.

Ну и конечно, данный код далек от оптимального - постоянно бегать на 26 бар назад, получая значения, которые только что уже получали - так себе идея. Но ИИ он же скоро заменит всех программистов, веселое время настанет...
 
Цитата
Nikolay написал:
Ошибка заключается в том, что если график содержит дырку, т.е. нет бара в отсечку времени, то H и L выдадут nil.
А nil нельзя сравнивать с числом. Поэтому необходимо проверять, что вернули H и L. И если это nil, то пропускать такое, переходя к следующему бару.

Ну и конечно, данный код далек от оптимального - постоянно бегать на 26 бар назад, получая значения, которые только что уже получали - так себе идея. Но ИИ он же скоро заменит всех программистов, веселое время настанет...
неужели не возможно код исправить или если вас не затруднит ,как вырезать из ишимоку Senkou Span1

Settings = {
Name = "*ICHIMOKU (Ichimoku Kinko Hyo)",
Tenkan = 9,
Kijun = 26,
Senkou = 52,
Chinkou = 26,
Shift = 26,
line = {{
Name = "Horizontal line",
Type = TYPE_LINE,
Color = RGB(140, 140, 140)
},
{
Name = "ICHIMOKU - Tenkan",
Type = TYPE_LINE,
Color = RGB(255, 0, 255)
},
{
Name = "ICHIMOKU - Kijun",
Type = TYPE_LINE,
Color = RGB(221, 44, 44)
},
{
Name = "ICHIMOKU - Senkou Span1",
Type = TYPE_LINE,
Color = RGB(0, 255, 255)
},
{
Name = "ICHIMOKU - Senkou Span2",
Type = TYPE_LINE,
Color = RGB(0, 206, 0)
},
{
Name = "ICHIMOKU - Chinkou",
Type = TYPE_LINE,
Color = RGB(128, 0, 0)
}
},
Round = "off",
Multiply = 1,
Horizontal_line="off"
}

function Init()
func = ICHIMOKU()
return #Settings.line
end

function OnCalculate(Index)
local Out1,Out2,Out3,Out4,Out5 = func(Index, Settings)
SetValue(Out5, 6, ConvertValue(Settings,C(Index)))
return tonumber(Settings.Horizontal_line),ConvertValue(Settings,Out1,Out2,Out3,Out4,nil)
end

function ICHIMOKU() --Ichimoku ("ICHIMOKU")
local OutSenkou1 = {}
local OutSenkou2 = {}
local H_tmp={}
local L_tmp={}
local it = {p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local Tenkan = (Fsettings.Tenkan or 9)
local Kijun = (Fsettings.Kijun or 26)
local Senkou = (Fsettings.Senkou or 52)
local Chinkou = (Fsettings.Chinkou or 26)
local Shift = (Fsettings.Shift or 26)
local function sen(H_t,L_t,Ind,Per)
if Ind >= Per then
return (math.max(table.unpack(H_t,Ind-Per+1,Ind)) + math.min(table.unpack(L_t,Ind-Per+1,Ind)))/2
else return nil end
end
if (Tenkan>0) and (Kijun>0) and (Senkou>0) and (Chinkou>0) then
if I == 1 then
OutSenkou1 = {}
OutSenkou2 = {}
H_tmp={}
L_tmp={}
it = {p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then it={p=I, l=it.l+1} end
H_tmp[it.l] = GetValueEX(it.p,HIGH,ds)
L_tmp[it.l] = GetValueEX(it.p,LOW,ds)
local OutTenkan = sen(H_tmp, L_tmp, it.l, Tenkan)
local OutKijun = sen(H_tmp, L_tmp, it.l, Kijun)
if it.l >= math.max(Tenkan, Kijun) then
OutSenkou1[Squeeze(it.l,Senkou)] = (OutTenkan + OutKijun)/2
else
OutSenkou1[Squeeze(it.l,Senkou)] = nil
end
OutSenkou2[Squeeze(it.l,Senkou)] = sen(H_tmp, L_tmp, it.l, Senkou)
return OutTenkan,
OutKijun,
OutSenkou1[Squeeze(it.l-Shift,Senkou)],
OutSenkou2[Squeeze(it.l-Shift,Senkou)],
it.p - Chinkou
end
end
return nil,nil,nil,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©=="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®== "ON" then R=0 end
if V and tonumber® 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
local arg = {...}
arg.n = select('#', ...)
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 table.unpack(arg)
else return nil end
end

function GetValueEX(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 ((GetValueEX(I,HIGH,ds) + GetValueEX(I,LOW,ds)) / 2)
elseif VT == TYPICAL then --Typical
return ((GetValueEX(I,MEDIAN,ds) * 2 + GetValueEX(I,CLOSE,ds))/3)
elseif VT == WEIGHTED then --Weighted
return ((GetValueEX(I,TYPICAL,ds) * 3 + GetValueEX(I,OPEN,ds))/4)
elseif VT == DIFFERENCE then --Difference
return (GetValueEX(I,HIGH,ds) - GetValueEX(I,LOW,ds))
else --Any
return (ds and ds[I])
end
return nil
end
 
Возможно. Но подумайте, что к Вам приходят на работу и говорят - сделай мне. Очень надо. А то что кто-то тратит на это время - не важно.

Кажется Вам уже выдали множество рекомендаций. Даже если взять код индикатора от ARQA, что Вы сами нашли, то там еще проще - убрать вывод не нужных линий. Собственно, как нам говорят со всех углов, ИИ должен с этим справится на раз. Deepseek Вам помощь, если другие не доступы - и проведете с пользой время в выходные.
Страницы: 1
Читают тему
Наверх