В нашей библиотеке: 321 книг 226 авторов 0 статей За всё время нас посетило 875319 человек которые просмотрели 17332495 страниц.
Читатели оставили 10 отзывов о писателях, 69 отзывов о книгах и 6 о сайте


Название: Энциклопедия торговых стратегий

Автор: Джеффри Оуэн Кац

Жанр: Технический анализ

Рейтинг:

Просмотров: 1769

Страница: | 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 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 |




Методология  тестирования

 

Во всех тестах циклических моделей входа используется стандартный портфель из 36 рынков. Количество контрактов для покупки или прода- жи на каждом  рынке подбиралось для соответствия долларовой волатиль- ности  двух контрактов S&P 500 на конец 1998 г. Использован стандарт- ный  выход:  защитная остановка закрывает любую позицию, убытки  ко- торой  превышают одну единицу волатильности. Кроме того,  лимитный приказ закрывает позиции, прибыль которых превышает четыре  едини- цы волатильности, а рыночный приказ по цене закрытия закрывает пози- ции,  не закрытые  предыдущими  выходами в течение  10 дней. Правила входов рассмотрены  в обсуждении модели и индивидуальных тестов. Все тесты проведены  при помощи  стандартного  C-Trader toolkit. Ниже при- веден код модели, основанный на волновом фильтре со стандартной стра- тегией  выходов:

 

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) {

 

// Модели группы волновых фильтров

// File = x14mod01.c

// parms            — набор [1..MAXPRM] параметров

// dt      - набор [l..nb] дат в формате ГГММДД

//          орn      — набор [1..nb] цен открытия

// hi       — набор [1..nb] максимальных цен

// 1о     - набор [l..nb] минимальных цен

//          cls        — набор [1..nb] цен закрытия

// vol     — набор [1..nb] значений объема

// oi      — набор [1..nb] значений открытого интереса

// dlrv   - набор [l..nb] средних долларовой волатильности

// nb     — количество точек в наборе данных

// ts       - ссылка на класс торгового стимулятора

ГЛАВА 10    Входы НА ОСНОВЕ циклов 241

 

// eqcls             - набор [l..nb]  уровней капитала по ценам закрытия

 

// объявляем локальные  переменные

static int rc, cb, ncontracts,  maxhold, ordertype,  signal; static int disp, k, modeltype,  fcount, goodcycle,  domperndx; static float mmstp, ptlim, stpprice,  limprice,  tmp;

static float width, oldwidth, lper, sper, per, ratio;

static float exitatr[MAXBAR+1], **inphase,  **inquad,  **power;

static float peakpower,  phase, peaknoise,  domperiod;

static float buyphase,  sellphase,  phaseb, oldphase,  oldphaseb;

static WAVFILT filter[20];

 

// копируем параметры в локальные переменные  для удобного обращения

width    = parms[l];       // ширина полосы пропускания фильтра  (0.05 .. 0.20}

disp= parms[2];            // временное смещение в градусах modeltype          = parms[8];       // модель:  1=торговать  развороты циклов ordertype             = parms[9];       // вход: 1=на открытии,  2=по лимитному приказу,

// 3=по стоп-приказу

maxhold                       = 10;                // период максимального  удержания  позиции ptlim         =                      4;              // целевая прибыль в единицах волатильности mmstp                 = 1;       // защитная остановка в единицах волатильности

 

// Создаем искусственный  набор цен закрытия в

// форме синусоиды.  Это «плазмода» для проведения тестов.

// Модель должна хорошо торговать  на данном наборе цен.

// #define USESIMEWAVE

#ifdef USESINEWAVE

per = 3.0;

ratio = exp (log (30.0/3.0) / (nb - 1));

sper=0.0;

for (cb = 1; cb <= nb; cb++) (

sper += 2.0 * PI * (1.0 / per);

cls[cb] = sin(sper);

per *= ratio;

}

#endif

 

// инициализируем  группу равноотстоящих  волновых фильтров

// заново инициализируем,  если параметр ширины полосы изменился if(width != oldwidth)  {

lper ==30.0;     // фильтр длинных периодов

sper = 3.О ;      // фильтр коротких периодов fcount =20;    // число фильтров в группе ratio = exp (log (lper / sper) / (fcount - 1) ) ;

per = sper;

for(k = 1; k <= fcount; k++) (

filter[k-1].build_kernel(per, width);

per *= ratio;

}

oldwidth = width;

}

// рассчитываем  выходы фильтров и откорректированный спектр мощности

