Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
05 Торг системы.doc
Скачиваний:
18
Добавлен:
15.03.2016
Размер:
679.94 Кб
Скачать

Одновременное открытие комбинации ордеров Buy и Sell

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

при затишье на рынке открываются одновременно две позиции в разные стороны по одной валюте, у которых StopLoss и TakeProfit равны 100 и 110.

Возможная прибыль от комбинации ордеров определяется разностью

TakeProfit - StopLoss.

Например, в соответствии с данным алгоритмом открываются сразу две позиции в разные стороны: StopLoss - на 100 пунктов, TakeProfit - на 110 пунктов. После этого советник не выполняет никаких действий, пока не закроются обе позиции. Затем весь процесс повторяется. В результате в каждой паре одна позиция будет закрываться с потерями: -100, другая с прибылью: +110. Прибыль 10 пунктов с каждой пары.

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

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

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

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

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

Еще одна проблема реализации алгоритма заключается в том, что возможны ситуации, когда одна позиция закрывается по StopLoss, а вторая не закрывается в течение длительного времени, т.е. движение цены в «нужном направлении» остановилась. В этом случае следует задавать и программно ограничивать общие по комбинации ордеров потери.

Следующая проблема программной реализации алгоритма возникает, когда цена открытия ордера (обычно Bid или Ask), смещенная на величину StopLoss или TakeProfit, указывает на значение котировки, близкой к «круглой цене». Например,

Ask+TakeProfit1=1.2100

или

Bid-TakeProfit1=1.1900.

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

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

Обозначим цену закрытия комбинации при увеличении котировок Price1

Price1=Ask+TakeProfit1.

Вычислим остаток от деления Price1 на 100

Mod1=Mod(Price1*MultiPlier1,100),

где MultiPlier1 – множитель, вычисление значения которого приведено при рассмотрении торговли «вблизи круглых цен».

Тогда, если

Mod1<a1,

т.е. цена закрытия комбинации незначительно больше «круглой цены», то величину TakeProfit для ордера Buy и, следовательно, величину StopLoss для ордера Sell, рекомендуется уменьшить на величину

a1+Mod1.

Например, пусть

a1=8 пунктов

TakeProfit=110 пунктов

StopLoss=100 пунктов.

Тогда, если

Ask=1.1995,

то

Price1=1.2105

и, следовательно,

Mod1=5.

В этом случае рекомендуется уменьшить TakeProfit для ордера Buy до величины

110-(8+5)=97 пунктов,

а StopLoss для ордера Sell уменьшить до величины

100-(8+5)=87 пунктов.

Аналогично выполняются изменения значений TakeProfit и StopLoss при уменьшении котировок (движении цены вниз).

Пусть

Price2=Bid-TakeProfit1.

Как и в предыдущем случае вычислим остаток от деления Price2 на 100

Mod2=Mod(Price2*MultiPlier1,100),

где MultiPlier1 – множитель, вычисление значения которого приведено при рассмотрении торговли «вблизи круглых цен».

Тогда, если

Mod2>100-a1,

т.е. цена закрытия комбинации незначительно меньше «круглой цены», то величину TakeProfit для ордера Sell и, следовательно, величину StopLoss для ордера Buy, рекомендуется уменьшить на величину

a1+(100-Mod2).

Например, пусть

Bid=1.2004,

то (см. предыдущий пример)

Price2=1.1894

и, следовательно,

Mod2=94.

В этом случае рекомендуется уменьшить TakeProfit для ордера Sell до величины

110-(8+(100-94))=96 пунктов,

а StopLoss для ордера Buy уменьшить до величины

100-(8+(100-94))=86 пунктов.

Рассмотрим основные этапы реализации алгоритма одновременного открытия комбинации ордеров Buy и Sell.

Настраиваемые параметры алгоритма (см. блок defines):

1. Ширина коридора при затишье на рынке (пунктов) - CoridWidth

2. Интервал времени, используемый для вычисления ширины коридора (количество свечей) - CoridCandleAmount

3. Количество лотов в позиции - Lots0

