EMA

Страницы: 1
RSS
EMA, Расчет средней скользящей
 
Добрый вечер.

Пробую написать простой скрипт и не могу справиться. Изучаю Lua 2-ой вечер. На данном форуме нашел скрипт по вычислению средней экспоненциальной, но не могу понять что за что отвечает. Может быть кто то поможет написать пояснения что за что отвечает. В чем разобрался, я подписал.
Код
is_run = true

--объявление переменных
class_code = "SPBFUT"         -- класс торгуемого инструмента (фьючерс)
sec_code = "BRX1"             -- код торгуемого инструмента (нефть)
interval = INTERVAL_M15       -- торговый таймфрейм


function main()
ds = CreateDataSource (class_code, sec_code, interval) 
while is_run == true do
   sleep(1000)               -- задержка в 1 сек.
   ds:SetEmptyCallback()     -- обновляем данные по инструменту в массиве ds
   
   Ema_8 = 0                 -- переменная
   GO8 = 0                   -- переменная
   pre_ema_8 =0              -- переменная
   period_ema8 = 8           -- переменная

for i_ema_8 = 1, ds:Size() , 1 do
   C_ema8[i_ema_8] = ds:C(ds:Size() - (i_ema_8 - 1))

       if i_ema_8 == period_ema8 then
              Ema_8 = C_ema8[i_ema_8]
       else
           pre_ema_8 = Ema_8
           GO8 = 1
       end

       if GO8 == 1 then
                Ema_8 = pre_ema_8*(2/(period_ema8+1))+ (1 - (2/(period_ema8+1)))*C_ema8[i_ema_8]
       end

       if i_ema_8 == 1 then
               Ema8 = math.ceil(Ema_8)
               GO8 = 0
       end
end
end
end
 
Дмитрий, ну пример для изучения вы явно не самый удачный нашли.. точнее совсем уж неудачный ибо кривой и нерабочий, в нем даже и комментировать нечего

Лови мою функцию расчета EMA Close вместе с примером использования
Код
function main()
  ema_cache={}  -- Кзш со значениями EMA Close
  period=15 -- Период EMA
  ds,error_desc=CreateDataSource("SPBFUT","SiZ1",INTERVAL_H1) -- Создаем датасурс
  n=0 -- Счетчик
  while(ds:Size()==0)and(n<100)do sleep(100) n=n+1 end -- Ждем загрузки датасурса
  if(n==100)then message("Ошибка:"..tostring(error_desc)) return false end -- Если не дождались - выход
  ema(ds,period) -- Вычисляем EMA, заполняем кзш
  message("EMA "..ema_cache[ds:Size()])   -- Пример получения EMA последней свечи
  message("EMA "..ema_cache[ds:Size()-1]) -- Пример получения EMA предпоследней свечи
end
function ema(datasource,period) -- Расчет EMA Close
  local k=2/(period+1) -- Коэффициент взвешивания
  for i=1,datasource:Size() do -- Пробегаемся по всем свечам
    if i==1 then ema_cache[i]=datasource:C(i) -- EMA Close первой свечи
            else ema_cache[i]=k*datasource:C(i)+(1-k)*ema_cache[i-1] -- EMA Close всех остальных свеч
    end
  end
end
 
Добрый вечер.
Отлично работает, спасибо.
Не могу значение поместить в таблицу. Подскажите пжл как правильно написать.
Код
ema_cache[ds:Size()-1]

SetCell(Tabl,2,2,ema_cache[ds:Size()-1])
 
О, так вроде работает
Код
SetCell(Tabl,2,2,tostring(ema_cache[ds:Size()-1]))
 
Цитата
BlaZed написал:
Дмитрий, ну пример для изучения вы явно не самый удачный нашли.. точнее совсем уж неудачный ибо кривой и нерабочий, в нем даже и комментировать нечего

