Стратегия Gelium_Trader (TradeStation).

История изменений материала

23.06.2018 Выложена версия Gelium_Trader 2018. Обновлено описание параметров.
06.03.2016 Выложена версия Gelium_Trader 2015 Final.
17.09.2013  Выложена версия Gelium_Trader 2013.09.17.
Добавлен раздел "Вопросы и ответы".
15.09.2013  Выложена версия Gelium_Trader 2013.09.15.
12.09.2013  Выложена версия Gelium_Trader 2013.09.12.

Дистрибутив.

Для работы стратегии необходимы:
  • TradeStation 9.1.12098 (Update 12) или новее.
  • Для работы с моделями необходима библиотека Puls 2013.319 или новее. Для использования других стратегий Gelium_Trader_XXX библиотека Puls не нужна.
Обратите внимание:
  • Стратегия написана на языке EasyLanguage для платформы TradeStation 9.x. Для MetaTrader нет реализации этой стратегии и пока не планирую это делать.
Изменения в версии 2018.06.23:
  • Изменений в версии 2018 по сравнению с версией 2015 огромное количество, поэтому необходимо прочесть новое описание всех параметров.

Описание.

Торговая стратегия Gelium_Trader является базовым движком для всех стратегий Gelium_Trader_XXX. Полное описание всех общих параметров стратегий есть в этой статье. Текущая версия Gelium_Trader содержит сигнал p_MD_XXX, который позволяет провести тестирование торговых решений на базе моделей, которые самостоятельно устанавливает трейдер с помощью индикатора Gelium_Expert.

Возможности стратегии:
  • Открытие позиций по установленным трейдером моделям.
  • Пирамидинг на откатах или с фиксированным шагом.
  • Закрытие позиций фиксированным стопом.
  • Закрытие позиций фиксированным лимитом.
  • Подтягивание стопа к минимуму отката (StopExt).
  • Выход после разворота на откате StopRT (двойной трейлинг StopReTarget).
  • Подтягивание стопа в случае нахождения цены долгого времени в малом диапазоне (StopTM). 
  • Подтягивание стопа с использованием Gelium_Q.
  • Риск фиксированным лотом или процентом депозита (Optimal F).
  • Ограничение числа повторных входов по одному базовому сигналу.
  • Собственный целевой критерий оптимизации (поиск максимальной доходности для года с минимальной отдачей) .
  • Экспорт торговых сигналов в MetaTrader с помощью советника Gelium_2MT.
  • Экспорт параметров стратегии в Excel.
Обсуждение стратегии на форума: "Gelium_Trader - торговля на базе моделей".
Параметры стратегии:

Параметр Назначение
p_MD - параметры для работы с моделями. В других стратегиях Gelium_Trader_XXX параметры сигналов для открытия позиций будут другие. Например, p_SRB_XXX. Соответственно параметры p_MD_XXX в других стратегиях будут отсутствовать.
p_MD(1) 1 - разрешается торговля по моделям.
p_MD_ExtIdent(1) Отступ в пунктах от экстремума для входа на прорыве.
p_MD_TargetMinus(20) Количество пунктов, на которое уменьшается размер цели. В среднем, для базовых пар и золота, цена не доходит до целевого уровня в среднем 20 пунктов Fоrexite.
p_MD_Ident2w(100) Уровень входа на опережение относительно предыдущего экстремума на второй волне. Для входа по второй волне стоп размещается на 1 пункт выше предыдущей волны.
p_MD_Open(1) 1 - разрешаются входы по моделям.
p_MD_Exit(1) 1 - разрешаются закрытия позиций по моделям.
p_MD_Series
("model_"+gp_SymbolName)
Название серии с данными моделей (серия создается с помощью индикатора Gelium_Expert).
p_Impuls - параметры детектирования наличия импульса.
p_Impuls_Rollback(0) Максимально допустимый размер отката против импульсного движения.
p_Impuls_Start(0) Размер движения в одном направлении без откатов больше p_Impuls_Rollback-пунктов, достижение которого включает флаг наличия импульса.
p_Risc - параметры управления вычислением объёма сделки.
p_RiscCapital(10000) Размер депозита на начало года.
p_RiscPrc(10) Процент риска в одной позиции относительно текущего остатка. Если параметр равен нулю, используется фиксированный размер позиции.
p_RiscPrc_NoLossReserve(0) Если параметр равен нулю, то после установки ордера размер рискового депозита уменьшается на величину возможной потери. Если параметр равен 1, резервирование под возможный убыток не осуществляется.
p_Profit - фиксирование прибыли с помощью заданного размера профита в пунктах относительно цены открытия позиции.
p_Profit(0) Размер фиксированного профита в пунктах.
p_Profit_Indiv(0) Если параметр равен нулю, уровень фиксации прибыли для всех открытых позиций вычисляется относительно цены открытия последней позиции. Если параметр равен 1, то каждый вход имеет свой отдельный уровень фиксации прибыли.
p_Profit_Impuls(0) Если параметр равен нулю, ордер для фиксации прибыли ставится всегда. Если параметр равен 1, то ордер для фиксации прибыли ставится только в том случае, если был детектирован импульс.
p_Stop - параметры фиксирование убытка с помощью заданного размера уровня stop loss в пунктах относительно цены открытия позиции.
p_Stop(50) Размер стопа в пунктах.
p_Stop_Indiv(0) Если параметр равен нулю, уровень фиксации убытка для всех открытых позиций вычисляется относительно цены открытия последней позиции. Если параметр равен 1, то каждый вход имеет свой отдельный уровень фиксации убытка.
p_StopZero - подтягивание стопа к уровню без убытка или фиксации гарантированной прибыли. В случае, когда стоп подтягивается к уровню гарантированной прибыли, будущая прибыль добавляется к объёму рискового депозита и учитывается при расчёте объёма новых позиций.
p_StopZero(0) Если параметр больше нуля, то после прохождения в направлении позиции более p_StopZero-пунктов, стоп переносится в ноль или на уровень фиксации прибыли в p_StopZeroProf-пунктов лучше цены открытия позиции.
p_StopZeroProf(0) Размер фиксации профита в пунктах.
p_StopZeroAsLimit(0) Если параметр равен нулю, параметр p_StopZeroProf не может быть больше параметра p_StopZero. Это приводит к запрещению установки ордера фиксации прибыли. Если параметр равен 1 и p_StopZeroProf>=p_StopZero, то при прохождении StopZero-пунктов будет установлен лимитный ордер согласно параметру p_StopZeroProf. Это может быть полезно, когда целью стратегии являются краткосрочные импульсы.
p_StopRT - закрытие позиции двойным трейлингом по методу StopRT (StopReTarget).
p_StopRT1(0) Порог движения в пунктах против открытой позиции, после достижения которого позиция будет закрыта на откате в направлении открытой позиции.
p_StopRT2(0) Размер отката в пунктах в направлении ранее открытой позиции, по достижению которого позиция будет закрыта.
p_StopRT_Impuls(0) Если параметр равен нулю, метод закрытия позиций используется всегда. Если параметр равен 1, то метод закрытия позиций используется только в том случае, если был детектирован импульс.
p_StopRT_PlusPos(0) Пока не используется. Зарезервировано на будущее.
p_StopRT_Stop(0) Пока не используется. Зарезервировано на будущее.
p_StopQ - закрытие позиции с помощью Ama_Q (индикатор Gelium_Q).
p_StopQ(0) Число баров для расчета Ama_Q. Если значение меньше или равно нулю, StopQ не используется.
p_StopQ_Start(0) Размер разницы между текущим значением Ama_Q и значением в момент последнего пересечения с ценой, по достижению которого будет использоваться StopQ. Например, если p_StopQ_Start=200 и мы имеем длинную позицию, то стоп на уровень значения Ama_Q будет установлен только тогда, когда Ama_Q вырастет с момента последнего пересечения с ценой минимум на 200 пунктов.
p_StopQ_Impuls(0) Если параметр равен нулю, метод закрытия позиций используется всегда. Если параметр равен 1, то метод закрытия позиций используется только в том случае, если был детектирован импульс.
p_StopQ_Price(c) Значение, которое используется для расчёта Ama_Q. Например, вместо Close можно использовать (H+L)/2 или любую другую вычисляемую в параметре формулу.
p_StopExt - закрытие позиции с помощью подтягивания стопа к минимуму/максимуму отката против направления текущей позиции.
p_StopExt1(0) Размер отката в пунктах для подтягивания стопа.
p_StopExt2(0) Порог прохождения в направлении открытой позиции в пунктах, по достижению которого стоп будет установлен на один пункт ниже экстремума отката.
p_StopTm - закрытие позиции с помощью подтягивания стопа к минимуму/максимуму диапазона цен за заданное число баров.
p_StopTm1(0) Число баров бокового диапазона для подтягивания стопа.
p_StopTm2(0) Максимальный допустимый размер диапазона в пунктах.
p_SF - параметры управления целевым критерием оптимизации. Метод управления целью оптимизации рассматривается на форуме в теме "Gelium_Helper_SF - установка своего критерия оптимизации в TradeStation".
p_SF(-16) Последний год интервала настройки в формате YY, для которого делается учёт минимальной годовой прибыли. Если параметр меньше нуля, коррекция результата работы стратегии не производится и оптимизация выполняется согласно заданному целевому критерию оптимизации TradeStation. Например, если мы задаём p_SF=16 и оптимизация производится на данных [2010-2018], то интервалом настройки будет интервал [2010-2016] и минимальная годовая доходность этого интервала будет установлена в качестве результата работы стратегии. Интервалом проверки будут данные за период [2017-2018]. Результаты торговли на интервалах и настройки, и проверки, будут сохранён в Excel. Стоит учесть, что оптимизация на данных с добавлением интервала проверки потребует больше времени, так как стратегия считается на большем объёме истории.
p_SF_AllYear(1) Если p_SF_AllYear=1, то все года интервала настройки должны иметь сделки. Если в какой-то год сделок не будет, минимальной доходностью будет -10000 (потеря депозита).
p_SF_TargetMode(0) Если p_SF_TargetMode=0, ведётся поиск максимальной доходности для года с меньшим доходом. Если параметр p_SF_TargetMode=1, ведётся поиск максимальной средней геометрической прибыли для серии из всех прибыльных лет (функция СРГЕОМ в Excel).
p_SF_WinPrc(0) Если параметр p_SF_WinPrc>0, то параметр p_SF_WinPrc используется как коэффициент коррекции минимальной годовой доходности пропорционально проценту прибыльных сделок по формуле: MinYearPrc * ((WinTrades / TotalTrades) / p_SF_WinPrc). Таким образом, чем больше p_SF_WinPrc, тем сильнее процент прибыльных сделок влияет на результат генетической оптимизации. На мой взгляд, достаточно использовать p_SF_WinPrc=1.
p_SF_FileFlag(0) Если параметр равен 1, создаётся файл-флаг "c:\Optimization.flag" во время оптимизации. Файл флаг может использоваться для отправки уведомлений в случае завершения оптимизации. Что может быть весьма актуально при использовании арендованных многопроцессорных серверов.
p_SF_Debug(0) Если параметр равен 1, в лог TradeStation выводится отладочная информация и производится коррекция результирующей доходности стратегии не зависимо от того, выполняется оптимизация или нет. Включение этого режима позволяет проверить работу коррекции итогового дохода стратегии и разобраться с проблемой, если таковая возникнет.
Управление возможностью открытия позиции и числом входов по одному и тому же сигналу.
p_IgnoreMP(1) 0 - открывать новые позиции только когда нет открытых позиций.
1 - игнорировать наличие открытых позиций.
p_MaxEntryCount(4) Допустимое число входов по одному базовому сигналу. Например, если позиция открывается на пробитии экстремума и выбивается из-за короткого стопа, можно установить p_MaxEntryCount=4, чтобы было осуществлено 4 попытки входа в направлении базового сигнала.
p_MaxEntryMode(0) Режим вычисления цены для повторного входа:  0 - максимальный/минимальный экстремум с момента открытия позиции, 1 - максимальный/минимальный экстремум за заданное параметром p_MaxEntBars число баров, 2 - исходная цена входа.
p_MaxEntryBars(0) Число баров для вычисления уровня повторного входа.
Управление использованием истории цен. Обратите внимание: в случае пропуска истории в объёме года или более, при включении оптимизации с p_SF_AllYear=1, пропуск заданного промежутка истории не приведёт к блокировке работы стратегии. Пропуск истории будет корректно учтён во время генетической оптимизации с собственным критерием оптимизации.
p_StartDate(0) Дата начала торговли в формате TradeStation. До достижения этой даты сигналы для открытия позиций игнорируются.
p_SkipDate1(-1081020) Дата начала пропуска истории. Если параметр меньше нуля, он игнорируется.
p_SkipDate2(-1091020) Дата окончания пропуска истории. Если параметр меньше нуля, он игнорируется.
p_SkipLastBarOnChart(1) 1 - последний бар чарта игнорируется. Это необходимо в некоторых случаях при синхронизации экспорта торговых сигналов.
Использование тиковых баз. В последних версиях стратегии эта группа сигналов отключена.
p_TickBase(0) Флаг использования тиковой базы для установки ордеров по точным цена. Если p_TickBase=1, используется тиковая база. Если p_TickBase=0, тиковая база не используется.
p_TickBaseFile
(Getsymbolname)
Название файл базы данных с тиками без расширения. Например: p_TickBaseFile(Getsymbolname) или p_TickBaseFile("XAU-D"). Расположение файлов с тиковыми базами устанавливается в параметрах Puls.
p_TickDebug(0) Флаг режима отладки установки ордеров на базе цен тиковой базы.
p_Trade - экспорт торговых приказов в текстовый файл для автоматизации торговли в MetaTrader4 с помощью советника Gelium_2MT.
p_TradeExport(0) 1 - выполнять экспорт торговых приказов в текстовый файл. 0 - не выполнять.
p_TradeSymbol(gp_GetSymbolName) Название торгового символа.
p_TradeFile("c:\Chart\Trade\Test") Путь и название файла сигнала без расширения. В качестве расширения к названию файла будет добавлен текст ".Signal". В данном примере будет производиться экспорт в файл "c:\Chart\Trade\Test.Signal".
p_TradeStart(0) Дата начала торговли в формате TradeStation. Если p_TradeStart меньше первого бара графика, торговля ведётся без ограничений.
p_TradeSumPlus(0) Зарезервировано на будущее.
p_TradeOpenSpread(1) Использовать спред для вычисления цены ордера ASK. В качестве спреда берётся комиссия, установленная для стратегии в параметрах TradeStation.
p_TradeShow(1) 1 - показывать окно с информацией об изменениях ордеров.
p_TradeMail(1) 1 - отправлять уведомление о наличии изменений на электронную почту с помощью утилиты MailSender.
p_TradeMinChange(1) Минимальное изменение цены ордера в пунктах, ведущее к созданию уведомления.
Исходные цены баров, которые используются внутри стратегии. При необходимости можно использовать любую серию данных. Например, все расчёты можно делать на базе O Data2, H Data2, L Data2, С Data2, а торговля будет вестись на главной серии Data1.
p_O(O) Open.
p_H(H) Heigh.
p_L(L) Low.
p_C(C) Close.
p_Excel - экспорт статистики работы стратегии в Excel. Ручное сохранение в Excel выполняется с помощью кнопки Save, которая расположена сверху на информационной панели.
p_Excel_WorkBook("c:\Chart\Reports\GT_Reports.xlsm") Рабочая книга Excel с поддержкой макросов.
p_Excel_Sheet("Test") Рабочий лист для записи информации.
p_Excel_Comment(1) 1 - осуществлять запись сжатого комментария с основными параметрами стратегии.
p_Excel_Optim(0) 1 - делать экспорт статистики во время оптимизации стратегии.
0 - не делать экспорт во время оптимизации.
p_Excel_OverHelper(0) 1 - отправка данных в Excel через экспериментальную версию Gelium_Helper. 0 - отправка данных напрямую в Excel. Пока лучше делать экспорт данных напрямую в Excel после завершения оптимизации.
p_Excel_OverText(0) 1 - экспериментальный экспорт данных в текстовый файл. 0 - экспорт напрямую в Excel. Пока лучше делать экспорт данных напрямую в Excel после завершения оптимизации.
p_Excel_TextFile("c:\GT_Op.txt") Файл для записи данных в текстовом формате.
p_Excel_MinYear(-100) Сохранять данные только если доходность в процентах худшего года интервала настройки больше значения p_Excel_MinYear.
p_Excel_MinProfit(0) Сохранять данные только если общая доходность интервала настройки больше значения p_Excel_MinProfit.
p_Excel_OOSProfit(0) Сохранять данные только если минимальная доходность худшего года интервала проверки больше значения p_Excel_OOSProfit.
p_Excel_SparkLine(0) 1 - экспортировать данные для построения в Excel SparkLine. Экспорт этих данных замедляет экспорт в Excel.
p_Excel_AutoSave(0) 1 - автоматически сохранять рабочую книгу Excel после экспорта данных.
p_Info - информационная панель.
p_Info(1)

