Общие вопросы по разработке > Интересный момент поведения АД4 в стратегиях

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Аватара пользователя
evge
Администратор
Сообщения: 1654
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 305 раз
Контактная информация:

Интересный момент поведения АД4 в стратегиях

Непрочитанное сообщение evge » 14 дек 2017, 19:35

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

Здесь всё понятно.

А вот как себя поведет стратегия, если позицию частично мы будем закрывать лимитным ордером, например, CloseShortLimit(Price, Q);

Вот как раз здесь мы и увидим странность:

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

Код обоих примеров тестовых стратегий и скриншоты сигналов:

Код: Выделить всё

/**
x1
**/

function Initialize()
{
   StrategyName = "x1";
   AddParameter("P1", 0.005, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "SBER=МБ ЦК");
   LongLimit = 100;
   ShortLimit = 100;
}

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( Input1.Open < Input1.Close && CurrentPosition() == 0)
   {
      EnterShort();     
      StopLoss(Input.Close + Input.Close * 0.01, SignalPriceType.Price);
   }
   
   if ( Input1.Open > Input1.Close && CurrentPosition() != 0)
   {
      CloseShort(1);
   }

}


Результат

CloseShort-StopLoss-01.png


Код: Выделить всё

/**
x2
**/

function Initialize()
{
   StrategyName = "x2";
   AddParameter("P1", 0.005, "", 1);
   AddInput("Input1", Inputs.Candle, 60, true, "SBER=МБ ЦК");
   LongLimit = 100;
   ShortLimit = 100;
}

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( Input1.Open < Input1.Close && CurrentPosition() == 0)
   {
      EnterShort();     
      StopLoss(Input.Close + Input.Close * 0.01, SignalPriceType.Price);
   }
   
   if ( Input1.Open > Input1.Close && CurrentPosition() != 0)
   {
      CloseShortLimit(Input.Close + Input.Close * 0.01, 1);
   }
}


Результат

CloseShort-StopLoss-02.png


во второй тестовой стратегии CloseShortLimit() не в ту строну, но сути это не меняет, он просто исполнился сразу
никогда такого не было и вот опять

Evgeny_TK
Сообщения: 7
Зарегистрирован: 11 сен 2017, 14:42

Re: Интересный момент поведения АД4 в стратегиях

Непрочитанное сообщение Evgeny_TK » 14 дек 2017, 23:11

Действительно! Нюанс который может привести к неожиданным результатом.
по логике в вашем примере, закрытие позиции по
ShortLimit = 100;
CloseShortLimit(100) тоже стоп не отменит! (или CloseShortLimit(99) не отменит а CloseShortLimit(100) отменит)
получатся что
CloseShortLimit() закроет позицию и снимет стоп
CloseShortLimit(100) закроет позицию, а стоп оставит.

Одно могу сказать: работа ордеров, и такие нюансы должны быть подробно и недвусмысленно описаны в документации.
А это не так, и это печально!


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей