Trading algorítmico para .NET e Python✦86+ conectores · bolsas · corretoras · cripto✦S#.Designer · backtest · otimizar · ao vivo✦Uma comunidade de 31,456+ traders e desenvolvedores✦Trading algorítmico para .NET e Python✦86+ conectores · bolsas · corretoras · cripto✦S#.Designer · backtest · otimizar · ao vivo✦Uma comunidade de 31,456+ traders e desenvolvedores✦
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
}
Если это фортс, то на фортсе рыночных заявок нет.
Пользуйтесь или котированием, либо заявками с ценой равной ценой лимита по инструменту.
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
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 пока руки не дошли.
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:
Здравствуйте!
Возникла очень похожая проблемы. А именно: тестирую в 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].
У меня три вопроса:
Это лечится? И если да, то как?
Если не лечится, то как иначе можно выставить стоп-ордер с исполнением по рынку.
Можно ли в Таймфрейм-стратегии выставлять правила типа this.When().Do();?
Поменял стоп-ордер с исполнением по рынку на стоп-лимит, вылезает то же самое исключение BadImageFormatException. Похоже, что вообще со стоп-ордерами какой-то непорядок...
Вероятно, что основное приложение у вас x64, а смартовский коннектор 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 не поддерживает работу со стоп-заявками. Эти два исключения из-за этого?
И предыдущие два вопроса еще актуальны:
Если не лечится, то как иначе можно выставить стоп-ордер с исполнением по рынку.
Можно ли в Таймфрейм-стратегии выставлять правила типа this.When().Do();?
Почему появляются сообщения подобные "#=q_7aAU8b_zEypCQ8s7GI9rucncBvXzAN_LW7DIugCEGA=.#=q1Ehw5NVz5qQudEX$OPx_WI5IMzAHUYsMUkc9dR9UJ9E=" (интересует не причина, а само название)? вы сами дали такие названия? Как узнать что под собой подразумевают подобные "кодировки"?
Почему появляются сообщения подобные "#=q_7aAU8b_zEypCQ8s7GI9rucncBvXzAN_LW7DIugCEGA=.#=q1Ehw5NVz5qQudEX$OPx_WI5IMzAHUYsMUkc9dR9UJ9E=" (интересует не причина, а само название)? вы сами дали такие названия? Как узнать что под собой подразумевают подобные "кодировки"?
Да, нам такие названия понятнее. Удобнее находить ошибку.
А зачем знать что под собой подразумевают данные названия? Вы с ними сталкиваться вообще не должны
Почему появляются сообщения подобные "#=q_7aAU8b_zEypCQ8s7GI9rucncBvXzAN_LW7DIugCEGA=.#=q1Ehw5NVz5qQudEX$OPx_WI5IMzAHUYsMUkc9dR9UJ9E=" (интересует не причина, а само название)? вы сами дали такие названия? Как узнать что под собой подразумевают подобные "кодировки"?
Да, нам такие названия понятнее. Удобнее находить ошибку.
А зачем знать что под собой подразумевают данные названия? Вы с ними сталкиваться вообще не должны
Человек выше уже столкнулся. Мой интерес - исключительно любопытство. А чем вы их генерите? Или сами придумываете?
Честно говоря не понимаю как такие названия могут помогать. Это все равно, что на Brainfuck писать)
У меня возникла немного иная проблема при попытке создать 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);
Андрей Александрович:
Никаких ошибок не происходит, но стоп-заявка в SmartTrade регистрируется как лимитированная заявка с ценой равной 150000 при наступлении цены 150000, вместо ожидаемой цены исполнения MARKET при наступленни цены 150000
Мне сложно понять, что здесь написано (то ли пропущены какие-то части предложение, то ли знаки препинания расставлены хаотично)... Попытаюсь задать наводящий вопрос. Понятно, что стоп-заявка - это не лимитированная заявка и какие между ними существуют различия?
Терминал SmartTrade поддерживает два типа стоп заявок: STOP и STOP-LIMIT (как показано на скриншоте на первой странице данной темы). Более актуальными являются заявки типа STOP с исполнением по рынку. в документации сказано что при Order.Price = 0 тип заяки должен получаться STOP, а на деле получается STOP-LIMIT с ценой исполнения равной стоп-цене (150000 в случае описанном во фрагменте кода) . Это не вызывает серьезных трудностей поскольку можно указать цену исполнения STOP-LIMIT при которой разницы с исполнением по рынку не будет. Не думаю что способен объяснить намного лучше и на мой взгляд гораздо более продуктивным с вашей стороны было бы уделить минутку и попробовать поставить заявку с типом STOP способом который описан в документации самим. У меня этого не получилось хотя я всё делал в точности как в примере и решил что будет полезно сообщить об этом авторам. Хотя донести информацию не всегда бывает легко...
Comentários (29)
Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário
Анализируем последнюю цену. Если она <= (>=) 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 }
Брокер позволяет делать такие заявки
в Stock#.chm в главе SmartCom написано
На практике получается, что при Order.Price = 0, тип ордера остается OrderTypes.Limit. Из-за чего Смартком ругается о невозможности лимитированной заявки с ценой 0
Как такое может быть, если в коде явно устанавливается Conditional?
Я так выразился согласно написанному в Stock#.chm глава SmartCom -> Стоп-заявки (я уже цитировал выше):
Но при указании Order.Price = 0 в момент RegisterOrder вылетает исключение
Следовательно как мне кажется в реализации RegisterOrder должным образом не происходит проверка Order.Price == 0. Либо стоп с исполнением по маркету задается другим способом, нежели как представлено в примере. К сожалению проверить это с помощью SmartCOMWrappera пока руки не дошли.
Но при указании Order.Price = 0 в момент RegisterOrder вылетает исключение
В примере (который вы же и привели), все настройки указаны правильно. А вот вы почему то этим рекомендациям следовать отказываетесь.😂
Насколько я понял происходит примерно следующее.
Создаётся стоп заявка:
и ожидается, что при достижении цены 198 у нас пошлётся заявка по рынку, но этого не происходит.
немного другая ситуация. При выполнении кода
программа вылетает с эксепшн
Раз вы явно устанавливаете Order.Type, то бага в S#. Ок, посмотрю в чем дело.
Здравствуйте! Возникла очень похожая проблемы. А именно: тестирую в EmulationTrader стратегию, решил поменять маркет-ордер на стоп-ордер (с исполнением по рынку), код такой:
Цена Price = 0, как в документации по Смарту. В итоге получил следующий Exception:
У меня три вопроса:
Несовпадение битности.
Хм... А если чтоб понятно было)))?
Поменял стоп-ордер с исполнением по рынку на стоп-лимит, вылезает то же самое исключение BadImageFormatException. Похоже, что вообще со стоп-ордерами какой-то непорядок...
Вероятно, что основное приложение у вас x64, а смартовский коннектор x86, поэтому вылетает это исключение. И тестер ранее не поддерживал стоп-заявки, скорее всего и сейчас не поддерживает.
А как-нибудь лечится?
Изменением Platform Target на x86 в свойствах проекта
Спасибо за подсказки! Ох и помаялся, пока нашел, где в Visual C# 2010 Express можно поменять AnyCPU на x86)))) BadImageFormatException больше не появляется. Но вылезла новая проблема: ArgumentException
Alexander Mukhanchikov,
Почему появляются сообщения подобные "#=q_7aAU8b_zEypCQ8s7GI9rucncBvXzAN_LW7DIugCEGA=.#=q1Ehw5NVz5qQudEX$OPx_WI5IMzAHUYsMUkc9dR9UJ9E=" (интересует не причина, а само название)? вы сами дали такие названия? Как узнать что под собой подразумевают подобные "кодировки"?
Да, нам такие названия понятнее. Удобнее находить ошибку. А зачем знать что под собой подразумевают данные названия? Вы с ними сталкиваться вообще не должны
Человек выше уже столкнулся. Мой интерес - исключительно любопытство. А чем вы их генерите? Или сами придумываете?
Честно говоря не понимаю как такие названия могут помогать. Это все равно, что на Brainfuck писать)
Это обфускация на самом деле.
Человек выше столкнулся т.к. получил exception
Если это была бы платная библиотека, то понятно. Но зачем защита в бесплатной?
Alexander Mukhanchikov
Я правильно понимаю, что посмотреть исходники обфусцированных библиотек не получится или их можно достать?
Есть 2 варианта:
И по первому, и по второму пункту - обращайтесь в скайп, amukhanchikov.
У меня возникла немного иная проблема при попытке создать StopOrder с исполнением по рыночной цене. Никаких ошибок не происходит, но стоп-заявка в SmartTrade регистрируется как лимитированная заявка с ценой равной 150000 при наступлении цены 150000, вместо ожидаемой цены исполнения MARKET при наступленни цены 150000 (т.е. регистрируется STOP-LIMIT вместо нужной заявки STOP, хотя в документации сказано что при Order.Price = 0 тип заяки должен получиться STOP) Версия 4.1.2
Мне сложно понять, что здесь написано (то ли пропущены какие-то части предложение, то ли знаки препинания расставлены хаотично)... Попытаюсь задать наводящий вопрос. Понятно, что стоп-заявка - это не лимитированная заявка и какие между ними существуют различия?
Терминал SmartTrade поддерживает два типа стоп заявок: STOP и STOP-LIMIT (как показано на скриншоте на первой странице данной темы). Более актуальными являются заявки типа STOP с исполнением по рынку. в документации сказано что при Order.Price = 0 тип заяки должен получаться STOP, а на деле получается STOP-LIMIT с ценой исполнения равной стоп-цене (150000 в случае описанном во фрагменте кода) . Это не вызывает серьезных трудностей поскольку можно указать цену исполнения STOP-LIMIT при которой разницы с исполнением по рынку не будет. Не думаю что способен объяснить намного лучше и на мой взгляд гораздо более продуктивным с вашей стороны было бы уделить минутку и попробовать поставить заявку с типом STOP способом который описан в документации самим. У меня этого не получилось хотя я всё делал в точности как в примере и решил что будет полезно сообщить об этом авторам. Хотя донести информацию не всегда бывает легко...
Вот наш код конвертации в Смарт типы
Почему заявка отправляется не как стоп, а как стоп-лимит - не понятно. В примере SampleSmart так же? Если да, то надо отписывать в АйТи.