Тип вывода результатов стратегии на график справа от текущей цены:

  • p_Info = 0 - отчет не выводится.
  • p_Info = 1 - отчет выводится на график.
  • p_Info = 2 - отчет выводится в отдельную панель, вне окна графика, справа.
  • p_Info > 20 - отчет выводится и текст отчета выводится с отступом p_Info-баров справа от последнего бара на графике.
В TradeStation расположение отчета масштабируется при перетягивании или сжатии графика по вертикали.



В первых строках отчета выводится название стратегии и параметры актуальных ордеров. Далее выводится таблица с результатами работы стратегии по годам:
  • Yaer - год.
  • Profit - доход стратегии в долларах.
  • Profit% - годовой доход относительно начального капитала 10 000$.
  • MaxDD % - максимальная просадка относительно начального баланса или максимального дохода в течение года.
  • TT - количество сделок.
  • Win% - количество выигрышных сделок.
После таблицы с результатами торговли находится список используемых параметров. Параметры с нулевыми значениями, как правило, не используются и в список не выводятся.
p_Info_Font
("Lucida Console")
Шрифт для отображения текста отчета.
p_Info_FontSize(8) Размер шрифт для отображения текста отчета.
p_Info_Width(550) Ширина информационной панели.
p_Info_Orders(1) 1 - отрисовывать линии ордеров и позиций.
p_Info_Slippage(0) Если p_Info_Slippage > 0, на график выводятся исходные уровни ордеров, которые можно сравнить с исполнением с учетом проскальзываний:



