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

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

Страницы: 1
Скрипт оповещения значения спреда между двумя инструментами
 
Добрый день, подскажите пожалуйста как можно в квике сделать скрипт который бы присылал оповещения если спред между двумя инструментами достигает заданной величины. Например спред между вечным фьючерсом на доллар и квартальным достигает заданной пользователем величины и срабатывает оповещение.  
как в луа брать данные из excel?
 
у меня получилось с помощью вот такой функции
Скрытый текст
аккуратно, спойлер может лишить вас зрения. получается значения 11004, 11003 и т.д. отвечают за бар на графике. например 11004 это бар 18.11.2022 23:45, подскажите как сделать чтобы значения return он мне возвращал из моего файла csv и как мне сопоставить их по времени? в файле csv значения в таком виде 2022-11-18;23:00:00;1000, сначало идет дата, потом время, потом значение.
как в луа брать данные из excel?
 
Цитата
Nikolay написал:
Вычисления лучше в скрипте и произвести. И быстрее будет. Ексель нужен только когда это надо визуализировать, больше ни для чего он не нужен.
Я не очень понимаю это странное "учеба на YouTube". В книге от автора языка все написано очень просто и понятно. Да и примеров очень много как прочитать файл, если просто поискать.
А вот чтение xls - это уже использование сторонней библиотеки luaCOM. С учетом древности технологии COM, не думаю что будет много информации.
Просто по видео хоть как то понятно, смотришь и повторяешь + автор какие то коментарии дает. Хочу начать с простого, хочу просто попробовать нарисовать свечу в 10:00 в поле индикатора со значением 10. нашел на форуме такой скрипт правильно ли я понимаю что этот скрипт просто рисует 2 свечи со значениями 5 и 10? если да то как допустим указать в какое время они должны рисоваться?
Скрытый текст
как в луа брать данные из excel?
 
