Пользовательские индикаторы > FiboBars - трендовый индикатор, фильтр шума

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

FiboBars - трендовый индикатор, фильтр шума

Непрочитанное сообщение evge » 15 окт 2020, 19:46

FiboBars индикатор служит для удаления шума в графике цены. В своей логике он использует число Фибоначчи. Для возможности настройки уровня шума, в настройках есть поле "Period" и уровень "Level" fibo (0.236 по умолчанию). Чем выше значение периода, тем больше шумы поглощает индикатора.

Идеально подходит для трендовых инструментов.

Для лучшего восприятия отображения индикатора желательно включить график в виде баров.

По мотивам: https://ru.tradingview.com/script/z3Suev68-fibobars/

Примеры

FiboBars-01.png
FiboBars-01.png (29.44 КБ) 1173 просмотра

FiboBars-02.png
FiboBars-02.png (24.67 КБ) 1173 просмотра

FiboBars-03.png
FiboBars-03.png (26.41 КБ) 1173 просмотра


Код: Выделить всё

function Initialize()
{
   IndicatorName = "FiboBars";   
   AddInput("Input", Inputs.Candle);   
   AddSeries("Bear", DrawAs.Custom, Color.Red, AxisType.Default, true, Axes.Parent);
   AddSeries("Bull", DrawAs.Custom, Color.Green, AxisType.Default, true, Axes.Parent);

   AddSeries("trend", DrawAs.Custom, Color.Red, false);
   
   AddGlobalVariable("Last", Types.Boolean, false);   
   AddParameter("Period", 7, 1);
   AddParameter("Level", 0.236, 1);
}

function Evaluate()
{

//evge 15.10.2020 https://alfadirect4.ru

var I = Input;

double lwst = I.Low[0];
double hgst = I.High[0];
for (int x = 1; x < Period; x++)
{
   if (I.Low[x] < lwst) lwst = I.Low[x];
   if (I.High[x] > hgst) hgst = I.High[x];
}

int trend1 = (trend[1] >= 0) && ((hgst - lwst) * Level < (I.Close[0] - lwst)) ? 1 : -1;
int trend2 = (trend[1] <= 0) && ((hgst - lwst) * Level < (hgst - I.Close[0])) ? -1 : 1;

trend[0] = I.Open[0] > I.Close[0] ? trend1 : trend2;

Bear = Input.Low[0];
Bull = Input.High[0];
     
if (trend[0] > 0)
   {
      Bull.DrawHistogram(Bear);
      Last = true;
   }
   else
   {
      Bear.DrawHistogram(Bull);
      Last = false;
   }
}


простой пример использования в стратегии

Код: Выделить всё

function Initialize()
{
   StrategyName = "FiboBarsStr";
   AddParameter("P1", 7, "", 1);
   AddParameter("P2", 0.236, "", 1);
   AddInput("Input1", Inputs.Candle, 5, true, "SBER=МБ ЦК");
   LongLimit = 10;
   ShortLimit = -10;
   AddChartIndicator("MY.FiboBars", new Dictionary <string, string>{{"Period", "P1"},{"Level", "P2"}});
}

function OnUpdate()
{
var I = Input1;

var F = MY.FiboBars(I, P1, P2);

if (F["trend"][0] > 0) EnterLong();
if (F["trend"][0] < 0) EnterShort();

}


Скачать индикатор
FiboBars.zip
(71.38 КБ) 90 скачиваний
никогда такого не было и вот опять

m4Dmitry
Сообщения: 66
Зарегистрирован: 21 май 2018, 22:04
Благодарил (а): 54 раза
Поблагодарили: 3 раза

Re: FiboBars - трендовый индикатор, фильтр шума

Непрочитанное сообщение m4Dmitry » 15 окт 2020, 22:29

Супер, еще раз спасибо !

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

Re: FiboBars - трендовый индикатор, фильтр шума

Непрочитанное сообщение evge » 16 окт 2020, 12:12

Выше вариант работает через поиск экстремумов за Period, т.е. Period указывает на количество последних баров для поиска этих экстремумов.

Ниже ещё одна реализация.

Это вариант через последние найденные фракталы, вне зависимости от того когда они образовались.

Здесь параметр Period уже используется для поиска фрактала и указывает на количество в барах для поиска фрактала +\- в обе стороны от предполагаемого экстремума.

Последние фракталы Low (глобальная переменная L) и High (глобальная переменная H) и используются для определения отклонения от них.

Код: Выделить всё

function Initialize()
{
   IndicatorName = "FiboBarsFractal";
   AddInput("Input", Inputs.Candle);   
   AddSeries("Bear", DrawAs.Custom, Color.Red, AxisType.Default, true, Axes.Parent);
   AddSeries("Bull", DrawAs.Custom, Color.Green, AxisType.Default, true, Axes.Parent);

   AddSeries("trend", DrawAs.Custom, Color.Red, false);
   
   AddGlobalVariable("Last", Types.Boolean, false);   
   AddParameter("Period", 7, 1);
   AddParameter("Level", 0.236, 1);
   
   AddGlobalVariable("H", Types.Double, 0);
   AddGlobalVariable("L", Types.Double, 9999999);
}

function Evaluate()
{

//evge 16.10.2020 https://alfadirect4.ru

var I = Input;

bool isL = true, isH = true;
for (int x = 1; x <= Period; x++)
{
   if (I.Low[Period + x] < I.Low[Period] || I.Low[Period - x] < I.Low[Period]) isL = false;
   if (I.High[Period + x] > I.High[Period] || I.High[Period - x] > I.High[Period]) isH = false;
   if (!isL && !isH) break;
}
if (isL) L = I.Low[Period];
if (isH) H = I.High[Period];

int trend1 = (trend[1] >= 0) && ((H - L) * Level < (I.Close[0] - L)) ? 1 : -1;
int trend2 = (trend[1] <= 0) && ((H - L) * Level < (H - I.Close[0])) ? -1 : 1;

trend[0] = I.Open[0] > I.Close[0] ? trend1 : trend2;

Bear = Input.Low[0];
Bull = Input.High[0];
     
if (trend[0] > 0)
   {
      Bull.DrawHistogram(Bear);
      Last = true;
   }
   else
   {
      Bear.DrawHistogram(Bull);
      Last = false;
   }
}


Скачать индикатор

FiboBarsFractal.zip
(1.08 КБ) 74 скачивания
никогда такого не было и вот опять


Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 3 гостя