// Выполняем вычисления по всему объему данных, которые не подвержены
// воздействию каких- либо параметров. Выполняется один раз для каждого
// рынка, результаты сохраняются в таблицах для повторного использования.
// Таким образом, значительно снижается время выполнения программы.
mktindx = ts.modelf) ; // индекс рынка
if (exitatrtab[mktindx] == NOLL) { // размещен?
exitatrtab[mktindx] = vector(1, nb); // таблица exitatr
savgtab[mktindx] = vector{1, nb); // таблица savg
AvgTrueRangeS(exitatrtab[mktindx],
hi, lo, cls, 50, nb); //50- дневный средний истинный
// диапазон
float *pchg = vector(1, nb); // вспомогательный вектор
pchg[l] = 0.0;
for(cb =2; cb < = nb; cb++) {
tmp = cls [cb] - els [cb- 1]; // изменение цены
tmp /= exitatrtab[mktindx] [cb]; // нормирование
pchg [cb] = clip(tmp, - 2.0, 2.0); // обрезание
}
LunarAvg(savgtab[mktindx],
pchg, dt, 2, 60, nb); // лунная сезонность
free_vector(pchg, 1, nb);
printf {"Mkt: %d\n", mktindx}; // показывать прогресс
}
// выполняем вычисления для всех данных
memcpy(exitatr, exitatrtab[mktindx] , sizeof (float)*nb);
memcpy(savg, savgtab[mktindx], sizeof(float)*nb);
switch(modeltype) {
case 1: // данные для импульсной модели
MovAvg{savg,savg,matype,avglen,nb) ; // сглаживающее среднее
for(cb = 1; cb <= nb; cb++)
ma2 [cb] = fabs(savg[cb]} ;
MovAvg (mal, ma2, 1, 100, nb) ; // среднее отклонение
break;
case 2: case 3: case 4: // данные для моделей пересечения
for(cb = 2; cb <= nb; cb++)
savg[cb] += savg [cb- 1]; // интеграция
MovAvg(mal,savg,matype,avglen,nb); // сглаж. средн.
MovAvg(ma2,mal,matype,avglen,nb}; // пересеч. средн.
if (modeltype == 3 modeltype == 4) // стохастический осц.
StochOsc(stoch,hi,lo,cls,1,9,nb); // 9- дневный Быстрый %К
break;
default: nrerror("TRAPSMOD: invalid modeltype");
}
// проходим через дни, чтобы смоделировать реальную торговлю
for(cb = I; cb <= nb; cb++) {
// не открываем позиций до периода выборки
// ... то же самое, что установка MaxBarsBack в TradeStation
if(dt[cb] < IS_DATE) { egcls[cb] = 0.0; continue; }
// выполняем ожидающие приказы и считаем кумулятивный капитал
rc = ts.update(opn[cb], hi[cb], lo [cb], cls[cb], cb) ;
if (rc = 0) nrerror("Trade buffer overflow");
eqcls[cb] = ts.currentequity{EQ_CLOSETOTAL);
/ / не проводим сделок в последние 3 0 дней выборки.
// для того, чтобы оставить место в массивах для будущих сезонностей
if(cb > nb- 30) continue;
// считаем количество контрактов для позиции
// ... мы хотим торговать эквивалентом долларовой волатильности
// ... 2 новых контрактов на S&P- 500 от 12/31/98
neontracts = RoundToInteger(5673.О / dlrv[cb]};
if(ncontracts < 1) ncontracts = 1;
// избегаем устанавливать приказы на дни с ограниченной торговлей
if(hi[cb+1] == lo[cb+1]) continue;
// генерируем входные сигналы, цены стоп- и лимитных приказов
// для всех моделей
signal = 0 ;
switch(modeltype) {
case 1: // основная модель входа на основе импульса с порогом
k = cb + disp;