static int rc, cb, ncontracts,


Глава 1 Глава 2 Глава 3
// описываем локальные переменные 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); ] // обрабатываем следующий день ]
Содержание раздела