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

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

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 КБ) 10337 просмотров

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

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


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

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 КБ) 899 скачиваний
никогда такого не было и вот опять

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

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

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

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

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

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 КБ) 833 скачивания
никогда такого не было и вот опять


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей