← 返回

Стоп-лосс

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

本主题对您有帮助吗?

分享主题

评论 (29)

登录创建账户, 登录或注册以发表评论

Alexander
Alexander

Анализируем последнюю цену. Если она <= (>=) x - создаём новый stop-order с нужными нам условиями, делаем ему RegisterOrder.

raf
raf 作者

Alexander: Анализируем последнюю цену. Если она <= (>=) x - создаём новый stop-order с нужными нам условиями, делаем ему RegisterOrder.

Какие параметры надо задать new Order(), чтобы стоп по достижении условий выставил заявку по рынку?

Например, так не получается задать стоп:

var stoporder = new Order
{
  Portfolio = this.Portfolio,
  Type = OrderTypes.Conditional,
  Volume = lots,
  Price = 0,                    /////////  smartcom ругается
  Direction = OrderDirections.Sell,
  StopCondition = new SmartStopCondition
 {
   IsOneDay = true,
  StopPrice = stopPrice,
 }
}
Alexander
Alexander

raf:

Alexander: Анализируем последнюю цену. Если она <= (>=) x - создаём новый stop-order с нужными нам условиями, делаем ему RegisterOrder.

Какие параметры надо задать new Order(), чтобы стоп по достижении условий выставил заявку по рынку?

Например, так не получается задать стоп:

var stoporder = new Order { Portfolio = this.Portfolio, Type = OrderTypes.Conditional, Volume = lots, Price = 0, ///////// smartcom ругается Direction = OrderDirections.Sell, StopCondition = new SmartStopCondition }


Если это фортс, то на фортсе рыночных заявок нет.
Пользуйтесь или котированием, либо заявками с ценой равной ценой лимита по инструменту.
raf
raf 作者

Брокер позволяет делать такие заявки

в Stock#.chm в главе SmartCom написано

var stopOrder = new Order { Portfolio = (Portfolio)this.Portfolio.SelectedValue, Type = OrderTypes.Conditional, Volume = this.Volume.Text.To<int>(), Price = this.Price.Text.To<decimal>(), Security = this.Security, Direction = this.IsBuy.IsChecked == true ? OrderDirections.Buy : OrderDirections.Sell, StopCondition = new SmartStopCondition , };

Если значение Order.Price равно 0, то будет создана стоп-заявка, при исполнении которой будет зарегистрирована рыночная заявка (OrderTypes.Market). Если значение не равно 0, то будет зарегистрирована лимитированная заявка (OrderTypes.Limit).

На практике получается, что при Order.Price = 0, тип ордера остается OrderTypes.Limit. Из-за чего Смартком ругается о невозможности лимитированной заявки с ценой 0

Mikhail Sukhov
Mikhail Sukhov

raf: На практике получается, что при Order.Price = 0, тип ордера остается OrderTypes.Limit.

Как такое может быть, если в коде явно устанавливается Conditional?

raf
raf 作者

Mikhail Sukhov:

raf: На практике получается, что при Order.Price = 0, тип ордера остается OrderTypes.Limit.

Как такое может быть, если в коде явно устанавливается Conditional?

Я так выразился согласно написанному в Stock#.chm глава SmartCom -> Стоп-заявки (я уже цитировал выше):

Если значение Order.Price равно 0, то будет создана стоп-заявка, при исполнении которой будет зарегистрирована рыночная заявка (OrderTypes.Market).

Но при указании Order.Price = 0 в момент RegisterOrder вылетает исключение

{"Цена лимитной заявки не может быть равной 0.\r\nИмя параметра: order"}

Следовательно как мне кажется в реализации RegisterOrder должным образом не происходит проверка Order.Price == 0. Либо стоп с исполнением по маркету задается другим способом, нежели как представлено в примере. К сожалению проверить это с помощью SmartCOMWrappera пока руки не дошли.

Mikhail Sukhov
Mikhail Sukhov

Но при указании Order.Price = 0 в момент RegisterOrder вылетает исключение

{"Цена лимитной заявки не может быть равной 0.\r\nИмя параметра: order"}

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

Alexander
Alexander

Насколько я понял происходит примерно следующее.

Создаётся стоп заявка:


var stopOrder = new Order
{
Portfolio = Portfolio,
Type = OrderTypes.Conditional,
Volume = 1,
Price = 0,
Security = Security,
Direction = OrderDirections.Buy,
StopCondition = new SmartStopCondition
{
IsOneDay = true,
StopPrice = 198,
},
};

и ожидается, что при достижении цены 198 у нас пошлётся заявка по рынку, но этого не происходит.

raf
raf 作者

немного другая ситуация. При выполнении кода

var stoporder = new Order
{ 
  Portfolio = Portfolio, 
  Type = OrderTypes.Conditional, 
  Volume = 1, 
  Price = 0, 
  Security = Security, 
  Direction = OrderDirections.Buy, 
  StopCondition = new SmartStopCondition 
  { 
    IsOneDay = true, 
    StopPrice = 198, 
  } 
};

trader.RegisterOrder(stoporder);

программа вылетает с эксепшн

{"Цена лимитной заявки не может быть равной 0.\r\nИмя параметра: order"}

System.ArgumentException не обработано пользовательским кодом Message=Цена лимитной заявки не может быть равной 0. Имя параметра: order Source=StockSharp.Algo ParamName=order StackTrace: в StockSharp.Algo.TraderHelper.#=qsRY1Gkj5LVHKLGCPQgJrl$JyXax_iA3U0MweSn82MaA=(Order #=qDVBVu9ZsVP7dj1O6fXTk4w==) в StockSharp.Algo.TraderHelper.#=qOBksWyvS$yyrnUdbHdidNQ==(Order #=qPn5yemFjtL$WxVh_f8TzXQ==) в StockSharp.Algo.BaseTrader.RegisterOrder(Order order) в StockSharp.Algo.Strategies.Strategy.RegisterOrder(Order order) в asts1.StrategyTrailingStop.StrategyCloseTrailingStop.OnSecurityChanged() в D:\StrategyTrailing.cs:строка 278 в System.Action.Invoke() в Ecng.Common.DelegateHelper.SafeInvoke(Action handler) в StockSharp.Algo.Strategies.Strategy.#=qBYva7X6kv_LxPlcCnaByk_lkNTfOJr3i30JoILrggRY=(IEnumerable1 #=qJyxEDgBgAXtHSyyY73kdmA==) в System.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qaVX2FaXB8STRu3NJp2XNbz0Cxmp4RdtDimHr24gJPZg=.#=qg06BaMxlyeDvTDEuBbiTdQ==(IEnumerable1 #=q_hdH0YugUkBDNFJYZs9JhA==) InnerException:

Mikhail Sukhov
Mikhail Sukhov

Раз вы явно устанавливаете Order.Type, то бага в S#. Ок, посмотрю в чем дело.

Кот Матроскин
Кот Матроскин

Здравствуйте! Возникла очень похожая проблемы. А именно: тестирую в EmulationTrader стратегию, решил поменять маркет-ордер на стоп-ордер (с исполнением по рынку), код такой:

                _stopOrderOpenDeal = new Order 
                {
                    Portfolio = this.Portfolio,
                    Volume = 1m,
                    Security = this.Security,
                    Direction = _direction,
                    Type = OrderTypes.Conditional,
                    Price = 0,
                    ExpiryDate = DateTime.MaxValue,
                    StopCondition = new SmartStopCondition 
                    {
                        StopPrice = _stopPrice, 
                    }, 
                };
                RegisterOrder(_stopOrderOpenDeal);

Цена Price = 0, как в документации по Смарту. В итоге получил следующий Exception:

00:00:00.000 | | EmulationTrader | Экспорт запущен. 00:00:00.000 | | ... | Стратегия запущена. 10:00:00.000 | Error | ... | System.BadImageFormatException: Невозможно загрузить файл или сборку "StockSharp.Smart, Version=4.0.23.0, Culture=neutral, PublicKeyToken=null" или один из зависимых от них компонентов. Была сделана попытка загрузить программу, имеющую неверный формат. Имя файла: "StockSharp.Smart, Version=4.0.23.0, Culture=neutral, PublicKeyToken=null" в SampleHistoryTesting.SmaStrategy.OnProcess() в StockSharp.Algo.Strategies.TimeFrameStrategy.#=qZHVfyKwI4vf7ONEp35cU8OHmGCK4F9lK_KFrfCPAFBg=() в StockSharp.Algo.Strategies.StrategyRule1.#=quXXKfimi4hGCUUA2EBieBe40d1P3S0O01k7RpjQWc4Q=.#=qc5Q$2yznI4v7NUwkziu7eg==(StrategyRule1 #=q8pU360yixOnyal56ySThxQ==, #=qYvW23FoN_bSucNDVd1djgg== #=qRnz$uUKk_OQJpdyJfGa8Vg==) в StockSharp.Algo.Strategies.StrategyRule1.#=qxw3fSR$7BgRSk3lFnXHQPtLqr51eX9mDSwNA9yV$vaQ=.#=qslmG47QH3JqkLo3WYKyhrg==(#=qr72eow4hO9ArvO1OIY4FJQ== #=qZrZQCfhgUrmTFNWR9RAZfg==) в StockSharp.Algo.Strategies.StrategyRule1.#=qBNAojy8xnqgcson6lOpxCT5wSiewuGJorSoAQXI$8wU=.#=qC$$koezZsR34GX$1egQpLfxbTuzJqRxr0SkdYQagKnY=() в StockSharp.Algo.Strategies.Strategy.#=qxo2T0sDreIkxakECYZYbbA==(IStrategyRule #=qV94l1yQlEBjJ4u0D0$xIQA==, Func`1 #=q2Ngt1CMo$4x1_NRoZYzWlw==)

Предупреждение: регистрация привязки сборок выключена. Чтобы включить регистрацию ошибок привязки сборок, установите значение параметра реестра [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) в 1. Примечание. Регистрация ошибок привязки сборок может привести к некоторому снижению производительности. Чтобы отключить эту функцию, удалите параметр реестра [HKLM\Software\Microsoft\Fusion!EnableLog].

10:00:00.000 | | ... | Стратегия останавливается. 10:00:00.000 | Error | EmulationTrader | System.BadImageFormatException: Невозможно загрузить файл или сборку "StockSharp.Smart, Version=4.0.23.0, Culture=neutral, PublicKeyToken=null" или один из зависимых от них компонентов. Была сделана попытка загрузить программу, имеющую неверный формат. Имя файла: "StockSharp.Smart, Version=4.0.23.0, Culture=neutral, PublicKeyToken=null" в SampleHistoryTesting.SmaStrategy.OnProcess() в StockSharp.Algo.Strategies.TimeFrameStrategy.#=qZ7PT1v9STzIIBySDYht1xJhX_1t7NIqAu0OWio95UGY=() в StockSharp.Algo.Strategies.Strategy.#=q8MiGfL3WivuJhedkH9mlpxw3NIibLyQ$271VPSAha9g=(ProcessStates #=q8$qI6ivL1iYvibB0_IvSBw==) в StockSharp.Algo.Strategies.Strategy.#=qxo2T0sDreIkxakECYZYbbA==(IStrategyRule #=qV94l1yQlEBjJ4u0D0$xIQA==, Func`1 #=q2Ngt1CMo$4x1_NRoZYzWlw==) в System.Action.Invoke() в StockSharp.Algo.Testing.EmulationTrader.#=qCGdM8sQLMNb9D_j8ZApFfQ==()

Предупреждение: регистрация привязки сборок выключена. Чтобы включить регистрацию ошибок привязки сборок, установите значение параметра реестра [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) в 1. Примечание. Регистрация ошибок привязки сборок может привести к некоторому снижению производительности. Чтобы отключить эту функцию, удалите параметр реестра [HKLM\Software\Microsoft\Fusion!EnableLog].

У меня три вопроса:

  1. Это лечится? И если да, то как?
  2. Если не лечится, то как иначе можно выставить стоп-ордер с исполнением по рынку.
  3. Можно ли в Таймфрейм-стратегии выставлять правила типа this.When().Do();?
Mikhail Sukhov
Mikhail Sukhov

Кот Матроскин:

Несовпадение битности.

Кот Матроскин
Кот Матроскин

Хм... А если чтоб понятно было)))?