4. Потери StopLoss для обеих позиций (пунктов) - StopLoss0

5. Прибыль TakeProfit для обеих позиций (пунктов) равна StopLoss0+Profit0 - Profit0

6. Проскальзывание в системе торгов (пунктов) - Slippage0

Дополнительные настраиваемые параметры алгоритма (см. блок vars):

1. Время ожидания после появления первого ордера в списке ордеров (после реального открытия позиции) перед открытием второго ордера (сек.) - WaitTime0.

2. Время ожидания реального открытия первой или второй позиции - WaitTime1.

Необходимость использования дополнительных настраиваемых параметров вызвана чисто техническими проблемами Metatrader, так как всегда происходят:

- пауза после команды на открытие ордера,

- пауза после появления ордера в списке ордеров.

Алгоритм разбивается на следующие этапы:

Этап 1. Определение ширины коридора. Выполняется один раз для каждой новой завершенной свечки.

Находим максимальное среди значений High и минимальное среди значениий Low для последних CoridCandleAmount свечей. Рисуем границы коридора.

Если коридор узкий (меньше CoridWidth пунктов), то переходим к этапу 2.

Этап 2. Выдаем команду на открытие первой позиции BUY.

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

Этап 3. Ждем пока первый ордер появится в списке ордеров. При этом запоминаем время реального открытия первой позиции.

Но если в течение WaitTime1 секунд позиция не открыта, то генерируется сообщение об ошибке.

Этап 4. Ждем пока после реального открытия первой позиции пройдет WaitTime0 секунд. Выдаем команду на открытие второй позиции SELL. При этом запоминаем время подачи команды на открытие.

Этап 5. Проверка открытия второй позиции - ждем пока второй ордер появится в списке ордеров. Рисуем вертикальную зеленую линию.

Но если в течение WaitTime1 секунд позиция не открыта, то генерируется сообщение об ошибке.

Первый этап можно реализовать в виде следующего фрагмента программы:

// ===============================================================

// Этап 1. Определение ширины коридора. Выполняется один раз

// для каждой новой завершенной свечки

// Находим максимальное среди значений High и

// минимальное среди значениий Low для последних

// CoridCandleAmount свечей. Рисуем границы коридора.

// Если коридор узкий (меньше CoridWidth пунктов), то

// NarrowCor1=1 – переходим к следующему этапу

// ===================================================================

if PrevBarTime <> Time then // обнаружена новая завершенная свечка

{

PrevBarTime = Time;

// здесь когда на графике появилась новая законченная свечка

//вычислить коридор

CoridPeriods=CoridCandleAmount;

CoridMax=High[Highest(MODE_HIGH, CoridCandleAmount,CoridPeriods)];

CoridMin=Low[Lowest(MODE_LOW, CoridCandleAmount,CoridPeriods)];

if CoridMax - CoridMin <= CoridWidth*Point then

{ // коридор узкий, можно открывать позиции

NarrowCor1=1;

// нарусуем линии коридора КРАСНЫМ

alert(Symbol," Draw in Red ",CoridMax," ",CoridMin);

MoveObject("CorMax1",OBJ_HLINE,CurTime,CoridMax,

CurTime,CoridMax,Red,1,STYLE_SOLID);

MoveObject("CorMin1",OBJ_HLINE,CurTime,CoridMin,

CurTime,CoridMin,Red,1,STYLE_SOLID);

}

else

{ // коридор широкий, нельзя открывать позиции

NarrowCor1=0;

// нарусуем линии коридора ЗЕЛЕНЫМ

MoveObject("CorMax1",OBJ_HLINE,CurTime,CoridMax,

CurTime,CoridMax,LightGreen,1,STYLE_SOLID);

MoveObject("CorMin1",OBJ_HLINE,CurTime,CoridMin,

CurTime,CoridMin,LightGreen,1,STYLE_SOLID);

};

}; // if PrevBarTime <> Time конец обработки новой завершенной свечки

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

Результат работы указанного алгоритма приведен на следующем рисунке.