p_Color1(Black) Обычный цвет текста или цвет линий входа на графике.
p_Color2(Blue) Выделяемый цвет текста.
p_Color3(Red) Цвет текста для убыточных позиций или уровня стопа.
p_Debug - вывод отладочной информации.
p_DebugXXX Серия параметров, включающий вывод отладочной информации. Подробную информацию не привожу, так как эти параметры нужны только в случае проблем со стратегией.

Вопросы и ответы.

  • Почему не срабатывает продажа по второй модели, с пробитием цены 1352.1?



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


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

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



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


Разработка систем

Для души и разума.

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

Далее...

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

— Конечно, — говорит Недозайцев. Он директор, и всегда готов взвалить на себя проблему, которую придется нести кому-то из коллектива. Впрочем, он тут же уточняет: — Мы же это можем?

Начальник отдела рисования Сидоряхин торопливо кивает:

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

— Очень приятно, — говорит Морковьева. — Ну, меня вы все знаете. А это — Леночка, она специалист по дизайну в нашей организации.

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

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

— Нет, — говорит Петров.

— Давайте не будем торопиться с ответом, Петров, — говорит Сидоряхин. — Задача поставлена, и ее нужно решить. Вы же профессионал, Петров. Не давайте нам повода считать, что вы не профессионал.