// если матрицы  (таблицы)  пустые,  то присваиваем им значения if(inphase == NULL) inphase = matrix(l,fcount,1,MAXBAR); if(inquad == NULL) inquad = matrix(1,fcount,l.MAXBAR); if(power == NULL) power = matrix(1,fcount,1.MAXBAR);

for(k =1 ; k <= fcount; k++) {

filter[k-1] .apply (cls, inphase[k] , inquad[k], nb);

for(cb = 1; cb <= nb; cb++)

power [k] [cb] = (inphase [k] [cb] * inphase [k] [cb] +

inquad [k] [cb] * inquad [k] [cb] )

/ filter[k-1].period();

242      ЧАСТЬ II   ИССЛЕДОВАНИЕ входов в РЫНОК

 

}

 

// сохраняем спектральный  анализ выборки в файл

// эта процедура проводится для отладки

// #define WRITESAMPLE

#ifdef WRITESAMPLE

FILE *fil = fopen("test.dat", "wt");

for(cb = nb-1200; cb < nb; cb++) {

domperndx = 0 ;

peakpower = -1.0;

for(k = 1; k <= fcount; k++) (

if(power[k][cb] > peakpower) { peakpower = power[k] [cb] ; domperndx = k;

}

)

phase = (180.0 / PI) * atan2 (inquad [domperndx] [cb] ,

inphase[domperndx] [cb]);

for(k = 1; k <= fcount; k++) (

if (power [k] [cb] > 0.90 * peakpower)

fprintf(fil, " **");

else if (power[k][cb]  > 0.75 * peakpower)

fprintf(fil, " ++");

else if (power[k][cb]  > 0.5 * peakpower)

fprintf(fil,  " + ");

else

 

)

 

fprintf(fil, " ");

fprintf(fil,  "%4d %7d %7d %7d %8.1f ", (int)filter[domperndx-1].period(), (int)(inphase[domperndx] [cb]), (int)(inquad[domperndx] [cb]), (int)phase, cls [cb]);

}

fclose(fil);

exit(0);

#endif

 

// используется для отладки сигналов

// #define SIGNALDEBUG

#ifdef SIGNALDEBUG

FILE *fil = fopen("testsig.dat" , "wt");

#endif

 

// выполняем вычисления для всех данных

AvgTrueRangeS(exitatr,hi,lo,cls,50,nb) ;           // средний истинный диапазон для

// выхода

switch (modeltype)  [

case 1:

// Ничего не делайте! Место для будущего кода, break ;

default: nrerror  ("Invalid model type");

)

 

// проходим через дни, чтобы смоделировать реальную торговлю for(cb = 1; cb <= nb; cb++) {

 

// не открываем позиций до начала периода выборки

// ... то же самое, что установка MaxBarsBack в TradeStation if(dt[cb] < IS_DATE) 1 egcls[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;

 

// считаем количество контрактов для позиции

//  ... мы хотим торговать  эквивалентом  долларовой  волатильности

// ... 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;

switch (modeltype)  {

case 1:

// ищем хороший цикл для торговли domperndx = 0;

peakpower = -1.0;

for(k = 1; k <= fcount; k++) {

if(power[k][cb]  > peakpower)  { peakpower = power[k][cb]; domperndx = k;

}

}

goodcycle = FALSE;

if(domperndx > 3 && domperndx < fcount-1) {

peaknoise = 0.0;

for(k = 1; k <= fcount; k++) {

if (abs(k - domperndx) > 2) {

if (power[k] [cb] > peaknoise)

peaknoise - power[k] [cb] ;

}

}

if(peakpower > 1.5 * peaknoise) goodcycle = TRUE;

}

// генерируем торговые сигналы

if (goodcycle) {

domperiod = filter [domperndx-1] .period() ;

phase = (180.0 / PI) *

atan2(inquad[domperndx] [cb], inphase[domperndx] [cb]);

oldphase = (180.0 / PI) *

atan2(inquad[domperndx] [cb-1], inphase[domperndx] [cb-1] );

phaseb - (phase<0.0) ? (360.0+phase) : phase;

oldphaseb = (oldphase<0.0)

? (360.0+oldphase) : oldphase;

sellphase = 0.0 - (disp + 180.0 / domperiod);

buyphase = 180.0 + sellphase;

if (phaseb > buyphase && oldphaseb <- buyphase)

signal = 1;         // сигнал на покупку if (phase > sellphase && oldphase <= sellphase)

signal = -1;       // сигнал на продажу

}

break;

244      ЧАСТЬ II   ИССЛЕДОВАНИЕ входов в РЫНОК

 

}

limprice = 0.5 * (hi [cb] + lo [cb] ) ;

