HOME

Индикатор "Эквити портфеля" для Омеги.

18.03.2002

Благодарности: Данная методика никогда не увидела бы свет без неоценимой помощи Дмитрия Толстоногова (DT) в освоении мною азов программирования и использования библиотеки Puls. Отдельная благодарность Павлу (Gelium) за прекрасную программу Puls.

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

Воспользуемся для поименованной цели библиотекой дополнительных функций для ProSuite "Puls", разработанной Павлом (Gelium) и любезно предоставленной для всеобщего употребления на его сайте www.gelium.net.

Итак, скачиваем дистрибутив программы и устанавливаем ее на компьютер. С этого момента, мы можем вести обмен значениями, созданных в Омеге глобальных переменных, между различными методиками Easy Language.

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

Для того чтобы получить набор серий, содержащих в себе эквити по каждой бумаге, создадим функцию EL под названием $Puls_SymEq , которая будет отвечать за сбор необходимых данных:

{***************************
Puls_Symbol_Equity function
written by konkop 17.03.2002
Создано при участии Дмитрия Толстоногова (DT)
Copyright (c) DT & konkop 2002
***************************}

vars: r(false), SymOpenProf(0), SymCloseProf(0), Str("");

Str = MidStr(GetSymbolName,1,4)+"_"+GetStrategyName;
{Clear Series}
If BarNumber = 1 then begin
r = gp_SeriesSave("SymOpenProf." + Str, true);
r = gp_SeriesClear("SymOpenProf." + Str);

r = gp_SeriesSave("SymCloseProf." + Str, true);
r = gp_SeriesClear("SymCloseProf." + Str);
End;
if BarNumber > 1 then begin
SymOpenProf = Floor(NetProfit+OpenPositionProfit);
SymCloseProf = Floor(NetProfit);

{Set individual open equities to series data}
r = gp_SeriesSet("SymOpenProf." + Str, Date, Time, SymOpenProf);
{Set individual closed equities to series data}
r = gp_SeriesSet("SymCloseProf." + Str, Date, Time, SymCloseProf);
End;

$Puls_SymEq = 1;

Теперь в код испытуемой стратегии необходимо добавить строчку:

Value10 = $Puls_SymEq;

В результате, после наложения стратегии на графики акций, в Пульсе (который запустится автоматически и появится в виде значка в трее) будут созданы серии данных, содержащие в себе индивидуальные эквити для каждой бумаги. Название полученных переменных будет иметь следующий формат: symopenprof.sngs_1_nrtr_duble. Здесь, symopenprof - общее название для переменных содержащих "открытую" прибыль по текущим позициям стратегии, sngs - наименование акции (используются первые четыре символа из названия тикера), 1_nrtr_duble - название применяемой стратегии. По аналогии, вместе с массивами, содержащими индивидуальную "открытую" прибыль, будут созданы массивы содержащие индивидуальную "закрытую" прибыль по завершенным позициям для каждой акции symcloseprof.sngs_1_nrtr_duble.

Теперь нужно создать индикатор 1_Puls_PortEquity, который будет вызывать нужные серии данных, суммировать их в общую эквити и изображать в виде графика кривой дохода портфеля:

{***************************
Puls_Portfolio_Equity indicator
written by konkop 17.03.2002
Создано при участии Дмитрия Толстоногова (DT)
Copyright (c) DT & konkop 2002
***************************}

InPuts: Str(""),
InitCapital(50000),
Sym1(""),
Sym2(""),
Sym3(""),
Sym4(""),
Sym5(""),
Sym6(""),
Sym7(""),
Sym8(""); {UpTo 8 symbols}

Vars: SymOpenProf(0), SymCloseProf(0), PortOpenProf(0), PortCloseProf(0), r(false);

If BarNumber = 1 then begin
r = gp_SeriesSave("PortOpenProf"+"_"+Str, true);
r = gp_SeriesClear("PortOpenProf"+"_"+Str);

r = gp_SeriesSave("PortCloseProf"+"_"+Str, true);
r = gp_SeriesClear("PortCloseProf"+"_"+Str);
End;

If Barnumber>1 Then begin;
{Get individual open equities from series}
If gp_SeriesGet("SymOpenProf." +Sym1+"_"+Str,Date,Time,true,SymOpenProf) then value1 = SymOpenProf;
If gp_SeriesGet("SymOpenProf." +Sym2+"_"+Str,Date,Time,true,SymOpenProf) then Value2 = SymOpenProf;
If gp_SeriesGet("SymOpenProf." +Sym3+"_"+Str,Date,Time,true,SymOpenProf) then Value3 = SymOpenProf;
If gp_SeriesGet("SymOpenProf." +Sym4+"_"+Str,Date,Time,true,SymOpenProf) then Value4 = SymOpenProf;
If gp_SeriesGet("SymOpenProf." +Sym5+"_"+Str,Date,Time,true,SymOpenProf) then Value5 = SymOpenProf;
If gp_SeriesGet("SymOpenProf." +Sym6+"_"+Str,Date,Time,true,SymOpenProf) then Value6 = SymOpenProf;
If gp_SeriesGet("SymOpenProf." +Sym7+"_"+Str,Date,Time,true,SymOpenProf) then Value7 = SymOpenProf;
If gp_SeriesGet("SymOpenProf." +Sym8+"_"+Str,Date,Time,true,SymOpenProf) then Value8 = SymOpenProf;

