Moving Average продублировать из 5мин в 1мин

Страницы: 1
RSS
Moving Average продублировать из 5мин в 1мин, Нужно добиться одинаковых графиков ma на разных интервалах
 

Здравствуйте, коллеги.

Помогите разобраться: есть график с интервалом 5 мин, на нем два Moving Average с количеством периодов 2 и 4, оба Exponencial, поле цены Close. Нужно получить такие же (т.е. чтобы значения в одно и тоже время совпадали с MA на 5-ти минутке) на графике с интервалом 1 мин.


Простое увеличение периодов MA на минутном графике до 10 и 20 не приносит желаемого
результата. Есть идеи?
 
И так же нужно, чтобы во время торгов они вели себя одинаково. (Одинаково "дышали").
 
Задача "чтобы значения в одно и тоже время совпадали с MA на 5-ти минутке" строгого решения не имеет. Причина раз: EMA задается (дробным) параметром альфа, а не (целым) периодом, задавая целым мы загрубляем результат. Причина два в три строчки не поместится, ключевые слова теорема Котельникова, частота Найквиста, БИХ-фильтр, а если с этим все ок, тогда вопрос, куда девается верхняя половина спектра (спойлер: отражается в нижнюю).
 
Цитата
Anton написал:
строгого решения не имеет
Я потом и сам понял, что графики "такие же" никогда не получатся.

