longtrades
|
Date: 1/9/2014
|
|
|
|
Берем ваш пример SampleRealTimeTesting , переделаем его под квик , и ставим остановку на строку 125, и видим что событие _trader.NewTrades никогда не срабатывает: Code
namespace SampleRealTimeTesting
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Windows;
using Ecng.Collections;
using Ecng.Common;
using Ecng.ComponentModel;
using Ecng.Xaml;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Algo.Reporting;
using StockSharp.Algo.Testing;
using StockSharp.BusinessEntities;
using StockSharp.Logging;
using StockSharp.Messages;
using StockSharp.Quik;
using StockSharp.Xaml.Charting;
public partial class MainWindow
{
private bool _isConnected;
private readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(5);
private readonly SynchronizedList<TimeFrameCandle> _historyCandles = new SynchronizedList<TimeFrameCandle>();
private CandleManager _candleManager;
private RealTimeEmulationTrader<QuikTrader> _trader;
private SmaStrategy _strategy;
private DateTime _lastHistoryCandle;
private Security _lkoh;
private readonly ChartArea _area;
private ChartCandleElement _candlesElem;
private ChartIndicatorElement _longMaElem;
private ChartIndicatorElement _shortMaElem;
public MainWindow()
{
InitializeComponent();
_area = new ChartArea();
_chart.Areas.Add(_area);
}
protected override void OnClosing(CancelEventArgs e)
{
if (_trader != null)
_trader.Dispose();
base.OnClosing(e);
}
private void ConnectClick(object sender, RoutedEventArgs e)
{
if (!_isConnected)
{
if (_trader == null)
{
// тестовый портфель
var portfolio = new Portfolio
{
Name = "test account",
BeginValue = 1000000,
};
// создаем шлюз
_trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader("D:\\QUIK\\Front"));
// передаем первоначальное значение размера портфеля в эмулятор
_trader.Process(new PortfolioChangeMessage
{
LocalTimeStamp = DateTime.Now,
PortfolioName = portfolio.Name,
Changes = new[]
{
new PositionChange(PositionChangeTypes.BeginValue, portfolio.BeginValue)
}
});
// очищаем из текстового поля в целях безопасности
Password.Clear();
// подписываемся на событие успешного соединения
_trader.Connected += () =>
{
// возводим флаг, что соединение установлено
_isConnected = true;
_trader.UnderlyingTrader.StartExport();
_trader.StartExport();
// разблокируем кнопку Экспорт
this.GuiAsync(() => ChangeConnectStatus(true));
_candleManager = new CandleManager(_trader);
_trader.NewSecurities += securities => this.GuiAsync(() =>
{
// находим нужную бумагу
var lkoh = securities.FirstOrDefault(s => s.Code == "LKOH");
if (lkoh != null)
{
_lkoh = lkoh;
this.GuiAsync(() =>
{
Start.IsEnabled = true;
});
}
});
_trader.NewTrades += trades => this.GuiAsync(() =>
{
var tr = trades;
var stop = 0;
});
_trader.NewMyTrades += trades => this.GuiAsync(() =>
{
if (_strategy != null)
{
// найти те сделки, которые совершила стратегия скользящей средней
trades = trades.Where(t => _strategy.Orders.Any(o => o == t.Order));
_trades.Trades.AddRange(trades);
}
});
// подписываемся на событие о неудачной регистрации заявок
_trader.OrdersRegisterFailed += OrdersFailed;
_candleManager.Processing += (s, candle) =>
{
// выводим только те свечки, которые не были отрисованы как исторические
if (candle.OpenTime > _lastHistoryCandle)
ProcessCandle(candle);
};
_trader.StartExport();
this.GuiAsync(() =>
{
ConnectBtn.IsEnabled = false;
});
};
// подписываемся на событие разрыва соединения
_trader.ConnectionError += error => this.GuiAsync(() =>
{
// заблокируем кнопку Экспорт (так как соединение было потеряно)
ChangeConnectStatus(false);
MessageBox.Show(this, error.ToString(), "Ошибка соединения");
});
_trader.ProcessDataError += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), "Ошибка обработки данных"));
}
_trader.Connect();
}
else
{
_trader.Disconnect();
}
}
private void OrdersFailed(IEnumerable<OrderFail> fails)
{
this.GuiAsync(() =>
{
foreach (var fail in fails)
MessageBox.Show(this, fail.Error.ToString(), "Ошибка регистрации заявки");
});
}
private void ChangeConnectStatus(bool isConnected)
{
_isConnected = isConnected;
ConnectBtn.Content = isConnected ? "Отключиться" : "Подключиться";
}
private void OnLog(LogMessage message)
{
// если стратегия вывела не просто сообщение, то вывести на экран.
if (message.Level != LogLevels.Info && message.Level != LogLevels.Debug)
this.GuiAsync(() => MessageBox.Show(this, message.Message));
}
private void OnStrategyPropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.GuiAsync(() =>
{
Status.Content = _strategy.ProcessState;
PnL.Content = _strategy.PnL;
Slippage.Content = _strategy.Slippage;
Position.Content = _strategy.Position;
Latency.Content = _strategy.Latency;
});
}
private void StartClick(object sender, RoutedEventArgs e)
{
// если были получены и инструмент, и портфель
if (_strategy == null)
{
// создаем скользящие средние, на 80 5-минуток и 10 5-минуток
var longSma = new SimpleMovingAverage { Length = 80 };
var shortSma = new SimpleMovingAverage { Length = 10 };
// регистрируем наш тайм-фрейм
var series = new CandleSeries(typeof(TimeFrameCandle), _lkoh, _timeFrame);
// создаем торговую стратегию
_strategy = new SmaStrategy(series, longSma, shortSma)
{
Volume = 1,
Security = _lkoh,
Portfolio = _trader.Portfolios.First(),
Trader = _trader,
};
_strategy.Log += OnLog;
_strategy.PropertyChanged += OnStrategyPropertyChanged;
_candlesElem = new ChartCandleElement();
_area.Elements.Add(_candlesElem);
_longMaElem = new ChartIndicatorElement
{
Title = "Длинная",
Indicator = _strategy.LongSma,
};
_area.Elements.Add(_longMaElem);
_shortMaElem = new ChartIndicatorElement
{
Title = "Короткая",
Indicator = _strategy.ShortSma,
};
_area.Elements.Add(_shortMaElem);
// начинаем получать текущие сделки (для построения свечек реального времени)
_trader.RegisterTrades(_lkoh);
Report.IsEnabled = true;
}
if (_strategy.ProcessState == ProcessStates.Stopped)
{
// запускаем процесс получения стакана, необходимый для работы алгоритма котирования
_trader.RegisterMarketDepth(_strategy.Security);
_strategy.Start();
Start.Content = "Стоп";
}
else
{
_trader.UnRegisterMarketDepth(_strategy.Security);
_strategy.Stop();
Start.Content = "Старт";
}
}
private void ProcessCandle(Candle candle)
{
var longValue = candle.State == CandleStates.Finished ? new ChartIndicatorValue(_strategy.LongSma, _strategy.LongSma.Process(candle)) : null;
var shortValue = candle.State == CandleStates.Finished ? new ChartIndicatorValue(_strategy.ShortSma, _strategy.ShortSma.Process(candle)) : null;
_chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
{
{ _candlesElem, candle },
{ _longMaElem, longValue },
{ _shortMaElem, shortValue },
});
}
private void ReportClick(object sender, RoutedEventArgs e)
{
// сгерерировать отчет по прошедшему тестированию
new ExcelStrategyReport(_strategy, "sma.xls").Generate();
// открыть отчет
Process.Start("sma.xls");
}
}
}
|
longtrades
|
Date: 1/9/2014
|
|
|
|
Вот лог , можете что-то сказать ?
2014/01/09 20:42:41.131| |RealTimeEmulationTrader`1|Connect 2014/01/09 20:42:41.131|Debug |RealTimeEmulationTrader`1|BP:Portfolio,T=2014.01.09 20:42:41.173,Name=test account 2014/01/09 20:42:41.173| |RealTimeEmulationTrader`1|Создан новый портфель test account. 2014/01/09 20:42:41.173|Debug |RealTimeEmulationTrader`1|BP:PortfolioChange,T=2014.01.09 20:42:41.173P=test account,Changes=BeginValue=1000000 2014/01/09 20:42:41.173| |RealTimeEmulationTrader`1|RCM: Connecting PrevState = -1 CurrState = -1. 2014/01/09 20:42:41.131| |QuikTrader|Connect 2014/01/09 20:42:41.131|Warning|QuikTrader|Невозможно выполнить подключение, так как соединение находится в состоянии Connecting. 2014/01/09 20:42:41.131|Debug |RealTimeEmulationTrader`1|BP:Connect,T=2014/01/09 20:42:41.368 2014/01/09 20:42:41.131| |RealTimeEmulationTrader`1|RCM: Trader ConnectionState = Connected CurrState = Connected PrevState = -1 2014/01/09 20:42:42.482| |QuikTrader|StartExport 2014/01/09 20:42:42.482| |QuikTrader|RCM: Trader ConnectionState = Connected CurrState = Connected PrevState = -1 2014/01/09 20:42:42.734|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Security,T=2014/01/09 20:42:42.702,SecId=S#:RIH4@FORTS, Native: 2014/01/09 20:42:42.482|Debug |RealTimeEmulationTrader`1|BP:Security,T=2014/01/09 20:42:42.702,SecId=S#:RIH4@FORTS, Native: 2014/01/09 20:42:42.702|Debug |RealTimeEmulationTrader`1|BP:Level1,T=2014/01/09 20:42:42.702Sec=S#:RIH4@FORTS, Native:,Changes=State=Trading,StepPrice=10,MinPrice=10 2014/01/09 20:42:44.458|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388268 2014/01/09 20:42:44.462|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.495|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.496|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| <-- Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388268 2014/01/09 20:42:44.113|Debug |RealTimeEmulationTrader`1|BP:Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388268 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388269 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| <-- Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388269 2014/01/09 20:42:44.457|Debug |RealTimeEmulationTrader`1|BP:Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388269 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388270 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| <-- Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388270 2014/01/09 20:42:44.457|Debug |RealTimeEmulationTrader`1|BP:Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388270
|