Пробую написать простой скрипт и не могу справиться. Изучаю 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
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.
Мне эта скользящая средняя никогда была нафиг не нужна, код я, ессно, тоже смотреть не хочу, но nikolz, похоже, прав: никаких циклов здесь не нужно. Считаем сумму один раз, а потом к ней добавляем новое значение и убираем самое старое. Два действия - какой тут цикл?
Но, конечно, цикл никакое не "зло в прогах реального времени". Просто ЗДЕСЬ он действительно не нужен.
Владимир написал: Мне эта скользящая средняя никогда была нафиг не нужна, код я, ессно, тоже смотреть не хочу, но nikolz, похоже, прав: никаких циклов здесь не нужно.
(с) Ни читал, но осуждаю... Прекрасная позиция, и главное очень аргументированная
Цитата
Владимир написал: Считаем сумму один раз, а потом к ней добавляем новое значение и убираем самое старое. Два действия - какой тут цикл?
Так это не работает, тут разговор не про SMA, а про EMA Но даже для случая SMA, период 1000, сумму без цикла считать стали бы?
BlaZed, Я хороший алгоритмист. Кроме того, классика: "Чтобы узнать, что яйцо тухлое, не обязательно съесть его целиком".
Господи, да я понятия не имею, что такое SMA, а что EMA! Ага, понятно. Ни та, ни другая нафиг не нужны: сам смысл свечей именно в том, чтобы сглаживать случайные колебания, отрезать текущую "мышиную возню", а потому всё это "скольжение" только засирает это усреднение текущими колебаниями. НА КОЙ это надо? Ха-ха-ха! "Чтобы дать больший вес новым данным, была создана экспоненциальная скользящая средняя (EMA)". Нарочно не придумаешь! А свечи более лёгких таймфреймов на кой? Они-то и дают ПОЛНУЮ картину происходящего, дают столько информации, сколько этой несчастной EMA и не снилось.
Да очень просто! Сумма накапливается, пока не заполнен период, данные укладываются... ну, скажем, в циклическую очередь. А дальше - как я сказал. Что делать с этой придурочной EMA, я не знаю - мож, для неё действительно нужен цикл. Но сама она уж точно нафиг не нужна!
Владимир написал: "Чтобы дать больший вес новым данным, была создана экспоненциальная скользящая средняя (EMA)"
Чудесные писатели чудесных текстов, была создана, типа сидели-сидели и создали и сразу торговля как поперла. Это просто БИХ-фильтр первого порядка, соответственно где применяющий понимает, что он творит, - там полезен, в прочих случаях очередной бубенчик. А цикл не нужен, достаточно последнюю точку рассчитать.
Anton, Это было первое, что я нагуглил по "SMA EMA".
Нет, серьёзно - НА КОЙ этот "алгоритмический выкидыш"? У меня никогда не было ни малейших сомнений: ничего "скользящего" - только "прыгающее". Только закрытые свечи, и пока очередная свеча не накопится, её для анализа просто НЕТ. А "скользить" здесь означает только захламлять картину всякими броуновскими трепыханиями.
Владимир написал: пока очередная свеча не накопится, её для анализа просто НЕТ
Это правильно, при обычном применении "незакрытой свечи" это будет заглядывание в будущее на тесте и феерический слив в реалтайме. Но посмотрите на картинку с другой стороны. Пусть есть десятиминутные свечи 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, Лично я "эту математику ради наживы" вполне себе успешно применяю. Не "эту", конечно, которая EMA, а свою.
А нафига "настраивать десять систем, каждая на своем вот этом сдвинутом фрейме"? Вся эта кухня по определению вероятностная, поэтому избыточная точность здесь не нужна и даже вредна. Я вот формирую свои свечи тупым опросом параметра LAST в ТТТ раз в полторы секунды - результат меня полностью устраивает. Зачем "скользить"?
А то как же! Разумеется, "есть некое истинное движение, прикрытое шумом от несознательных граждан, лупящих по рынку почем зря"! Если "так и предполагается в большинстве академических работ", то я согласен с теми "академиками".
У меня тоже нет 100 лет впереди, но сделки идут по несколько десятков в день... ща... за сегодня на данный момент 14 сделок у одного брокера и, правда, всего лишь 2 у другого (обычно второй заметно опережает по числу сделок), и все довольно удачные.
А на тренд я тоже плюю - он учитывается лишь в достаточно "экзотических" случаях. И насчёт "простых и вкусных решений у нас полный консенсус.
Владимир написал: Вся эта кухня по определению вероятностная
Именно. Чтобы оценка распределения сформировалась более-менее близко к оригиналу, надо много отсчетов. А оригинал-то нестационарный, так что просто удлинить выборку - это собрать в кучу много разных распределений, в итоге получить нормальное и этот самый винеровский процесс. Так что если есть возможность увеличить выборку "на месте", ей стоит воспользоваться. Тут полный аналог неопределенности Гейзенберга: хотим точное распределение - непонятно, где оно было; хотим точно знать, где оно было - непонятно, какое оно было )
Anton, Я не понимаю, что такое "надо много отсчетов". Надо много тикеров, надо много таймфреймов, надо... нет, винеровского процесса как раз не надо. И неопределенности Гейзенберга тоже не надо. Основной закон рынка одним словом сформулируете?
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, ДА?! И в чём же таком "совершенно другом" этот "смысл свечей" заключается? Я вот В ГРОБУ видел эту временную ось - хоть равномерную, хоть неравномерную. И для справки: сжимают не "информацию", а данные. Я вот из свечей информацию как раз ИЗВЛЕКАЮ! Причём мне нафиг не нужны "пять точечных значений" - мне достаточно ОДНОГО. И "суммы объема", кстати, тоже нафиг не нужны.
Закон больших чисел. Грубо говоря, есть монетка, мы заранее знаем, что вероятность орла равна 0.5. Но с трех бросков можем получить и 1, и 0, и 0.33, и 0.66 (а 0.5, гыгы, даже теоретически не можем получить с трех бросков).
Цитата
Владимир написал: Основной закон рынка одним словом
Владимир написал: Нам деньги надо зарабатывать, а не монетки бросать.
Ну их же всем раздают просто так, подошел и заработал, изи. Собственно, в некоторые периоды так и есть, тогда интернет заполоняется рассказами, как победить рынок с помощью простого советского. Потом победители куда-то исчезают, видимо, покупают себе острова и там счастливо живут.
Отсылка к "автостопом по галактике" (читать не стоит). Там мегакомпьютер после многолетних расчетов ответа на вопрос о смысле жизни (или типа того) выдал ответ 42. Тксть ответ мы теперь знаем, осталось понять, в чем был вопрос.
Я и так вижу в наших диалогах "волшебные слова". Но смущает, что они "из разных сказок", не должны бы в одном месте быть одновременно. Для меня реально волшебное слово - это стоп-слово. Т.е. момент, когда "все, чудеса закончились, сворачиваемся и едем присматривать остров". Без оного есть хороший шанс в какой-то момент свернуться не совсем добровольно и на остров уже не поехать.
Закон больших чисел. Грубо говоря, есть монетка, мы заранее знаем, что вероятность орла равна 0.5. Но с трех бросков можем получить и 1, и 0, и 0.33, и 0.66 (а 0.5, гыгы, даже теоретически не можем получить с трех бросков).
Цитата
Владимир написал: Основной закон рынка одним словом
Владимир написал: Зачем резать курицу, несущую золотые яйца?
Несущую не надо. А когда в куриную башку приходит идея колонизации марса и она стартует на второй космической с прицепившимися где-то на границе стратосферы космическими туристами, лучше поглядеть на это со стороны, вскоре сверху жареные тушки икаров повалятся, мы ж не хотим среди них оказаться.
Цитата
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 ...
Dr Wed написал: По факту и в одно и в другое поле попадает номер свечи.
Сейчас не в той обстановке, чтобы вдумчиво в код повтыкать, могу ошибиться, но вроде как в p текущий индекс, а в l индекс последней закрытой свечи. На текущей свече же может быть несколько вызовов. Аналогично в tmp.p текущее рассчитанное значение, а в tmp.pp - значение для предыдущей закрытой свечи.