Как составить Техническое задание при заказе индикатора

MetaQuotes | 8 марта, 2018

Содержание


Как алготрейдинг облегчает жизнь трейдера?

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

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

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

Торговый робот работает 24 часа в сутки и не знает ни усталости, ни сомнений. Но написать его может не каждый. В этом случае остается только один вариант — заказать его у программиста-алготрейдера. Для этого необходимо составить Техническое Задание, в котором описываются требования к нужной вам программе — индикатору или торговому роботу. В этой статье мы рассмотрим вопросы, на которые должен ответить заказчик, который хочет обратиться во Фриланс.

Дополняйте текст рисунками и видео

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

Все проблемы в нашем обществе связаны с недопониманием друг друга. Заказ программы во Фрилансе — не исключение. Спросите любого разработчика, и вы узнаете, что самая трудозатратная часть выполнения заказа — выяснение вопроса "Чего хочет Заказчик?". Даже если обе стороны говорят на одном языке, чаще всего выясняется, что они не понимают друг друга. Обидно бывает обнаружить это при приеме выполненной работы. Досаду испытывают обе стороны - и Заказчик, и Исполнитель. Иногда это доходит до Арбитража.

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

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

Некоторые Заказчики создают огромные текстовые описания, думая, что составили все тщательно и понятно. Но на самом деле чаще всего продраться через сплошной текст сложно. Если какой-то термин или слово Заказчик и Исполнитель могут трактовать по-разному, то с рисунком таких проблем не будет: стрелка и круг будут восприняты именно как стрелка и круг, и никак иначе. Потратив 5 — 10 минут на создание понятных для разработчика иллюстраций, вы не только лучше донесете свои идеи, но и быстрее получите правильно работающую программу.

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

Посмотрите, как можно пользоваться редактором для оформления текста:


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

Теперь к делу: для начала разберем пару примеров Технического задания на разработку индикатора.

Полезные программы для составления ТЗ

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

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

Для создания прототипов графических панелей попробуйте программу Pencil. Она позволяет за 5 - 10 минут набросать эскиз нужного вам интерфейса. В ней же можно создавать блок-схемы для визуального объяснения сложных алгоритмов. Если вам нужно больше, почитайте обзоры в Сети, например, Шесть программ для создания диаграмм.

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

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

Формулировка Технического задания в виде Алгоритма

Каждый индикатор отражает какую-то идею. Поэтому сначала необходимо описать идею — словами и картинками, если это возможно. Без объяснения идеи понять, чего именно хочет Заказчик, будет намного сложнее.

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

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

Для описания терминов лучше использовать списки, например:

  1. дневной диапазон — расстояние между максимальной и минимальной ценой в течение дня;
  2. средний диапазон — среднее значение дневного диапазона за N дней;
  3. проторговка — узкий ценовой коридор, внутри которого находятся тела свечей, не выходя за его пределы;
  4. ...

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

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

Примеры Технических заданий

Пример №1

Нужен индикатор  ZigZag, который строится на осцилляторах

Идея индикатора

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

  • CCI
  • Chaikin
  • RSI
  • Stochastic Oscillator

Алгоритм и Термины

Первый этап — строительство Зигзага:

  1. Зоной перекупленности называются свечи, на которых значение индикатора Value > Lmax (Lmax=-20).
  2. Зоной перепроданности называются свечи, на которых значение индикатора меньше Value < Lmin (Lmin=-80).
  3. Значения Lmax и Lmin выносятся в параметры индикатора.
  4. На свечи в зоне перекупленности в точке High ставим желтую точку, это H-точки.
  5. На свечи в зоне перепроданности в точке Low ставим зеленую точку, это L-точки.
  6. Если между двумя H-точками есть хотя бы одна L-точка, то начинаем на интервале между ними искать LL-точку — свеча с минимальной ценой Low и будет LL-точкой. В общем случае LL-точка не обязательно является L-точкой. Нас интересуют свечи с минимальной ценой Low.
  7. Если между двумя L-точками есть хотя бы одна H-точка, то начинаем на интервале между ними искать HH-точку — свеча с максимальной ценой High и будет HH-точкой. В общем случае HH-точка не обязательно является H-точкой. Нас интересуют свечи с минимальной ценой Low.
  8. Соединяем LL и HH точки между собой, чтобы получился индикатор ZigZag. Цвет по умолчанию — желтый. Первый этап закончен.