Мне на самом деле нужно вот что: история минутных свечей, где-то 6-7 мес, и для проверки алгоритма, потребовались дополнительно MA с пятиминутного графика. А на 5-мин истории не оказалось. Помогла бы подкачка данных в Quilk на пятиминутный график, но поддержка Альфы не знает, как это сделать. Я тоже(((

Сегодня я в LUA скрипт сделал, который рассчитывает и добавляет к минутным свечкам значения MA (как бы с пятиминутного графика). Есть сомнения в корректности вычислений. Буду благодарен за замечания.

Например, не уверен, в том, насколько корректно брать среднее ценовое значение минутной свечи из минутного MA с периодом 1.

Код
function add_five_ma() -- Добавим к минутным свечам price_con значение 5-ти минутных ma
   local count
   local alfa2=1*2/(1+2)
   local alfa4=1*2/(1+4)

   --в ma4s к минутным свечам добавляем значение ma с интервалом 4 пятиминутного графика, которое соответствует исторической свече
   --в ma4 запишем значения ma с пятиминутного графика, которые видно на графике в моменте (т.е. когда минутная свеча завершена, а
   -- 5-минутная еще нет "дыхание" )
   --Начальные значения - SMA
   count=0 --индекс одноминутных свечей в таблице price_con
   sum_m1=0 -- сумма минутных ma1 (это же средняя цена свечи???)
   for i=1, 4, 1 do -- в первые 3 пятиминутные свечи пишем 0, в 4ю обычное SMA
      for j=1, 5, 1 do -- перебор одноминутных свечей
         price_con[count].ma4s=0
         price_con[count].ma4=0
         sum_m1=sum_m1+ma1[count].high
         count=count+1
      end
   end
   --четвертая пятиминутка на одноминутных свечах
   local ma4s=sum_m1/count
   for j=1, 5, 1 do -- перебор одноминутных свечей
      price_con[14+j].ma4s=ma4s
      price_con[14+j].ma4=0
      sum_m1=sum_m1+ma1[count].high
      count=count+1
   end

   local last_ma4_t5=ma4s -- предыдущее значение ma4
   count = 1 --счетчик одминуных свечей (1..5)
   local ma1s=0
   --  Далее перебор всех одноминутных свечей, кроме уже заданных первых 20ти (0..19)
   for i=20, min_len-1, 1 do -- перебор минутных свечей
      price_con[i].ma4s=0 --определим для последних, попавших в незакрытую 5мин свечу
      ma1s=((ma1s*(count-1))+ma1[i].high)/count --средняя цена в моменте (в незакрытой 5-ти минутной свече) (сумма минутных ma1)
      price_con[i].ma4=(alfa4*(ma1s))+((1-alfa4)*last_ma4_t5) --значение в моменте ("дыхание")

      if (count==5) then -- Закончилась 5-ти мин. свеча - занесем итоговое значение ma4 в ma4s
         for j= 0, -4, -1 do
            price_con[i+j].ma4s=price_con[i].ma4 -- итоговое значение
         end
         count = 0
         last_ma4_t5=price_con[i].ma4 --для следующе свечи
      end
      count=count+1
   end
end

Пояснение к коду: price_con – минутные свечи, к которым дописываем два свойства: ma4s –значение MA пятиминутной свечи в которую входит минутная(данное значение должно соответствовать тому, которое в это время выдавала бы MA с пятиминутного графика ),  ma4 – это значение в моменте(когда минутная свеча закрылась, а соответствующая 5-ти мин. свеча еще нет). Каждым пяти одноминутным свечам, начиная с 0, соответствует одна воображаемая пятиминутная  свеча.

За начальное значение для EMA – принимает среднее арифметическое.

 
В общем, проверил на имеющихся реальных значениях. Значения не совпадают, причем существенно.
В качестве ma1s - пробовал брать ma с периодом 1 с разными настройками -никакие не дали желаемого результата.
Еще вопрос к алгоритму: может после каждого вычисления значения "в моменте" price_con[i+sdvig].ma4=(alfa4*(ma1s))+((1-alfa4)*last_ma4_t5) - это значения и становиться последним. Т.е. надо дописать в следующей строке last_ma4_t5=price_con[i+sdvig].ma4. Хотя так тоже, значения не те получаются.
Может туда вообще цены всех сделок пишутся?

Открытый вопрос: как по данным с минутном графика самому рассчитать MA пятиминутного графика.  
 
Честно говоря, я не понял, что в скрипте происходит.

Пока пятиминутная  свеча не закрылась, окончательное значение EMA на ней не определено, в  реальном времени просто берем за закрытие последний тик и считаем, что  это и есть значение. Для промежуточных свечей значения - это прямая  линия, соединяющая текущее значение пятиминутки и предыдущее. Главная  проблема, по-моему, что в индикаторе нельзя задним числом четыре  внутренних свечи перерисовать. Так что может емашка с дробным периодом,  дающая ту же частоту среза фильтра, что и пятиминутная емашка, будет и  не самым плохим вариантом.

Пересчитал периоды емашек 2 и 4 с пяти минут на минуту, получаются такие периоды:
M5 EMA(2) -> M1 EMA(8.205459971)
M5 EMA(4) -> M1 EMA(19.18033544)

Поскольку стандартный квиковский индикатор не позволяет дробный период указать, вот минималистичная замена
Код
Settings = 
{
   Name = "EMA-X",
   Period = 8.205459971,
   line =
   {
      {
         Name = "EMA-X",
         Color = RGB(0, 255, 128),
         Type = TYPE_LINE,
         Width = 2
      }
   }
}

local alpha = 0
local prevval = 0

Init = function()
   alpha = 2 / (Settings.Period + 1)
   return 1
end

OnCalcul ate = function(idx)
   local v = C(idx)
   if nil == v then return nil end
   if 0 == prevval then prevval = v else prevval = prevval + alpha * (v - prevval) end
   return prevval
end
Посмотрите, может сойдет.
 
Спасибо за код, завтра проверю (сейчас имел неосторожность перезаказать данные, а сервер не алё). На самом деле, мне графическое отображение не так важно. Нужны значения. В скрипте я попытался воссоздать значения MA пятиминутного графика: ma4s – это итоговое значение закрывшейся пятиминутной свечи, а ma4 – значение незакрытой свечи в момент, когда минутная свечка внутри неё закрылась, т.е. значения которые мы видим, пока свеча не закрылась.
Посмотрел на C(idx) в вашем коде и, кажется, понял, где я накосячил: в v, видимо, должна быть цена закрытия свечи, а я нагородил там велосипедов – MA с периодом 1 влепил.
Цитата
Anton написал:
Пересчитал периоды емашек 2 и 4 с пяти минут на минуту, получаются такие периоды:M5 EMA(2) -> M1 EMA(8.205459971)M5 EMA(4) -> M1 EMA(19.18033544)
Если не секрет, каким образом вы посчитали?
 
Квик дергает индикатор на каждый тик, так что C(idx) это именно "текущее" закрытие, когда начинается новая свеча, последнее рассчитанное "текущее" автоматически становится "окончательным". Кабы не фиксировались значения на промежуточных свечах при их закрытии, было бы просто.

Цитата
Сергей написал:
Если не секрет, каким образом вы посчитали?
Довольно геморройным. Рассматриваем емашку как БИХ-фильтр первого порядка, определяем круговую частоту среза для заданного периода, денормируем на текущую частоту дискретизации (на пятиминутках это 1/(5*60) Гц), получаем частоту среза в герцах, нормируем на частоту дискретизации минуток (1/60 Гц), получаем круговую частоту среза на минутках, и самый гемор из нее выводим период емашки для минуток. В принципе, можно технологию упростить, повозившись с формулами, но тут уже из разряда шашечки или ехать, быстрей было таким образом, чем математические исследования затевать. Там еще обнаруживается такая вещь, что с ростом периода исходной емашки рассчитанный период постепенно приближается к ожидаемому 5x. На заданных же малых периодах оказывается настолько ниже ожидаемого, поскольку, строго говоря, емашка с периодом 2 (и альфой 0.66) находится выше частоты Найквиста и усредняет уже "неизвестно что", кашу из реальных значений и отраженных высших гармоник. У емашки 4 ситуация получше. Впрочем, сама нарезка на свечи без предварительной фильтрации (как требует теорема Котельникова) уже создает довольно-таки кашу в спектрах.
 
В скрипте поменял ma1 на последнюю цену одноминутной свечи - всё заработало с точностью до тысячных, что вполне устраивает. Задача решена.
Цитата
Anton написал:
Довольно геморройным. Рассматриваем емашку как БИХ-фильтр первого порядка, определяем круговую частоту среза для заданного периода, денормируем на текущую частоту дискретизации (на пятиминутках это 1/(5*60) Гц), получаем частоту среза в герцах, нормируем на частоту дискретизации минуток (1/60 Гц), получаем круговую частоту среза на минутках, и самый гемор из нее выводим период емашки для минуток. В принципе, можно технологию упростить, повозившись с формулами, но тут уже из разряда шашечки или ехать, быстрей было таким образом, чем математические исследования затевать. Там еще обнаруживается такая вещь, что с ростом периода исходной емашки рассчитанный период постепенно приближается к ожидаемому 5x. На заданных же малых периодах оказывается настолько ниже ожидаемого, поскольку, строго говоря, емашка с периодом 2 (и альфой 0.66) находится выше частоты Найквиста и усредняет уже "неизвестно что", кашу из реальных значений и отраженных высших гармоник. У емашки 4 ситуация получше. Впрочем, сама нарезка на свечи без предварительной фильтрации (как требует теорема Котельникова) уже создает довольно-таки кашу в спектрах.
Круто. Действительно EMA по закрывающей цене на малых периодах напоминает "цену на яблоки в дождливый день" )
Страницы: 1
Читают тему
Наверх