Цитата
Nikolay написал:
Библиотека luaCom поможет открыть COM объект и прочитать файл. Но я не очень понимаю  зачем использовать тяжелый формат xls, а не перейти на простой текст с расширением csv, который читается очень просто, да и Excel открывает его как простую таблицу.
в excele происходят некоторые операции сложения и вычитания с данными из csv файла, после чего получаются готовые данные которые необходимо перенести в квик. так как у меня нет опыта програмирования по логике я подумал что легче просто перенести готовые цифры в квик, чем производить в луа скрипте вычисления чтобы получить конечные данные (это я так думаю, конечно я могу ошибаться), не подскажешь какой нибудь видео урок где показывают как можно считывать либо excel файл либо csv файл (но тогда в самом скрипте нужно будет еще вычисления как то проводить) в луа. на ютюбе не нашел(
как в луа брать данные из excel?
 
Цитата
nikolz написал:
поясните, вы будете брать данные из файла или из excel таблицы.
-----------------------
если из файла, то как Вы в него хотите записывать.
у меня есть excel файл с несколькими листами, на 1 листе подгружаются данные из файла csv (который скачивается с интернета), на 2 листе у меня распределены эти данные по времени начиная с 9-00 и до 24-00 в пятиминутном интервале. теперь из этого excel файла мне нужно перенести их в квик с помощью луа индикатора.
как в луа брать данные из excel?
 
Цитата
nikolz написал:
поясните, вы будете брать данные из файла или из excel таблицы.
-----------------------
если из файла, то как Вы в него хотите записывать.
Из файла, данные в файл будут выгружатся с сайта.
как в луа брать данные из excel?
 
Подскажите пожалуйста как в луа скрипт сделать так чтобы данные брались из excel таблицы? у меня есть такой индикатор для квика
Скрытый текст


я пытаюсь переделать его чтобы он мне рисовал каждые 5 минут 2 значения в виде гистограммы. значения будут браться из файла "test.xlsx" с компьютера. подскажите как сделать так чтобы скрипт считывал данные с excel? нужны ли какие то дополнительные программы? я скачал только notepad++, если можете подскажите хотябы как мне просто рисовать бар со значением 1 из таблицы excel чтобы хоть с чего то начать.
Ввод собственных данных в виде индикатора в квик, индикатор для квик
 
Цитата
Евгений написал:
    Скрытый текст       Settings = {
Name = "*MACDH (Moving Average Convergence/Divergence Histogram)",
SHORT_Period = 12,
LONG_Period = 26,
Metod = "EMA", --SMA, EMA, VMA, SMMA, VMA
VType = "Close", --Open, High, Low, Close, Volume, Median, Typical, Weighted, Difference
Signal_Metod = "SMA", --SMA, EMA, VMA, SMMA, VMA
Signal_Period = 9,
Percent=1,
line = {{
       Name = "Horizontal line",
       Type = TYPE_LINE,
       Color = RGB(140, 140, 140)
       },
       {
       Width = 3,
       Name = "MACDH_Up",
       Type = TYPE_HISTOGRAM,
       Color = RGB(0, 206, 0)
       },
       {
       Width = 3,
       Name = "MACDH_Down",
       Type = TYPE_HISTOGRAM,
       Color = RGB(221, 44, 44)
       },
       {
       Name = "MACDH - Signal",
       Type = TYPE_LINE,
       Color = RGB(255, 255, 255)
       }
       },
Round = "off",
Multiply = 1,
Horizontal_line="0"
}

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

function OnCalculate(Index)
local Out1,Out2 = ConvertValue(Settings,func(Index, Settings))
local HL = tonumber(Settings.Horizontal_line)
   if Out1 then
       if Out1 > (HL or 0) then
           return HL,Out1,nil,Out2
       else
           return HL,nil,Out1,Out2
       end
   else
       return HL,nil,nil,nil
   end
end

function MACDH() --MACD Histogram ("MACDH")
   local MACDH_MACD = MACD()
   local it = {p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local ShortP = (Fsettings.SHORT_Period or 12)
local LongP = (Fsettings.LONG_Period or 26)
local M = (Fsettings.Metod or EMA)
local VT = (Fsettings.VType or CLOSE)
local SM = (Fsettings.Signal_Metod or SMA)
local SP = (Fsettings.Signal_Period or 9)
local Percent = (Fsettings.Percent or 1)
if (ShortP>0) and (LongP>0) and (SP>0) then
   if I == 1 then
       it = {p=0, l=0}
   end
   local Out, Signal = MACDH_MACD(I, {SHORT_Period=ShortP, LONG_Period=LongP, Metod=M,VType=VT, Signal_Metod=SM, Signal_Period=SP, Percent=Percent}, ds)
   if CandleExist(I,ds) then
       if I~=it.p then
            it={p=I, l=it.l+1}
       end
       if Out and Signal then
           return Out-Signal, Signal
       end
   end
end
return nil
end
end

function MACD() --Moving Average Convergence/Divergence ("MACD")
   local MACD_MA = MA()
   local Short_MA = MA()
   local Long_MA = MA()
   local it = {p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local ShortP = (Fsettings.SHORT_Period or 12)
local LongP = (Fsettings.LONG_Period or 26)
local M = (Fsettings.Metod or EMA)
local VT = (Fsettings.VType or CLOSE)
local SM = (Fsettings.Signal_Metod or SMA)
local SP = (Fsettings.Signal_Period or 9)
local Percent = (Fsettings.Percent or 1)
if (ShortP>0) and (LongP>0) and (SP>0) then
   if I == 1 then
       it = {p=0, l=0}
   end
   local So = Short_MA(I, {Period=ShortP, Metod = M, VType=VT}, ds)
   local Lo = Long_MA(I, {Period=LongP, Metod = M, VType=VT}, ds)
   if CandleExist(I,ds) then
       if I~=it.p then it={p=I, l=it.l+1} end
       local i = it.l - math.max(ShortP, LongP) + 1
       if (i>0) then
           if Percent==0 then
               t_MACD=So - Lo
           else
               t_MACD=100*(So - Lo) / Lo
           end
           if (SM~=SMA) and (SM~=EMA) then SM=SMA end
           return t_MACD, MACD_MA(i, {Period=SP, Metod = SM, VType=ANY}, { = t_MACD})
       end
   end
end
return nil, nil
end
end

function MA() --Moving Average ("MA")
   local T_MA = {[SMA]=F_SMA(),[MMA]=F_MMA(),[EMA]=F_EMA(),[VMA]=F_VMA(),[SMMA]=F_SMMA(),[WMA]=F_WMA()}
return function (I, Fsettings, ds)
   local Fsettings=(Fsettings or {})
   local P = (Fsettings.Period or 14)
   if (P > 0) then
       return T_MA[string.upper(Fsettings.Metod or EMA)](I, P, (Fsettings.VType or CLOSE), ds)
   end
return nil
end
end

------------------------------------------------------------------
----Moving Average SMA, MMA, EMA, WMA, SMMA, VMA
------------------------------------------------------------------
--[[Simple Moving Average (SMA)
SMA = sum(Pi) / n]]
function F_SMA()
   local sum = {}
   local it = {p=0, l=0}
return function (I, P, VT, ds)
   if I == 1 then
       sum = {}
       it = {p=0, l=0}
   end
   if CandleExist(I,ds) then
       if I~=it.p then it={p=I, l=it.l+1} end
       local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
       sum[Ip] = (sum[Ipp] or 0) + GetValueEX(it.p,VT,ds)
       if it.l >= P then
           return (sum[Ip] - (sum[Ippp] or 0)) / P
       end
   end
return nil
end
end

--[[Modified Moving Average (MMA)
MMA = (MMAi-1*(n-1) + Pi) / n]]
function F_MMA()
   local sum = {}
   local tmp = {pp=nil, p=nil}
   local it = {p=0, l=0}
return function(I, P, VT, ds)
   if I == 1 then
       sum = {}
       tmp = {pp=nil, p=nil}
       it = {p=0, l=0}
   end
   if CandleExist(I,ds) then
       if I~=it.p then
           it = {p=I, l=it.l+1}
           tmp.pp = tmp.p
       end
       local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
       if it.l <= P + 1 then
           sum[Ip] = (sum[Ipp] or 0) + GetValueEX(it.p,VT,ds)
           if (it.l == P) or (it.l == P + 1) then
               tmp.p = (sum[Ip] - (sum[Ippp] or 0)) / P
           end
       else
           tmp.p = (tmp.pp*(P-1) + GetValueEX(it.p,VT,ds)) / P
       end
       if it.l >= P then
           return tmp.p
       end
   end
return nil
end
end

--[[Exponential Moving Average (EMA)
EMAi = (EMAi-1*(n-1)+2*Pi) / (n+1)]]
function F_EMA()
   local tmp = {pp=nil, p=nil}
   local it = {p=0, l=0}
return function(I, P, VT, ds)
   if I == 1 then
       tmp = {pp=nil, p=nil}
       it = {p=0, l=0}
   end
   if CandleExist(I,ds) then
       if I~=it.p then
           it = {p=I, l=it.l+1}
           tmp.pp = tmp.p
       end
       if it.l == 1 then
           tmp.p = GetValueEX(it.p,VT,ds)
       else
           tmp.p = (tmp.pp*(P-1) + 2*GetValueEX(it.p,VT,ds)) / (P+1)
       end
       if it.l >= P then
           return tmp.p
       end
   end
return nil
end
end

--[[
William Moving Average (WMA)
( Previous WILLMA * ( Period - 1 ) + Data ) / Period]]
function F_WMA()
   local tmp = {pp=nil, p=nil}
   local it = {p=0, l=0}
return function(I, P, VT, ds)
   if I == 1 then
       tmp = {pp=nil, p=nil}
       it = {p=0, l=0}
   end
   if CandleExist(I,ds) then
       if I~=it.p then
           it={p=I, l=it.l+1}
           tmp.pp = tmp.p
       end
       if it.l == 1 then
           tmp.p = GetValueEX(it.p,VT,ds)
       else
           tmp.p = (tmp.pp * (P-1) + GetValueEX(it.p,VT,ds)) / P
       end
       if it.l >= P then
           return tmp.p
       end
   end
return nil
end
end

--[[Volume Adjusted Moving Average (VMA)
VMA = sum(Pi*Vi) / sum(Vi)]]
function F_VMA()
   local sum = {}
   local sum2 = {}
   local it = {p=0, l=0}
return function(I, P, VT, ds)
   if I == 1 then
       sum = {}
       sum2 = {}
       it = {p=0, l=0}
   end
   if CandleExist(I,ds) then
       if I~=it.p then it={p=I, l=it.l+1} end
       local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
       sum[Ip] = (sum[Ipp] or 0) + GetValueEX(it.p,VT,ds) * GetValueEX(it.p,VOLUME,ds)
       sum2[Ip] = (sum2[Ipp] or 0) + GetValueEX(it.p,VOLUME,ds)
       if it.l >= P then
           return (sum[Ip] - (sum[Ippp] or 0)) / (sum2[Ip] - (sum2[Ippp] or 0))
       end
   end
return nil
end
end

--[[Smoothed Moving Average (SMMA)
SMMAi = (sum(Pi) - SMMAi-1 + Pi) / n]]
function F_SMMA()
   local sum = {}
   local sum2 = {}
   local it = {p=0, l=0}
return function(I, P, VT, ds)
   if I == 1 then
       sum = {}
       sum2 = {}
       it = {p=0, l=0}
   end
   if CandleExist(I,ds) then
       if I~=it.p then it={p=I, l=it.l+1} end
       local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
       sum[Ip] = (sum[Ipp] or 0) + GetValueEX(it.p,VT,ds)
       if it.l >= P then
           if it.l == P then
               sum2[Ip] = (sum[Ip] - (sum[Ippp] or 0)) / P
           else
               sum2[Ip] = ((sum[Ip] - (sum[Ippp] or 0)) - (sum2[Ipp] or 0)+ GetValueEX(it.p,VT,ds)) / P
           end
           return sum2[Ip]
       end
   end
return 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~=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=arg and r(arg * ((T and T.Multiply) or 1), (T and T.Round) or "off")
       end
       return 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)
   end
return nil
end
Используй TYPE_HISTOGRAM в настройках линий, ну и естественно вместо функций MACD  MA добывь свои, если нет опыта в программировании закажи или изучай, других вариантов вроде нет
Вот я и хотел изучать, только не пойму с чего начать. Это рабочий индикатор какой то? Смотрю на это и ума не приложу куда тут вставлять значения. А если заказывать не подскажешь сколько это может стоить?
Ввод собственных данных в виде индикатора в квик, индикатор для квик
 
Добрый день, подскажите как можно реализовать аналог индикатора объема но только с собственными данными. Допустим есть определенные данные за день разбитые поминутно их нужно перенести в квик в виде гистограммы по времени, то есть получится что то вроде обычного индикатора объема только со своими значениями, и если изменять таймфрейм инструмента данный индикатор будет соответственно перестраиваться. Опыта програмирования нет но могу попробовать повторить по образу подобию чего либо, прошу помощи с чего начать?
Страницы: 1
Наверх