Методология тестирования 4





// описываем локальные переменные
static int rc, cb, ncontracts, maxhold, ordertype, signal;
static int disp, k, modeltype;
static float mmstp, ptlim, stpprice, limprice, tmp;
static float exitatr[MAXBAR+1] ;
static int rulel[MAXBAR+1], rule2[MAXBAR+1], rule3[MAXBAR+1];
// копируем параметры в локальные переменные для более удобного обращения к ним
modeltype = parms[14]; // модель: 1=длинная позиция, 2=короткая
ordertype = parms[15]; // вход: 1=на открытии, 2=по лимитному приказу,
// 3=по стоп- приказу
maxhold =10; // максимальный период удержания позиции
ptlim = 4; // целевая прибыль в единицах волатильности
mmstp = 1; // защитная остановка в единицах волатильности
// выполнение расчетов для всей ценовой информации
AvgTrueRangeS(exitatr,hi,lo,cls,50,nb); // средний истинный диапазон для
// выхода
switch(modeltype) {
case 1: case 2: // для моделей открытия длинных и коротких позиций
// для каждого дня отдельно оценить три правила
Rules (opn, hi, lo, cls, vol, oi, exitatr, nb,
parms[1], parms[2], parms[3], parms[4], rulel);
Rules (opn, hi, lo, cls, vol, oi, exitatr, nb,
parms[5] , parms[6] , parms[7] , parms[8] , rule2);
Rules (opn, hi, lo, cls, vol, oi, exitatr, nb,
parms[9] , parms[10] , parms[11] , parms[12] , rule3};
break;
default: nrerror("Invalid model type");
/ проходим через дни, чтобы моделировать настоящую торговлю
or(cb = 1; cb <= nb; cb++) {
// не открываем позиций до начала периода выборки
//... то же самое, что установка MaxBarsBack в TradeStation
if(dt[cb] < IS_DATE) { eqcls[cb] = 0.0; continue; }
// выполняем все ожидающие приказы и сохраняем значение капитала по
// закрытию
rс = ts.update(opn[cb] , hi[cb], lo [cb], cls[cb], cb};
if(rc != 0) nrerror("Trade buffer overflow");
eqcls[cb] = ts.currentequity {EQ__CLOSETOTAL};
// подсчитываем количество контрактов для торговли
// ... мы хотим торговать долларовым эквивалентом волатильности
// ... 2 новых контрактов S&P- 500 на 12/31/98
ncontracts - RoundToInteger(5673.О / dlrv[cb] ) ;
if(ncontracts < 1) ncontracts = 1;
// избегаем устанавливать приказы на дни с ограниченной торговлей
if(hi[cb+l] == lo[cb+l]) continue;
// генерируем входные сигналы, цены стоп- и лимитных приказов
signal = 0;
switch(modeltype) {
case 1: // только длинные позиции
if(rulel[cb] && rule2 [cb] && rule3[cb]) signal = 1;
break;
case 2: // только короткие позиции
if(rulel[cb] && rule2 [cb] && rule3[cb]} signal = - 1;
break;
]
limprice = 0.5 * (hi[cb] + lo [cb]);
stpprice = cls[cb] + 0.5 * signal * exitatr[cb] ;
// открываем позицию, используя определенные типы приказов
if(ts.position(} <= 0 && signal == 1} {
switch(ordertype) { // выбираем нужный тип приказа
case 1: ts.buyopen('1', ncontracts); break;
case 2: ts.buylimit('2', limprice, ncontracts); break;
case 3: ts.buystop('3' , stpprice, ncontracts); break;
default: nrerror("Invalid buy order selected");
}
}
else if(ts.position)) >= 0 && signal == - 1) {
switch(ordertype) { // выбираем нужный тип приказа
case 1: ts.sellopen('4', ncontracts); break;
case 2: ts.selllimit('5', limprice, ncontracts); break;
case 3: ts.sellstop('6', stpprice, ncontracts); break;
default: nrerror{"Invalid sell order selected");
}
}
// симулятор использует стандартную стратегию выхода
tmp = exitatr[cb];
ts.stdexitcls('X', ptlim*tmp, mmstp*tmp, maxhold);
] // обрабатываем следующий день
]