Проекты позволяют создавать прибыльных торговых роботов! Но это не точно

11 июня 2020, 15:35
MetaQuotes
20
2 928

Создание торгового робота всегда начинается с написания маленького файла, который затем начинает расти в размерах, наполняться множеством дополнительных функций и пользовательских объектов. Большинство разработчиков на MQL5 справляются с этой проблемой с помощью включаемых файлов (MQH). Но лучше сразу же начинать писать любую программу для трейдинга в проекте — это выгодно во всех отношениях.


Преимущества работы в проекте

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

Пример проекта

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

  • set-файлы с входными параметрами для тестирования и оптимизации,
  • исходные коды OpenCL-программ,
  • медиа-файлы с картинками и звуками,
  • ресурсы и т.д.

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


Создание проекта

Новый проект создается как и обычная MQL5-программа с помощью Мастера MQL5. Нажмите "Новый проект", а затем пройдите все шаги: задайте имя программы, добавьте входные параметры, укажите используемые обработчики событий. По окончании работы Мастера MQL5 откроется MQPROJ-файл для управления свойствами проекта.

Свойства проекта>


Здесь вы можете указать версию, задать описание программы, добавить иконку, а также управлять дополнительными опциями:

  1. Maximum optimization — оптимизация исполняемого EX5 файла для максимального быстродействия. Отключение этой опции ускорит компиляцию исходного кода, но получаемый EX5-файл может работать существенно медленней.
  2. Check floating point dividers — проверка вещественных чисел типа double и float на ноль в операциях деления. Отключение этой опции может повысить скорость работы, но делать это нужно сознательно.
  3. Use tester optimization cache — по умолчанию опция включена и тестер сохраняет все результаты выполненных проходов в кеш оптимизации, которые используются повторных расчетах. При необходимости кеш можно отключить с помощью свойства tester_no_cache, но в проекте это делается снятием галочки.

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

