Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Спрятать функцию в TimeFrameSet() Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
ifrm



Зарегистрирован: 16.02.2008
Сообщения: 20

СообщениеДобавлено: Пн Апр 19, 2010 1:23 am Ответить с цитатой Вернуться к началу

Имеется LRSI Эхлера:

Код:

SetBarsRequired(200, 0);

function LRSI(array, gamma)
{
  L0 = array; 
  L1 = array;
  L2 = array;
  L3 = array;
  LRSIValue = array;

  for(i = 1; i < BarCount; i++)
  {
     L0[i] = (1 - gamma)*array[i] + gamma*L0[i-1];
     L1[i] = - gamma * L0[i] + L0[i-1] + gamma * L1[i-1];
     L2[i] = - gamma * L1[i] + L1[i-1] + gamma * L2[i-1];
     L3[i] = - gamma * L2[i] + L2[i-1] + gamma * L3[i-1];

     CU = 0;
     CD = 0;
     if (L0[i] >= L1[i]) CU = L0[i] - L1[i]; else (CD = L1[i] - L0[i]);
     if (L1[i] >= L2[i]) CU = CU + L1[i] - L2[i]; else CD = CD + L2[i] -L1[i];
     if (L2[i] >= L3[i]) CU = CU + L2[i] - L3[i]; else CD = CD + L3[i] -L2[i];
     if (CU + CD != 0) LRSIValue[i] = CU / (CU + CD);
  }
  return LRSIValue;
}

Gamma_1 = Param("Gamma1", 0.5, 0.1, 1, 0.01);

Plot(LRSI(C, Gamma_1), "Laguerre RSI", colorRed, styleLine|styleThick);


Хочу посчитать этот индикатор на дневных барах и пользоваться результатами например на часовиках. Казалось бы все просто, но с этой функцией - куда TimeFrameSet() не прикладывай, получается пурга. Подозреваю что где-то очень сильно туплю (Ведь внутри цикл сидит, а я, к сожалению, не до конца понимаю что происходит с этим циклом при сжатии баров). Помогите пожалуйста. Заранее спасибо.
Посмотреть профиль Отправить личное сообщение
настырный



Зарегистрирован: 15.06.2008
Сообщения: 67

СообщениеДобавлено: Пн Апр 19, 2010 7:50 am Ответить с цитатой Вернуться к началу

Код:

SetBarsRequired(200, 0);

function LRSI(array, gamma)
{
  L0 = array; 
  L1 = array;
  L2 = array;
  L3 = array;
  LRSIValue = array;

  for(i = 1; i < BarCount; i++)
  {
     L0[i] = (1 - gamma)*array[i] + gamma*L0[i-1];
     L1[i] = - gamma * L0[i] + L0[i-1] + gamma * L1[i-1];
     L2[i] = - gamma * L1[i] + L1[i-1] + gamma * L2[i-1];
     L3[i] = - gamma * L2[i] + L2[i-1] + gamma * L3[i-1];

     CU = 0;
     CD = 0;
     if (L0[i] >= L1[i]) CU = L0[i] - L1[i]; else (CD = L1[i] - L0[i]);
     if (L1[i] >= L2[i]) CU = CU + L1[i] - L2[i]; else CD = CD + L2[i] -L1[i];
     if (L2[i] >= L3[i]) CU = CU + L2[i] - L3[i]; else CD = CD + L3[i] -L2[i];
     if (CU + CD != 0) LRSIValue[i] = CU / (CU + CD);
  }
  return LRSIValue;
}


Gamma_1 = Param("Gamma1", 0.5, 0.1, 1, 0.01);

//-------------Дневной тайм фрейм--------------------------------
TimeFrameSet(inDaily);
M = LRSI(C, Gamma_1);
//-------------------Вернулись к часовкам------------------------
Mov = TimeFrameExpand(M,inDaily);

Plot(Mov, "Laguerre RSI", colorRed, styleLine|styleThick);


Попробуйте так.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пн Апр 19, 2010 8:02 am Ответить с цитатой Вернуться к началу

Так не должно получиться. Функция TimeFrameSet() переключает на другой фрейм не все, что есть на чарте, а только массивы OHLLCVOI...

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
ifrm



Зарегистрирован: 16.02.2008
Сообщения: 20

СообщениеДобавлено: Пн Апр 26, 2010 2:46 am Ответить с цитатой Вернуться к началу

настырный
Спасибо за совет, но к сожалению - не работает. На дневных барах все в порядке, но часовики не работают. Схожие результаты, получаются и у меня. Что делать пока не могу сообразить.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пн Апр 26, 2010 8:02 am Ответить с цитатой Вернуться к началу

