TS Research Group


 по русски | in english  

КомпанияПрограмные ПродуктыУслугиУправление капиталомПубликацииКонтактыПоискSupport Forum

   Описание   Исследования   Download   Заказ




eSignal Solutions:
· Wavelet Transform for eSignal

Rocket Science Trading Tools:
· Genetic Optimizer for TradeStation

Portfolio Money Management:
· Real Time Portfolio Analyzer

Исследования:
Пробой Волатильности

Процент Риска

Оптимизация параметров стратегии со случайными выходами.



System Trading Tools:
· Wavelet Transform
· TS Link Dll

Исследования:
Использование TS Link. Пример вычисления оптимального F в TradeStation с использованием Excel.


Automatic System Trading:
· TS Automatic Trader DDE Version

RealTime tools:
· OnDemand Server
· Meta Server RT

Historical tools:
· HistoryCentre for OMZ
· HistoryCentre for XPO
· QLoader for QCharts

Utilities:
. Quotes Genereator DDE Version

Support:
. Как купить
. Customer support
· Online help
. Скачать демо
. Задать вопрос
. F.A.Q.



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

Любой, кто использует историю изменения цен, так или иначе имеет дело с техническим анализом. Формализованная часть технического анализа представляет собой так называемые «индикаторы». Индикатор, по определению г-на Акелиса, создателя популярной в России программы MetaStock, это «математическое вычисление, которое применяется к цене и/или объему ценной бумаги. Результат есть значение, которое используется для ожидания будущего изменения цен».

|Как купить| Задать вопрос| F.A.Q.| Online Help|

Вавилонянин не склонен к умозрительным операциям.
Он чтит приговоры случая, препоручает им свою жизнь, свою
надежду, свой панический страх, однако ему в голову не приходит
исследовать ни запутанные закономерности случая, ни движение
вращающихся шаров, которые нам его открывают.

Хорхе Луис Борхес

Существуют тысячи индикаторов, которые, по-существу, есть одно и то же с минимальными вариациями, часто отличающиеся лишь названиями. Новые «волшебные» индикаторы придумываются по двум причинам: 1) элементарная безграмотность, ведущая к изобретению велосипеда; 2) преднамеренная профанация. Подавляющее большинство пользователей индикаторов принимают их как абсолют, не задумываясь об их физическом смысле и свойствах. Более того, популярные книжки наделяют индикаторы свойствами, которыми они не обладают. Пытливые умы, заглянув в устройство индикаторов, обнаружат, что это есть ни что иное, как простейшие цифровые фильтры, теория и методы которых существуют более сотни лет и которые повсеместно применяются в технике. Например, простая скользящая средняя – это фильтр низких частот с конечной импульсной характеристикой, экспоненциальная скользящая средняя – это фильтр низких частот с бесконечной импульсной характеристикой, MACD – полосный фильтр. Stochastic и CCI – это не более чем цена, нормированная разными способами, и т.д. Фильтрация может проводиться как во временной области, как это делают скользящие средние, так и в частотной, где оперируют не с исходными данными, а преобразованными по методу Фурье и т.п. Все фильтры обладают такими атрибутами, как сглаживание входного сигнала и запаздывание сглаженного сигнала по отношению к исходному сигналу. Классические индикаторы создавались в докомпьютерную эру, когда главным требованием к индикатору была возможность посчитать его «на коленке», а уже потом оценивались качество сглаживания и величина запаздывания. По этим характеристикам классические индикаторы варьируются от плохих до очень плохих. Например, популярная среди технических аналитиков 200-дневная скользящая средняя запаздывает ни много ни мало на половину окна усреднения, или 100 дней, при очень низком качестве сглаживания.

Осцилляторы с точки зрения теории фильтрации являются полосными либо дифференцирующими фильтрами, их физический аналог – скорость изменения цен. Тогда такое популярное в техническом анализе средство, как «дивергенция» – цена и осциллятор направлены в разные стороны – есть ни что иное, как необходимое условие экстремума гладкой функции. Стоит подчеркнуть, что достаточное условие экстремума ниоткуда не следует, т.е. в точках экстремума гладкой функции должна наблюдаться дивергенция, но из дивергенции не следует, что это точка экстремума. Использование этого метода технического анализа, как и многих других, основано на логической ошибке подмены достаточного условия необходимым. То, что из дивергенции следует разворот цен аналогично тому, что из факта употребления перед смертью огурцов следует, что огурцы являются причиной смерти.

Широкое распространение компьютеров и цифровой обработки сигналов позволило существенно улучшить классические индикаторы за счет применения к ценовым рядам современных методов обработки информации. Индикаторы стали лучше сглаживать и меньше запаздывать. Однако holy grail не получилось. Во-первых, ценовые ряды нестационарны, т.е. их характеристики, по которым рассчитываются фильтры, меняются во времени. Во-вторых, в отличие от технических задач, в ценовых рядах вид сигнала и распределение шума неизвестны, т.е. неизвестно, что собственно фильтровать. В третьих, отфильтрованные при помощи преобразования Фурье и подобных методов ценовые ряды, при добавлении новых данных меняют свои предыдущие значения: на истории мы получаем идеальные тренды, но торговать их можем только справа-налево.

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

Мы используем вейвлет-преобразование типа Redundant Haar, которое представляет исходный ценовой ряд суммой полосных фильтров, называемых вейвлетами, и остаточного низкочастотного фильтра:

Price = + Residual,

Где N – число рассматриваемых масштабов. Следует иметь в виду, что число исторических данных (т.е. lookback период), по которым рассчитываются вейвлеты, равно , поэтому максимально возможный масштаб . 512 предыдущих значений цен более чем достаточно для любых практических задач. Waveleti аналогичны осцилляторам с последовательно возрастающими lookback периодами, в то время как остаточный член Residual подобен скользящей средней. Более подробно о Redundant Haar вейвлетах можно прочитать на http://www.multiresolution.com.

Фильтрация белого шума производится следующим образом. На каждом масштабе определяется, сигнал это или шум. Если идентифицирован шум, то соответствующему вейвлету присваивается нулевое значение. Если идентифицирован сигнал, то вейвлет остается без изменения. Затем мы производим обратное вейвлет-преобразование и получаем отфильтрованный сигнал.

Тренд определяется как значимое движение на рассматриваемом масштабе, т.е. для идентификации тренда отношение сигнал/шум должно быть больше заданного порога чувствительности. Поскольку шум предполагается гауссовским, можно использовать известное из статистики «правило сигма», задавая порог в диапазоне 2-3.

Приложение реализовано в виде динамической библиотеки dll. Взаимодействие с библиотекой осуществляется при помощи двух функций:

  1. RUNWVL(&ArrayPrice[0],Scales, Threshold),
  2. которая осуществляет прямое и обратное вейвлет-преобразование типа Redundant Haar.

    Значением данной функции является исходный отфильтрованный ряд цен. Входными параметрами для функции RUNWVL являются

    • массив данных, который мы зададим ниже,
    • число масштабов ,
    • пороговое значение отношения сигнал/шум, как правило.

    Ясно, что значением функции RUNWVL(&ArrayPrice[0],Scales, 0) является исходный ряд цен.

  3. GetAllValues(Output, Scale),
  4. Значениями которой, в зависимости от параметра Output, являются

      1. Redundant Haar вейвлет-коэффициент (Output = 1),
      2. уровня шума (Output = 2),
      3. отфильтрованный Redundant Haar вейвлет-коэффициент (Output = 3).

на соответствующем масштабе, который задается параметром Scale .

Например, GetAllValues(1, 5) равно значению 5-го вейвлет-коэффициента Wavelet5. Значением GetAllValues(Output, ) является остаточный член Residual.

