static int rc, cb, ncontracts,
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); ] // обрабатываем следующий день ]