ТЕСТИРОВАНИЕ
Энциклопедия торговых стратегий














ТЕСТИРОВАНИЕ

ТЕСТИРОВАНИЕ МОДИФИЦИРОВАННОЙ ССВ Следующий тест использует модифицированную стандартную стратегию выходов (МССВ). Системе придан больший реализм за счет того, что защитная остановка управления капиталом и лимит целевой прибыли срабатывают не только по цене закрытия, но и по внутридневным ценам. Чтобы избежать неоднозначных ситуаций (срабатывания нескольких приказов в один торговый день), все входы будут производиться только по цене открытия. Таким образом, можно экспериментировать с широ ким разнообразием стратегий выхода. В остальном правила выхода идентичны использованным ранее и сводятся к следующему: после входа устанавливаются выходная защитная остановка выше (для коротких) или ниже (для длинных позиций) цены входа и выходной лимитный приказ выше (для длинных) или ниже (для коротких позиций) цены входа. Остановка смещена от цены входа на величину произведения некоторого множителя (параметр остановки по управлению капиталом) и размера среднего истинного диапазона. Лимитный приказ смещен от цены входа на величину произведения другого множителя (параметра целевой прибыли) и среднего истинного диапазона. Система производит выход по цене закрытия по истечении 10 дней, если ни защитная остановка, ни целевая прибыль не закрывают сделку ранее. Используется средний истинный диапазон с периодом 50 баров. Ниже приведен код, обеспечивающий случайные входы и модифицированные стандартные выходы. static void Model (float *parms/ float *dt, float *opn, float *hi, float *lo, float *cls, float *vol, float *oi, float *dlrv, int nb, TRDSIM &ts, float *eqcls) { // // // parms // dt // орn // hi // 1о // cls // vol // oi // dlrv // nb // ts // eqcls Выполняет случайные File = x19mod02.c входы с модифицированными выходами набор набор набор набор набор набор набор набор набор [1..MAXPRM] [l..nb] [1..nb] [1..nb] [1..nb] [1..nb] [1..nb] [1..nb] [1..nb] параметров дат в формате ГГММДД цен открытия максимальных цен минимальных цен цен закрытия значений объема волатильности значений открытого интереса средних значений долларовой количество баров в наборе данных ссылка на класс торгового симулятора набор [1..nb] значений капитала по ценам закрытия // объявляем локальные переменные static int rc, cb, ncontracts, maxhold, signal, ranseed; static float mmstp, ptlim, limprice, stpprice; static int entryposted, entrybar; static float exitatr[MAXBAR+1] , rnum, entryprice; static long iseed; // копируем параметры в локальные переменные для удобного обращения ranseed = parms[8] ; // // maxhold = 10; // ptlim =4.0; // // mmstp =1.0; // // используется для генерации случайной последовательности период максимального удержания позиции целевая прибыль в единицах среднего истинного диапазона защитная остановка в единицах среднего истинного диапазона // выполняем вычисления для всех данных AvgTrueRangeS(exitatr,hi,lo,cls,50,nb); // // средний истинный диапазон выхода для // // запускаем генератор случайных чисел используем разные случайные последовательности // ... ts.model() возвращает индекс рынка (SP=1, YX=2, ...) iseed = -(ranseed + 10 * ts.model()); rnum = ran2 (Stiseed) ; // проходим через дни, чтобы смоделировать реальную торговлю 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+l] == lo[cb+l]) continue; // генерируем "стандартные" случайные входные сигналы signal = 0; rnum = ran2(&iseed); // случайное число между 0 и 1 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+l]; entrybar = cb + 1; } else if (ts.position)) >= 0 && signal == -1) { ts.sellopen('2', ncontracts); entryposted = -1; entryprice = opn[cb+l]; entrybar = cb + 1; } // выходить из сделок, используя модифицированный стандартный выход if(entryposted > 0) ( // инициализация и выходы для длинных позиций на каждый день limprice = entryprice + ptlim * exitatr[cb]; stpprice - entryprice - mmstp * exitatr[cb]; ts.exitlonglimit('A', limprice); ts.exitlongstop('B', stpprice); ] else if(entryposted < 0) { // инициализация и выходы для коротких позиций на каждый день limprice = entryprice - ptlim * exitatr[cb]; stpprice = entryprice + mmstp * exitatr[cb]; ts.exitshortlimit('C' , limprice) ; ts.exitshortstop('D' , stpprice); } else { // выходы после дня входа if(ts.position() > 0) ( // длинные позиции ts.exitlonglimit{'F' , limprice) ; ts.exitlongstop('G' , stpprice); if(cb-entrybar >= maxhold) ts.exitlongclose('E') } else if (ts.position)) < 0) { // короткие позиции ts.exitshortlimit{'I' , limprice) ; ts.exitshortstop('J' , stpprice) ; if(cb-entrybar >= maxhold} ts.exitshortclose{'H'); } } )// обрабатываем следующий день } Это код идентичен предыдущему за исключением изменений в стратегии выхода. Система входит на рынок по случайному сигналу, как описывалось ранее, но покупка и продажа производятся только по цене открытия. Кроме того, сохраняется информация о входе, т.е. записывается, отдавался ли приказ на вход (длинная, короткая позиция или никакой) в данном торговом дне (entryposted); по какой цене (entryprice) производился вход, если он был, и в какой день имел место вход (entrybar). Эти данные необходимы для расчета выходов, которые производятся после входа. Если на следующий день отдается приказ войти в рынок (т.е. занять длинную либо короткую позицию по цене открытия следующего дня), то для этого дня также рассчитываются целевая прибыль и защитная остановка. Для длинных позиций защитная остановка устанавливается на некотором уровне (цена входа минус произведение среднего истинного диапазона и некоторого параметра), а лимитный приказ целевой прибыли - на уровне цены входа плюс произведение среднего истинного диапазона и другого параметра. Если в данный день отдается приказ к открытию короткой позиции по цене открытия следующего дня, то также размещаются приказы закрытия данной короткой позиции (лимитный приказ целевой прибыли или защитная остановка). Для длинных позиций расчет производится подобным же образом, но в обратном направлении. Если данный день не используется для входа, то проводится проверка для определения наличия существующей позиции после закрытия дня. Если позиция существует, то размещаются два (а возможно, три) приказа: защитная остановка и целевая прибыль, вычисленные в день открытия данной позиции, и, если позиция открыта более чем maxhold дней, отдается приказ на выход по цене закрытия. Назад

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
Hosted by uCoz