Для работы с библиотекой dll необходимо

  1. Определить входные значения индикатора, сигнала, или любого другого study, добавив в начало кода индикатора или сигнала следующие строки:
  2. Inputs: Price(Close) { ценовой ряд },

    Scales(8) { число масштабов },

    NSigma(2) { пороговое значение сигнал/шум };


  3. Определить функции dll,
  4. defineDLLFunc: "tswvl.DLL", FLOAT, "RUNWVL",LPFLOAT,int,float;

    defineDLLFunc: "tswvl.DLL", FLOAT, "GETALLVALUES",int,int;


  5. определить массив входных данных длины , к которым будет применяться вейвлет-преобразование:
  6. vars: lookback(0), count(0);

    Array: ArrayPrice[511](0);

    lookback = power(2, Scales);

    for count = 0 to lookback-1 begin

    ArrayPrice[count] = Price[count];

    end;


  7. инициализировать вейвлет-преобразование:
  8. Value1 = RUNWVL(&ArrayPrice[0],Scales, NSigma);


  9. получить требуемые значения:
  10. Value2 = GetAllValues(1,Count);


  11. провести с полученными значениями требуемые операции.

Пример1. Индикатор, отображающий отфильтрованный ценовой ряд и остаточный член вейвлет-разложения:

На рисунке видно, что фильтрация при помощи вейвлет-преобразования (красный график) удаляет выбросы на бестрендовых участках, оставляя неизменными цены на трендах. На том же графике показан остаточный член разложения, который можно использовать аналогично долгосрочной скользящей средней.

{********************************************************

Non-decimated Haar Wavelet Denoised & Residual Indicator

Copyright (c) Trade Smart Research Group 2002

Notes: The math is based on Multiresolution Analysis of Time Series

www.multiresolutions.com

********************************************************}

Inputs: Price(Close), { ценовой ряд }

Scales(6), { число масштабов }

NSigma(2); { пороговое значение сигнал/шум }

vars: Lookback(0), count(0); { определение переменных }

Array: ArrayPrice[511](0); { определение массива }

defineDLLFunc: "tswvl.DLL", FLOAT, "RUNWVL",LPFLOAT,int,float; { определение dll }

defineDLLFunc: "tswvl.DLL", FLOAT, "GETALLVALUES",int,int;

lookback = power(2, Scales); { вычисление количества элементов массива }

for count = 0 to lookback -1 begin

ArrayPrice[count] = Price[count]; { задание элементов массива }

end;

Value1 = RUNWVL(&ArrayPrice[0],Scales, NSigma); { сглаженный ряд }

Value2 = Scales + 1;

Value3 = GetAllValues(3, value2);

Plot1(value1, "Denoised"); { рисование графиков }

Plot2(value3, "Residual");

Пример 2. Функция, вычисляющая detrended цену, т.е. цену без долговременной трендовой составляющей. Очевидно, это ни что иное как сумма вейвлет-коэффициентов.

Можно значительно улучшить стандартные осцилляторы, если использовать detrended цену вместо исходного ряда цен: На рисунке приведены стандартный индикатор RSI вместе с тем же индикатором (желтая линия на графике), у которого вместо close использованы значения функции TS_Wvl_DetrendPrice. Видно, что модифицированный индикатор несколько более гладкий и значительно лучше ловит экстремумы цен.

{********************************************************

Non-decimated Haar Wavelet Detrended & Denoised Price Function

Copyright (c) Trade Smart Research Group 2002

Notes: The math is based on Multiresolution Analysis of Time Series

www.multiresolutions.com

********************************************************}

Inputs: Price(NumericSeries), { ценовой ряд }

Scales(Numeric), { число масштабов <=9 }

NSigma(Numeric); { пороговое значение сигнал/шум }

vars: Lookback(0), count(0); { определение переменных }

Array: ArrayPrice[511](0); { определение массива }

defineDLLFunc: "tswvl.DLL", FLOAT, "RUNWVL",LPFLOAT,int,float; { определение dll }

defineDLLFunc: "tswvl.DLL", FLOAT, "GETALLVALUES",int,int;

lookback = power(2, Scales); { вычисление количества элементов массива }

for count = 0 to lookback -1 begin { задание элементов массива }

ArrayPrice[count] = Price[count];

end;

Value1 = RUNWVL(&ArrayPrice[0],Scales, NSigma); { вызов dll}

Value2 = Scales + 1;

TS_Wvl_DetrendPrice = Value1 - GetAllValues(3, value2); { вычисление функции}

Пример 3. Индикатор, отображающий семейство низкочастотных фильтров, полученных последовательным вычитанием из отфильтрованного ряда отфильтрованных вейвлет-коэффициентов (см. рисунок):

Здесь использованы два индикатора, TS_Wvl Filter Family и TS_Wvl Filter Family 2: один строит фильтры 1-го по 4-й масштаб, другой с 5-го по 8-й.

{********************************************************

Non-decimated Haar Wavelet Smoothing Indicator Family

Copyright (c) 2002 Trade Smart Research Group

Notes: The math is based on Multiresolution Analysis of time series www.multiresolutions.com

********************************************************}

Inputs: Price(MedianPrice), { ценовой ряд }

NSigma(2); { пороговое значение сигнал/шум }

vars: Lookback(0), count(0); { определение переменных }

Array: ArrayPrice[16](0); { определение массива }

defineDLLFunc: "tswvl.DLL", FLOAT, "RUNWVL",LPFLOAT,int,float; { определение dll }

defineDLLFunc: "tswvl.DLL", FLOAT, "GETALLVALUES",int,int;

for count = 0 to 15 begin { задание элементов массива }

ArrayPrice[count] = Price[count];

end;

Value11 = RUNWVL(&ArrayPrice[0], 4, NSigma); { обращение к dll }

Value1 = value11 - GetAllValues(3,1);

Value2 = value1 - GetAllValues(3,2);

Value3 = value2 - GetAllValues(3,3);

Value4 = value3 - GetAllValues(3,4);

Plot1(value1, "1"); { рисование графиков }

Plot2(value2, "2");

Plot3(value3, "3");

Plot4(value4, "4");

Пример 4. Индикатор, отображающий последовательные вейвлет-коэффициенты, начиная с FirstScale:

На рисунке выше приведены восемь коэффициентов вейвлет-разложения ценового ряда. Их можно использовать вместо осцилляторов.

{********************************************************

Non-decimated Haar Wavelet Coefficients

Copyright (c) Trade Smart Research Group 2002

Notes: The math is based on Multiresolution Analysis of Time Series www.multiresolutions.com

********************************************************}

Inputs: Price(MedianPrice), { ценовой ряд }

FirstScale(4) { число масштабов must be <= 6 },

NSigma(3); { пороговое значение сигнал/шум }

vars: count(0), scales(1); { определение переменных }

Array: ArrayPrice[511](0); { определение массива }

defineDLLFunc: "tswvl.DLL", FLOAT, "RUNWVL",LPFLOAT,int,float; { определение dll }

defineDLLFunc: "tswvl.DLL", FLOAT, "GETALLVALUES",int,int;

scales = FirstScale + 4;

for count = 0 to power(2, Scales) - 1 begin { задание элементов массива }

ArrayPrice[count] = Price[count];

end;

Value2 = RUNWVL(&ArrayPrice[0], scales, NSigma); { обращение к dll }

Value3 = GetAllValues(3,FirstScale);

Value4 = GetAllValues(3,FirstScale + 1);

Value5 = GetAllValues(3,FirstScale + 2);

Value6 = GetAllValues(3,FirstScale + 3);

Plot1(value3, "First"); { рисование графиков }

Plot2(value4, " First +1");

Plot3(value5, " First +2");

Plot4(value6, " First +3");

Пример 5. ShowMe, идентифицирующее тренд на каждом баре на всех масштабах.

Чтобы применить этот инструмент к графику, необходимо запустить TS_Wvl Trend Nowcast из меню ShowMe, нажать на кнопку Expert Commentary и щелкнуть мышью на нужном баре. После этого появится окно с комментарием. На рисунке выше показан результат. Кроме этого, к графику применено семейство низкочастотных фильтров (Пример 3) и вейвлет-коэффициенты (Пример 4). Интересно заметить, что в точках, где на нескольких масштабах тренд не идентифицирован, соответствующие низкочастотные фильтры совпадают, но не пересекаются, что позволяет избежать ложных сигналов, которые будет давать в этих точках, например, пересечение скользящих средних. Кроме того, совпадение фильтров можно трактовать как индикатор состояния готовности к breakout, и не использовать в это время контртрендовых методов.

{********************************************************

Non-decimated Haar Wavelet Trend Detection ShowMe

Copyright (c) Trade Smart Research Group 2002

Notes: The math is based on Multiresolution Analysis of Time Series

www.multiresolutions.com

********************************************************}

Inputs: Price(Close), { ценовой ряд }

NSigma(2); { пороговое значение сигнал/шум }

vars: Lookback(0), AllText(""), count(0); { определение переменных }

Arrays: Sigma[10](0), Wavelet[10](0), Comment[10](""); { определение массивов }

Array: ArrayPrice[511](0);

defineDLLFunc: "tswvl.DLL", FLOAT, "RUNWVL",LPFLOAT,int,float;

defineDLLFunc: "tswvl.DLL", FLOAT, "GETALLVALUES",int,int;

for count = 0 to 511 begin { задание элементов массива }

ArrayPrice[count] = Price[count];

end;

Value1 = RUNWVL(&ArrayPrice[0], 9, NSigma); { обращение к dll }

AllText = "";

for count = 1 to 9 begin

Wavelet[count] = GetAllValues(1,count);

Sigma[count] = GetAllValues(2,count);

if absvalue(Wavelet[count]) < NSigma * Sigma[count] then

Comment[count] = "No detection";

if Wavelet[count] > NSigma * Sigma[count] and

absvalue(Wavelet[count][1]) < NSigma * Sigma[count][1] then

Comment[count] = "New upward detection" + " SNR = " + NumToStr(AbsValue(iff(Sigma[count] >0, Wavelet[count] / Sigma[count], 1)), 2);

if Wavelet[count] < - NSigma * Sigma[count] and

absvalue(Wavelet[count][1]) < NSigma * Sigma[count][1] then

Comment[count] = "New downward detection" + " SNR = " + NumToStr(AbsValue(iff(Sigma[count] >0, Wavelet[count] / Sigma[count], 1)), 2);

if Wavelet[count] > NSigma * Sigma[count] and Wavelet[count][1] < - NSigma * Sigma[count][1] then

Comment[count] = "Upward reversal" + " SNR = " + NumToStr(AbsValue(iff(Sigma[count] >0, Wavelet[count] / Sigma[count], 1)), 2);

if Wavelet[count] < - NSigma * Sigma[count] and Wavelet[count][1] > NSigma * Sigma[count][1] then

Comment[count] = "Downward reversal" + " SNR = " + NumToStr(AbsValue(iff(Sigma[count] >0, Wavelet[count] / Sigma[count], 1)), 2);

if Wavelet[count] > NSigma * Sigma[count] and absvalue(Wavelet[count][1]) > NSigma * Sigma[count][1] then

Comment[count] = "Positive significant structure";

if Wavelet[count] < - NSigma * Sigma[count] and absvalue(Wavelet[count][1]) > NSigma * Sigma[count][1] then

Comment[count] = "Negative significant structure";

if absvalue(Wavelet[count]) < NSigma * Sigma[count] and absvalue(Wavelet[count][1]) > NSigma * Sigma[count][1] then

Comment[count] = "End of significant structure";

AllText = AllText + "SCALE " + NumToStr(count, 0) + " " + Comment[count] + NewLine;

end;

if atCommentaryBar then

begin

CommentaryCL(AllText);

value1 = Text_New(Date, Time, L, "");

end;

Пример 6. Индикатор, отображающий отношение Сигнал/Шум, начиная с FirstScale:

На рисунке видно, что отношение сигнал/шум растет с увеличением масштаба, как и следовало ожидать: на младших масштабах превалирует шум.

{********************************************************

Non-decimated Haar Wavelet Signal to Noise Ratio

Copyright (c) Trade Smart Research Group 2002

Notes: The math is based on Multiresolution Analysis of Time Series

www.multiresolutions.com

********************************************************}

Inputs: Price(MedianPrice), { ценовой ряд }

FirstScale(1); { первый масштаб, с которого рисуются индикаторы}

vars: scales(0), count(0);

Array: ArrayPrice[511](0);

defineDLLFunc: "tswvl.DLL", FLOAT, "RUNWVL",LPFLOAT,int,float; { определение dll }

defineDLLFunc: "tswvl.DLL", FLOAT, "GETALLVALUES",int,int;

for count = 0 to 511 begin { задание элементов массива }

ArrayPrice[count] = Price[count];

end;

value1 = FirstScale + 3;

Value2 = RUNWVL(&ArrayPrice[0],value1, 3); { обращение к dll }

value3 = GetAllValues(2,FirstScale);

value4 = GetAllValues(2,FirstScale + 1);

value5 = GetAllValues(2,FirstScale + 2);

value6 = GetAllValues(2,FirstScale + 3);

if value3 > 0 then Value7 = AbsValue(GetAllValues(1,FirstScale))/value3 else value7 = 0;

if value4 > 0 then Value8 = AbsValue(GetAllValues(1,FirstScale + 1))/value4 else value8 = 0;

if value5 > 0 then Value9 = AbsValue(GetAllValues(1,FirstScale + 2))/value5 else value9 = 0;

if value6 > 0 then Value10 = AbsValue(GetAllValues(1,FirstScale + 3))/value6 else value10 = 0;

if FirstScale > 4 then begin

SetPlotColor(1, 13);

SetPlotColor(2, 9);

SetPlotColor(3, 14);

SetPlotColor(4, 10);

end;

Plot1(value7, "First"); { рисование графиков }

Plot2(value8, "First +1");

Plot3(value9, "First +2");

Plot4(value10, "First +3");

Пример 7. Сигнал, открывающий позиции, если вейвлет-коэффициенты разных масштабов имеют одинаковые направления, и закрывающий ее, если они имеют разные направления:

Примечательно, что эта простейшая стратегия прибыльна на всем диапазоне масштабов. Этот отчет при значениях параметров по умолчанию, без оптимизации.

{********************************************************

Non-decimated Haar Wavelet Slope signal

Copyright (c) Trade Smart Research Group 2002

Notes: The math is based on Multiresolution Analysis of Time Series

www.multiresolutions.com

********************************************************}

Inputs: EntryScale(6), { масштаб вейвлета для входа}

ExitScale(5); { масштаб вейвлета для выхода}

vars: Lookback(0), Scales(0), EntryWL(0), ExitWL(0), Count(0);

Array: ArrayPrice[511](0);

defineDLLFunc: "tswvl.DLL", FLOAT, "RUNWVL",LPFLOAT,int,float; { определение dll }

defineDLLFunc: "tswvl.DLL", FLOAT, "GETALLVALUES",int,int;

Scales = maxlist(EntryScale, ExitScale);

lookback = power(2, Scales);

for count = 0 to lookback-1 begin

ArrayPrice[count] = Close[count];

end;

Value1 = RUNWVL(&ArrayPrice[0],Scales, 0); { обращение к dll }

EntryWL = GetAllValues(3,EntryScale);

ExitWL = GetAllValues(3,ExitScale);

Condition1 = EntryWL > EntryWL[1];

Condition2 = ExitWL > ExitWL[1];

If Condition1 = True and Condition2 = True Then

Buy("Slope.LE") at close;

If Condition1 = False and Condition2 = False Then

Sell("Slope.SE") at close;

If Condition2 = False Then

ExitLong("Slope.LX") at close;

If Condition2 = True Then

ExitShort("Slope.SX") at close;

Пример 8. Сигнал, открывающий позиции, если на заданном масштабе идентифицирован тренд, и закрывающий их, если идентифицировано окончание тренда.

Отчет неоптимизированной системы. Она показывает замечательную робастность относительно параметра NSigma из «теоретически обоснованного» диапазона 2-3, что соответствует 95-99% амплитуды гауссовского шума. Конкретный масштаб (параметр Scale) целесообразно выбирать из середины шкалы, с третьего по пятый.