{Get individual closed equities from series}
If gp_SeriesGet("SymCloseProf." +Sym1+"_"+Str,Date,Time,true,SymCloseProf) then value11 = SymCloseProf;
If gp_SeriesGet("SymCloseProf." +Sym2+"_"+Str,Date,Time,true,SymCloseProf) then Value12 = SymCloseProf;
If gp_SeriesGet("SymCloseProf." +Sym3+"_"+Str,Date,Time,true,SymCloseProf) then Value13 = SymCloseProf;
If gp_SeriesGet("SymCloseProf." +Sym4+"_"+Str,Date,Time,true,SymCloseProf) then Value14 = SymCloseProf;
If gp_SeriesGet("SymCloseProf." +Sym5+"_"+Str,Date,Time,true,SymCloseProf) then Value15 = SymCloseProf;
If gp_SeriesGet("SymCloseProf." +Sym6+"_"+Str,Date,Time,true,SymCloseProf) then Value16 = SymCloseProf;
If gp_SeriesGet("SymCloseProf." +Sym7+"_"+Str,Date,Time,true,SymCloseProf) then Value17 = SymCloseProf;
If gp_SeriesGet("SymCloseProf." +Sym8+"_"+Str,Date,Time,true,SymCloseProf) then Value18 = SymCloseProf;

{Summ ind.open equities to Portfolio equity}
PortOpenProf = value1 + value2 + Value3 + Value4 + Value5 + Value6 + Value7 + Value8;
r = gp_SeriesSet("PortOpenProf"+"_"+Str,Date,Time,PortOpenProf);
{Summ ind.closed equities to Portfolio equity}
PortCloseProf = value11 + value12 + Value13 + Value14 + Value15 + Value16 + Value17 + Value18;
r = gp_SeriesSet("PortCloseProf"+"_"+Str,Date,Time,PortCloseProf);
End;

If gp_SeriesGet("PortOpenProf"+"_"+Str,Date,Time,true,PortOpenProf) then Value19 = PortOpenProf;
If gp_SeriesGet("PortCloseProf"+"_"+Str,Date,Time,true,PortCloseProf) then Value20 = PortCloseProf;

Plot1(Value19+InitCapital, "OpenEquity");
Plot2(Value20+InitCapital, "ClosedEquity");

При наложении индикатора на график, в инпутах необходимо указать название стратегии Str, например "1_nrtr_duble", начальную стоимость портфеля InitCapital, например 50.000, и названия акций, входящих в состав портфеля Sym1, Sym2..., например "eesr", "sngs", "sber" - до восьми символов.

Итак, в качестве практического занятия, по порядку:

1. Запускаем Омегу. Открываем нужные графики акций, например eesr, sngs, sber. Открываем график индекса РТС, на который будем накладывать эквити портфеля для оценки его эффективности.

2. Накладываем на графики акций исследуемую стратегию (я использовал стратегию под названием 1_nrtr_duble, с разными для всех бумаг параметрами и суммой на сделку в настройках костов = 10.000). В код стратегии должна быть добавлена строчка Value10 = $Puls_SymEq;

3. Пульс запускается автоматически и собирает в серии данных индивидуальные эквити бумаг.

4. На график индекса РТС наносим индикатор 1_Puls_PortEquity, указывая в инпутах: Str - "1_nrtr_duble", InitCapital - 30.000, Sym1 - "eesr", Sym2 - "sngs", Sym3 - "sber" (в остальных строчках Sym оставляем пустые кавычки).

5. Наслаждаемся полученной картиной.

Красная линия индикатора показывает "открытую" эквити портфеля из трех акций, синяя линия - "закрытую" эквити портфеля по завершенным позициям.

Если щелкнуть по иконке Пульса в трее (около часов), то мы увидим следующую картину:

Здесь все наши серии данных с индивидуальными эквити символов и общей эквити портфеля.

Одно замечание. Данная методика не всегда корректно обсчитывает результат на графиках открытых из третьих источников, например из Метастоковского даунлоадера. Данные для построения графиков лучше брать из Омеговского Глобал-Сервера.

Файл ELA с функцией $Puls_SymEq и индикатором 1_Puls_PortEquity.

(с) konkop, 2002

HOME

 

Hosted by uCoz