{
  "platform"    :"mt5",
  "program_type":"expert",
  "copyright"   :"Copyright 2019, MetaQuotes Software Corp.",
  "link"        :"https:\/\/www.mql5.com",
  "version"     :"1.00",
  "description" :"The mean reversion strategy: the price breaks the channel border outwards and reverts back towards the average. The channel is represented by Bollinger Bands. The Expert Advisor enters the market using limit orders, which can only be opened in the trend direction.",
  "icon"        :"Mean Reversion.ico",
  "optimize"    :"1",
  "fpzerocheck" :"1",
  "tester_no_cache":"0",
  "tester_everytick_calculate":"0",

  "files":
  [
    {
      "path":".\\Mean Reversion.mq5",
      "compile":"true",
      "relative_to_project":"true"
    },
    {
      "path":"MQL5\\Include\\Trade\\Trade.mqh",
      "compile":"false",
      "relative_to_project":"false"
    },
....


    Правила торговли

    Возьмем простые классические правила: входим в рынок при касании ценой линии Боллинджера. Это одна из разновидностей торговли на возврат к среднему.

    Вход в рынок на линиях Боллинджера

    Входить будем только лимитными отложенными ордерами. Кроме того, добавим дополнительное правило — торгуем только в направлении тренда. Это означает, что при восходящем тренде выставляем только Buy Limit на нижней границе канала, а при нисходящем — Sell Limit на верхней границе.

    Направление тренда можно определять множеством способов, возьмем самый простой вариант — по взаимному расположению двух скользящих средних. Если быстрая скользящая средняя (Fast EMA) находится выше медленной, то определяем восходящий тренд. Если наоборот, то — нисходящий.

    Определение тренда с помощью двух скользящих средних

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

    • Если ширина канала меньше k*ATR — это флет и выставлять отложенные ордера запрещается.
    • Если ширина канала больше k*ATR — выставляем отложенный лимитный ордер на границу канала в направлении тренда.

    Здесь k — некоторый коэффициент, который необходимо подобрать.

    Вычисление ширины канала Боллинджера с помощью индикатора ATR


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

    //--- Параметры канала
    input int             InpBBPeriod   =20;           // период индикатора Боллинджера
    input double          InpBBDeviation=2.0;          // отклонение полос Боллинджера от средней
    //-- периоды EMA для вычисления тренда 
    input int             InpFastEMA    =12;           // период Fast EMA
    input int             InpSlowEMA    =26;           // период Slow EMA
    //-- ATR parameters
    input int             InpATRPeriod  =14;           // период индикатора ATR
    input double          InpATRCoeff   =1.0;          // коэффициент ATR для определения флета
    //--- управление капиталом
    input double          InpLot        =0.1;          // торговый объем в лотах
    //--- параметры таймфреймов
    input ENUM_TIMEFRAMES InpBBTF       =PERIOD_M15;   // таймфрейм, на котором берутся значения индикатора Боллинджера
    input ENUM_TIMEFRAMES InpMATF       =PERIOD_M15;   // таймфрейм, на котором определяется тернд
    //--- идентификатор советника для торговых транзакций
    input long            InpMagicNumber=245600;       // Magic Number

    Чтобы не подбирать вручную таймфрейм для определения тренда и ширины канала, добавлены входные параметры InpBBTF и InpMATF. Это позволит прямо во время оптимизации искать подходящие таймфреймы и сократит лишние операции. То есть мы можем запустить советника на таймфрейме M1, при этом он будет использовать индикатор Bollinger Bands на M15 и скользящие средние с M30. Для индикатора ATR мы не стали вводить отдельный входной параметр таймфрейма, чтобы не увеличивать число параметров.


    Пишем функции

    Итак, проект создан и пора приступать к написанию самого советника. Приведем только 3 основные функции, которые описывают правила.

    Вычисление ширины канала Боллинджера просто — копируем значения из индикаторных буферов.

    //+------------------------------------------------------------------+
    //| Получает значения границ канала                                  |
    //+------------------------------------------------------------------+
    bool ChannelBoundsCalculate(double &up, double &low)
      {
    //--- получим значения индикатора Bollinger Bands 
       double bbup_buffer[];
       double bblow_buffer[];
       if(CopyBuffer(ExtBBHandle, 1, 1, 1, bbup_buffer)==-1)
         {
          PrintFormat("%s: Failed CopyBuffer(ExtBBHandle,0,1,2,bbup_buffer), code=%d", __FILE__, GetLastError());
          return(false);
         }
    
       if((CopyBuffer(ExtBBHandle, 2, 1, 1, bblow_buffer)==-1))
         {
          PrintFormat("%s: Failed CopyBuffer(ExtBBHandle,0,1,2,bblow_buffer), code=%d", __FILE__, GetLastError());
          return(false);
         }
       low=bblow_buffer[0];
       up =bbup_buffer[0];
    //--- успешно
       return(true);
      }

    Определение флета также не вызывает проблем. Сначала получаем значения границ канала, затем вычисляем ширину и сравниваем со значением индикатора ATR, умноженного на коэфициент InpATRCoeff.

    //+------------------------------------------------------------------+
    //|  Возвращает true, если канал слишком узкий (означает флет)       |
    //+------------------------------------------------------------------+
    int IsRange()
      {
    //--- получим значение ATR на последнем завершенном баре
       double atr_buffer[];
       if(CopyBuffer(ExtATRHandle, 0, 1, 1, atr_buffer)==-1)
         {
          PrintFormat("%s: Failed CopyBuffer(ExtATRHandle,0,1,2,atr_buffer), code=%d", __FILE__, GetLastError());
          return(NO_VALUE);
         }
       double atr=atr_buffer[0];
    //--- получим границы канала
       if(!ChannelBoundsCalculate(ExtUpChannel, ExtLowChannel))
          return(NO_VALUE);
       ExtChannelRange=ExtUpChannel-ExtLowChannel;
    //--- если ширина канала меньше ATR*коэффициент, то это флет
       if(ExtChannelRange<InpATRCoeff*atr)
          return(true);
    //--- флет не обнаружен
       return(false);
      }

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

    #define NO_VALUE      INT_MAX                      // невалидное значение при вычислении Сигнала или Тренда

    Самой большой по объему получилась функция для определения тренда.

    //+------------------------------------------------------------------+
    //| Возвращает 1 для UpTrend или -1 для DownTrend (0 = нет тренда)   |
    //+------------------------------------------------------------------+
    int TrendCalculate()
      {
    //--- сначала проверимся на флет 
       int is_range=IsRange();
    //--- проверим результат
       if(is_range==NO_VALUE)
         {
          //--- если проверка неуспешна, то выходим досрочно со значение "нет значения"
          return(NO_VALUE);
         }
    //--- во флете тренд не вычисляем
       if(is_range==true) // узкий диапазон, возвращаем "flat"
          return(0);
    //--- получим значение ATR на последнем завершенном баре
       double atr_buffer[];
       if(CopyBuffer(ExtBBHandle, 0, 1, 1, atr_buffer)==-1)
         {
          PrintFormat("%s: Failed CopyBuffer(ExtATRHandle,0,1,2,atr_buffer), code=%d", __FILE__, GetLastError());
          return(NO_VALUE);
         }
    //--- получим значение Fast EMA на последнем завершенном баре
       double fastma_buffer[];
       if(CopyBuffer(ExtFastMAHandle, 0, 1, 1, fastma_buffer)==-1)
         {
          PrintFormat("%s: Failed CopyBuffer(ExtFastMAHandle,0,1,2,fastma_buffer), code=%d", __FILE__, GetLastError());
          return(NO_VALUE);
         }
    //--- получим значение Slow EMA на последнем завершенном баре
       double slowma_buffer[];
       if(CopyBuffer(ExtSlowMAHandle, 0, 1, 1, slowma_buffer)==-1)
         {
          PrintFormat("%s: Failed CopyBuffer(ExtSlowMAHandle,0,1,2,slowma_buffer), code=%d", __FILE__, GetLastError());
          return(NO_VALUE);
         }
    //--- по умолчанию тренд не определен
       int trend=0;
    //--- если быстрая EMA выше медленной
       if(fastma_buffer[0]>slowma_buffer[0])
          trend=1;   // восходящий тренд (uptrend)
    //--- если быстрая EMA ниже медленной
       if(fastma_buffer[0]<slowma_buffer[0])
          trend=-1;  // нисходящий тренд (downtrend)
    //--- возвращаем направление тренда
       return(trend);
      }

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

    //+------------------------------------------------------------------+
    //| Checks the emergence of a new bar on the current timeframe,      |
    //| also calculates the trend and the signal                         |
    //+------------------------------------------------------------------+
    bool IsNewBar(int &trend)
      {
    //--- здесь постоянно хранится время открытия текущего бара между вызовами функции
       static datetime timeopen=0;
    //--- получим время открытия текущего бара 
       datetime time=iTime(NULL, InpMATF, 0);
    //--- если время не изменилось, значит бар не является новым, выходим со значением false
       if(time==timeopen)
          return(false);
    //--- бар является новым, значит нужно вычислить направление тренда
       trend=TrendCalculate();
    //--- если не удалось получить направление тренда, то выйдем и попробуем получить на следующем вызове
       if(trend==NO_VALUE)
          return(false);
    //--- все проверки прошли успешно: бар является новым и направление тренда получено
       timeopen=time; //запомним время открытия текущего бара для последующих вызовов.
    //---
       return(true);
      }

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

    Весь торговый алгоритм представлен в обработчике OnTick():

    • Сначала определяется появление нового бара и направление тренда.
    • Если тренда нет или открыта позиция, то делается попытка удалить отложенные ордера с выходом из обработчика.
    • Если есть направленный тренд и не выставлен отложенный ордер, то делается попытка выставить лимитный ордер на границу канала.
    • Если же есть выставленный ордер, и он еще не был модифицирован на новом баре, то делается попытка передвинуть его на текущую границу канала.
    //+------------------------------------------------------------------+
    //| Expert tick function                                             |
    //+------------------------------------------------------------------+
    void OnTick()
      {
       static bool order_sent    =false;    // не удалось установить лимитный ордер на текущем баре
       static bool order_deleted =false;    // не удалось удалить лимитный ордер на текущем баре
       static bool order_modified=false;    // не удалось модифицировать лимитный ордер на текущем баре
    //--- если входные параметры невалидны, прекращаем тестирование на первом же тике
       if(!ExtInputsValidated)
          TesterStop();
    //--- проверим появление нового бара и направление тренда
       if(IsNewBar(ExtTrend))
         {
          //--- сбросим значения статических переменных в исходное состояние
          order_sent    =false;
          order_deleted =false;
          order_modified=false;
         }
    //--- создадим вспомогательные переменные, чтобы проверки вызывались только один раз на текущем баре
       bool order_exist   =OrderExist();
       bool trend_detected=TrendDetected(ExtTrend);
    //--- если нет тренда или есть открытая позиция, удалим отложенные ордеры
       if(!trend_detected || PositionExist())
          if(!order_deleted)
            {
             order_deleted=DeleteLimitOrders();
             //--- если ордера были успешно удалены, никаких других операций на текущем баре делать не требуется
             if(order_deleted)
               {
                //--- запрещаем установку и модификацию ордеров
                order_sent    =true;
                order_modified=true;
                return;
               }
            }
    
    //--- есть тренд
       if(trend_detected)
         {
          //--- установим ордер на границу канала, если его еще нет
          if(!order_exist && !order_sent)
            {
             order_sent=SendLimitOrder(ExtTrend);
             if(order_sent)
                order_modified=true;
            }
          //--- пропробуем передвинуть ордер на границу канала, если это еще не было сделано на текущем баре
          if(order_exist && !order_modified)
             order_modified=ModifyLimitOrder(ExtTrend);
         }
    //---
      }

    Остальные торговые функции советника являются достаточно стандартными и описываться не будут. Исходные коды проекта входят в поставку терминала MetaTrader 5 и находятся в каталоге MQL5\Experts\Examples.

    Расположение проекта MeanReversion в Навигаторе


    Оптимизация параметров и добавлениe Set-файлов

    После написания советника необходимо найти оптимальные значения входных параметров в тестере стратегий. Немногие знают, что тестер позволяет легко копировать значения вкладок "Настройки" и "Параметры" в буфер обмена с помощью стандартной комбинации Ctr+C. Это позволяет быстро передать ваши настройки другому человеку, например, заказчику через чат Фриланса, без необходимости сохранять их в set-файл. Заказчик может скопировать эти данные в буфер обмена и вставить в тестер на вкладке "Настройки" с помощью обратной операции Ctr+V.

    Разумеется, сохранение настроек в set-файл никто не отменял, и многие Продавцы в Маркете сопровождают своих советников такими файлами для удобства покупателей — те сразу же могут загрузить правильные наборы параметров для тестирования и оптимизации на нужном инструменте. Для каждого инструмента требуется создавать отдельный set-файл, если советников и таких файлов много, то можно легко запутаться. Проекты позволяют покупателям ваших роботов работать только со своими наборами входных параметров и не искать их на диске при смене символа.

    Покажем на примере, как проекты позволяют добавлять нужные наборы параметров прямо в EX5-файл советника. Выберите инструмент, на котором будет проводиться оптимизация, например, EURUSD. Установите значения Start, Step и Stop для оптимизируемых параметров и запустите оптимизацию. По окончании на вкладке "Оптимизация" сделайте двойной клик на лучшем на ваш взгляд проходе — значения входных параметров из этого прохода подставятся на вкладке "Параметры", после чего запустится одиночное тестирование. Теперь вы можете сохранить найденные параметры в set-файл, но передавать его отдельно уже не требуется. Сохраните набор параметров под именем, скажем, EURUSD.set, что означает, что параметры предназначены именно для этого символа, а не для GBPJPY.

    Сохранение настроек входных параметров в set-файл

    Проделайте эту операцию для каждого символа, на котором может работать ваш советник. Таким образом, пусть у вас будет набор из 9 set-файлов. Теперь просто добавьте эти файлы в ваш проект — создайте соответствующую папку "Settings and files\Set", чтобы они хранились отдельно от исходников. Проекты позволяют поддерживать порядок с помощью правильной файловой структуры.

    Добавление set-файлов в проект


    Теперь скомпилируйте проект и откройте тестер стратегий с советником MeanReversion. Во вкладке "Параметры" в контекстном меню появится новый пункт "Загрузить из советника", где будут предложены все варианты из вашего набора set-файлов.

    Загрузка входных параметров из советника

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


    Проверка стратегии на реальных данных

    Советник MeanReversion в сентябре 2019 года был запущен на демосчете для проверки на программные и торговые ошибки в режиме реального времени. При этом советник стартовал в режиме портфеля с торговлей на множестве символов, как и задумывалось при оптимизации. Был арендован встроенный VPS, для онлайн мониторинга был создан приватный сигнал Many MeanReversion Optimized

    Торговые результаты за 9 месяцев

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

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

    Распределение по символам

    Стоит отметить, что c момента запуска советника в торговлю его входные параметры ни разу не менялись, более того, ни разу не проводилась даже миграция. То есть скомпилированный девять месяцев назад советник был отправлен торговать на восьми графиках на встроенном VPS и работает с тех пор без вмешательства. Сейчас мы уже и не можем вспомнить, почему из девяти set-наборов в работу были взяты только восемь. Как и то, какие параметры были использованы. Но тем не менее, созданный в учебных целях проект советника MeanReversion всё еще остается в деле и на 10 июня 2020 года показывает прибыль.


    Переходите на проекты — это выгодно

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

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

    С помощью советника MeanReversion из стандартной поставки MetaTrader 5 вы можете изучить и оценить все преимущества работы с проектами. Просто создайте или скопируйте его в новую папку и начните экспериментировать. Пользуйтесь проектами — это удобно и выгодно во многих отношениях!

    Последние комментарии | Перейти к обсуждению на форуме трейдеров (20)
    Vladimir Karputov
    Vladimir Karputov | 12 июн 2020 в 13:06

    Что за чудеса?

    Повторю: вариант (ранее рабочий) - в проекте совместно находится советник и индикатор

       handle_iCustom=iCustom(m_symbol.Name(),Period(),"Shared Projects\\AlligatorAndStochastic\\AlligatorAndStochastic rectangles",

    сегодня на 2485 начал выдавать ошибку - мол файл не найден.


    После многих экспериментов вынес индикатор за пределы Shared Projects в отдельную папку. Результата не принесло


    Удалил вынесенную папку. Откатил все изменения проекта назад (то есть теперь снова и СОВЕТНИК и ИНДИКАТОР в одной паапке) - и о чуда: отладка на истории запустилась:


    Кто хочет можете проверить проект 'AlligatorAndStochastic'

    Sergey Lebedev
    Sergey Lebedev | 21 июн 2020 в 14:04

    Тема статьи достаточно важная, но сама статья - пустое промо, концентрирующее внимание на конечной цели в виде построения прибыльных советников, но при этом  совершенно не рассматривающее использование прикладные аспекты  применения функционала Проектов для организации взаимодействия участников при одновременной работе над  сложными экспертами.
    На самом деле текущий функционал MQL-проектов очень скудный и по сути негодный для организации проектов. Именно поэтому многие именитые форумчане выбирают  Github для размещения своих публичных и частных проектов (н-р свой достаточно известен репозиторий PublicMqlProjects Василия Соколова).

    Совсем недавно я размещал на Фриланс заказ на отдельные графические компоненты для своего эксперта (SixPanels), так как возникло желание распараллелить рабту - самому сконценрироваться на центральном функционале, создание gui отдать на аутсорсинг, т.е.по сути провести  организацию проектного взаимодействия с одном из разработчиков. Однако в целях сохранения своих know-how это потребовало от меня  и от  заказчика многочисленных непроизводительных трудозатрат:
        - мне потребовалось создать целый набор классов-пустышек, эмулирующих работу настоящий классов,
        - заказчику  в ходе реализации потребовалось переписать часть данных классов, что было произведено без синхронизации с моей продолжающейся разработчик центральной части советника,
        - по итогам выполнения заказа  мне потребовалось выполнить реинтеграцию gui компонентов со своим кодом, внося изменения в код gui -компонентов.

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

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

    Описанные ниже недостатки функционал MQL-проектов условно разделены на 2 части:
    А.  Недостатки  текущего Функционала  в части организации и ведения проектов
    В. Недостатки  текущего Функционала  в части интеграции в экосистему MQL5.com

    Sergey Lebedev
    Sergey Lebedev | 21 июн 2020 в 14:05

    А. Недостатки  текущего функционала MQL-проектов в части организации и ведения проектов

    Недостатки , из-за которых участники сейчас выбирают Github вместо MT5.Проекты

    1. Неполноценная ролевая структуры,  без возможности обеспечения доступа отдельных участников к отдельным каталогам проекта
    Use case 1: Привлечение платного фрилансера к выполнению части работ в более крупном проекте
    Use case2: Распределение работ между разработчиками с целью защиты
    Как устранить недостаток:  создать распределение доступов на уровне отдельных каталогов проекта и расширить текущую структуру доступов для до след.состава:  Владелец (полный доступна уровне всего проекта + администрирование участников) , Участник (полный доступ на уровне всего проекта), Разработчик(полный доступ на уровне корневого каталога и отдельных подкаталогов) , Наблюдатель (доступ на просмотр уровне всего проекта); без присвоения прав доступа участник с ролью разработчик не получает доступа к о всем подкаталогам.

    2. Отсутствует функционал планирования и распределения задач
    Use case 1: Требуется фиксировать список задач на выполнение и распределять/назначать  задачи участникам
    Use case 2: Требуется выстроить упорядоченную структуру задач, которые  должны быть решены в ходе проекта
    Use case 2: Требуется учитывать отпуска и периоды неактивности участников
    Как устранить недостаток:  в параллели с SVN системой облачного хранения и версионирования файлов запустить серверную систему jira, проведя  интеграцию отдельных ее компонентов в MetaEditor, в частности таких компонентов как Задачи и Доски; т.е. по сути создание MQL-проекта в MetaEditor должно приводит одновременно и к выделению файлового пространства в SVN и к автоматической регистрации нового проекта в системы Jira.

    3. Отсутствует функционал запуска/компиляции нескольких mq5 в рамках одного проекта
    Use case 1: Требуется параллельная разработка в различных классах, для удобства тестирования каждый разработчик делает копию первичного класса программы, изменения при этом ссылки на с те вложенные классы, которые он дорабатывает; для ускорения тестирования каждый запускает свой экземпляр  первичного класса программы.
    Use case 2: В целях- распределения потоков на процессорных ядрах разработка распределенного советника, отдельные части которого общаются собой через систему событий (events) или общие файлы;
    н-р у меня сейчас советник из 2х компонент: бэк-енд  телеграм бота работает как независимый эксперт на одном графике, анализирует команды и посредством events перенаправляет их в core, запушенном как советник на другом графике того же символа (+ в планах собираюсь добавить 3х элемент, который будет работать как сервис и поставлять данные с внешних источников), при этом все оба компонента опираются на одни библиотеки и по сути являются одним проектом.
    Как устранить недостаток:  в рамках структуры проекта сделать указатель какой .mq5 файл компилируется, который может быть установлен на уровне каждого участника проекта; если внутри проекта вложено более 2-х файлов .mq5 , то MetaEditorпозволяет на уровне проекта сменить компилируемый участником файл.

    4. Отсутствует функционал интегрированной разработки с адресацией к индикаторам

    Use case 1: Внешние индикаторы  часто являются важнейшая часть советников, выполняя как расчетные функции, так и визуализацию на графиках.
    Use case 2: Индикаторы т позволяют распараллелить вычисления внутри индикаторного потока.
    Функционал был ранее рабочим, но по каким-то соображениям был удален в последней версии MetaEditor.
    В  принципе описано в постах выше, и полагаю что топик  не нуждается в отдельных комментариях.
    Как устранить недостаток: восстановить функционал вызов в советнике и работу через iCustom  индикаторов, содержащихся в подкаталогах проекта.

    5. Отсутствует  функционал поддержки параллельной работы над разными редакциями проекта (а-ка DevOps)
    Use case 1:  Требуется обеспечить работу разных участников над проектом в разных стадиях, с целью ускорения релизов.
    Use case 2: В ситуации когда советник уже используется участниками для торговли на реальных счетах требуется обеспечить релизы с высоким качеством тестирования
    Как устранить недостаток: сделать минимальную структуру редакций проекта: DEV, TEST, PROD; вначале проект создается как DEV, затем участник с ролью  Владелец может создать редакцию TEST, затем PROD; при этом при работе с проектом каждый участник может переключить версию, задав ее в свойствах проекта, и перейти к работе над предыдущей редакцией; участник с ролью  Владелец могут обновлять редакции TEST/PROD, при этом система требует "согласия" всех участников с ролью Владелец.
    Sergey Lebedev
    Sergey Lebedev | 21 июн 2020 в 14:07

    В. Недостатки  текущего функционала MQL-проекты в части интеграции в экосистему MQL5.com

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

    6. Связь с разделом Фриланс (1): отсутствует  реестр совместных запросов на поиск участников
    Use case 1: Требуется найти потенциальных участников проекта, с нужными скилзами, требуется понимание опыта потенциальных партнеров.
    Use case 2: Требуется проскринить список потенциальных проектов, в которых было бы интересно принять участие.
    Как устранить недостаток:  создать в рамках раздела Фриланс подраздел "Доска Проектов", в которых выводить запросы  организаторов  на поиск участников (подразуемевается бесплатное участие в реализации проектов), с совместным правом пользоваться итоговым результатом.
    P.S.: сейчас в определенном виде кооперация идет за счет обсуждений на форуме в виде отдельных тем "напишу советник бесплатно" и т.д., но по сути не организовано никак вокруг проектного функионала, и достаточно часто обсуждение превращается в какой-то срач и флуд. Организация Доски проектов позволит увязать данную активность с проектным функционалом.

    7. Связь с разделом Фриланс (2): отсутствует  возможность сделать проект в виде совместного заказа
    Use case 1: Нескольким участникам требуется вскладчину оплатить создание нового функционала, с привлечением внешнего разработчика из Фриланс.
    Как устранить недостаток:  в  проекте создать вкладку "Заказы на Фриланс", на которой регистрировать заявки с бюджетом для Фриланса; после выбора разработчика, данный участник получает доступ к проекту с ролью "Разработчик", контрактные доступы которой задаются участниками с ролью Владелец.
    Монетизация (для MQ):  рост сложности совместных заказов, потенциальный рост  среднего чека заказов.

    8. Связь с разделом Маркет (1): отсутствует  возможность вывести результаты проекта на продажу, получая автоматическое разделение прибыли
    Use case 1: По итогам завершения проекта участники решают опубликовать советник/утилиту на Маркете, требуется функционал разделения прибыли в зафиксированной в проекте пропорции.
    Как устранить недостаток:  в  проекте создать вкладку "Заказы на Фриланс", на которой регистрировать заявки с бюджетом для Фриланса; после выбора разработчика, данный участник получает доступ к проекту с ролью

    9. Связь с разделом Статьи
    Use case 1: По итогам публикации сери и статей с некой полезной библиотекой, автор теряет к развитию данной библиотеки интерес, у сообщества нет инструментов для организованной поддержки/развития проктов; деньги MQ, уплаченные авторам серии статей уходят в песок (т.е. эффект теряется за 1-2 года после публикаций); среди примеров можно привести "Универсальный торговый эксперт" (В. Соколов), "Библиотека Easy & Fast GUI" (А. Кажарский), которые были заброшены/подзабыты свои авторами.
    Как устранить недостаток:  для всех авторов, развивающих своим библиотеки в ряде статей , установить обязательно требование  к публикации библиотеки в виде общедоступного проекта; при этом начиная с 3й статьи должно быть установлено доп. Требования включения в данный проекта +1 участника mql-сообщества с ролью Владелец перед каждой след. Статьей или +3 участника с ролью Участник.
    P.S. Т.е. по сути - если публикации авторов не находят отклика в участника mql-сообщества в  виде желающих стать со-владельцами проекта и далее еге развивать, то данная библиотека не интересна сообществу и ее развитие через Статьи не подлежит финансированию. Пусть авторы публикуют ее в Кодебазе и все.

    10. Связь с функционалом MQ-Сообщения
    Use case 1: После сбора участников требуется организовать обсуждение, которое сейчас чаще всего проходит в Телеграмм или Ватсапп, т.е. вне экосистемы MQL5.com
    Как устранить недостаток:  в настройках проекта создать галочку для открытия в  системе MQ-Сообщения  связанного с проектом закрытого  канала, в участники которого  автоматически добавляются участники проекта.


    Без  устранения вышеописанных недостатков, любая агитация типа  данной статьи - просто пустые лозунги. Они не приведут ни к популярности текущего функционала проектов, ни к монитезации для MQ.
    То что сейчас сделано в рамках MQL-проектов  - это можно рассматривать только как первый, базовый шаг.
    Вывод функционала MQL-проектов на новый уровень интеграции в экосистему MQL5.com требует устранения вышеуказанных недостатков.
    Stanislav Korotky
    Stanislav Korotky | 21 июн 2020 в 15:49

    Sergey Lebedev:

    ... запустить серверную систему jira...

    У MQ есть свой продукт - TeamWox, так что интеграция с конкурентом в лице Jira, скорее всего, исключается по политическим мотивам.

    По поводу всего остального складывается непаханное поле разноплановых задач, а для MQ лучше всего было бы сконцентрироваться на качестве и полноте основного функционала, т.е. трейдерского. ИМХО, "нельзя объять необъятное" и все такие утилитарные вещи как редактор+IDE, система сборки, контроля версий, workflow и пр. имело смысл брать готовые и настраивать для работы с MQL и компилятором MQL. Почему-то для контроля версий решили взять сторонний CVS (выбрав SVN!), а всё остальное -- писать с нуля. В результате по всем параметрам уступают признанным инструментам в каждом сегменте.

    PS. Основной аргумент от MQ был, насколько я помню, такой, чтобы дать всё в одном флаконе яко-бы удобном для трейдеров-непрограммистов. Но в результате инструмент становился все более и более сложным, и вот уже он по-любому не из разряда для непрограммистов и при этом не обладает "фичами", привычными для программистов. Ни вашим, ни нашим.

    Вычисление математических выражений (Часть 2). Парсеры Пратта и сортировочной станции Вычисление математических выражений (Часть 2). Парсеры Пратта и сортировочной станции

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

    Инструментарий для быстрой ручной торговли: Работа с открытыми и отложенными ордерами Инструментарий для быстрой ручной торговли: Работа с открытыми и отложенными ордерами

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

    Работа с таймсериями в библиотеке DoEasy (Часть 45): Мультипериодные индикаторные буферы Работа с таймсериями в библиотеке DoEasy (Часть 45): Мультипериодные индикаторные буферы

    В статье начнём доработку объектов-индикаторных буферов и класса коллекции буферов для работы в мультипериодном и мультисимвольном режимах. В данной статье рассмотрим работу объектов-буферов для получения и вывода данных с любого таймфрейма на текущий график текущего символа.

    Работа с таймсериями в библиотеке DoEasy (Часть 46): Мультипериодные, мультисимвольные индикаторные буферы Работа с таймсериями в библиотеке DoEasy (Часть 46): Мультипериодные, мультисимвольные индикаторные буферы

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