{********************************************************

Non-decimated Haar Wavelet Trend Nowcast Signal

Copyright (c) Trade Smart Research Group 2002

Notes: The math is based on Multiresolution Analysis of Time Series

www.multiresolutions.com

********************************************************}

Inputs: Scale(5), { масштаб вейвлета }

NSigma(3); { пороговое значение сигнал/шум }

vars: Wavelet(0), Sigma(0), Trend(0), countarray(0), num(1);

Array: ArrayPrice[511](0);

defineDLLFunc: "tswvl.DLL", FLOAT, "RUNWVL",LPFLOAT,int,float;

defineDLLFunc: "tswvl.DLL", FLOAT, "GETALLVALUES",int,int;

for countarray = 0 to 255 begin

ArrayPrice[countarray] = Close[countarray];

end;

Value1 = RUNWVL(&ArrayPrice[0], 8, NSigma);

Wavelet = GetAllValues(1, Scale);

Sigma = GetAllValues(2, Scale);

if Wavelet > NSigma * Sigma then Trend = 1

else

if Wavelet < - NSigma * Sigma then Trend = -1

else

Trend = 0;

if Trend = 1 then buy("NCast.LE") num contracts at close;

if Trend = -1 then sell("NCast.SE") num contracts at close;

if Trend = 0 and marketposition = 1 then ExitLong("NCast.LX") at close;

if Trend = 0 and marketposition = -1 then ExitShort("NCast.SX") at close;

Пример 9. Сигнал, открывающий длинную позицию, если «быстрый» низкочастотный фильтр, построенный в примере 3, поднимается выше «медленного» фильтра, и короткую позицию, если «быстрый» фильтр опускается ниже «медленного» фильтра.

Заметим, что низкочастотные фильтры на основе вейвлетов используют точек. Сравним результаты данной системы с пересечением скользящих средних той же длины. Верхний отчет – это пересечение вейвлет-фильтров, параметры по умолчанию, без оптимизации.

Ниже приводятся результаты применения той же стратегии – пересечение простых скользящих средних вместо вейвлет-фильтров, длиной и , на тех же данных:

Комментарии в данном случае излишни.

Не следует обращать внимание на одинаковое название стратегий: в целях экономии времени мы заменили последние две строки в исходном коде EasyLenguage теми, что взяты в скобки.

{********************************************************

Non-decimated Haar Wavelet Filter Crossover system

Copyright (c) Trade Smart Research Group 2002

Notes: The math is based on Multiresolution Analysis of Time Series

www.multiresolutions.com

********************************************************}

Inputs: MinScale(2), { минимальный масштаб вейвлета }

MaxScale(4), { максимальный масштаб вейвлета }

NSigma(3); { пороговое значение сигнал/шум }

vars: Lookback(0), Count(0);

Array: Filter[9](close);

Array: ArrayPrice[511](0);

defineDLLFunc: "tswvl.DLL", FLOAT, "RUNWVL",LPFLOAT,int,float;

defineDLLFunc: "tswvl.DLL", FLOAT, "GETALLVALUES",int,int;

Lookback = Power(2, MaxScale);

for count = 0 to lookback-1 begin

ArrayPrice[count] = Close[count];

end;

Filter[0] = RUNWVL(&ArrayPrice[0], MaxScale, NSigma);

for count = 1 to MaxScale begin

Filter[count] = Filter[count - 1] - GetAllValues(3,count);

end;

if Filter[MinScale] cross above Filter[MaxScale] Then Buy("Cross.LE") at close;

if Filter[MinScale] cross below Filter[MaxScale] Then Sell("Cross.SE") at close;

{

value21 = power(2, MinScale);

value22 = power(2, MaxScale);

value11 = Average(close, value21);

value12 = Average(close, value22);

if value11 cross above value12 Then Buy("Cross.LE") at close;

if value11 cross below value12 Then Sell("Cross.SE") at close;

}

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

|Как купить| Задать вопрос| F.A.Q.| Online Help|



 В начало  | Контакты  | Карта сайта  | Disclaimer  | Privacy Statement 
Copyright © TS Research Group 2002, e-mail: info@tsresearchgroup.com.  Developed by webdesign.tria.lv