В соседней ветке задал Михаилу вопрос как Тестер учитывает стаканы , сам на него отвечаю :
Никак!!! Он их видит но не учитывает положение нашего ордера в стакане.Вот вам доказательство: берем стандартный пример SampleHistoryTesting в настройка трейдера изменяем :
MarketTimeChangedInterval = TimeSpan.FromMilliseconds(10);
теперь содержимое SmaStrategy.cs изменяем так что-бы каждые 10мс мы проверяли свои ордера на покупку и продажу и переставляли их на лучший бид и офер + контроль позиции.
Code
namespace SampleHistoryTesting
{
using Ecng.Common;
using System.Collections.Generic;
using System.Linq;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Testing;
using StockSharp.Logging;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
class SmaStrategy : Strategy
{
private readonly CandleSeries _series;
private bool _isShortLessThenLong;
public SmaStrategy(CandleSeries series, SimpleMovingAverage longSma, SimpleMovingAverage shortSma)
{
_series = series;
LongSma = longSma;
ShortSma = shortSma;
}
public SimpleMovingAverage LongSma { get; private set; }
public SimpleMovingAverage ShortSma { get; private set; }
protected override void OnStarted()
{
this.Security.Trader.NewMyTrades += trades => NewMyTrades(trades);
this.Trader.MarketTimeChanged += t => ProcessDepth();
// запоминаем текущее положение относительно друг друга
_isShortLessThenLong = ShortSma.GetCurrentValue() < LongSma.GetCurrentValue();
base.OnStarted();
}
private void NewMyTrades(IEnumerable<MyTrade> trades)
{
foreach (var tr in trades)
{
if (tr.Order.GetTrades().Sum(x => x.Trade.Volume) > tr.Order.Volume)
{
var Trtrades = this.Trader.MyTrades;
var stp = 0;
}
}
}
Order buy_order = null;
Order sell_order = null;
private void ProcessDepth()
{
var Volume = 1;
if (this.Position <= 0)
{
if (buy_order != null)
{
if (buy_order.State == OrderStates.Done || buy_order.State == OrderStates.Failed)
{
buy_order = this.CreateOrder(OrderDirections.Buy, Security.BestBid.Price, Volume);
RegisterOrder(buy_order);
}
else
if (buy_order.Price != Security.BestBid.Price)
{
this.CancelOrder(buy_order);
buy_order = this.CreateOrder(OrderDirections.Buy, Security.BestBid.Price, Volume);
RegisterOrder(buy_order);
}
}
else
{
buy_order = this.CreateOrder(OrderDirections.Buy, Security.BestBid.Price, Volume);
RegisterOrder(buy_order);
}
}
else
{
if (buy_order != null)
{
this.CancelOrder(buy_order);
buy_order = null;
}
}
if (this.Position >= 0)
{
if (sell_order != null)
{
if (sell_order.State == OrderStates.Done || sell_order.State == OrderStates.Failed)
{
sell_order = this.CreateOrder(OrderDirections.Sell, Security.BestAsk.Price, Volume);
RegisterOrder(sell_order);
}
else
if (sell_order.Price != Security.BestAsk.Price)
{
this.CancelOrder(sell_order);
sell_order = this.CreateOrder(OrderDirections.Sell, Security.BestAsk.Price, Volume);
RegisterOrder(sell_order);
}
}
else
{
sell_order = this.CreateOrder(OrderDirections.Sell, Security.BestAsk.Price, Volume);
RegisterOrder(sell_order);
}
}
else
{
if (sell_order != null)
{
this.CancelOrder(sell_order);
sell_order = null;
}
}
}
}
}
и получаем ГРААЛЬ !!!
Запускать на реале не советую , слив гарантирован!!!