4.1.3 Не удаляется собственное правило правило~/topic/2956/4_1_3-ne-udalyaetsya-sobstvennoe-pravilo-pravilo/Copyright @ StockSharp Platform LLC 2010 - 20242024-03-29T02:25:52Zhttps://stocksharp.ru/images/logo.pnghttps://stocksharp.ru/posts/m/21046/ Ответ был дан выше Остальные подробности - обращайтесь в ТП К сожалению я не получил ответа который...2012-08-27T02:53:48Z2016-08-16T00:08:44ZPavelAdhttps://stocksharp.ru/users/6072/info@stocksharp.ru<div class="quote"><span class="quotetitle">Alexander Mukhanchikov <a href="https://stocksharp.ru/posts/m/21035/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><br /><a href="http://stocksharp.com/posts/m/20975/" title="http://stocksharp.com/posts/m/20975/">Ответ был дан выше</a><br />Остальные подробности - обращайтесь в ТП</div></div><br /><br />[confused]К сожалению я не получил ответа который бы помог разобраться в причине...<br />Поэтому привел более подробное описание.<br />Не видя как реализовано удаление правил, осталось только мое предположение - что проблема связана с введением токенов.<br /><br />вопросы из предыдущих постов: <br /><div class="quote"><span class="quotetitle">Цитата:</span><div class="innerquote">1. Можно ли как-то поменять токен у ранее созданного правила?<br />2. Если сейчас никак нельзя, возможно ли добавить поддержку подобного механизма в будущих версиях S#?<br /><br />используется ли токен при удалении правила через Rules.Remove?<br /></div></div><br />тоже остались не отвеченнымиCopyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/21035/ У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочи...2012-08-26T14:06:47Z2016-08-16T00:08:43ZAlexanderhttps://stocksharp.ru/users/2826/info@stocksharp.ru<div class="quote"><span class="quotetitle">PavelAd <a href="https://stocksharp.ru/posts/m/20978/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><div class="quote"><span class="quotetitle">Mikhail Sukhov <a href="https://stocksharp.ru/posts/m/20977/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><br />У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.</div></div><br /><br /><br />Привожу более точный код:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
IMarketRule ChangeStopOrderRule;
Order StopOrder;
// Здесь первоначально создаем стоп заявку и правило
public void PrepareStopOrder(OrderDirections direction) {
...
StopOrder = this.CreateOrder(direction, stopPrice, Volume);
ChangeStopOrderRule = StopOrder.WhenIndicatorChanged(Indicator).Do(RePrepareStopOrder).Apply(this);
RegisterOrder(StopOrder);
}
// Здесь перевыставляем стоп заявку, когда изменился индикатор
private void RePrepareStopOrder(Order oldStopOrder) {
...
var newStopOrder = oldStopOrder.Clone();
newStopOrder.Price = newStopPrice;
((QuikStopCondition) newStopOrder.StopCondition).StopPrice = newActivatePrice;
...
ChangeStopOrderRule.ChangeOrder(newStopOrder); // Заменяем заявку в правиле
ReRegisterOrder(oldStopOrder, newStopOrder);
StopOrder = newStopOrder;
}
// Вызывается при полном исполнении профит заявки
private void ProfitOrderMatched(Order profitOrder) {
// Когда исполнен профит, отменяем стоп заявку и удаляем правило
Trader.CancelOrder(StopOrder);
Rules.Remove(ChangeStopOrderRule); // Здесь получаю исключение
}
</pre>
</div></div><br /><br />Стоп-заявка перевыставляется каждый раз с новой ценой когда меняется индикатор. В методе переподготовки RePrepareStopOrder<br />вызывается ChangeStopOrderRule.ChangeOrder(newStopOrder) для замены заявки в правиле (чтобы следующий раз когда сработает правило передавалась уже новая заявка)<br />Если после одного перевыставления стоп заявки вдруг сработал профит, то в методе ProfitOrderMatched при удалении правила и получаю вышеуказанное исключение.<br />Как я предполагаю из-за того что в правиле токен продолжает смотреть на первоначальную стоп заявку.<br /><br />Михаил подскажите, при удалении через Rules.Remove все равно используется токен?</div></div><br /><br /><br /><a href="http://stocksharp.com/posts/m/20975/" title="http://stocksharp.com/posts/m/20975/">Ответ был дан выше</a><br />Остальные подробности - обращайтесь в ТПCopyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/20978/ У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочи...2012-08-23T10:16:50Z2012-08-23T10:20:14ZPavelAdhttps://stocksharp.ru/users/6072/info@stocksharp.ru<div class="quote"><span class="quotetitle">Mikhail Sukhov <a href="https://stocksharp.ru/posts/m/20977/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><br />У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.</div></div><br /><br /><br />Привожу более точный код:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
IMarketRule ChangeStopOrderRule;
Order StopOrder;
// Здесь первоначально создаем стоп заявку и правило
public void PrepareStopOrder(OrderDirections direction) {
...
StopOrder = this.CreateOrder(direction, stopPrice, Volume);
ChangeStopOrderRule = StopOrder.WhenIndicatorChanged(Indicator).Do(RePrepareStopOrder).Apply(this);
RegisterOrder(StopOrder);
}
// Здесь перевыставляем стоп заявку, когда изменился индикатор
private void RePrepareStopOrder(Order oldStopOrder) {
...
var newStopOrder = oldStopOrder.Clone();
newStopOrder.Price = newStopPrice;
((QuikStopCondition) newStopOrder.StopCondition).StopPrice = newActivatePrice;
...
ChangeStopOrderRule.ChangeOrder(newStopOrder); // Заменяем заявку в правиле
ReRegisterOrder(oldStopOrder, newStopOrder);
StopOrder = newStopOrder;
}
// Вызывается при полном исполнении профит заявки
private void ProfitOrderMatched(Order profitOrder) {
// Когда исполнен профит, отменяем стоп заявку и удаляем правило
Trader.CancelOrder(StopOrder);
Rules.Remove(ChangeStopOrderRule); // Здесь получаю исключение
}
</pre>
</div></div><br /><br />Стоп-заявка перевыставляется каждый раз с новой ценой когда меняется индикатор. В методе переподготовки RePrepareStopOrder<br />вызывается ChangeStopOrderRule.ChangeOrder(newStopOrder) для замены заявки в правиле (чтобы следующий раз когда сработает правило передавалась уже новая заявка)<br />Если после одного перевыставления стоп заявки вдруг сработал профит, то в методе ProfitOrderMatched при удалении правила и получаю вышеуказанное исключение.<br />Как я предполагаю из-за того что в правиле токен продолжает смотреть на первоначальную стоп заявку.<br /><br />Михаил подскажите, при удалении через Rules.Remove все равно используется токен?Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/20977/ Это перестало работать после введения токенов для правила. Что обидно У меня выше написанный код ра...2012-08-23T09:29:21Z2012-08-23T09:29:21ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ru<div class="quote"><span class="quotetitle">PavelAd <a href="https://stocksharp.ru/posts/m/20976/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><br />Это перестало работать после введения токенов для правила. Что обидно [crying] <br /></div></div><br /><br />У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/20976/Проблема возникает после вызова собственного метода ChangeOrder() для правила. Этот метод у меня выз...2012-08-23T09:20:47Z2012-08-23T09:20:47ZPavelAdhttps://stocksharp.ru/users/6072/info@stocksharp.ruПроблема возникает после вызова собственного метода ChangeOrder() для правила.<br />Этот метод у меня вызывается при перевыставлении заявки по условию, для того чтобы изменить ссылку на заявку в правиле без пересоздания самого правила в целях экономии ресурсов и времени.<br />Это перестало работать после введения токенов для правила. Что обидно [crying] <br /><br />Вопрос к разработчикам: <br />1. Можно ли как-то поменять токен у ранее созданного правила?<br />2. Если сейчас никак нельзя, возможно ли добавить поддержку подобного механизма в будущих версиях S#?<br /><br /><br />Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/20975/Эта тема, за последние несколько дней, поднималась пару раз минимум. Смотрим в поиске или документац...2012-08-23T09:15:55Z2012-08-23T09:15:55Zesperhttps://stocksharp.ru/users/5990/info@stocksharp.ruЭта тема, за последние несколько дней, поднималась пару раз минимум. Смотрим в поиске или <a href="http://stocksharp.com/doc/html/12ef8365-1bd1-426d-afc5-5eee33d554a6.htm" title="http://stocksharp.com/doc/html/12ef8365-1bd1-426d-afc5-5eee33d554a6.htm">документацию</a>.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/20974/При попытке удалить собственное правило получаю исключение: System.InvalidOperationException не обра...2012-08-23T08:57:58Z2012-08-23T09:03:10ZPavelAdhttps://stocksharp.ru/users/6072/info@stocksharp.ruПри попытке удалить собственное правило получаю исключение:<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><div class="innerquote">System.InvalidOperationException не обработано пользовательским кодом<br /> Message=Правило не зарегистрировано в контейнере TS_RIU2@RTS_SPBFUT010Lt.<br /> Source=StockSharp.Algo<br /> StackTrace:<br /> в #=qB2ExCNEQw8oj77e3UN$lsGXd9IM$6dAY$FrsPtHePsc=.OnRemoving(IMarketRule #=ql0zRQV$KEbPTptc25u4ShA==)<br /> в Ecng.Collections.BaseCollection`2.Remove(TItem item)<br /> в Ecng.Collections.SynchronizedCollection`2.Remove(TItem item)<br /> в TradeStrategy.TresureStrategy.RemoveOrderRules(Order order) в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 1630<br /> в TradeStrategy.TresureStrategy.StopOrderOnSignalBarFound(Order stopOrder, Candle signalCandle) в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 1116<br /> в TradeStrategy.TresureStrategy.<PrepareStopOrder>b__23(Order o) в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 872<br /> в StockSharp.Algo.MarketRule`2.#=qn2RvSblijBybYyyfWKcy1_hs9OJvieXgUlAwEKJ7QG4=()<br /> в StockSharp.Algo.MarketRuleHelper.#=qO_5nYqG02u$qDVGuIGBcPw==(IMarketRuleContainer #=q6WtW4HdAsVTLateaVJyxUg==, IMarketRule #=qXKycGTf2ej0HKdDUPJVrlQ==, Func`1 #=qUHVCmgydNCLfZ5O8NP$PBg==)<br /> в StockSharp.Algo.Strategies.Strategy.#=qCypqGMSO_x8SPWJDIPw__UD8vJqmRZyixTy_v9o8CHprIFRlcm3cJQXa6UL4cY1T9Cm2VTpAHQA6L2x1piL2jw==(IMarketRule #=q3eSZx6_yVLksnYZxrbPPbA==, Func`1 #=qDQNtK0bpCquD2$1aKN0h3w==)<br /> InnerException: <br /></div></div><br /><br />Код приводящий к ошибке:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
IMarketRule ChangeStopOrderRule = stopOrder.WhenIndicatorChanged(Indicator).Do(RePrepareOrder).Apply(this);
...
Rules.Remove(ChangeStopOrderRule); // Здесь получаю исключение
</pre>
</div></div><br /><br />Код правила:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public sealed class OrderChangeRule : MarketRule<Order, Order> {
private readonly Func<Order, bool> _changed;
private Order _order;
private readonly BaseIndicator<decimal> _indicator;
public OrderChangeRule(BaseIndicator<decimal> indicator, Order order, Func<Order, bool> changed) : base(order) {
if (indicator == null)
throw new ArgumentNullException("indicator");
if (order == null)
throw new ArgumentNullException("order");
if (changed == null)
throw new ArgumentNullException("changed");
_indicator = indicator;
_order = order;
_changed = changed;
_indicator.Changed += OnIndicatorChanged;
}
private void OnIndicatorChanged(IIndicatorValue v1, IIndicatorValue v2) {
if (_changed != null && _changed(_order))
Activate(_order);
}
// Замена заявки для которой первоначально создано правило. Необходимо для возможности замены заявки без пересоздания правила
public void ChangeOrder(Order newOrder) {
_order = newOrder;
}
protected override void DisposeManaged() {
_indicator.Changed -= OnIndicatorChanged;
base.DisposeManaged();
}
}
public static class OrderChangeRuleHelper {
public static MarketRule<Order, Order> WhenIndicatorChanged(this Order order, BaseIndicator<decimal> indicator, Func<Order, bool> changed = null) {
if (indicator == null)
throw new ArgumentNullException("indicator");
if (order == null)
throw new ArgumentNullException("order");
return new OrderChangeRule(indicator, order, changed);
}
}
</pre>
</div></div><br /><br />Это ошибка? или что-то я делаю не так<br /><br />в 4.1.2 все отрабатывало нормальноCopyright @ StockSharp Platform LLC 2010 - 2024