Лови мою функцию расчета EMA Close вместе с примером использования
Код
   function   main ()
  ema_cache = {}   -- Кзш со значениями EMA Close 
  period =  15   -- Период EMA 
  ds,error_desc =  CreateDataSource ( "SPBFUT" ,"SiZ1",INTERVAL_H1)  -- Создаем датасурс 
  n =  0   -- Счетчик 
   while (ds: Size () =  =  0 ) and (n <  100 ) do   sleep ( 100 ) n = n +  1   end   -- Ждем загрузки датасурса 
   if (n =  =  100 ) then   message ( "Ошибка:"  .. tostring(error_desc))  return   false   end   -- Если не дождались - выход 
  ema(ds,period)  -- Вычисляем EMA, заполняем кзш 
   message ( "EMA "  .. ema_cache[ds: Size ()])    -- Пример получения EMA последней свечи 
   message ( "EMA "  .. ema_cache[ds: Size () -  1 ])  -- Пример получения EMA предпоследней свечи 
 end 
 function   ema (datasource,period)  -- Расчет EMA Close 
   local  k =  2 /(period +  1 )  -- Коэффициент взвешивания 
   for  i =  1 ,datasource: Size ()  do   -- Пробегаемся по всем свечам 
     if  i =  =  1   then  ema_cache[i] = datasource:C(i)  -- EMA Close первой свечи 
             else  ema_cache[i] = k * datasource:C(i) + ( 1  - k) * ema_cache[i -  1 ]  -- EMA Close всех остальных свеч 
     end 
   end 
 end   
не используйте цикл. Это зло в прогах реального времени.
Если Вам надо рассчитать EMA с периодом 1000 таймов скока времени  будете считать?
Можете не успеть до  получения следующего значения.
При этом Вы для каждого нового значения повторно обсчитываете предыдущие 999.
-------------------
Прикольно.
-----------------
В правильной программе и кеш никакой не нужен
и время расчета нового значения  не зависит от периода EMA.
 
У меня нет опыта, вот и спрашиваю как сделать, если есть вариант оптимальное, поделитесь пжл, может быть и другим пригодиться.
 
Возьмите уж лучше примеры, поставляемые Arqa. Там хоть более корректно все написано, с замыканиями.
 
Цитата
nikolz написал:
не используйте цикл. Это зло в прогах реального времени.
А разве возможно без цикла рассчитать EMA? Буду признателен, если продемонстрируете как это сделать.
Цитата
nikolz написал:
Если Вам надо рассчитать EMA с периодом 1000 таймов скока времени  будете считать?
Ради интереса проверил, на моем компе период 1000 просчитался за 0,00099999999656575 секунды
Цитата
nikolz написал:
При этом Вы для каждого нового значения повторно обсчитываете предыдущие 999.
Это вы откуда взяли? Для расчета каждого нового значения берется одно предыдущее из кеша.
Цитата
nikolz написал:
В правильной программе и кеш никакой не нужен
На вкус и цвет...
Цитата
nikolz написал:
и время расчета нового значения  не зависит от периода EMA
Так у меня время расчета тоже от периода не зависит
 
Мне эта скользящая средняя никогда была нафиг не нужна, код я, ессно, тоже смотреть не хочу, но nikolz, похоже, прав: никаких циклов здесь не нужно. Считаем сумму один раз, а потом к ней добавляем новое значение и убираем самое старое. Два действия - какой тут цикл?

Но, конечно, цикл никакое не "зло в прогах реального времени". Просто ЗДЕСЬ он действительно не нужен.
 
Цитата
Владимир написал:
Мне эта скользящая средняя никогда была нафиг не нужна, код я, ессно, тоже смотреть не хочу, но nikolz, похоже, прав: никаких циклов здесь не нужно.
(с) Ни читал, но осуждаю...
Прекрасная позиция, и главное очень аргументированная  :lol:

Цитата
Владимир написал:
Считаем сумму один раз, а потом к ней добавляем новое значение и убираем самое старое. Два действия - какой тут цикл?
Так это не работает, тут разговор не про SMA, а про EMA
Но даже для случая SMA, период 1000, сумму без цикла считать стали бы?
 
BlaZed, Я хороший алгоритмист. Кроме того, классика: "Чтобы узнать, что яйцо тухлое, не обязательно съесть его целиком". :smile:

Господи, да я понятия не имею, что такое SMA, а что EMA! Ага, понятно. Ни та, ни другая нафиг не нужны: сам смысл свечей именно в том, чтобы сглаживать случайные колебания, отрезать текущую "мышиную возню", а потому всё это "скольжение" только засирает это усреднение текущими колебаниями. НА КОЙ это надо? Ха-ха-ха! "Чтобы дать больший вес новым данным, была создана экспоненциальная скользящая средняя (EMA)". Нарочно не придумаешь! А свечи более лёгких таймфреймов на кой? Они-то и дают ПОЛНУЮ картину происходящего, дают столько информации, сколько этой несчастной EMA и не снилось.

Да очень просто! Сумма накапливается, пока не заполнен период, данные укладываются... ну, скажем, в циклическую очередь. А дальше - как я сказал. Что делать с этой придурочной EMA, я не знаю - мож, для неё действительно нужен цикл. Но сама она уж точно нафиг не нужна!
 
Цитата
Владимир написал:
"Чтобы дать больший вес новым данным, была создана экспоненциальная скользящая средняя (EMA)"
Чудесные писатели чудесных текстов, была создана, типа сидели-сидели и создали и сразу торговля как поперла. Это просто БИХ-фильтр первого порядка, соответственно где применяющий понимает, что он творит, - там полезен, в прочих случаях очередной бубенчик. А цикл не нужен, достаточно последнюю точку рассчитать.
 
Anton, Это было первое, что я нагуглил по "SMA EMA". :smile:

Нет, серьёзно - НА КОЙ этот "алгоритмический выкидыш"? У меня никогда не было ни малейших сомнений: ничего "скользящего" - только "прыгающее". Только закрытые свечи, и пока очередная свеча не накопится, её для анализа просто НЕТ. А "скользить" здесь означает только захламлять картину всякими броуновскими трепыханиями.
 
Цитата
Владимир написал:
пока очередная свеча не накопится, её для анализа просто НЕТ
Это правильно, при обычном применении "незакрытой свечи" это будет заглядывание в будущее на тесте и феерический слив в реалтайме. Но посмотрите на картинку с другой стороны. Пусть есть десятиминутные свечи 10:00-10:10, 10:10-10:20 и т.д. Можно ли вместо них использовать свечи 10:01-10:11, 10:11-10:21 и т.д.? Можно же, какая разница. Или 10:02-10:12, или 10:03-10:13... Ну так давайте настроим десять систем, каждая на своем вот этом сдвинутом фрейме, почему нет? Ну и в конце, раз они все одинаковые, может и будем просто каждую минуту считать очередной сдвинутый десятиминутный фрейм? И у нас получился скользящий фрейм, все свечи в котором, однако, вполне себе закрытые. Ну и минутный сдвиг тут для примера, а чего бы нам секундный не взять.

Цитата
Владимир написал:
захламлять картину всякими броуновскими трепыханиями
Это в предположении, что под трепыханиями есть некое "истинное движение", прикрытое "шумом" от несознательных граждан, лупящих по рынку почем зря. Собственно, так и предполагается в большинстве "академических работ", винеровский процесс (сиречь интегрированный белый шум) со сдвигом (сиречь "тренд"). И даже это предположение бьется на истории (если брать дневки за 100 лет, как обычно и берут). Но у меня например нет 100 лет впереди, чтобы доказывать эту теорию на практике. А на меньших горизонтах вклад винеровского процесса оказывается настолько больше "тренда", что последним можно смело пренебречь. Куды бечь, есть ли спасение для бедного инвестора-физика? Ну, можно считать, что процесс не совсем винеровский. Или совсем не винеровский. А тогда вылезают простые и вкусные решения, рассказывать о которых я конечно не буду )

Цитата
Владимир написал:
алгоритмический выкидыш
Та не, с этим все нормально, под ним математика строгая. Вот можно ли эту математику ради наживы применить, другой вопрос. Напрямую вряд ли.
 
Anton, Лично я "эту математику ради наживы" вполне себе успешно применяю. :smile:  Не "эту", конечно, которая EMA, а свою.

А нафига "настраивать десять систем, каждая на своем вот этом сдвинутом фрейме"? Вся эта кухня по определению вероятностная, поэтому избыточная точность здесь не нужна и даже вредна. Я вот формирую свои свечи тупым опросом параметра LAST в ТТТ раз в полторы секунды - результат меня полностью устраивает. Зачем "скользить"?

А то как же! Разумеется, "есть некое истинное движение, прикрытое шумом от несознательных граждан, лупящих по рынку почем зря"! Если "так и предполагается в большинстве академических работ", то я согласен с теми "академиками". :smile:

У меня тоже нет 100 лет впереди, но сделки идут по несколько десятков в день... ща... за сегодня на данный момент 14 сделок у одного брокера и, правда, всего лишь 2 у другого (обычно второй заметно опережает по числу сделок), и все довольно удачные. :smile:

А на тренд я тоже плюю - он учитывается лишь в достаточно "экзотических" случаях. И насчёт "простых и вкусных решений у нас полный консенсус.
 
Цитата
Владимир написал:
Вся эта кухня по определению вероятностная
Именно. Чтобы оценка распределения сформировалась более-менее близко к оригиналу, надо много отсчетов. А оригинал-то нестационарный, так что просто удлинить выборку - это собрать в кучу много разных распределений, в итоге получить нормальное и этот самый винеровский процесс. Так что если есть возможность увеличить выборку "на месте", ей стоит воспользоваться. Тут полный аналог неопределенности Гейзенберга: хотим точное распределение - непонятно, где оно было; хотим точно знать, где оно было - непонятно, какое оно было )
 
Anton, Я не понимаю, что такое "надо много отсчетов". Надо много тикеров, надо много таймфреймов, надо... нет, винеровского процесса как раз не надо. И неопределенности Гейзенберга тоже не надо. Основной закон рынка одним словом сформулируете? :smile:  
 
Цитата
BlaZed написал:
Цитата
nikolz написал:
и время расчета нового значения  не зависит от периода EMA
Так у меня время расчета тоже от периода не зависит
тогда поясните зачем это:
---------------------------
  for  i =  1 ,datasource: Size ()  do   -- Пробегаемся по всем свечам
  if  i =  =  1   then  ema_cache[i] = datasource:C(i)  -- EMA Close первой свечи
            else  ema_cache[i] = k * datasource:C(i) + ( 1  - k) * ema_cache[i -  1 ]  -- EMA Close всех остальных свеч
    end
  end
-------------------------
и от чего зависит этот цикл?
 
Цитата
Владимир написал:
BlaZed, Я хороший алгоритмист. Кроме того, классика: "Чтобы узнать, что яйцо тухлое, не обязательно съесть его целиком". ::

Господи, да я понятия не имею, что такое SMA, а что EMA! Ага, понятно. Ни та, ни другая нафиг не нужны: сам смысл свечей именно в том, чтобы сглаживать случайные колебания, отрезать текущую "мышиную возню", а потому всё это "скольжение" только засирает это усреднение текущими колебаниями. НА КОЙ это надо? Ха-ха-ха! "Чтобы дать больший вес новым данным, была создана экспоненциальная скользящая средняя (EMA)". Нарочно не придумаешь! А свечи более лёгких таймфреймов на кой? Они-то и дают ПОЛНУЮ картину происходящего, дают столько информации, сколько этой несчастной EMA и не снилось.

Да очень просто! Сумма накапливается, пока не заполнен период, данные укладываются... ну, скажем, в циклическую очередь. А дальше - как я сказал. Что делать с этой придурочной EMA, я не знаю - мож, для неё действительно нужен цикл. Но сама она уж точно нафиг не нужна!
Вообще-то сам смысл свечей совершенно в другом.
Во-первых, смысл в том чтобы неравномерную временную ось заменить равномерной
Во-вторых, чтобы сжать информацию, заменив множество сделок на интервале пятью точечными значениями.
При этом нет никакого сглаживания, кроме суммы объема.
--------------------  
 
nikolz, ДА?! И в чём же таком "совершенно другом" этот "смысл свечей" заключается? Я вот В ГРОБУ видел эту временную ось - хоть равномерную, хоть неравномерную. И для справки: сжимают не "информацию", а данные. Я вот из свечей информацию как раз ИЗВЛЕКАЮ! Причём мне нафиг не нужны "пять точечных значений" - мне достаточно ОДНОГО. И "суммы объема", кстати, тоже нафиг не нужны.
 
Цитата
nikolz написал:
тогда поясните зачем это:
чтобы заполнить кэш с расчетами EMA, для дальнейшего обращения к любому из элементов
Цитата
nikolz написал:
и от чего зависит этот цикл?
исключительно от количества свечей в датасурсе, точно не от периода
 
Цитата
Владимир написал:
что такое "надо много отсчетов"
Закон больших чисел. Грубо говоря, есть монетка, мы заранее знаем, что вероятность орла равна 0.5. Но с трех бросков можем получить и 1, и 0, и 0.33, и 0.66 (а 0.5, гыгы, даже теоретически не можем получить с трех бросков).

Цитата
Владимир написал:
Основной закон рынка одним словом
Это все знают, 42.
 
Anton, А зачем считать вероятность? Нам деньги надо зарабатывать, а не монетки бросать. :smile:
Цитата
Это все знают, 42.
Я - не все, я такого не знаю. Что ещё за "42"?
 
Цитата
Владимир написал:
Нам деньги надо зарабатывать, а не монетки бросать.
Ну их же всем раздают просто так, подошел и заработал, изи. Собственно, в некоторые периоды так и есть, тогда интернет заполоняется рассказами, как победить рынок с помощью простого советского. Потом победители куда-то исчезают, видимо, покупают себе острова и там счастливо живут.
Цитата
Владимир написал:
Что ещё за "42"?
Отсылка к "автостопом по галактике" (читать не стоит). Там мегакомпьютер после многолетних расчетов ответа на вопрос о смысле жизни (или типа того) выдал ответ 42. Тксть ответ мы теперь знаем, осталось понять, в чем был вопрос.
 
Anton, Ну, не совсем "раздают просто так", подошёл, включил комп, запустил скрипт и заработал, вполне себе "изи". :smile:

Ах ты чёрт! И что, все острова уже раскупили? Я тоже хочу купить себе остров и там счастливо жить. :smile:

Понятно. Нет, я и в самом деле знаю "волшебное слово". Очень неплохо помогает! :smile:  
 
Цитата
Владимир написал:
волшебное слово
Я и так вижу в наших диалогах "волшебные слова". Но смущает, что они "из разных сказок", не должны бы в одном месте быть одновременно. Для меня реально волшебное слово - это стоп-слово. Т.е. момент, когда "все, чудеса закончились, сворачиваемся и едем присматривать остров". Без оного есть хороший шанс в какой-то момент свернуться не совсем добровольно и на остров уже не поехать.
 
Anton, Дык на этом слове фактически и построен мой алгоритм. :smile: Мне - ндравицца. А сворачиваться-то зачем? Зачем резать курицу, несущую золотые яйца?
 
Цитата
Anton написал:
Цитата
Владимир написал:
что такое "надо много отсчетов"
Закон больших чисел. Грубо говоря, есть монетка, мы заранее знаем, что вероятность орла равна 0.5. Но с трех бросков можем получить и 1, и 0, и 0.33, и 0.66 (а 0.5, гыгы, даже теоретически не можем получить с трех бросков).

Цитата
Владимир написал:
Основной закон рынка одним словом
Это все знают, 42.
Ахахах хороший юмор
                       
 
Люди, привет

Что такое it в коде индикаторов от arqa?

Например, EMA

---
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

......
 
Цитата
Владимир написал:
Зачем резать курицу, несущую золотые яйца?
Несущую не надо. А когда в куриную башку приходит идея колонизации марса и она стартует на второй космической с прицепившимися где-то на границе стратосферы космическими туристами, лучше поглядеть на это со стороны, вскоре сверху жареные тушки икаров повалятся, мы ж не хотим среди них оказаться.

Цитата
Dr Wed написал:
Что такое it в коде индикаторов от arqa?
Это итератор, судя по всему.
 
Цитата

Цитата
Dr Wed написал:
Что такое it в коде индикаторов от arqa?
Это итератор, судя по всему.
Я тоже прихожу  к такому заключению. При этом не очень понятно что в нем есть p и что l. По факту и в одно и в другое поле попадает номер свечи.
М.б. это для обработки ситуаций, когда в источнике есть пропуски в свечах?
 
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
...
 
Anton, Дык у нас же нормальные куры, а не припадочные.  :smile: Зачем нам "вторые космические"? Наоборот, "мы медленно-медленно спустимся вниз"...
 
Цитата
Dr Wed написал:
По факту и в одно и в другое поле попадает номер свечи.
Сейчас не в той обстановке, чтобы вдумчиво в код повтыкать, могу ошибиться, но вроде как в p текущий индекс, а в l индекс последней закрытой свечи. На текущей свече же может быть несколько вызовов. Аналогично в tmp.p текущее рассчитанное значение, а в tmp.pp - значение для предыдущей закрытой свечи.

Цитата
Владимир написал:
Зачем нам "вторые космические"?
Я и говорю, нам такой хоккей не нужен )
Страницы: 1
Читают тему
Наверх