Второй этап — цвет Зигзага:

  1. Ищем три подряд идущие HH-точки так, чтобы выполнялось условие: каждая последующая HH-точка выше предыдущей.
  2. Если для двух лежащих между ними LL-точек также выполняется условие, что вторая LL-точка выше первой, то все колена Зигзага между 5-ю точками красим синим цветом.
  3. Если после найденной пятерки экстремумов Зигзага найдется еще по одной HH и LL точке, которые находятся выше соответственно предыдущих HH и LL точек, то дополнительно красим еще 2 колена Зигзага синим цветом.
  4. Продолжаем так до тех пор, пока не нарушится условие. Так мы отмечаем восходящий тренд.
  5. Аналогично ищем идущие подряд понижающиеся LL точки и проделываем все операции как в пунктах 1- 4. Красим эти колена красным цветом: так мы отмечаем нисходящий тренд.



Третий этап - добавляем возможность указывать нужный тип осциллятора, по которому будет строиться Зигзаг: CCI, Chaikin, RSI,  Stochastic Oscillator.

  1. Добавляем первым параметром тип, который будет задаваться перечислением. Значением по умолчанию будет WPR.
  2. Для каждого типа добавляем свои параметры Lmax и Lmin со значениями по умолчанию.
  3. Имена максимального и минимального параметров должны содержать имя индикатора, то есть вида WPRmax, CCImax,STOmax и так далее.

Четвертый этап — добавляем графическую панель для управления параметрами индикатора.

  1. На панели должны быть чекбоксы со всеми типами осцилляторов для быстрого переключения типа.
  2. Панель должна уметь сворачиваться и разворачиваться по клику мыши.
  3. Панель можно перемещать по графику.
  4. Индикатор можно снять с графика через панель.

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

Приемка работы производится поэтапно — каждый этап должен быть выполнен по порядку.


Пример №2

Требуется индикатор NRTR с отправкой сообщений на почту и в мобильный терминал

1. Нужно переписать индикатор NRTR c MQL4 на MQL5 . Код находится здесь: https://www.mql5.com/ru/code/7760

2. При смене цвета отправлять Push-уведомление и сообщение на email о смене тренда.

3. Добавить в параметры рабочие часы, в которые разрешено отправлять уведомления — ночью отправлять не нужно. Должно быть два параметра:

  • StartHour — с какого часа утра можно отправлять;
  • EndHour — до какого часа вечера можно отправлять.

4. Добавить параметры на разрешение отправки сообщений:

  • SendPush — разрешить отправку Push-сообщений;
  • SendEmail — разрешить отправку писем на почту.

5. Текст отправляемого сообщения имеет формат:

NRTR на EURUSD H1 развернулся вверх. Up=1.23560, Down=1.23300, Brick=260 pips

   где:

  • имя и таймфрейм берутся с графика, на котором запущен индикатор;
  • Up — верхний уровень канала;
  • Down — нижний уровень канала;
  • Brick — толщина канала в пунктах (размер стопа при открытии позиции).



6. Email и Push отправляются только после того, как закроется свеча, пробившая канал.

7. Разрешается отправлять только один сигнал на один бар.

8. Для контроля работы индикатора на VPS нужно также писать текст отправляемого сообщения в логи.

9. Из индикатора нужно получать значения 3 буферов:

  • Up — верхняя граница;
  • Down — нижняя граница;
  • Trend — направление тренда, -1 или 1.

10. Индикатор должен быть написан оптимально с точки зрения производительности.


Пример №3

Требуется написать индикатор

Входные параметры:
  1. Первая валютная пара
  2. Вторая валютная пара
  3. Расчетная пара
  4. Цена для расчета - Bid/Ask

Пункт 3 не является входным параметром, это  просто результат деления курсов из п.1 и п.2, выводится на график для ознакомления.

Принцип действия:
Суть идеи в том, что если взять две валютные пары с одинаковым знаменателем (желательно какие-нибудь популярные), например EUR/USD и GBP/USD, и поделить друг на друга их курсы, то в результате, по правилам деления дробей и после всех сокращений, мы получим курс пары EUR/GBP.



Индикатор рисуется в отдельном окне. Черная вертикальная линия - это текущий момент времени, начиная от нее влево рисуются две кривые:

  • одна - рассчитанный курс, на рисунке зеленая,
  • другая - реальный курс, на рисунке красная

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


Что можно указать в Техническом Задании на создание индикатора

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

Тип отрисовки индикатора

  1. Линии — самый простой и понятный вид графика.
  2. Гистограмма — чаще всего применяется в осцилляторах.
  3. Стрелки и символы — удобны для обозначения моментов входа/выхода. Иногда на них строятся даже каналы (NRTR) или системы Trailing Stop.
  4. Области и каналы — например, Envelopes.
  5. Отрезки — могут использоваться в составе сложных индикаторов для отрисовки линий.
  6. Стиль Zigzag — например, цветной Зигзаг.
  7. Бары и свечи — для отображения графиков с чужих символов или пользовательских свечей на основе вычислений. Например, Heiken-Ashi.
  8. Комбинация перечисленных стилей.

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

Цвета отрисовки

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

Где рисуется индикатор

  1. На главном окне графика
  2. В подокне графика

Таймфреймы и символы для расчета и показа

  1. Индикатор будет использовать для расчетов только свою пару символ/таймфрейм или же будет обращаться к данным других символов и таймфреймов?
  2. Нужно ли запрещать показ индикатора на каких-то символах/таймфреймах?
  3. Что делать, если для расчетов недостаточно баров с чужого символа/таймфрейма?

Какие цены, объемы и индикаторы используются для расчетов

Классические индикаторы всегда работали только с ценами Open, High, Low и Close родного таймфрейма. Но в наше время возможности технического анализа и языки программирования MQL5/MQL4 позволяют использовать самые разные временные серии данных, включая объемы и значения других индикаторов.

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

Состав и названия входных параметров

Лучше представить разработчику список параметров и их названия, как они будут выглядеть в терминале. Как правило, программист дает входным переменным имена для удобства чтения кода. Трейдеру же, как пользователю программы, нужны имена параметров, которые раскрывают их суть и назначения. Например, в индикаторе Chaikin Volatility (CHV) есть такие параметры, которые понятны трейдеру:

  1. Период сглаживания — сколько значений берется для усреднения вспомогательного массива.
  2. Период CHV — сколько баров берется для получения вспомогательного массива по методу Чайкина.
  3. Тип сглаживания — какой тип сглаживания будет использоваться для осциллятора.

Разработчик на основе этого пишет в коде:

//--- перечисление типов сглаживания
enum SmoothMethod
  {
   SMA=0,// Простая средняя
   EMA=1 // Экспоненциальное 
  };
//--- входные параметры 
input int          InpSmoothPeriod=10;  // Период сглаживания
input int          InpCHVPeriod=10;     // период расчета CHV 
input SmoothMethod InpSmoothType=EMA;   // Способ сглаживания

Комментарии после значений будут показаны как названия в окне параметров для трейдера:

Запуск вычислений на каждом тике

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

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

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

Перерисовка индикатора

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

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

Алерты, Push-сообщения, отправка писем, отчетов, скриншотов

Если вам необходимо, чтобы индикатор в определенные моменты времени сообщал вам о текущей ситуации на рынке, то разработчик может добавить в код отправку Push-уведомлений и электронных писем. Кроме того, для привлечения внимания трейдера в индикатор можно добавить функции PlaySound(), Alert() и MessageBox(). Если у вас есть свой сайт или страница блога, возможно вам пригодится SendFTP().

В статье Андрея Войтенко Создание бота для Telegram на языке MQL5 приводятся и другие возможности по автоматизации ручной торговли. Возможно, вы захотите взять некоторые идеи из неё.

Графическая панель управления

Если вы хотите сделать управление индикатором более гибким, то подумайте о добавлении графической панели управления. Статья MQL5, обработка событий: Изменяем период мувинга "на лету" вышла много лет назад, в ней показана сама идея. С тех пор возможности языка MQL5 стали практически безграничными. Посмотрите примеры в статьях Универсальный осциллятор с графическим интерфейсом и Как быстро добавить панель управления к индикатору и советнику. И, конечно же, рекомендуем посмотреть серию статей Графические интерфейсы от Анатолия Кажарского.

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

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

Скриншоты для пояснения

Хороша известна пословица "Лучше один раз увидеть, чем сто раз услышать". Поэтому если ваш индикатор должен отрисовывать/визуализировать на графике совершенно определенным образом конкретные ситуации, вам необходимо сделать хорошо понятные иллюстрации. Мы рекомендуем на них показывать только самое необходимое, размер картинок должен быть небольшим, нет смысла делать гигантские скриншоты. Некоторые полезные советы вы найдете в статье Как правильно подать Продукт для продажи в Маркете?

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


Не стоит пытаться в один скриншот втиснуть много мелких деталей. Вот пример того, как не надо делать:


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


Если приложить немного усилий, то можно сделать из него вариант получше:


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

Логи и журналы для отладки

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

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

Кроме того, при возникновении непредвиденной ситуации предоставьте разработчику дополнительные сведения, как это показано в статье Андрея Хатимлянского Как заказать написание советника и получить желаемый результат:

  • Приложите set-файл с параметрами программы (кнопка "Сохранить" в окне параметров советника)
  • Укажите используемые валютную пару и таймфрейм графика
  • Укажите адрес сервера, к которому был подключен терминал, и тип счета (демо, реал, конкурсный или другой)
  • Укажите версию терминала (меню "Справка" - "О программе")
  • Если проверка производилась в тестере, дополнительно укажите настройки тестера (интервал дат, режим моделирования, режим торговли, начальный депозит, кредитное плечо)

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

Приемка и проверка индикатора

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

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

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

Задумал, описал, заказал!

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

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