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



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

СообщениеДобавлено: Пн Май 08, 2017 12:34 pm Ответить с цитатой Вернуться к началу

Попалась такая ссылка: http://meyersanalytics.com/publications2/es5rmed2.pdf. Как я понял, суть в том, чтобы найти отклонения цены, от которых потом получить медиану. Не могу сообразить, как это реализовать в Ами. Пока получается только среднее отклонение взять, а не медианное. Примерно так:
Код:
function fRMV( x, Per, ARR ) {
   Result = 0;

   if ( x >= Per ) {
      for ( z = 2; z <= Per; z++ ) {
         Result = Result + ( ARR[ x - Per + 1 ] - ARR[ x - Per + 1 + z - 1 ] ) / ( 1 - z );
      }
      Result = Result / Per;
   }
   return Result;
}

Чтобы найти медиану, нужно в каждой итерации значение писать в массив, который потом подать в Median(). Но отладчик в 6.10 показывает, что массив по умолчанию имеет 200 значений, поэтому внеся туда, допустим, 20 значений (Per = 20), медиана всегда будет равна нулю, т.к. по середине отсортированного массива нули. Есть ли способ задать размер массива вручную?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пн Май 08, 2017 2:00 pm Ответить с цитатой Вернуться к началу

Просто надо писать их не в начало массива, а в конец.
или
Когда возьмешь медиану (это же тоже получится массив) взять из этого массива элемент с номером [Per]

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



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

СообщениеДобавлено: Вт Май 09, 2017 7:17 pm Ответить с цитатой Вернуться к началу

Решил поступить иначе. Массив для последующего получения медианы проинициализировать крайне положительными значениями, а саму медиану потом брать самостоятельно. Получилось так:
Код:
function fRMV( x, Per, ARR ) {
   Result = 0;
   MARR = 1000000; // массив для медианы
   tmp = 0;
   
   A = B = 0;
   f = frac( Per );
   if ( f > 0 ) { A = floor( Per / 2 ); B = A; }
   else { A = Per / 2; B = A - 1; }
   
   if ( x >= Per ) {
      for ( z = 2; z <= Per; z++ ) {
         tmp = ARR[ x - Per + 1 + z - 1 ] * 100 / ARR[ x - Per + 1 ] - 100; // решил использовать процентное изменение
         tmp = tmp / ( z - 1 );         
         MARR[z-2] = tmp;
      }
      MARR = Sort( MARR ); // сортируем массив
      Result = ( MARR[ A ] + MARR[ B ] ) / 2; // берем медиану
      }

   return Result;
}
Заполнение массива и отрисовку делаю так:
Код:
for ( i = PP; i < BarCount; i++ ) RMV[i] = fRMV(i,PP,C);

Работать-то работает, но ооооочень медленно. Пробовал убирать сортировку - скорость не прибавляется. Сам график рисуется также медленно даже на часовиках. Про 15мин и ниже и говорить нечего - все просто застывает. Подозреваю, что из-за того, что функция совсем не оптимальна. На каждом шаге берется процентное изменение, хотя правильнее получить эти изменения заранее в массивы, например так:
Код:
Delta2 = ( C * 100 / Ref( C, -1 ) - 100 ) / ( 2 - 1 );
Delta3 = ( C * 100 / Ref( C, -2 ) - 100 ) / ( 3 - 1 );
Delta4 = ( C * 100 / Ref( C, -3 ) - 100 ) / ( 4 - 1 );

и использовать в функции. Но как создать эти массивы в нужном количестве, если оно (количество) зависит от периода? Можно конечно сделать штук 30 (до максимального периода), но как потом из них взять нужные? Или можно как-то создать массив массивов, чтобы обращаться к ним по индексу?[/code]
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Май 10, 2017 10:10 am Ответить с цитатой Вернуться к началу

Да, похоже от вложенного цикла избавиться не получится. Если только попробовать использовать 2мерный массив. ( Matrix() ).
А проще написать плагин.

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


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

СообщениеДобавлено: Пт Май 12, 2017 10:36 am Ответить с цитатой Вернуться к началу

Может попробовать как то так?
Код:

PP = 20;
arr = C;

for(i = 1; i <= PP; i++)
{
   tmp = (arr*100/Ref(arr, -i) - 100)/i;
   VarSet("tmp" + i, tmp);
   Plot(VarGet("tmp" + i), "", ColorRed);
}

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



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

СообщениеДобавлено: Пт Май 12, 2017 10:47 am Ответить с цитатой Вернуться к началу

Таким образом мы получаем тот самый начальный набор изменений, из которых можно на каждом баре брать медиану. Попробую, спасибо.
Посмотреть профиль Отправить личное сообщение
Marcello



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

СообщениеДобавлено: Пт Май 12, 2017 11:04 am Ответить с цитатой Вернуться к началу

Не взлетело... Твои линии рисует быстро, потому что это массивы. А определение медианы на каждом баре в цикле тормозит также. На 15 мин тормозит даже такая "холостая" конструкция:
Код:
function fRMV( x, Per, ARR ) {
   Result = 0;
   return Result;
}
RMV = 0;
for ( i = PP; i < BarCount; i++ ) {
   RMV[i] = fRMV(i,PP,C);
}
Видимо без массивов никак. Либо действительно переходить на плагины.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen