Alexander
|
Дата: 10.11.2012
vk37 Alexander Mukhanchikov Ап. Или уже не актуально? Пока работаю на предыдущей версии. Есть слабая надежда, что как-то все само сабой исправиться ) Продублирую вопрос - Какой код нужно дописать в пример, чтобы увидеть разницу между версиями 4 и 6? Без ответа на этот вопрос вряд ли что-то исправится.
|
|
Спасибо:
|
|
|
|
|
vk37
|
Дата: 10.11.2012
Так ведь это ж исследовать надо. Не знаю какой код. Потом у вас пример со свечами, а у меня со стаканами.
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 10.11.2012
vk37 Alexander Mukhanchikov Ап. Или уже не актуально? Пока работаю на предыдущей версии. Есть слабая надежда, что как-то все само сабой исправиться ) Судя по всему, проблема в вашем коде. То, что начало тормозить на новой версии, еще не означает ошибку S#. Возможно, раньше не было каких-то алгоритмов, которые появились в последних версиях и в вашем случае начали использоваться в роботе. Думаю багу можно закрывать.
|
|
Спасибо:
|
|
|
|
|
vk37
|
Дата: 18.11.2012
|
|
|
|
Торможение стало происходить из-за работы дочерней стратегии. Что-то не так с синхронизацией? Дочерняя стратегия: Код
using System.Collections.Concurrent;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
namespace AlgoTrading.SpeedTest
{
public class MyQuotingStrategy : Strategy
{
private readonly ConcurrentStack<Order> _orders = new ConcurrentStack<Order>();
private readonly OrderDirections _orderDirection;
private readonly Unit _startPrice;
private readonly Unit _offset;
private readonly object _locker = new object();
private bool _canCancel;
public MyQuotingStrategy(OrderDirections orderDirection, Unit price, Unit offset)
{
_orderDirection = orderDirection;
_startPrice = price;
_offset = offset;
}
protected override void OnStarted()
{
Security
.WhenMarketDepthChanged()
.Do(depth =>
{
Order order;
_orders.TryPeek(out order);
if (order != null && order.State == OrderStates.Active && _canCancel)
{
var cancelOrder = _orderDirection == OrderDirections.Buy && depth.BestBid != null &&
depth.BestBid.Price > order.Price || _orderDirection == OrderDirections.Sell && depth.BestAsk != null &&
depth.BestAsk.Price < order.Price;
if (cancelOrder)
{
_canCancel = false;
order.WhenCanceled().Do(o => RegisterNew(o.Balance,
_orderDirection == OrderDirections.Buy
? new Unit(depth.BestBid.Price, UnitTypes.Absolute, Security)
: new Unit(depth.BestAsk.Price, UnitTypes.Absolute, Security)))
.Once()
.Sync(_locker)
.Apply(this);
CancelOrder(order);
}
}
})
.Sync(_locker)
.Apply(this);
RegisterNew(Volume, _startPrice);
base.OnStarted();
}
private void RegisterNew(decimal volume, Unit price)
{
var order = new Order()
{
Direction = _orderDirection,
Price = price.ApplyOffset(_orderDirection, _offset),
Volume = volume,
};
order.WhenRegistered().Do(o => _canCancel = true )
.Once()
.Sync(_locker)
.Apply(this);
order.WhenMatched().Do(o => Stop())
.Once()
.Sync(_locker)
.Apply(this);
RegisterOrder(order);
_orders.Push(order);
}
}
}
Вызов дочерней стратегии из основной: Код
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
namespace AlgoTrading.SpeedTest
{
public class MarketDepthSkeleton : Strategy
{
private OrderDirections? _orderDirection;
private bool _canProcess = true;
private readonly object _locker = new object();
protected override void OnStarted()
{
Security
.WhenMarketDepthChanged()
.Do(ProcessDepth)
.Sync(_locker)
.Apply(this);
base.OnStarted();
}
private void ProcessDepth(MarketDepth depth)
{
if (Security.BestAsk == null || Security.BestBid == null)
return;
if (_canProcess)
{
_canProcess = false;
_orderDirection = _orderDirection.HasValue ? _orderDirection.Value.Invert() : OrderDirections.Buy;
var price = depth.GetCurrentPrice(_orderDirection.Value).Value;
var strategy = new MyQuotingStrategy(_orderDirection.Value,
new Unit(price, UnitTypes.Absolute, Security),
new Unit(1, UnitTypes.Step, Security)) { Volume = Volume };
strategy.WhenStopped().Do(() => _canProcess = true).Once().Sync(_locker).Apply(this);
ChildStrategies.Add(strategy);
}
}
}
}
|
|
Спасибо:
|
|
|
|
|
vk37
|
Дата: 19.11.2012
Да скорость снизилась из-за работы дочерней стратегии. Отказался пока от использования дочерних стратегий: котирование встроил в основную стратегию. Скорость стала прежней.
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 19.11.2012
vk37 Да скорость снизилась из-за работы дочерней стратегии. Отказался пока от использования дочерних стратегий: котирование встроил в основную стратегию. Скорость стала прежней. Вряд ли. В SampleHistoryTesting котирование используется как дочерняя стратегия. И наблюдается только ускорение тестирования.
|
|
Спасибо:
|
|
|
|
|
vk37
|
Дата: 19.11.2012
Я говорю не про статегию MarketQuotingStrategy в SampleHistoryTesting, а про свою дочернюю стратегию. На предыдущей версии сборок тестирование за 2 месяца выполнялось за 20 мин. На новой версии - 1 час 20 мин. На новой версии без механизма дочерних стратегий - 20 мин.
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 20.11.2012
vk37 Я говорю не про статегию MarketQuotingStrategy в SampleHistoryTesting, а про свою дочернюю стратегию.
Может вы скажите наконец, что нужно в SampleHistoryTesting изменить, чтобы воспроизвести данную ситуацию.
|
|
Спасибо:
|
|
|
|
|
vk37
|
Дата: 08.01.2013
Вопрос со скоростью тестирования решился указанием у дочерней стратегии: Код
var quotingStrategy = new MyQuotingStrategy(quotingOrder)
{
DisposeOnStop = true,
WaitAllTrades = true,
};
Скорость тестирования падала только при тестировании за достаточно длительный период времени, когда котирование вызывалось много раз.
|
|
Спасибо:
|
|
|
|