Работаем с площадью. Алгоритм на WelathLabРаботаем с площадью. Алгоритм на WelathLab
Когда на графике куча скользяшек, складывается впечатление, что система держится на соплях и долго не протянет. Поэтому давно начал думать о каких-то универсальных индикаторах, которые бы измеряли сразу много параметров рынка.
Первое, что пришло в голову – это использовать площади на графике. Изначально идея была такой:
- Строим кривую по хаям и по лоям
- С помощью интерполяции находим промежуточные значения нашей кривой для большей точности.
- Аппроксимировать получившуюся кривую.
- Взять интеграл от получившейся в третьем шаге функции.
По задумке получившееся значение должно было отражать глубину рынка, то есть насколько сильно ходит рынок от локального хая/лоя до хая/лоя внутри дня. Если же мы добавим сюда время (за сколько рынок сходил), то получим индикатор флэта (маленькое значение + большой временной промежуток). По ходу построения индикатора возникали мысли о том, что всё это можно реализовать гораздо проще, и действительно – можно.
Так как мы ищем площадь области над или под графиком, то мы можем просто складывать разницы между текущим high/low и high/low за определенный период. Тогда получаем такую формулу:
Чтобы лучше представлять картинку визуально и удобнее расписывать входы, я решил представить эту разницу свечками. Свеча строится так:
Low = Low(period)
High = Low(now)
Close = Low(now)
Open = Low(period)
Аналогично для high. Вот что получилось:
Далее считаем площади под образующимся графиком и выводим их на отдельную панель. Если хай или лоу за период обновляются, то обнуляем счетчик. Красным обозначены площади под графиком, зеленым – над ним.
Теперь подумаем как можно использовать получившиеся наблюдения.
1. Определяем флэт
Тут все элементарно – маленькие площади можно интерпретировать как сужение волатильности.
Пример:
2. Бэкграунд пробойной стратегии
Очень распространенная стратегия на обновление локального хая может быть дополнена этим индикатором как мерой волатильности. Учитывать движения до пробития важно! Так можно отфильтровать часть убыточных сделок. Возможно, стоит попробовать.
3. Технические паттерны
Можно посмотреть разные паттерны типа пробоя тренда и прочих.
4. Следуем за трендом
Как правило трендовое движение сопровождается коррекциями, которые внутри дня могут быть незначительными и их площадь соответственно не так велика.
Возможно, все уже используют эти методы, но я пока не замечал.
На самом деле с площадями можно придумать много всего интересного, поэтому надеюсь, что для кого-то эта статья была полезной.
Код под Вэлс может и кривой, но мне кажется, что сойдет.
DataSeries size_area_dwn = new DataSeries(Bars,"");
DataSeries size_area_up = new DataSeries(Bars, "");
DataSeries dwn_space_ds = new DataSeries(Bars, "");
DataSeries up_space_ds = new DataSeries(Bars, "");
double dwn_space = 0;
double up_space = 0;
DataSeries highs_b = Highest.Series(High, 10);
DataSeries lows_b = Lowest.Series(Low, 10);
DataSeries highs = Highest.Series(High, 1);
DataSeries lows = Lowest.Series(Low, 1);
var synth_high = GetExternalSymbol("SPFB.RTS", true);
var synth_low = GetExternalSymbol("SPFB.Eu", true);
for (int bar = 0; bar < Bars.Count; bar++) // Пробегаемся по всем барам
{
synth_high.Close[bar] = highs_b[bar];
synth_high.Open[bar] = High[bar];
synth_high.High[bar] = highs_b[bar];
synth_high.Low[bar] = High[bar];
synth_low.Close[bar] = Low[bar];
synth_low.Open[bar] = lows_b[bar];
synth_low.High[bar] = Low[bar];
synth_low.Low[bar] = lows_b[bar];
size_area_up[bar] = synth_high.Close[bar] - synth_high.Open[bar];
size_area_dwn[bar] = synth_low.Close[bar] - synth_low.Open[bar]; // тут отнимал от close open для красоты отображения
up_space = up_space + size_area_up[bar];
dwn_space = dwn_space + size_area_dwn[bar];
if (synth_high.Close[bar] == synth_high.Open[bar] || synth_low.Close[bar] == synth_low.Open[bar])
{
up_space = 0;
dwn_space = 0;
}
dwn_space_ds[bar] = dwn_space;
up_space_ds[bar] = up_space;
}
PlotSeries(PricePane, highs, Color.CornflowerBlue, LineStyle.Solid, 1);
PlotSeries(PricePane, lows, Color.CornflowerBlue, LineStyle.Solid, 1);
PlotSymbol(PricePane, synth_high, Color.RoyalBlue, Color.Blue);
PlotSymbol(PricePane, synth_low, Color.RoyalBlue, Color.Blue);
var RatioPane = CreatePane(40, false, true);
PlotSeries(RatioPane, dwn_space_ds, Color.Red, LineStyle.Histogram, 3);
PlotSeries(RatioPane, up_space_ds, Color.Green, LineStyle.Histogram, 3);