Расчет скользящих средних в ФТ (вопросы)

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Ответить
Сообщение
Автор
-=LP=-
Сообщения: 14
Зарегистрирован: Пн янв 22, 2007 11:42 am

Расчет скользящих средних в ФТ (вопросы)

#1 Сообщение -=LP=- » Пн фев 05, 2007 10:55 pm

Создаю новую тему, потомучто незнаю куда написать. :roll:
Хочу задать вопрос по поводу расчета СС. Вопрос следующий:
Мне нужно расчитать Exponential MA. Нашел формулы расчета.
Экспоненциальное скользящее среднее

Экспоненциальное, или экспоненциально сглаженное, скользящее среднее определяется путем добавления к вчерашнему значению скользящего среднего определенной доли сегодняшней цены закрытия. В случае экспоненциальных скользящих средних больший вес имеют последние цены закрытия.

Формула для расчёта экспоненциальной скользящей средней задается рекурсионно:

MAE = P1*K + MAE-1*(1-K),

где MAE - экспоненциальная скользящая средняя;
P1 - цена в рассчитываемый период;
MAE-1 - предыдущее значение экспоненциальной скользящей средней;

K = 2/(N + 1)

N - период усреднения.
"Взято с www.fibo-futures.ru/pages.php?page=52"

Так вот. Написал код, по примеру Simple MA, взятой из стратегии, входящей в ФТ.

Код: Выделить всё

{-----Reset strategy--------------------------------------------------------}
procedure ResetStrategy; stdcall;

begin
  OrderHandle := -1;
end;

// Расчет EMA
function GetEMA(period: integer): double;
var
  i: integer;
  sum: double;
begin
  sum := 0;
  for i:=0 to period - 1 do
    sum := (sum + Close(i));
  result := sum*(2/(period + 1)) + result*(1-(2/(period + 1)));
end;
Компилю, выдает:
Return value of function 'GetEMA' might be undefined.
Если запринтить потом значения ф-ции, вообще леваковые выдает.
Помогите пожалуйста разобраться в чем моя ошибка! :(
P.S. Ув. Terranin, если Вам несложно, подскажите, когда будет свободное время! Вы точно знаете что к чему!! :wink:

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Расчет скользящих средних в ФТ (вопросы)

#2 Сообщение Terranin » Вт фев 06, 2007 3:07 am

-=LP=- писал(а):

Код: Выделить всё

{-----Reset strategy--------------------------------------------------------}
procedure ResetStrategy; stdcall;

begin
  OrderHandle := -1;
end;

// Расчет EMA
function GetEMA(period: integer): double;
var
  i: integer;
  sum: double;
begin
  sum := 0;
  for i:=0 to period - 1 do
    sum := (sum + Close(i));
  result := sum*(2/(period + 1)) + result*(1-(2/(period + 1)));
end;
Компилю, выдает:
Return value of function 'GetEMA' might be undefined.
Если запринтить потом значения ф-ции, вообще леваковые выдает.
Помогите пожалуйста разобраться в чем моя ошибка! :(
P.S. Ув. Terranin, если Вам несложно, подскажите, когда будет свободное время! Вы точно знаете что к чему!! :wink:
result := sum*(2/(period + 1)) + result*(1-(2/(period + 1)));

здесь в правой части вместо result* подразумевалось я думаю sum*
Asta la vista
Mike

-=LP=-
Сообщения: 14
Зарегистрирован: Пн янв 22, 2007 11:42 am

Re: Расчет скользящих средних в ФТ (вопросы)

#3 Сообщение -=LP=- » Вт фев 06, 2007 7:47 pm

Terranin писал(а):result := sum*(2/(period + 1)) + result*(1-(2/(period + 1)));

здесь в правой части вместо result* подразумевалось я думаю sum*
Поставил. Потом делаю так:

Код: Выделить всё

EMA := GetEMA(period);
Print(format('EMA: %.4f', [EMA]));
Принтит значения в пределах 5-ти. Насколько я понимаю, расчитываеться цена СС на текущем баре. Так почему значение 5 с копейками, если должно быть, 1 с копейками (для Фунта), непонятно! :shock: А может есть какой-то другой способ узнать значение СС на текущем баре? Может через GetIndicatorValue или еще как? :roll:

Козьма Прутков
Сообщения: 86
Зарегистрирован: Чт июн 26, 2008 3:55 pm

#4 Сообщение Козьма Прутков » Вс фев 22, 2009 7:10 pm

Что-то неладное с расчетом ЕМА. В приведенных выше формулах нет рекурсивности.

По идее, должно быть так:

Код: Выделить всё

  K := 2/(period + 1);
  EMA[index] := K*Close(index) + (1-K)*EMA[index+1];
График получается тот же, что в MovingAverage в режиме ЕМА, но не сразу: очень долго длится начальный переходной процесс. Как можно задать начальное условие - самое первое значение = Close?

Уважаемый Терранин! Может быть, выложите текст MovingAverage (для Дельфи)?
"Многие вещи нам непонятны не потому, что понятия наши слабы, но потому, что сии вещи не входят в круг наших понятий" (с) К.П.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#5 Сообщение Terranin » Вс фев 22, 2009 7:32 pm

Козьма Прутков писал(а):Что-то неладное с расчетом ЕМА. В приведенных выше формулах нет рекурсивности.

По идее, должно быть так:

Код: Выделить всё

  K := 2/(period + 1);
  EMA[index] := K*Close(index) + (1-K)*EMA[index+1];
График получается тот же, что в MovingAverage в режиме ЕМА, но не сразу: очень долго длится начальный переходной процесс. Как можно задать начальное условие - самое первое значение = Close?

Уважаемый Терранин! Может быть, выложите текст MovingAverage (для Дельфи)?
Исходники всех индикаторов лежат на сайте http://www.forextester.ru/download.html
Asta la vista
Mike

Козьма Прутков
Сообщения: 86
Зарегистрирован: Чт июн 26, 2008 3:55 pm

#6 Сообщение Козьма Прутков » Вс фев 22, 2009 9:18 pm

Спасибо, исходники я уже нашел сам, разбираюсь.
"Многие вещи нам непонятны не потому, что понятия наши слабы, но потому, что сии вещи не входят в круг наших понятий" (с) К.П.

Ответить