Проверил на 15 мин. Работает.
Код:

SetBarsRequired(200, 0);

function LRSI(array, gamma)
{
  L0 = array; 
  L1 = array;
  L2 = array;
  L3 = array;
  LRSIValue = array;

  for(i = 1; i < BarCount; i++)
  {
     L0[i] = (1 - gamma)*array[i] + gamma*L0[i-1];
     L1[i] = - gamma * L0[i] + L0[i-1] + gamma * L1[i-1];
     L2[i] = - gamma * L1[i] + L1[i-1] + gamma * L2[i-1];
     L3[i] = - gamma * L2[i] + L2[i-1] + gamma * L3[i-1];

     CU = 0;
     CD = 0;
     if (L0[i] >= L1[i]) CU = L0[i] - L1[i]; else (CD = L1[i] - L0[i]);
     if (L1[i] >= L2[i]) CU = CU + L1[i] - L2[i]; else CD = CD + L2[i] -L1[i];
     if (L2[i] >= L3[i]) CU = CU + L2[i] - L3[i]; else CD = CD + L3[i] -L2[i];
     if (CU + CD != 0) LRSIValue[i] = CU / (CU + CD);
  }
  return LRSIValue;
}


Gamma_1 = Param("Gamma1", 0.5, 0.1, 1, 0.01);

//-------------Дневной тайм фрейм--------------------------------
TimeFrameSet(inDaily);
   M = LRSI(C, Gamma_1);
TimeFrameRestore();
//-------------------Вернулись к часовкам------------------------
Mov = TimeFrameExpand(M,inDaily);

Plot(Mov, "Laguerre RSI", colorRed, styleLine|styleThick);

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
ifrm



Зарегистрирован: 16.02.2008
Сообщения: 20

СообщениеДобавлено: Пн Апр 26, 2010 11:14 pm Ответить с цитатой Вернуться к началу

А никто и не утверждает что функция не работает (то есть AFL выдает ошибку). LRSI должен колебаться от нуля до ста, а вместо этого на графиках таймфрейм которых отличаются от дневного значения индикатора как бы следуют за ценой.

Ошибка заключается в том что значения индикатора построенного на дневных барах не совпадают со значениями "таймфреймнутого" индикатора на младших барах. Достаточно посмотреть на значения индикатора в одно и тоже время на разных таймфреймах
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Апр 27, 2010 12:27 am Ответить с цитатой Вернуться к началу

Ошибка вот в чем. Функция LRSI никак не защищена от неопределенных значений, а когда сжимаешь цены на другой фрейм в начале получаются "пустые" данные, вот она и глючила.
Код:

SetBarsRequired(200, 0);

function LRSI(array, gamma)
{
  L0 = array; 
  L1 = array;
  L2 = array;
  L3 = array;
  LRSIValue = array;

  for(i = 1; i < BarCount; i++)
  {
     L0[i] = (1 - gamma)*array[i] + gamma*L0[i-1];
     L1[i] = - gamma * L0[i] + L0[i-1] + gamma * L1[i-1];
     L2[i] = - gamma * L1[i] + L1[i-1] + gamma * L2[i-1];
     L3[i] = - gamma * L2[i] + L2[i-1] + gamma * L3[i-1];

     CU = 0;
     CD = 0;
     if (L0[i] >= L1[i]) CU = L0[i] - L1[i]; else (CD = L1[i] - L0[i]);
     if (L1[i] >= L2[i]) CU = CU + L1[i] - L2[i]; else CD = CD + L2[i] -L1[i];
     if (L2[i] >= L3[i]) CU = CU + L2[i] - L3[i]; else CD = CD + L3[i] -L2[i];
     if (CU + CD != 0)   (LRSIValue[i] = CU / (CU + CD));
  }
  return LRSIValue;
}


Gamma_1 = Param("Gamma1", 0.5, 0.1, 1, 0.01);

//-------------Дневной тайм фрейм--------------------------------
TimeFrameSet(inDaily);
   M = LRSI(Nz(C), Gamma_1);
TimeFrameRestore();
//-------------------Вернулись к часовкам------------------------
Mov = TimeFrameExpand(M, inDaily);

Plot(Mov, "Laguerre RSI", colorRed, styleLine|styleThick);

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
ifrm



Зарегистрирован: 16.02.2008
Сообщения: 20

СообщениеДобавлено: Вт Апр 27, 2010 12:35 am Ответить с цитатой Вернуться к началу

Спасибо огромное. Теперь работает. Никогда бы не догадался.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen