English 中文 Español Deutsch 日本語 Português
preview
Индикаторы с интерактивным управлением на графике

Индикаторы с интерактивным управлением на графике

MetaTrader 5Индикаторы | 27 мая 2022, 12:22
1 523 0
Aleksandr Kononov
Aleksandr Kononov

Введение

Занимаясь трейдингом с 2008 года и накопив приличный багаж знаний, теперь я использую их для разработки своих продуктов. Перепробовав за долгие годы десятки различных торговых стратегий, а также протестировав сотни различных индикаторов, я сделал для себя некоторые выводы, которыми хочу с вами поделиться в этой статье. Сейчас, так же как и раньше, качество торговых платформ MetaTrader не вызывает сомнений. Но прогресс не стоит на месте, и в современных условиях пользователи становятся все более требовательными к предоставляемым им продуктам. Поэтому, с целью повышения удобства для трейдеров, я подумал, что неплохо было бы создать принцип, который можно легко применить на любые индикаторы, который заключается  в более интерактивном взаимодействии пользователя и программы. 


Об индикаторах

В платформах MetaTrader существуют различные виды программ, предназначенных для торговли. Это торговые советники, скрипты и индикаторы. Я хочу поговорить об индикаторах.

Индикаторы бывают разные: линии поддержки и сопротивления, свечные фракталы или фигуры, объемы или другие данные о торговых операциях на бирже, осцилляторы или гистограммы. Все они нам нужны для того, чтобы показывать определенную закономерность движения цены, которая, в свою очередь, формирует сигнал для совершения сделки. И чем чаще встречается закономерность, тем сильнее сигнал. 

Закономерность представляет собой повторяющиеся, или очень похожие между собой движения цены при определенных показаниях индикатора. Например, если быстрая скользящая средняя пересекает медленную снизу вверх, а цена пересекает ее сверху вниз, то большая вероятность того, что цена отскочит от этой линии и продолжит повышение. Такие закономерности можно найти, используя любой индикатор. 

Но каждый индикатор, вне зависимости от его предназначения, показывает закономерности за определенный промежуток времени. То есть сигнал формируется, исходя из прошлых движений цены на каком-то участке исторических данных. Это может быть 10 часовых баров или 1000 дневных. Этот временной промежуток, на котором мы ищем закономерность, называют "периодом" индикатора.

Любой индикатор имеет период расчета, так как все индикаторы рассчитываются на исторических данных. Если мы установим значение периода равным 100 и установим индикатор на график H1, то мы получим результат вычисления индикатора за последние 100 часовых свечей. Период останется неизменным на протяжении всей работы индикатора, пока мы сами не изменим его. Если характер движения цены изменится, например движение станет более волатильным, то нам придется увеличить период для того, чтобы индикатор соответствовал текущей ситуации на рынке. 

Для этого нужно будет зайти в настройки индикатора и подобрать новое значение периода. Причем менять этот параметр придется ступенчато. Шаг придется подбирать интуитивно — он должен быть не слишком большим, чтобы не пропустить нужный сигнал, но и не слишком маленьким — чтобы не тратить на это слишком много времени. А если делать это часто в течение дня, то можно потратить на это существенное время. Поэтому работа с индикаторами представляет собой некоторый компромисс между искомым результатом, его точностью и временем, которое трейдер готов на это потратить.

Еще один вариант для выхода из положения — это открыть сразу все необходимые графики с различными настройками индикатора. Но тогда весь рабочий экран монитора загромождается окнами с однотипными индикаторами, незначительно различающимися настройками периода. Это решение тоже не является идеальным с точки зрения организации рабочего пространства. Об удобстве, к сожалению, говорить не приходится ни при каком варианте.


Суть проблемы

На примере торговой стратегии, которую я использовал в своей торговле долгое время, я хочу показать, в чем заключается проблема. Думаю, что многие трейдеры сталкиваются с такой же проблемой каждый день, но кто-то ее просто не осознает и принимает как должное, а для кого-то, так же, как и для меня, она создает дискомфорт. Стратегия основана на показаниях скользящих средних линий. Она хорошо работает в трендовых движениях. Ее суть состоит в том, что если начался тренд, то скорее всего он продолжится, и сигналом для сделки служит возврат цены к медленной линии во время коррекции. 

Для того, чтобы рассчитать период медленной линии, нужно найти определенное положение быстрой и медленной скользящих средних во время предыдущей коррекции. 

pic_01

Чтобы найти нужный период, надо выполнить целый ряд однообразных операций. Особенность этой стратегии в том, что период линий всегда должен различаться в 2 раза. Например, при периоде быстрой линии, равном 20, период медленной должен быть равен 40. При этом нужно найти минимальное значение для периодов этих линий, при котором быстрая линия не будет пересекать медленную во время этой коррекции. На изображении периоды линий равны соответственно 25 и 50. Видно, что во время предыдущей коррекции линии еще не пересекаются. Значит, мы можем еще уменьшить их периоды. Открываем настройки быстрой линии, меняем период. Затем открываем настройки медленной линии, также меняем период. Придется несколько раз проделать такую операцию, пока линии не сойдутся максимально близко.

pic_03

Линии еще не пересекаются. Но нам сначала нужно найти крайнее положение, при котором линии пересекутся, а затем увеличить их период на один шаг. Поэтому снова меняем настройки периодов на 7 и 14, соответственно.

  

pic_04

Получаем пересечение линий. Значит найдено крайнее положение и теперь нужно увеличить периоды на один шаг. Снова открываем настройки каждой линии и меняем значения периода.

pic_05

В итоге нужное сочетание параметров линий найдено, и сигнал успешно сформировался. Но подготовка для поиска этого сигнала заняла определенное время, а также вынудила заниматься однообразными, можно сказать, утомительными действиями. А ведь это только один таймфрейм на одной валютной паре. А для того, чтобы следить за несколькими валютными парами на разных таймфреймах, такие действия придется совершать очень часто. На практике я могу сказать, что если использовать минутные таймфреймы, то этот процесс занимает как минимум половину рабочего времени. Эта стратегия, возможно, является популярной, возможно, я ее позаимствовал или придумал сам, сейчас уже не вспомню. Но я думаю, что многие трейдеры используют нечто подобное в своей повседневной торговле.

Минусы, вытекающие из применения подобного рода стратегий, очевидны. Помимо того, что такие постоянные манипуляции с настройками индикаторов занимают кучу времени, они еще и отвлекают от основной деятельности - торговли. Во время подбора очередных параметров линий можно пропустить уже сформировавшийся сигнал на другой валютной паре или другом таймфрейме. Или вовремя не закрыть уже открытую сделку, с максимальной прибылью или минимальным убытком. Вдобавок к этому, после нескольких часов такой работы, любой человек начинает уставать. Однообразные действия притупляют сознание, внимание рассеивается, да и просто трейдеру может надоесть торговать из-за этих манипуляций. Но главный ресурс, который ценнее любых денег — это время, которое при этом тратится. Многие трейдеры, скорее всего, просто об этом еще не задумывались. Но после нескольких лет работы за монитором компьютера, начинаешь ценить свое время и понимаешь важность таких, казалось бы, мелочей.


Принцип интерфейса

Смысл интерфейса заключается в прокрутке периода индикатора колесом мышки прямо с графика, не заходя в настройки. Для активации режима прокрутки будем использовать кнопку.

Если вы хотите попробовать, как данный интерфейс работает, вы можете скачать исходный код индикатора "Button CCI" в прикрепленном файле. Или скачать бесплатную последнюю версию, с дополнительными возможностями, а также увидеть подробное описание его настроек по ссылке.

Суть проблемы ясна, теперь нужно подумать над ее решением. Очевидно, что нужно как-то ускорить процесс настройки периода. Сделать это можно только одним способом — автоматизировать этот процесс. Можно создать алгоритм, который будет сам подбирать значения для периода. Но для этого алгоритма все равно нужен свой период для расчета! Придется вручную задавать количество свечей, на которых алгоритм будет подбирать период скользящих средних! Своего рода Мета-период. Это решит проблему со временем, затрачиваемым на подбор нужного периода, но ввиду своей сложности, это решение имеет свои недостатки. Такой подход реализован в бесплатном индикаторе Dynamic Double Moving Averages. В дальнейшем я планирую его усовершенствовать, чтобы он был более управляем и откликался на изменения настроек, вводимых пользователем.

Другой метод, на мой взгляд, более простой и в то же время более интерактивный, — это изменение периода самим трейдером, но в более удобном виде. Ведь какой бы ни был умный алгоритм, трейдер все равно лучше знает, какие настройки индикатора ему нужны, а наша задача - помочь ему и облегчить этот процесс. Для изменения периода будем использовать прокрутку с помощью колеса мышки. Сам режим прокрутки будет активироваться включением кнопки прямо на графике.


GIF_01

На изображении видно, как легко можно изменять период индикатора одним движением. Просто активируем кнопку нужного индикатора и прокручиваем колесо мышки в нужную сторону. При желании можно установить нужный шаг для изменения периода. Также можно менять период сразу нескольких индикаторов одновременно, просто активировав нужные кнопки. Эти функции отлично подойдут для стратегии, описанной выше. Например, вы можете задать шаг для изменения быстрой линии равным 1, а для медленной - равным 2, активировать прокрутку для обеих линий и легко изменять их периоды одновременно, сохраняя пропорцию 1/2.


Преимущества

    Индикаторы с таким интерфейсом имеют ряд преимуществ.
    • Во-первых, трейдер сам может регулировать период индикатора, как он делает это обычно, но затрачивая на это намного меньше времени и усилий.
    • Во-вторых, такой интерфейс интуитивно понятен и прост в использовании. После продолжительного использования такого индикатора уже не захочется возвращаться к стандартному интерфейсу.
    • Кроме того, применение такого индикатора позволяет использовать только одно окно, заменив несколько однотипных индикаторов с различными параметрами периода одним. Это разгрузит рабочий экран от нагромождений.
    • Еще одно преимущество — это повышение качества торговли, благодаря повышению концентрации на самом процессе, а не на настройках индикаторов.
    • Также ускоряется поиск сигналов на быстро меняющемся рынке, что способствует увеличению производительности трейдера.

    Недостатки

    При всех перечисленных преимуществах такой интерфейс не лишен недостатков.

    • Во-первых, его проблематично воспроизвести для MetaTrader 4 ввиду технических возможностей языка MQL4.
    • Во-вторых, при расчете на большом количестве данных, более 20 000 баров, заметно подтормаживание индикаторов.

    Но анализ истории нужен не так часто, а для повседневного использования можно ограничить количество данных для расчета.  Но эти недостатки не являются критичными и не мешают наслаждаться повседневным использованием таких индикаторов в MetaTrader 5.


    Создание индикатора с прокруткой периода на основе Moving Average

    Основываясь на вышесказанном, я решил, что было бы полезно создать индикатор с максимально удобным интерфейсом, который избавит пользователя от рутинных действий, а также будет экономить время и силы трейдера. Также целью было создать максимально простой принцип для большинства индикаторов, чтобы можно было аналогичный интерфейс легко воспроизвести на любом другом индикаторе.

    Для примера я решил взять самый популярный индикатор — это скользящая средняя. Вся сложность идеи состоит в том, что если мы хотим динамически изменять период, то, по сути, мы будем использовать одновременно десятки и даже сотни индикаторов. Так как система отличает используемые в одном окне индикаторы по короткому имени и набору параметров, соответственно набор параметров будет всегда отличаться показателем "период" при каждом шаге изменения, и для каждого периода будет создан новый хендл индикатора, что может существенно тормозить работу. Пытаясь решить эту проблему, на форумах я столкнулся с критикой этого метода. Опытные программисты говорили, что такая реализация запрещена на уровне языка и вообще невозможна — переполнение памяти неизбежно (с чем я постоянно сталкивался в MetaTrader 4). Да, для MetaTrader 4 это является неразрешимой проблемой.

    Но в языке MQL5 хендл создается для каждого индикатора на графике один раз, и далее идет лишь обращение к уже созданному. То есть, даже если на каждом тике создавать новый хендл, то по факту он не будет создаваться, а будет лишь обращение к уже созданному. Это уже облегчает работу для памяти. Но можно ведь заранее создать все необходимые хендлы в OnInit, и тогда можно совсем забыть об этой проблеме. Единственное ограничение при этом возникает для трейдера — нужно заранее определить, в каких пределах будет изменяться период, чтобы при инициализации индикатора создать все необходимые хендлы. Максимальный период заранее ограничивает трейдер в настройках через параметр "period_ma_max". С помощью шага еще больше экономим память, не рассчитывая ненужные хендлы. Шаг тоже задает трейдер, но по умолчанию установим step=1.

    int OnInit()
    {
    //Создаем все необходимые хендлы
    for(int i=1; i<=period_ma_max; i+=step)
        handle=iMA(_Symbol,_Period,i,0,method_MA,price_MA);
         
    }

    Теперь нужно создать функционал для реализации прокрутки периода. Для этого создадим на графике кнопку, при нажатии на которую будет активироваться режим прокрутки периода с помощью колеса мыши.

    //+------------------------------------------------------------------+
    //|              СОЗДАНИЕ КНОПКИ В OnInit()                          
    //+------------------------------------------------------------------+
     
       ObjectDelete(0,name);
       ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
       ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
       ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr_Text_Button);
       ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,clr_Button);
       ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
       ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,distance_X);
       ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,distance_Y);
       ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,size_X);
       ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,size_Y);
       ObjectSetInteger(chart_ID,name,OBJPROP_STATE,true);
       ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,true);
       ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,true);
       ObjectSetInteger(chart_ID,name,OBJPROP_STATE,press_Button);
       ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,1);
    
       ChartRedraw();

    При загрузке двух и более индикаторов на график, их кнопки будут создаваться в одном и том же месте, что неудобно. Поэтому при добавлении каждого последующего индикатора нам нужно смещать кнопку по какой-либо оси. Для этого нужно сначала посчитать, сколько именно наших индикаторов уже загружено на график. Сначала найдем общее количество индикаторов в данном окне:

    int      total_Indicators=ChartIndicatorsTotal(0,0),
             this_indicators=0;

    А потом выберем из них свои индикаторы:

    for(int i=0; i<total_Indicators; i++)
         {
          if(ChartIndicatorName(0,0,i)=="Button_MA")
             this_indicators++;
         }
    IndicatorSetString(INDICATOR_SHORTNAME,"Button_MA")

    При таком поиске индикатора по короткому имени нужно всегда помнить, что если мы создадим короткое имя индикатора после цикла, то имя текущего индикатора, который мы добавляем на график, будет соответствовать названию его файла. То есть в данном случае, если имя файла будет отличаться от INDICATOR_SHORTNAME, то текущий индикатор в цикле не посчитается.

    Теперь сместим кнопку по оси X:

    distance_X=size_X*this_indicators;

    После этого кнопки всех индикаторов, добавленных на график, будут появляться в ряд. Но, к сожалению, пользователю придется переименовывать кнопку при добавлении более одного индикатора на один график. Или как минимум изменять другие input-параметры индикатора в настройках. Это обусловлено тем, что в MetaTrader 5 запрещено добавлять в одно окно индикаторы с одинаковыми входными параметрами. С этим нельзя ничего сделать, поэтому придется переложить на трейдера изменение настроек вручную. Но так как изменение настроек не всегда необходимо, то вынесем имя кнопки в настройки индикатора. Так мы убьем сразу двух зайцев: изменим входные параметры индикатора и обеспечим различные имена для объектов на одном графике. Тем более, что кнопки с разными именами более информативны и удобны для использования. 

    input string  name_Line = "MA_1"; 
    string   name = name_Line,
             text = name_Line;

    Теперь, при переименовании пользователем каждой кнопки, индикаторы и сами кнопки без проблем будут добавляться в окно, и текст, отображаемый на кнопках, будет соответствовать их названию. Кнопки готовы, теперь нужно создать механизм прокрутки периода. Активируем событие прокрутки колеса, а также нажатия кнопок мыши.

    ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
    ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
    

    Дальше работаем в функции OnChartEvent(). Проверяем, нажата ли кнопка. Если не нажата, то отображаем на ней ее название, а если нажата, то активируем режим прокрутки периода индикатора и отключаем прокрутку самого графика. Соответственно, если кнопка не нажата, включаем обратно прокрутку графика.


    void OnChartEvent(const int id,
                      const long &lparam,
                      const double &dparam,
                      const string &sparam)
      {
    //---
       if(!press_Button)
          ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
       if(id==CHARTEVENT_OBJECT_CLICK)
         {
          if(sparam==name)
            {
             press_Button=ObjectGetInteger(chart_ID,name,OBJPROP_STATE);
             if(press_Button)
               {
                scroll_Button=true;
                ChartSetInteger(0,CHART_MOUSE_SCROLL,0);
                ChartRedraw();
               }
             else
               {
                scroll_Button=false;
                ChartSetInteger(0,CHART_MOUSE_SCROLL,1);
                ChartRedraw();
               }
            }
         }
      }

    Если активирован режим прокрутки периода, то проверяем состояние колеса мыши. В зависимости от того, куда оно поворачивается, прибавляем или убавляем период. Суммарное значение прокрутки колесика срабатывает при достижении +120 или -120.

    if(scroll_Button)
          if(id==CHARTEVENT_MOUSE_WHEEL)
            {
             int delta = (int)dparam;
             if(delta>119)
                if(period_ma<period_ma_max)
                  {
                   period_ma+=step;
                   ChartRedraw();
                  }
             //
             if(delta < -119)
                if(period_ma>step)
                  {
                   period_ma-=step;
                   ChartRedraw();
                  }

    Здесь же продолжаем: обращаемся к хендлу индикатора с новым периодом, и сразу же перерисовываем линию индикатора (total определяем в OnCalculate). Так же при прокрутке меняем текст кнопки с названия на текущий период.

    handle = iMA(_Symbol,_Period,period_ma,0,method_MA,price_MA);
          
             ArraySetAsSeries(Label1Buffer,true);
             for(int i = 0; i<total; i++)
               {
                double MA[];
                CopyBuffer(handle,0,i,1,MA);
                Label1Buffer[i]=MA[0];
           
                ChartRedraw();
    
               }
             ArraySetAsSeries(Label1Buffer,false);
             if(press_Button)
                ObjectSetString(chart_ID,name,OBJPROP_TEXT,IntegerToString(period_ma));
            }

    Здесь мы перерисовываем линию для того, чтобы не нужно было ждать новый тик для отображения линии индикатора с новым периодом. Таким образом линия всегда будет перестраиваться мгновенно, независимо от прихода нового тика.

    Еще одно ограничение, которое не получается обойти, касается кнопки. Если включен режим перетаскивания, то отключается режим нажатия на кнопку, и наоборот. Поэтому перетаскивать кнопку в более удобное место можно только один раз. После отключения режима перетаскивания больше мы его включать не будем. А при следующей инициализации кнопка не запомнит свое положение и встанет на свое первоначальное место в общем ряду.

    if(id==CHARTEVENT_OBJECT_CLICK)
         {
          if(sparam==name)
            {
             long select = ObjectGetInteger(chart_ID,name,OBJPROP_SELECTED);
             if(select==0)
               {
                ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,false);
                ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,false);
                flag_drag=false;
               }
             ChartRedraw();
             }
          }

    Основную линию индикатора делаем как обычно в OnCalculate();

    total=rates_total-1;
       if(Limit_for_Calc)
          if(total>Limit)
             total=Limit;
       handle = iMA(_Symbol,_Period,period_ma,0,method_MA,price_MA);
       if(handle==INVALID_HANDLE)
         {
          Print("invalid handle ");
          return(rates_total);
         }
       ResetLastError();
       while(BarsCalculated(handle)<=0)
         {
          // значения индикатора еще не рассчитаны, зайдем в следующий раз
          return(0);
         }
    
       for(int i = prev_calculated>0?prev_calculated-1:0; i<rates_total; i++)
         {
          double MA[];
          CopyBuffer(handle,0,time[i],1,MA);
          Label1Buffer[i]=MA[0]+level;
         }
    Здесь мы можем ограничить расчет линии при прокрутке только на последних данных для экономии вычислительных ресурсов. Для этого дадим возможность трейдеру выбрать, хочет ли он включить ограничение расчетов в настройках и сколько баров будет взято для расчетов.
    input bool    Limit_for_Calc = false;
    input int     Limit = 20000;


    Результат

    На этом все, основные моменты для создания индикатора разобраны. В итоге получился полноценный индикатор, ничем не уступающий стандартному, но более удобный. Разве что некоторых недостатков все же не удалось избежать. Например, на истории более 20 000 баров заметно подтормаживание. Но анализ истории нужен не так часто, а для повседневного использования можно ограничить количество баров для расчета. Также остались неудобства с переименованием кнопок вручную и отсутствием возможности перетаскивать кнопку более одного раза.

    А в остальном цели достигнуты — индикатор плавно меняет период при прокрутке колесика мыши, при этом функция прокрутки включается и отключается нажатием всего одной кнопки прямо на графике.


    Заключение

    Такой интерфейс, хоть и не лишенный недостатков, все же можно назвать более удобным, чем стандартный. Он позволяет трейдеру получить необходимые настройки индикатора, применив минимальные усилия и затратив на это минимум времени, разгружает рабочее пространство от однотипных индикаторов, позволяет получить более точные сигналы за ограниченный промежуток времени в условиях быстро меняющегося рынка. 

    Индикаторы, созданные с применением подобного интерфейса, удобны в использовании, интуитивно понятны, экономят время и силы трейдера, позволяют сконцентрироваться на торговле, тем самым повышая ее качество, а также повышают производительность трейдера. 

    Кроме того, такой подход позволяет получать не только настройки периода, но также и любые другие, которые целесообразно вынести на кнопку или даже создать панель для различных настроек. Это может быть цвет, толщина линии, размер объекта и так далее. Кроме прокрутки можно использовать перетаскивание объектов, горячие клавиши либо простое наведение курсора на объект или область графика. Одна из таких функций реализована в индикаторе Button MA. В нем вы можете использовать прокрутку периода не только нажатием на кнопку, но и просто наведя на нее курсор. Кроме того, он запоминает положение кнопок после перетаскивания даже после смены таймфрейма.

    В этой статье рассмотрены основные этапы создания индикатора с прокруткой периода на основе Moving Average. А в прикрепленном файле вы найдете код готового индикатора, созданного на основе CCI. Его использование еще проще, так как при любом количестве кнопок на одном графике не требуется их переименование, а их название индексируется автоматически, соответственно количеству установленных кнопок.

    GIF_02


    Прикрепленные файлы |
    Button_CCI.mq5 (28.97 KB)
    DoEasy. Элементы управления (Часть 6): Элемент управления "Панель", автоизменение размеров контейнера под внутреннее содержимое DoEasy. Элементы управления (Часть 6): Элемент управления "Панель", автоизменение размеров контейнера под внутреннее содержимое
    В статье продолжим работу над WinForms-объектом "Панель" и реализуем автоизменение его размеров под общие размеры Dock-объектов, расположенных внутри панели. Кроме того добавим новые свойства в объект библиотеки "Символ".
    Разработка торгового советника с нуля (Часть 8): Концептуальный скачок (I) Разработка торгового советника с нуля (Часть 8): Концептуальный скачок (I)
    Как максимально просто реализовать новый функционал? В данной статье мы сделаем шаг назад, а затем два шага вперед.
    Разработка торгового советника с нуля (Часть 9): Концептуальный скачок (II) Разработка торгового советника с нуля (Часть 9): Концептуальный скачок (II)
    Размещение Chart Trade в плавающем окне. В предыдущей статье мы создали базовую систему для использования шаблонов внутри плавающего окна.
    Машинное обучение и Data Science (Часть 01): Линейная регрессия Машинное обучение и Data Science (Часть 01): Линейная регрессия
    Пришло время нам, трейдерам, обучить наши системы и научиться самим принимать решения, основываясь на том, что показывают цифры. Не визуальным и не интуитивным путем, которым движется весь мир. Мы пойдем перпендикулярно общему направлению.