Выполняем вычисления по всему объему


Глава 1 Глава 2 Глава 3
// Выполняем вычисления по всему объему данных, которые не подвержены // воздействию каких- либо параметров. Выполняется один раз для каждого // рынка, результаты сохраняются в таблицах для повторного использования. // Таким образом, значительно снижается время выполнения программы. 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;
Содержание раздела