stpprice = cls[cb] + 0.5 * signal * exitatr[cb];

 

// печатаем  отладочную  информацию

#ifdef SIGNALDEBUG

fprintf(fil,  "%8d %8.1f %8d %8d %8d %8d ", cb, cls[cb], signal, (int)filter[domperndx-1].period(), (int)peakpower,   {int)peaknoise);

#endif

 

// входим в сделку,  используя определенный  тип приказа 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);

 

} // обрабатываем  следующий  день

 

// закрываем, если в режиме отладки

#ifdef SIGNALDEBUG fclose(fil); exit(0);

#endif

}

 

Вышеприведенный код описывает тестируемую модель.  Первый важ- ный блок кода,  принципиальный для циклической модели,  инициализи- рует индивидуальные фильтры, составляющие группу фильтров. Этот код работает только  при первом проходе  или при изменении параметра, вли- яющего на инициализацию группы фильтров, например параметра width. Если важные параметры остаются без изменений, не имеет смысла пере- запускать фильтры при каждом  вызове  функции Model.

Следующий блок применяет к входящему сигналу  каждый из фильт-

ров в составе  группы.  В этом  блоке  отведены два массива для хранения выходного сигнала группы  фильтров. Первый массив хранит выход с со- впадающей фазой inphase, а второй  —ортогональный выход inquad. Вход- ной  сигнал представляет исходные цены  закрытия. Поскольку фильтры математически оптимальны и рассчитаны на удаление трендов, предва-

ГЛАВА 10    Входы НА ОСНОВЕ циклов                                                                                              245

 

рительная обработка данных  становится излишней в отличие от менее продвинутых методик анализа.  Каждая строка  в массиве представляет собой  выход отдельного фильтра с данной частотой или  периодом, каж- дая колонка представляет собой торговый день. Центральные частоты или периоды фильтров расположены на равных  расстояниях на логарифми- ческой шкале, т.е. соотношение между центральной частотой данного и следующего фильтра постоянно.  Селективность полосы пропускания (width)  — единственный настраиваемый параметр в расчете группы филь- тров,  и это значение может подбираться путем оптимизации.

Затем  запускается обычный цикл  перебора точек  данных,   и генери- руются  собственно торговые сигналы. Сначала проверяется наличие чи- стого,  пригодного для торговли цикла. Для этого определяется мощность при периоде, имеющем максимальный резонанс с текущей активностью рынка (peak power).  Также  оценивается период, на котором наблюдается максимальная мощность. Если период не попадает на одно из крайних зна- чений рассматриваемого диапазона (диапазон составляет от 3 до 30 дней), то потенциально цикл может быть пригоден для торговли. Затем проверя- ется максимальная мощность на расстоянии не менее  2 полос  пропуска- ния  фильтра от  периода пика   (peak noise).  Если  отношение peak power/ peak noise составляет 1,5 или  более,  то выполняется второе  условие  при- годности цикла. На основе пары выходов определяется фазовый угол цик- ла.  Затем  код  проверяет фазовый угол на  соответствие максимуму или минимуму цены.  Кроме того,  в эту оценку вводится небольшое значение смещения (disp).  Оно  работает  подобно смещению в предыдущих моде- лях,  хотя здесь относится к фазовому углу, а не к количеству точек дан- ных. Между фазовым углом и количеством точек данных  существует пря- мая зависимость: период цикла, умноженный на фазовый угол в градусах и разделенный затем на 360, дает количество точек данных,  соответству- ющее  фазовому углу. Если  фаза после  смещения такова,  что через неко- торое  количество градусов  до или  после  текущего дня  можно ожидать минимума, отдается приказ на покупку. Если фаза такова,  что можно ожи- дать максимума, отдается  приказ на продажу.  Затем,  как обычно, рассчи- тываются цены для лимитного и стоп-приказов. При поступлении сигна- лов система исполняет требуемые приказы.

Другие блоки вышеприведенного кода здесь не обсуждаются, посколь- ку связаны с отладкой и тестированием программы. Их предназначение описано в комментариях к коду.

 




Страница: | 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 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 |

Оцените книгу: 1 2 3 4 5

Добавление комментария:






Информацию в электронную библиотеку yourforexschool.com добавляют исключительно для ознакомления. Если вы являетесь автором книги или компанией которая имеет права распространения и вы хотите чтоб на сайте не было вашей книги, то напишите в обратную связь и мы незамедлительно удалим её.

Копирование материалов сайта разрешено только с использованием активной ссылки на yourforexschool.com Copyright © 2010