Блог им. HsergeyF
Работаем с площадью. Алгоритм на 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);
1. Период 10 — почему именно 10?
2. Почему у Вас 2 разных тикера подгружаются в хай и лоу, это о чем?
3. Про обнуление счетчиков я вообще не понял, о чем это, почему при новом хае обнуляется, при лоу нет.
2. Для того, чтобы рисовать свечки над графиком и под ним. Эти свечки можно сказать делят площадь под/над графиком на равные прямоугольники(у которых 1 ребро = 1(1 минута или любой другой таймфрейм), а другое ребро = разница между хаем за период(в данном случае 10) и хаем свечи). Суммируя площади прямоугольников получаем общую площадь. Разные тикеры берутся для того, чтобы создать два разных массива со свечками, в которых мы уже будем менять значения Open, High, Low, и Close на нужные нам. Возможно, можно создать свечи иначе, но мне было удобнее.
3. Обнуляем счетчик, когда фигура замкнулась, то есть Хай свечи коснулся Хая с периодом 10, например. Это сделано для отображения на гистограмме. Лоу тоже обновляется, может быть Вы просто кусок кода не увидели:
А почему бы для определения флета не использовать болинджер? почитай мой пост поймешь о чем я.
Как можно вообще использовать площади которые ты ищешь, может просто выразить их в виде объема — точнее числовое значение найденой площади можно использовать в качестве объема?
Получиться объем бычьего или медвежьего рынка...
Можно даже посчитать их соотношение друг к другу...
Мысль интересна, но ты мало написал про сам расчет… более подробно сможешь написать? Я имею ввиду весь расчет простыми словами — а то не могу понять как работает апроксимация в расчете.
В индикаторе 1 параметр — количество свечей для рассчёта хай/лоу. Применение(кроме флета) гораздо более специфическое. Использовать площадь можно как душа пожелает, 4 варианта как минимум я накинул. Площадь и объем в вашем случае два названия одного явления, от перемены названия суть не изменится.
Считать соотношение — разумная идея, возьму на заметку!
Аппроксимации в расчете нету. Формула расчета проста как камень:
площадь фигуры над графиком = сумма разниц между значением хай(за икс свечей) и хай(за 1 свечу). Фигура замыкается, когда Хай (за 1 свечу) = хай (за икс свечей), после чего площади начинает считаться с нуля.
Надеюсь так понятнее, наверное действительно плохо описал идею.
предположим расчет на 10 свечей (баров или периодов)
Расчет будет таким.
берем хай первой свечи и отнимаем хай 2 свечи
берем хай первой свечи и отнимаем хай 3 свечи
и т.д 10 свечей
затем полученные значения суммируем
затем полученная сумма становиться показателем площади фигуры над графиком.
И т.д
Я правильно понял расчет, подход интересен… серьезно.
Но у меня вопрос, почему в расчете участвует только хай, ведь для точности желательно использовать оба экстремума?
Но тот самый момент, именно в расчете видимо заключается...
на скрине я заметил что только в бычий тренд хорошо ставить стоп на границе площади, а вот медвежий тренд — граница очень близко находиться и стоп чаще будет выбивать.
Мне кажется нужно использовать в расчете не только хай но и лоу...
Как ты считаешь?
Тот скрин где написано поджатие вверх, это по сути пробой низкой волатильности.
Я именно поэтому сравнил индюк с болинджером, несмотря на расчет отрисовка графика почти идентична — такое же затухание волатильности и дальнейший пробой…
Хотя нет - price channel запаздывает с изменением ширины канала.
а то уже ниче нового давно не попадалось…