Изначально вопрос ставился так: Можно ли в TradeStation на основе только дневных данных совершать покупки/продажи внутри текущего бара, если для формирования сигнала используется цена открытия текущего бара. Оказалось, можно.
Небольшое вступление:
1. В Омеге можно использовать четыре основных вида ордеров:
Stop – исполнение по указанной цене или хуже,
Limit – исполнение по указанной цене или лучше,
Market – исполнение по цене открытия,
Close – исполнение по цене закрытия.
При этом, если для расчета сигнала используются какие-либо компоненты текущего бара, на текущем баре может быть исполнен только Close ордер. Market ордер исполняется на открытии следующего бара, Stop/Limit ордера исполняются так же на следующих барах, когда выполнится их условие.
2. В PowerEditor можно создавать сигналы для стратегий, в которые включены все условия на вход и на выход одновременно, а можно для каждого условия создать свой сигнал, а затем в StrategyBuilder , как из кубиков, собрать стратегию из нескольких сигналов.
Для примера покупки внутри бара с учетом цены открытия я выбрал следующую стратегию: Если закрытие вчера и открытие сегодня ниже ЕМА(С,30), и цены в течение дня пересекают ЕМА вверх, то покупаются первые 50 контрактов по стоп-ордеру на уровне ЕМА+5 пунктов. Если закрытие сегодня будет выше ЕМА, то на закрытии бара покупаются вторые 50 контрактов, если закрытие сегодня окажется ниже ЕМА, то сигнал на вход считается не подтвержденным и первые 50 контрактов продаются. Если сигнал подтвердился и куплены 100 контрактов, то выход из позиции, когда цена закрытия дня пересечет ЕМА обратно вниз.
Видно, что в стратегии используется сегодняшнее открытие, поэтому если просто записать эти условия в EasyLanguage, то стоп-ордер на первую покупку не будет исполнен на текущем баре, а только на последующих, когда цены пересекут сигнальную линию. Коллега REM «напомнил» :) , что в EL можно использовать функцию Tomorrow (кстати только для цены открытия). Теперь условие для стоп-ордера можно записать так:
If Close < XAverage(Close,30) and Open of Tomorrow < XAverage(Close,30) Then Begin
StopOrder = XAverage(Close,30) + 5 points;
Buy 50 Contracts at StopOrder Stop;
End;
Тогда ордер сформируется с учетом прошлых цен и текущего открытия и будет исполнен на текущем баре.
Однако, если попытаться в этот же сигнал добавить условие второй покупки по закрытию дня:
If Close Cross Over XAverage(Close,30) Then Buy 50 Contracts at Close;
То, PowerEditor «ругнется» на невозможность исполнения Close ордера с учетом «завтрашних» цен. Поэтому надо создавать два отдельных сигнала для каждого ордера. Стратегия будет состоять из трех сигналов (2 на вход и 1 на выход).
1_EntrySignal:
Vars: StopOrder(0);
If MarketPosition = 0 and Close < XAverage(Close,30) and Open of Tomorrow < XAverage(Close,30) Then Begin
StopOrder = XAverage(Close,30) + 5 points;
Buy 50 Contracts at StopOrder Stop;
End;
2_EntrySignal:
If C Cross Over XAverage(Close,30) Then Buy 50 Contracts at Close;
Exit_Signal:
If C < XAverage(Close,30) Then ExitLong at Close;
В настройкх стратегии (Format) необходимо указать Pyramiding Settings – Allow for different Entry…
Вот как это выглядит на графике:
В первом случае, цена вчерашнего закрытия и текущего открытия были ниже ЕМА. После открытия, цены пошли вверх и сработал стоп-ордер на покупку 50 контрактов, однако затем цены пошли вниз и закрытие дня оказалось ниже ЕМА. В результате позиция на 50 контрактов была закрыта. На следующий день сохранились те же условия для входа. При пересечении ЕМА было куплено 50 контрактов по стоп-ордеру и на закрытии дня было куплено еще 50 контрактов, т.к. закрытие было выше ЕМА. На следующий день позиция была полностью закрыта, т.к. цена закрытия пересекла ЕМА обратно вниз.
Вот, собственно и все.
Предупреждение: Выбранная стратегия и тексты сигналов не являются полноценным продуктом, готовым к применению, а использованы лишь для примера.
(c) konkop 2001