[vk]http://vk.com/video_ext.php?oid=-66650972&id=167470235&hash=5354329b0f44e11a&hd=3[/vk]
[vk]http://vk.com/video_ext.php?oid=-66650972&id=167470340&hash=d4a2baaf8c533bc8&hd=3[/vk]
[vk]http://vk.com/video_ext.php?oid=-66650972&id=167470847&hash=05646cb903828f2e&hd=3[/vk]
Создание сборки с получением исторических свечей, отрисовкой графиков и запуском стратегии
В проекте с получением и отображением исторических свечей, сделать вывод меток заявок и сделок на график.
Проект CandlesDownload
Файл History.cs и SimpleSecurityStorage.cs
Было:
Code
using StockSharp.Algo.History.Finam;
Стало:
Code
using StockSharp.Algo.History.Russian.Finam;
Файл SimpleSecurityStorage.cs
В версии S# 4.1.19.1 интерфейс ISecurityStorage содержит свойство Securities, поэтому класс SimpleSecurityStorage, его должен реализовать.
Было:
Code
/// <summary>
/// Простое хранилище
/// </summary>
class SimpleSecurityStorage:ISecurityStorage
{
private readonly SynchronizedDictionary<long, Security> _cacheByFinamId = new
SynchronizedDictionary<long, Security>();
public Security LoadBy(string fieldName, object fieldValue)
{
return _cacheByFinamId.TryGetValue((long)fieldValue);
}
public IEnumerable<Security> Lookup(Security criteria)
{
throw new NotImplementedException();
}
public void Save(Security security)
{
TryAddToCache(security);
}
private void TryAddToCache(Security security)
{
if (security == null)
throw new ArgumentNullException("security");
var finamId = security.ExtensionInfo.TryGetValue(FinamHistorySource.FinamSecurityIdField);
if (finamId != null)
_cacheByFinamId.SafeAdd((long)finamId, key => security);
}
}
Стало:
Code
/// <summary>
/// Простое хранилище
/// </summary>
class SimpleSecurityStorage:ISecurityStorage
{
private readonly SynchronizedDictionary<long, Security> _cacheByFinamId = new
SynchronizedDictionary<long, Security>();
private IEnumerable<Security> _securities;
public Security LoadBy(string fieldName, object fieldValue)
{
return _cacheByFinamId.TryGetValue((long)fieldValue);
}
public IEnumerable<Security> Lookup(Security criteria)
{
throw new NotImplementedException();
}
public IEnumerable<Security> Securities
{
get { return _securities; }
}
public void Save(Security security)
{
TryAddToCache(security);
}
private void TryAddToCache(Security security)
{
if (security == null)
throw new ArgumentNullException("security");
var finamId = security.ExtensionInfo.TryGetValue(FinamHistorySource.FinamSecurityIdField);
if (finamId != null)
_cacheByFinamId.SafeAdd((long)finamId, key => security);
}
}
Проект CandlesDownloadUsing
Файл BollingerStrategy.cs
Теперь класс Strategy не имеет свойства PendingOrders, все Pending заявки можно получить из общей коллекции Orders, поэтому избыточность в библиотеке была устранена, и мы в соем проекте теперь используем коллекцию Orders, и в ней, анализируя свойство State каждой заявки, используя Linq выражение.
Было:
Code
/// <summary>
/// Возвращает true если нет активных заявок, а противном случае возвращает false
/// </summary>
private bool NoActiveOrders
{
get
{
return Orders.Count(o => o.State != OrderStates.Done) == 0 && PendingOrders.Count() == 0;
}
}
Стало:
Code
/// <summary>
/// Возвращает true если нет активных заявок, а противном случае возвращает false
/// </summary>
private bool NoActiveOrders
{
get
{
return Orders.Count(o => o.State != OrderStates.Done) == 0 && Orders.Where(o=>o.State ==
OrderStates.Pending).Count() == 0;
}
}
Файл MainWindow.cs
Начиная с версии S# 4.1.19.1 статус подключения коннектора вынесен в специальное свойство ConnectionState, которое может принимать следующие значения:
Disconnected - Не активно,
Disconnecting - В процессе отключения,
Connected - В процессе подключения,
Connecting - Подключение активно,
Failed - Ошибка подключения
Таким образом, теперь нет свойства IsConnected, а наличие статуса подключения мы можем получать от свойства ConnectionState.
Было:
Code
/// <summary>
/// Обработчик события закрытия окна
/// </summary>
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
if (Connection.SafeConnection.Trader != null && Connection.SafeConnection.Trader.IsConnected)
{
Connection.SafeConnection.Trader.Dispose();
}
Thread.CurrentThread.Abort();
base.OnClosing(e);
}
Стало:
Code
/// <summary>
/// Обработчик события закрытия окна
/// </summary>
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
if (Connection.SafeConnection.Trader != null && Connection.SafeConnection.Trader.ConnectionState ==
ConnectionStates.Connected)
{
Connection.SafeConnection.Trader.Dispose();
}
Thread.CurrentThread.Abort();
base.OnClosing(e);
}