— Видите ли, — объясняет Петров, — термин «красная линия» подразумевает, что цвет линии — красный. Нарисовать красную линию зеленым цветом не то, чтобы невозможно, но очень близко к невозможному...

— Петров, ну что значит «невозможно»? — спрашивает Сидоряхин.

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

— То есть, в принципе, это возможно, мы правильно вас понимаем, Петров? — спрашивает Морковьева.

Петров осознает, что переборщил с образностью.

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

— Петров, вы нас не путайте, пожалуйста. Только что вы говорили, что это возможно.

Петров молча проклинает свою болтливость.

— Нет, вы неправильно меня поняли. Я хотел лишь сказать, что в некоторых, крайне редких ситуациях, цвет линии не будет иметь значения, но даже и тогда — линия все равно не будет красной. Понимаете, она красной не будет! Она будет зеленой. А вам нужна красная.

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

— А что если, — осененный идеей, произносит Недозайцев, — нарисовать их синим цветом?

— Все равно не получится, — качает головой Петров. — Если нарисовать синим — получатся синие линии.

Опять молчание. На этот раз его прерывает сам Петров.

— И я еще не понял... Что вы имели в виду, когда говорили о линиях прозрачного цвета?

Морковьева смотрит на него снисходительно, как добрая учительница на отстающего ученика.

