Страница 1 из 1

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

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

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

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

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

Примеры

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

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

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


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

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 КБ) 916 скачиваний

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

Добавлено: 15 окт 2020, 22:29
m4Dmitry
Супер, еще раз спасибо !

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

Добавлено: 16 окт 2020, 12:12
evge
Выше вариант работает через поиск экстремумов за 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 КБ) 848 скачиваний