Кот Матроскин
Кот Матроскин

Поменял стоп-ордер с исполнением по рынку на стоп-лимит, вылезает то же самое исключение BadImageFormatException. Похоже, что вообще со стоп-ордерами какой-то непорядок...

esper
esper

Вероятно, что основное приложение у вас x64, а смартовский коннектор x86, поэтому вылетает это исключение. И тестер ранее не поддерживал стоп-заявки, скорее всего и сейчас не поддерживает.

Кот Матроскин
Кот Матроскин

А как-нибудь лечится?

esper
esper

Изменением Platform Target на x86 в свойствах проекта

Кот Матроскин
Кот Матроскин
Кот Матроскин

Спасибо за подсказки! Ох и помаялся, пока нашел, где в Visual C# 2010 Express можно поменять AnyCPU на x86)))) BadImageFormatException больше не появляется. Но вылезла новая проблема: ArgumentException

14:30:00.000 | | EmulationTrader | OnProcess: 28.04.2012 17:00:24.148 PnL = 0 14:30:00.000 | | EmulationTrader | RegisterOrder: TransactionId=61213539, Id=0, Price=0, Balance=1, Security=SBER@EQBR, State=None 14:30:00.990 | | EmulationTrader | New order: TransactionId=61213539, Id=1, Price=0, Balance=1, Security=SBER@EQBR, State=Active 14:30:00.990 | Error | EmulationTrader | System.ArgumentException: Стоп-заявки не могут иметь реализованный объем. Имя параметра: order в StockSharp.Algo.TraderHelper.GetMatchedVolume(Order order) в StockSharp.Algo.TraderHelper.GetPosition(Order order) в StockSharp.Algo.Testing.EmulationTrader.#=q_7aAU8b_zEypCQ8s7GI9rucncBvXzAN_LW7DIugCEGA=.#=q1Ehw5NVz5qQudEX$OPx_WI5IMzAHUYsMUkc9dR9UJ9E=(Position #=qT5lumkkYLnDIqrM8CbtkoQ==) в StockSharp.Algo.BaseTrader.GetPosition(Portfolio portfolio, Security security, Func3 createPosition, Action1 changePosition) в StockSharp.Algo.BaseTrader.GetPosition(Portfolio portfolio, Security security, Action1 changePosition) в StockSharp.Algo.Testing.EmulationTrader.#=qKccLf2wuZwfZbL1C7cjImw==(Order #=qrTNaO4Nib9BUygvpQrDnUg==) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.Testing.MarketEmulator.#=qUhv25xUz4s7MvC8VgEsQvQ==(LinkedListNode1 #=qmTTURhdw0uY5Y3xHDagFnQ==) И тут же в догонку вылезло следующее исключение: NotImplementedException 14:30:01.000 | Error | EmulationTrader | System.NotImplementedException: Метод или операция не реализована. в StockSharp.BusinessEntities.StopCondition.TryActivate(MarketDepth depth) в StockSharp.Algo.Testing.MarketEmulator.#=qCAhc4yiwP_SZxXRczpuhqET6igMTZMTj5wR7r28M7zE=(Order #=qc2Wk9Bom9Xj1I5fl8ZjWEQ==) в StockSharp.Algo.Testing.MarketEmulator.#=qUhv25xUz4s7MvC8VgEsQvQ==(LinkedListNode1 #=qmTTURhdw0uY5Y3xHDagFnQ==) Стал разбираться, и наткнулся на форуме, что класс EmulationTrader не поддерживает работу со стоп-заявками. Эти два исключения из-за этого? И предыдущие два вопроса еще актуальны:

  1. Если не лечится, то как иначе можно выставить стоп-ордер с исполнением по рынку.
  2. Можно ли в Таймфрейм-стратегии выставлять правила типа this.When().Do();?
