Здравствуйте форумчане. В коде ниже функция GETLABLEPOSIXTIME внутри себя
рассчитывается корректно (должна возвращать время метки в формате posix, в
сообщении его и выводит), но при обращении к ней в функции IsLabelChange
переменная posixNewLblTime получает значение nil. Второй день бьюсь, не пойму
в чем косяк. Что не так делаю?
рассчитывается корректно (должна возвращать время метки в формате posix, в
сообщении его и выводит), но при обращении к ней в функции IsLabelChange
переменная posixNewLblTime получает значение nil. Второй день бьюсь, не пойму
в чем косяк. Что не так делаю?
Скрытый текст |
---|
Settings={ Name = "0_12.02.2019",--имя индикатора AssetID = "sber",--идентификатор инструмента LabelName = "D:\метка.bmp",--имя файла метки "down-254095_1280_1", stopper = false,--обработка на каждом тике complect = 0, -- начальное местоположение меток fplace = 40, splace = 5, Yvalue = 0, line= { { Name = "High", Type =TYPE_LINE, Width = 1, Color = RGB(120,90, 140) }--, --{ --Name = "Low", --Type =TYPE_LINE, --Width = 1, --Color = RGB(120,90,140) --}, --{ --Name = "Close", --Type =TYPE_LINE, -- Width = 1, --Color = RGB(120,90, 140) --}, --{ --Name = "Open", --Type =TYPE_LINE, --Width = 1, --Color = RGB(120,90,140) --} --} } } --глобальные переменные -- Внимание, название всех параметров меток должны писаться большими буквами label={ --TEXT="метка"; IMAGE_PATH=Settings.LabelName; --TRANSPARENCY=50, --TRANSPARENT_BACKGROUND=1, --YVALUE=Settings.Yvalue, DATE=0, TIME=0; --R=255; --G=255; --B=255; } t={}--исходная таблица данных свечек tposixByTime={}--индексы свечек проиндексированные по времени tposixOldLabelTime={}--таблица старых значений даты-времени выведенных на чарт меток в POSIX-формате count=0--ограничитель количества циклов Label_Id = {}--массив с идентификаторами меток ScriptPath=""--полный путь к иконке (для метки) flagIndExist=false--флаг существования индикатора на чарте flagLblModify=false--флаг, сигнализирующий о перемещении метки a=0 b=0 c=0 k=0 v=0 tDT={} function Init() --объявление переменных. Присваиваем начальные значения чтобы сразу типизировать. local n = 0--количество строк в таблице (количество свечек) local l = ""--подпись инструмента local NmbrOfCandles = 0--номер последней справа свечи на графике local CandleIndex = 0 --local tDT={} ---[[ if Settings.AssetID == "" then message("Необходимо установить идентификатор инструмента") end --ScriptPath = getScriptPath().."\\"..Settings.LabelName; --путь к файлу метки --message("Init_ScriptPath "..ScriptPath); --label["IMAGE_PATH"]=ScriptPath; --номер предпоследней справа свечи на графике. Нумерация начинается с нуля. NmbrOfCandles = getNumCandles(Settings.AssetID)-2; --получим таблицу с данными всех свечек, проиндексированную по номеру свечки --t - таблица значений свечек --n - количество полученных свечек(строк таблицы) --l - подпись к инструменту --текущую свечу не получаем t,n,l = getCandlesByIndex(Settings.AssetID,0,0,NmbrOfCandles); --получить индекс двух свечек, номера которых заданы во входных параметрах --и установить метки CandleIndex = NmbrOfCandles-Settings.splace; tposixOldLabelTime["splace"], Label_Id["splace"] = PUTLABEL(CandleIndex); --message("Initsplace "..tostring(tposixOldLabelTime["splace"])); --message("Initsplace "..tostring(Label_Id["splace"])); CandleIndex = NmbrOfCandles-Settings.fplace; tposixOldLabelTime["fplace"], Label_Id["fplace"] = PUTLABEL(CandleIndex); --message("Initfplace "..tostring(tposixOldLabelTime["fplace"])); --message("Initfplace "..tostring(Label_Id["fplace"])); --берем из таблицы только время-дату свечи count = 0; for k=0,NmbrOfCandles-1 do count = count + 1; if count > 100000 then break end; --преобразуем в POSIX-формат поле datetime --транспонируем таблицу - индексируем по времени tDT[k] = os.time (t[k].datetime); b=k; tposixByTime[tDT[b]] = b; --[[ if NmbrOfCandles-Settings.splace==b then --message("Initsplace "..tostring(tDT[b]).." "..tostring(tposixByTime[b])) end; if NmbrOfCandles-Settings.fplace==b then --message("Initfplace "..tostring(tDT[b]).." "..tostring(tposixByTime[b])) end --]] end return 1 end function OnCalculate(index) local LblIdF = 0 local LblIdS = 0 local posixNewLblTimeF = 0 local posixOldLblTimeF = 0 local posixNewLblTimeS = 0 local posixOldLblTimeS = 0 local indput local IndLines={} local ChTrend local flagIndChange=false--false-перестроить индикатор, true - не перестраивать ---[[ --если флаг перемещения метки не установлен if flagLblModify==false then --проверяем перемещалась ли первая метка LblIdF=IsLabelChange("fplace"); --проверяем вторую метку LblIdS=IsLabelChange("splace"); --если индикатор существует, то выходим без расчетов, возвращаем массив линий if flagIndExist==true then flagIndChange=true; --иначе строим индикатор, выставляем его флаг, возвращаем массив линий else flagIndChange=false; flagIndExist=true; end --если метка перемещалась flagLblModify==true else --строим индикатор, выставляем флаг индикатора, --сбрасываем флаг метки, возвращаем индикатор flagIndChange=false; flagIndExist=true; flagLblModify=false end --рассчитываем индикатор или выводим линии без расчета --ChTrend=PUTINDICATOR(LblIdF,LblIdS,flagIndChange) --]] return ChTrend end function OnDestroy () local tmp tmp=DelAllLabels(Settings.AssetID) end function IsLabelChange(place) --функция принимает индекс массива Label_Id["строка"] --устанавливает глобальные флаги и --записывает posix-время в глобальную таблицу tposixOldLabelTime --возврашает Id метки local LblId = 0 local posixNewLblTime = 0 local posixOldLblTime = 0 --проверяем перемещалась ли метка --считываем Id метки из массива LblId = Label_Id[place]; message(tostring(LblId).." IsLabelChange_LblId") --считываем posix-время для этой метки posixOldLblTime = tposixOldLabelTime[place]; message(tostring(posixOldLblTime).." IsLabelChange_posixOldLblTime"); --преобразуем время метки с чарта в posix-формат posixNewLblTime = GETLABLEPOSIXTIME (LblId); message(tostring(posixNewLblTimeF).." IsLabelChange_posixNewLblTime") ---[[ --если время не совпадает, выставляем флаги отсутствия индикатора и модификации метки if posixNewLblTime ~= nil then if posixOldLblTime ~= posixNewLblTime then --выставляем флаги --метка перемещена flagLblModify=true; --индикатор не построен flagIndExist=false; --изменяем время метки в массиве tposixOldLabelTime[place] = posixNewLblTime; --message(tostring(posixOldLblTime).." IsLabelChange_posixOldLblTime") --message(tostring(posixNewLblTimeF).." IsLabelChange_posixNewLblTime") --message("IsLabelChange_LblId "..tostring(LblId)); end end return LblId end FTEXT = function (V) --функция подставляет нули при их отсутствии на первой позиции даты-времени V=tostring (V) if string.len (V) == 1 then V = "0".. V end return V end PUTLABEL = function (index) --[[функция для установки метки на чарт по индексу принимает индекс свечи возвращает время метки в posix-формате и Id метки входные параметры: -индекс свечи -строка с названием точки для индексации массива установленных меток --]] local Date=""--дата свечки local Time=""--время свечки local Yvalue=0 LabelId=0 --message ("PUTLABELindex.."..tostring(index)); --дата и время свечи Date=t[index].datetime.year..FTEXT(t[index].datetime.month)..FTEXT(t[index].datetime.day); --дата Time=FTEXT(t[index].datetime.hour)..FTEXT(t[index].datetime.min)..FTEXT(t[index].datetime.sec); --привязка к оси У Yvalue = t[index].high; --заполнить структуру данных метки label={ IMAGE_PATH=Settings.LabelName; YVALUE=Settings.Yvalue+Yvalue; DATE=Date, TIME=Time }; --добавляем метку на чарт и запоминаем Id метки в массиве, проиндексированном принятой строкой LabelId = AddLabel(Settings.AssetID,label); --message ("PUTLABELindex LabelId "..tostring(LabelId)) return os.time (t[index].datetime), LabelId end function GETLABLEPOSIXTIME (LabelId) --функция принимает Id метки и возвращает ее время в posix-формате local id--Id метки local NewLbLParam = {}--структура параметров метки local LabelTime = ""--строка с данными даты-времени метки local dt={}--структура в формате datetime local osTime=0 ---[[ id = LabelId; --message("GETLABLEPOSIXTIME_LabelId "..tostring(id)); --получаем таблицу с параметрами метки (в нижнем регистре в формате строки) NewLbLParam = GetLabelParams(Settings.AssetID, id); --message("GETLABLEPOSIXTIME_LbLParam.date "..tostring(NewLbLParam.date)); --message("GETLABLEPOSIXTIME_LbLParam.time "..tostring(NewLbLParam.time)); --преобразуем в формат datetime dt.year,dt.month,dt.day = string.match(NewLbLParam.date,"(%d%d%d%d)(%d%d)(%d%d)") if #NewLbLParam.time == 5 then LabelTime="0".. NewLbLParam.time else LabelTime="".. NewLbLParam.time end dt.hour,dt.min,dt.sec = string.match(LabelTime,"(%d%d)(%d%d)(%d%d)") --[[ message("GETLABLEPOSIXTIME_dt.year "..tostring(dt.year)); message("GETLABLEPOSIXTIME_dt.month "..tostring(dt.month)); message("GETLABLEPOSIXTIME_dt.day "..tostring(dt.day)); message("GETLABLEPOSIXTIME_dt.hour "..tostring(dt.hour)); message("GETLABLEPOSIXTIME_dt.min "..tostring(dt.min)); message("GETLABLEPOSIXTIME_dt.sec "..tostring(dt.sec)); message("GETLABLEPOSIXTIME_os.time "..tostring(os.time (dt))); --]] --преобразуем в формат POSIX osTime = os.time (dt); message("GETLABLEPOSIXTIME_os.time "..tostring(osTime)); return osTime; end function PUTINDICATOR(LblId1,LblId2,boolIndExist) local i local j local k local TrndH=0 local TrndL=0 local h local l local CndlIdx1=0 local CndlIdx2=0 local ABIdx={} local IntervalCndlNmbr=0 local koef local VChLines={} local VChTrend={} local VChUp={} local VChDn={} local VChUpMax local VChDnMin local posixLblTime1 local posixLblTime2 local APointIdx local BPointIdx local APointLvl local BPointLvl local idxUpMax local idxDnMin local AidxUp local AidxDn local BidxUp local BidxDn local VChTrnd=0 return VChTrnd end |