— Ну, как вам объяснить?.. Петров, вы разве не знаете, что такое «прозрачный»?

— Знаю.

— И что такое «красная линия», надеюсь, вам тоже не надо объяснять?

— Нет, не надо.

— Ну вот. Вы нарисуйте нам красные линии прозрачным цветом.

Петров на секунду замирает, обдумывая ситуацию.

— И как должен выглядеть результат, будьте добры, опишите пожалуйста? Как вы себе это представляете?

— Ну-у-у, Петро-о-ов! — говорит Сидоряхин. — Ну давайте не будем... У нас что, детский сад? Кто здесь специалист по красным линиям, Морковьева или вы?

— Я просто пытаюсь прояснить для себя детали задания...

— Ну, а что тут непонятного-то?.. — встревает в разговор Недозайцев. — Вы же знаете, что такое красная линия?

— Да, но...

— И что такое «прозрачный», вам тоже ясно?

— Разумеется, но...

— Так что вам объяснять-то? Петров, ну давайте не будем опускаться до непродуктивных споров. Задача поставлена, задача ясная и четкая. Если у вас есть конкретные вопросы, так задавайте.

— Вы же профессионал, — добавляет Сидоряхин.

— Ладно, — сдается Петров. — Бог с ним, с цветом. Но у вас там еще что-то с перпендикулярностью?..

— Да, — с готовностью подтверждает Морковьева. — Семь линий, все строго перпендикулярны.

— Перпендикулярны чему? — уточняет Петров.

Морковьева начинает просматривать свои бумаги.

— Э-э-э, — говорит она наконец. — Ну, как бы... Всему. Между собой. Ну, или как там... Я не знаю. Я думала, это вы знаете, какие бывают перпендикулярные линии, — наконец находится она.

— Да конечно знает, — взмахивает руками Сидоряхин. — Профессионалы мы тут, или не профессионалы?..

— Перпендикулярны могут быть две линии, — терпеливо объясняет Петров. — Все семь одновременно не могут быть перпендикулярными по отношению друг к другу. Это геометрия, 6 класс.

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

— Петров, давайте без вот этого: «6 класс, 6 класс». Давайте будем взаимно вежливы. Не будем делать намеков и скатываться до оскорблений. Давайте поддерживать конструктивный диалог. Здесь же не идиоты собрались.

— Я тоже так считаю, — говорит Сидоряхин.

Петров придвигает к себе листок бумаги.

— Хорошо, — говорит он. — Давайте, я вам нарисую. Вот линия. Так?

Морковьева утвердительно кивает головой.

— Рисуем другую... — говорит Петров. — Она перпендикулярна первой?

— Ну-у...

— Да, она перпендикулярна.

— Ну вот видите! — радостно восклицает Морковьева.

— Подождите, это еще не все. Теперь рисуем третью... Она перпендикулярна первой линии?..

Вдумчивое молчание. Не дождавшись ответа, Петров отвечает сам:

— Да, первой линии она перпендикулярна. Но со второй линией она не пересекается. Со второй линией они параллельны.

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

— Ну... — неуверенно произносит она. — Наверное, да.

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

— А можно мне ручку? — просит Морковьева.

Петров отдает ручку. Морковьева осторожно проводит несколько неуверенных линий.

— А если так?..

Петров вздыхает.

— Это называется треугольник. Нет, это не перпендикулярные линии. К тому же их три, а не семь.

Морковьева поджимает губы.

— А почему они синие? — вдруг спрашивает Недозайцев.

— Да, кстати, — поддерживает Сидоряхин. — Сам хотел спросить.

Петров несколько раз моргает, разглядывая рисунок.

— У меня ручка синяя, — наконец говорит он. — Я же просто чтобы продемонстрировать...

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

— Получится то же самое, — уверенно говорит Петров.

— Ну, как то же самое? — говорит Недозайцев. — Как вы можете быть уверены, если вы даже не попробовали? Вы нарисуйте красные, и посмотрим.

— У меня нет красной ручки с собой, — признается Петров. — Но я могу совершенно...

— А что же вы не подготовились, — укоризненно говорит Сидоряхин. — Знали же, что будет собрание...

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

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

— Кстати, да, — замечает Недозайцев. — Я же еще спрашивал вас про синий цвет. Что вы мне ответили?

Петрова внезапно спасает Леночка, с интересом изучающая его рисунок со своего места.

— Мне кажется, я понимаю, — говорит она. — Вы же сейчас не о цвете говорите, да? Это у вас про вот эту, как вы ее называете? Перпер-чего-то-там?

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

— Все, вы меня запутали окончательно, — говорит Недозайцев, переводя взгляд с одного участника собрания на другого. — Так у нас с чем проблемы? С цветом или с перпендикулярностью?

Морковьева издает растерянные звуки и качает головой. Она тоже запуталась.

— И с тем, и с другим, — тихо говорит Петров.

— Я ничего не могу понять, — говорит Недозайцев, разглядывая свои сцепленные в замок пальцы. — Вот есть задача. Нужно всего-то семь красных линий. Я понимаю, их было бы двадцать!.. Но тут-то всего семь. Задача простая. Наши заказчики хотят семь перпендикулярных линий. Верно?

Морковьева кивает.

— И Сидоряхин вот тоже не видит проблемы, — говорит Недозайцев. — Я прав, Сидоряхин?.. Ну вот. Так что нам мешает выполнить задачу?

— Геометрия, — со вздохом говорит Петров.

— Ну, вы просто не обращайте на нее внимания, вот и все! — произносит Морковьева.

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

Устав ждать ответа, Недозайцев произносит:

— Петров, вы ответьте просто — вы можете сделать или вы не можете? Я понимаю, что вы узкий специалист и не видите общей картины. Но это же несложно — нарисовать какие-то семь линий? Обсуждаем уже два часа какую-то ерунду, никак не можем прийти к решению.

— Да, — говорит Сидоряхин. — Вы вот только критикуете и говорите: «Невозможно! Невозможно!» Вы предложите нам свое решение проблемы! А то критиковать и дурак может, простите за выражение. Вы же профессионал!

Петров устало изрекает:

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

— Нас это устроит? — оборачивается Морковьева к Леночке. — Да, нас устроит.

— Только еще хотя бы пару — зеленым цветом, — добавляет Леночка. — И еще у меня такой вопрос, можно?

— Да, — мертвым голосом разрешает Петров.

— Можно одну линию изобразить в виде котенка?

Петров молчит несколько секунд, а потом переспрашивает:

— Что?

— Ну, в виде котенка. Котеночка. Нашим пользователям нравятся зверюшки. Было бы очень здорово...

— Нет, — говорит Петров.

— А почему?

— Нет, я конечно могу нарисовать вам кота. Я не художник, но могу попытаться. Только это будет уже не линия. Это будет кот. Линия и кот — разные вещи.

— Котенок, — уточняет Морковьева. — Не кот, а котенок, такой маленький, симпатичный. Коты, они...

— Да все равно, — качает головой Петров.

— Совсем никак, да?.. — разочарованно спрашивает Леночка.

— Петров, вы хоть дослушали бы до конца, — раздраженно говорит Недозайцев. — Не дослушали, а уже говорите «Нет».

— Я понял мысль, — не поднимая взгляда от стола, говорит Петров. — Нарисовать линию в виде котенка невозможно.

— Ну и не надо тогда, — разрешает Леночка. — А птичку тоже не получится?

Петров молча поднимает на нее взгляд и Леночка все понимает.

— Ну и не надо тогда, — снова повторяет она.

Недозайцев хлопает ладонью по столу.

— Так на чем мы остановились? Что мы делаем?

— Семь красных линий, — говорит Морковьева. — Две красным цветом, и две зеленым, и остальные прозрачным. Да? Я же правильно поняла?

— Да, — подтверждает Сидоряхин прежде, чем Петров успевает открыть рот.

Недозайцев удовлетворенно кивает.

— Вот и отлично... Ну, тогда все, коллеги?.. Расходимся?.. Еще вопросы есть?..

— Ой, — вспоминает Леночка. — У нас еще есть красный воздушный шарик! Скажите, вы можете его надуть?

— Да, кстати, — говорит Морковьева. — Давайте это тоже сразу обсудим, чтобы два раза не собираться.

— Петров, — поворачивается Недозайцев к Петрову. — Мы это можем?

— А какое отношение ко мне имеет шарик? — удивленно спрашивает Петров.

— Он красный, — поясняет Леночка.

Петров тупо молчит, подрагивая кончиками пальцев.

— Петров, — нервно переспрашивает Недозайцев. — Так вы это можете или не можете? Простой же вопрос.

— Ну, — осторожно говорит Петров, — в принципе, я конечно могу, но...

— Хорошо, — кивает Недозайцев. — Съездите к ним, надуйте. Командировочные, если потребуется, выпишем.

— Завтра можно? — спрашивает Морковьева.

— Конечно, — отвечает Недозайцев. — Я думаю, проблем не будет... Ну, теперь у нас все?.. Отлично. Продуктивно поработали... Всем спасибо и до свидания!

Петров несколько раз моргает, чтобы вернуться в объективную реальность, потом встает и медленно бредет к выходу. У самого выхода Леночка догоняет его.

— А можно еще вас попросить? — краснея, говорит Леночка. — Вы когда шарик будете надувать... Вы можете надуть его в форме котенка?..

Петров вздыхает.

— Я все могу, — говорит он. — Я могу абсолютно все. Я профессионал.




Перепечатка авторских материалов сайта без указания ссылки на
сайт Gelium.net запрещена.

Pavel Gelium 2000-2017 © All rights reserved.