alpha
alpha

Alexander Mukhanchikov,

Почему появляются сообщения подобные "#=q_7aAU8b_zEypCQ8s7GI9rucncBvXzAN_LW7DIugCEGA=.#=q1Ehw5NVz5qQudEX$OPx_WI5IMzAHUYsMUkc9dR9UJ9E=" (интересует не причина, а само название)? вы сами дали такие названия? Как узнать что под собой подразумевают подобные "кодировки"?

Alexander
Alexander

alpha: Alexander Mukhanchikov,

Почему появляются сообщения подобные "#=q_7aAU8b_zEypCQ8s7GI9rucncBvXzAN_LW7DIugCEGA=.#=q1Ehw5NVz5qQudEX$OPx_WI5IMzAHUYsMUkc9dR9UJ9E=" (интересует не причина, а само название)? вы сами дали такие названия? Как узнать что под собой подразумевают подобные "кодировки"?

Да, нам такие названия понятнее. Удобнее находить ошибку. А зачем знать что под собой подразумевают данные названия? Вы с ними сталкиваться вообще не должны

alpha
alpha

Alexander Mukhanchikov:

alpha: Alexander Mukhanchikov,

Почему появляются сообщения подобные "#=q_7aAU8b_zEypCQ8s7GI9rucncBvXzAN_LW7DIugCEGA=.#=q1Ehw5NVz5qQudEX$OPx_WI5IMzAHUYsMUkc9dR9UJ9E=" (интересует не причина, а само название)? вы сами дали такие названия? Как узнать что под собой подразумевают подобные "кодировки"?

Да, нам такие названия понятнее. Удобнее находить ошибку. А зачем знать что под собой подразумевают данные названия? Вы с ними сталкиваться вообще не должны

Человек выше уже столкнулся. Мой интерес - исключительно любопытство. А чем вы их генерите? Или сами придумываете?

Честно говоря не понимаю как такие названия могут помогать. Это все равно, что на Brainfuck писать)

Alexander
Alexander

Это обфускация на самом деле.

Человек выше столкнулся т.к. получил exception

alpha
alpha

Alexander Mukhanchikov: Это обфускация на самом деле.

Человек выше столкнулся т.к. получил exception

Если это была бы платная библиотека, то понятно. Но зачем защита в бесплатной?

alpha
alpha

Alexander Mukhanchikov

Я правильно понимаю, что посмотреть исходники обфусцированных библиотек не получится или их можно достать?

Alexander
Alexander

alpha: Alexander Mukhanchikov

Я правильно понимаю, что посмотреть исходники обфусцированных библиотек не получится или их можно достать?

Есть 2 варианта:

  1. покупка исходников;
  2. большая оказанная помощь для библиотеки, за это подключение к закрытому TFS и, соответственно, доступ к исходникам.

И по первому, и по второму пункту - обращайтесь в скайп, amukhanchikov.

Андрей Александрович

У меня возникла немного иная проблема при попытке создать StopOrder с исполнением по рыночной цене. Никаких ошибок не происходит, но стоп-заявка в SmartTrade регистрируется как лимитированная заявка с ценой равной 150000 при наступлении цены 150000, вместо ожидаемой цены исполнения MARKET при наступленни цены 150000 (т.е. регистрируется STOP-LIMIT вместо нужной заявки STOP, хотя в документации сказано что при Order.Price = 0 тип заяки должен получиться STOP) Версия 4.1.2

var stoporder = new Order
{
  Portfolio = Portfolio,
  Type = OrderTypes.Conditional,
  Volume = 1,
  Price = 0,
  Security = Security,
  Direction = OrderDirections.Buy,
  StopCondition = new SmartStopCondition {StopPrice = 150000};
}
 
trader.RegisterOrder(stoporder);
Mikhail Sukhov
Mikhail Sukhov

Андрей Александрович: Никаких ошибок не происходит, но стоп-заявка в SmartTrade регистрируется как лимитированная заявка с ценой равной 150000 при наступлении цены 150000, вместо ожидаемой цены исполнения MARKET при наступленни цены 150000

Мне сложно понять, что здесь написано (то ли пропущены какие-то части предложение, то ли знаки препинания расставлены хаотично)... Попытаюсь задать наводящий вопрос. Понятно, что стоп-заявка - это не лимитированная заявка и какие между ними существуют различия?

Андрей Александрович

Терминал SmartTrade поддерживает два типа стоп заявок: STOP и STOP-LIMIT (как показано на скриншоте на первой странице данной темы). Более актуальными являются заявки типа STOP с исполнением по рынку. в документации сказано что при Order.Price = 0 тип заяки должен получаться STOP, а на деле получается STOP-LIMIT с ценой исполнения равной стоп-цене (150000 в случае описанном во фрагменте кода) . Это не вызывает серьезных трудностей поскольку можно указать цену исполнения STOP-LIMIT при которой разницы с исполнением по рынку не будет. Не думаю что способен объяснить намного лучше и на мой взгляд гораздо более продуктивным с вашей стороны было бы уделить минутку и попробовать поставить заявку с типом STOP способом который описан в документации самим. У меня этого не получилось хотя я всё делал в точности как в примере и решил что будет полезно сообщить об этом авторам. Хотя донести информацию не всегда бывает легко...

Mikhail Sukhov
Mikhail Sukhov

Вот наш код конвертации в Смарт типы

public static StOrder_Type GetSmartOrderType(this Order order)
{
	if (order == null)
		throw new ArgumentNullException("order");

	switch (order.Type)
	{
		case OrderTypes.Limit:
			return StOrder_Type.StOrder_Type_Limit;
		case OrderTypes.Market:
			return StOrder_Type.StOrder_Type_Market;
		case OrderTypes.Conditional:
			return order.Price != 0 ? StOrder_Type.StOrder_Type_StopLimit : StOrder_Type.StOrder_Type_Stop;
		default:
			throw new ArgumentOutOfRangeException("order");
	}
}

Почему заявка отправляется не как стоп, а как стоп-лимит - не понятно. В примере SampleSmart так же? Если да, то надо отписывать в АйТи.