проходим через торговые дни, чтобы





// проходим через торговые дни, чтобы смоделировать реальную торговлю
for(cb = 1; cb <= nb; cb++) {
// не открываем позиций в периоде подсчета
// ... то же самое, что установка MaxBarsBack в TradeStation
if(dt[cb] < IS_DATE) { eqcls[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) ;
// не входим в сделки в последние 30 дней внутри выборки
// оставляем место в массивах для будущих сезонностей
if(cb > nb- 30) continue;
// считаем количество контрактов для позиции
// ... мы хотим торговать эквивалентом долларовой волатильности
// ... двух новых контрактов на S&P- 500 от 12/31/98
neontracts = RoundToInteger{5673 . О / dlrv[cb]) ;
if(ncontracts < 1) ncontracts = 1;
// избегаем устанавливать приказы на дни с ограниченной торговлей
if(hi[cb+l] == lo[cb+l]) continue;
// генерировать входные сигналы, цены стоп- и лимитных приказов
// для всех моделей сезонного входа
signal = 0;
switch{modeltype) {
case 1: // основная модель входа на основе порогов импульса
k = cb + disp;
tmp = thresh * mal[k];
if(savg[k] > tmp && savg [k- 1] <= tmp)
signal = 1;
else if (savg [k] < - tmp && savg[k- 1] >= - tmp)
signal = - 1;


break;
case 2: // основная модель входа на пересечении
k = cb + disp;
if(CrossesAbove(mal, ma2, k)) signal = 1;
else if{CrossesBelow(mal, ma2, k)} signal = - 1;
break;
case 3: // пересечение с подтверждением
k = cb + disp;
if(CrossesAbove(mal, ma2, k)) {
if(stoch[cb] < 25.0) signal = 1;
}
else if(CrossesBelow(mal, ma2, k)) (
if(stoch[cb] > 75.0) signal = - 1;
}
break;
case 4: // пересечение с подтверждением и инверсией
k = cb + disp;
if(CrossesAbove(mal, ma2, k)) (
if(stoch[cb] < 25.0) signal = 1;
else if(stoch[cb] > 75.0) signal = - 1;
}

Содержание раздела