Автор |
Сообщение |
Marcello
Зарегистрирован: 30.05.2015
Сообщения: 69
|
Попалась такая ссылка: 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
Сообщения: 9106
|
Просто надо писать их не в начало массива, а в конец.
или
Когда возьмешь медиану (это же тоже получится массив) взять из этого массива элемент с номером [Per] |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Marcello
Зарегистрирован: 30.05.2015
Сообщения: 69
|
Решил поступить иначе. Массив для последующего получения медианы проинициализировать крайне положительными значениями, а саму медиану потом брать самостоятельно. Получилось так:
Код: |
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
Сообщения: 9106
|
Да, похоже от вложенного цикла избавиться не получится. Если только попробовать использовать 2мерный массив. ( Matrix() ).
А проще написать плагин. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Может попробовать как то так?
Код: |
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
Сообщения: 69
|
Таким образом мы получаем тот самый начальный набор изменений, из которых можно на каждом баре брать медиану. Попробую, спасибо. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Marcello
Зарегистрирован: 30.05.2015
Сообщения: 69
|
Не взлетело... Твои линии рисует быстро, потому что это массивы. А определение медианы на каждом баре в цикле тормозит также. На 15 мин тормозит даже такая "холостая" конструкция:
Код: |
function fRMV( x, Per, ARR ) {
Result = 0;
return Result;
}
RMV = 0;
for ( i = PP; i < BarCount; i++ ) {
RMV[i] = fRMV(i,PP,C);
} |
Видимо без массивов никак. Либо действительно переходить на плагины. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|