Метод тенденциальной планиметрии - страница 4

 
Mathemat:

но тогда придется отвергнуть стандартный алгоритм метаквотов.


Его нужно отвергнуть.  Если конечно время имеет значение.
 
Mathemat:

Проблема в том, что сами машки надо научиться вычислять еще оптимальнее, чем в стандартном пакете метаквотов. Нужен какой-то рекуррентный алгоритм вычислений машек, при котором по известной машке периода N вычисляется машка периода N+1. В принципе он несложен, но тогда придется отвергнуть стандартный алгоритм метаквотов.

По поводу плотности машек: здесь явно нужен какой-то алгоритм кластеризации, так как они могут располагаться очень неоднородно по вертикали (для заданного бара). Короче, задача технически совсем непроста.

Можно сделать индикатор, в котором последние сто(если использовать сто машек) значений возвращают значения машек. Но в таком случае речь пойдет только о SMA. У других машек алгоритм немного другой, но в принципе тоже реализуемо.
 

Не совсем понял, Виктор. Поясни, пожалуйста, подробнее. Что такое "последние сто"? В одном одномерном массиве?

В принципе рекуррентность в алгоритме метаквотов уже заложена для всех машек. Но она хороша для вызовов машек одного периода. А у нас-то периоды разные каждый раз.

 
Mathemat:

В принципе рекуррентность в алгоритме метаквотов уже заложена для всех машек. Но она хороша для вызовов машек одного периода. А у нас-то периоды разные каждый раз.

for (i = 2; i<=N;i++) {
  Sum += Close[i];
  MA[i] = Sum/i;
}
P.S. Суммы кажется тоже надо сделать массивами :)
 
Mathemat:

Не совсем понял, Виктор. Поясни, пожалуйста, подробнее. Что такое "последние сто"? В одном одномерном массиве?

В принципе рекуррентность в алгоритме метаквотов уже заложена для всех машек. Но она хороша для вызовов машек одного периода. А у нас-то периоды разные каждый раз.


Если считать по среднему,

int i,j;
double sum=0, Count;
for (i=0;i<100;i++) {
   for (j=0;j<step;j++) {
       sum+=Close[i*step+j];
       Count++;
   }
   Buffer[i]=sum/Count;
}
Что -то подобное.
 

Я имел в виду другое.

double SMA( int newperiod, int sh, double SMAprev )
{
   return( ( SMAprev * ( newperiod - 1 ) + Close[ sh + newperiod - 1 ] ) / newperiod );
}

Функция вместо дорогущего вызова iMA() (который будет суммировать кучу слагаемых) независимо от периода вычисляет машку с периодом, увеличенным на 1. Таким образом, фактически на каждом обсчитываемом баре iMA() можно вызывать только один раз, первый и последний.

Для EMA аналогичный алгоритм тоже рекуррентен, хотя не настолько очевиден. SMMA эквивалентна EMA, осталось только LWMA посмотреть.

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

Конечно быстрее. Но я говорю про "ещё быстрее" :). Сравни с моим, который выше.

 
Ага, Candid, понял теперь. Для произвольного бара со сдвигом sh:

// размер массива SMA[] уже установлен равным N+1 перед вызовом функции
void createSMAsArray( int sh, double& SMA[] ) 
{
   double Sum = 0;
   for ( int i = 1; i <= N; i ++ ) 
   {
     Sum += Close[ sh + i - 1 ];
     SMA[ i ] = Sum / i;
   }
   return;
}
Так, что ли? Обрати внимание на начальный индекс суммирования.
Причина обращения: