Тестирование динамических защитных остановок 2





// копируем параметры в локальные переменные для удобного обращения
mmstp = parms[1]; // используется для начальный защитной остановки
stpa - parms[2]; // дополнительный параметр защитной остановки
stpb = parms[3]; // дополнительный параметр защитной остановки
ptlim = parms[6]; // целевая прибыль в единицах среднего истинного
// диапазона
modeltype = parms[7]; // тип используемой динамической защитной
// остановки
maxhold = parms[8]; // период максимального удержания позиции
ranseed = parms[9]; // используется для инициализации случайной
// последовательности
// выполняем вычисления по всему объему данных
AvgTrueRangeS{exitatr,hi,lo,cls,50,nb); // средний истинный диапазон
// для выхода
// очищаем генератор случайных чисел
// ... используем различные случайные последовательности для каждого рынка
// ... ts.model() возвращает индекс рынка (SP=1, YX- 2, ...)
iseed = - {ranseed + 10 * ts.model());
rnum = ran2(&iseed);
// проходим через дни, чтобы смоделировать реальную торговлю
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);
// считаем количество контрактов для позиции
// ... мы хотим торговать эквивалентом долларовой волатильности
// ... 2 новых контрактов на S&P- 500 от 12/31/98
ncontracts = RoundToInteger(5673.О / dlrv[cb]);
if (ncontracts < 1) ncontracts = 1;
// избегаем устанавливать приказы на дни с ограниченной торговлей
if (hi[cb+1] == lo[cb+1]} continue;
// генерировать "стандартные" случайные сигналы входа
signal = 0;
rnum = ran2(&iseed);
if(rnum < 0,025) signal = - 1 // случайный короткий вход
else if(rnum > 0.975) signal = 1 // случайный длинный вход
// входим в сделки по цене открытия
entryposted = 0;
if (ts.position() < = 0 && signal == 1) {
ts.buyopen{'1' , ncontracts) ;
entryposted - 1;
entryprice = opn[cb+1];
entrybar = cb + 1;
}
else if(ts.position{} >= 0 && signal == - 1) {
ts.sellopen{'2', ncontracts};
entryposted = - 1;
entryprice = opn[cb+1];
entrybar = cb + 1;
}