Во всех тестах циклических моделей входа используется стандартный портфель из 36 рынков. Количество контрактов для покупки или продажи на каждом рынке подбиралось для соответствия долларовой волатильности двух контрактов S&P 500 на конец 1998 г. Использован стандартный выход: защитная остановка закрывает любую позицию, убытки которой превышают одну единицу волатильности. Кроме того, лимитный приказ закрывает позиции, прибыль которых превышает четыре единицы волатильности, а рыночный приказ по цене закрытия закрывает позиции, не закрытые предыдущими выходами в течение 10 дней. Правила входов рассмотрены в обсуждении модели и индивидуальных тестов. Все тесты проведены при помощи стандартного C- Trader toolkit. Ниже приведен код модели, основанный на волновом фильтре со стандартной стратегией выходов:
static void Model (float *parms, float *dt, float *opn, float *hi, float *lo, float *cls, float *vol, float *oi, float *dlrv, int nb, TRDSIM &ts, float *eqcls) {
// Модели группы волновых фильтров
// File = x14mod01.c
// parms — набор [1..MAXPRM] параметров
// dt - набор [l..nb] дат в формате ГГММДД
// орn — набор [1..nb] цен открытия
// hi — набор [1..nb] максимальных цен
// 1о - набор [l..nb] минимальных цен
// cls — набор [1..nb] цен закрытия
// vol — набор [1..nb] значений объема
// oi — набор [1..nb] значений открытого интереса
// dlrv - набор [l..nb] средних долларовой волатильности
/ / nb — количество точек в наборе данных
// ts - ссылка на класс торгового стимулятора
// eqcls - набор [l..nb] уровней капитала по ценам закрытия
// объявляем локальные переменные
static int rc, cb, ncontracts, maxhold, ordertype, signal;
static int disp, k, modeltype, fcount, goodcycle, domperndx;
static float mmstp, ptlim, stpprice, limprice, tmp;
static float width, oldwidth, lper, sper, per, ratio;
static float exitatr[MAXBAR+1], **inphase, **inquad, **power;
static float peakpower, phase, peaknoise, domperiod;
static float buyphase, sellphase, phaseb, oldphase, oldphaseb;
static WAVFILT filter[20];
// копируем параметры в локальные переменные для удобного обращения
width = parms[l]; // ширина полосы пропускания фильтра (0.05 .. 0.20}
disp= parms[2]; // временное смещение в градусах
modeltype = parms[8]; // модель: 1=торговать развороты циклов
ordertype = parms[9]; // вход: 1=на открытии, 2=по лимитному приказу,
// 3=по стоп- приказу
maxhold = 10; // период максимального удержания позиции
ptlim = 4; // целевая прибыль в единицах волатильности
mmstp = 1; // защитная остановка в единицах волатильности
// Создаем искусственный набор цен закрытия в
// форме синусоиды. Это плазмода для проведения тестов.
// Модель должна хорошо торговать на данном наборе цен.
// #define USESIMEWAVE
#ifdef USESINEWAVE
per = 3.0;
ratio = exp (log (30.0/3.0) / (nb - 1));
sper=0.0;
for (cb = 1; cb <= nb; cb++) (
sper += 2.0 * PI * (1.0 / per);
cls[cb] = sin(sper);
per *= ratio;
}
#endif