RoboKrolik
|
Date: 1/16/2013
|
|
|
|
Посмотрел тот пример - не понимаю как он мне подходит. Дам весь код чтобы было понятно. Мне нужно знать что подправить чтобы получить _order.IsMatched()MainWindows.csCode
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Configuration;
// using S#
using Ecng.Common;
using Ecng.ComponentModel;
using Ecng.Xaml;
using Ecng.Serialization;
using Ecng.Collections;
using StockSharp.Algo;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Candles.Compression;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Storages;
using StockSharp.BusinessEntities;
using StockSharp.Quik;
using StockSharp.Logging;
using StockSharp.Xaml;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
// Объявление переменных
private QuikTrader _trader; // квик трейдер
private TimeSpan _timeFrame = TimeSpan.FromMinutes(5); // таймфрейм
private TimeSpan _timeRefreshStrategy = TimeSpan.FromSeconds(5); // частота обновления стратегии
int _sharecount; // количество торгуемых контрактов
private DartWeiderStretegy _strategy; // обявляем стратегию
private Security _security; // инструмент
private Portfolio _portfolio; // портфель
private CandleManager _candleManager; // менеджер свечек
public CandleSeries _series; // поток свечей
private ChartArea _area; // область графика
private ChartCandleElement _candlesElem; // элемент области графика
readonly DateTime _starttime = new DateTime(2013, 1, 1); // дата начала экспорта свечей для _ candleManager
readonly DateTime _endtime = DateTime.MaxValue; // дата конца экспорта свечей для _ candleManager
private const string _historyPath = @"D:\hist\"; // папка где храняться тиковые данные сделок для TimeFrameCandleBuilder
public const string _quikPath = @"W:\Soft\QUIK-Junior"; // путь к квику
public MainWindow()
{
InitializeComponent();
this.WindowState = System.Windows.WindowState.Maximized; // разворачиваем главное окно на максимум
_area = new ChartArea(); // cоздание области графика
_chart.Areas.Add(_area); // и добавление ее в _chart
}
// Кнопка "Подключение" - Метод подключения к квику
private void Connect_Click(object sender, RoutedEventArgs e)
{
// если трейдер не подключен
if (_trader == null)
{
// находим автоматом расположение квика
_trader = new QuikTrader(_quikPath);
//Подписываемся на событие появления новых портфелей и добавляем их в ComboBox Portfolios
_trader.NewPortfolios += portfolios => this.GuiAsync(() => {Portfolios.ItemsSource = _trader.Portfolios;});
//Подписываемся на событие появления новых инстументов и добавляем их в ComboBox Securities
_trader.NewSecurities += securities => this.GuiAsync(() => {Securities.ItemsSource = _trader.Securities;});
// ТУТ НУЖНО ПОДПИСАТЬСЯ НА СОБЫТИЯ ПОЯВЛЕНИЯ НОВЫХ ЗАЯВОК... а КАК?
// Создание элемента графика представляющего свечки и добавление его в область графика
_candlesElem = new ChartCandleElement();
_area.Elements.Add(_candlesElem);
}
try
{
// подключаем квик
_trader.Connect();
}
catch (System.IO.IOException err)
{
MessageBox.Show("Не удается подключиться к квику" + err.Message);
}
//Начинаем Экспорт данных
_trader.StartExport(); //получение он-лайн данных из квика Инструменты, Заявки, Портфели и так далее
_candleManager = new CandleManager(_trader); // создаем менеджер свечек
var storageRegistry = new StorageRegistry(); // создаем экземпляр класа-источника данных
((LocalMarketDataDrive)storageRegistry.DefaultDrive).Path = _historyPath; // присваиваем ему по умолчанию путь где хранятся наши тиковые данные
var cbs = new TradeStorageCandleBuilderSource { StorageRegistry = storageRegistry }; // создаем новый источник данных и присваиваем ему хранилище
_candleManager.Sources.OfType<TimeFrameCandleBuilder>().Single().Sources.Add(cbs); // добавляем в менеджер свечек наш источник
_candleManager.Processing += DrawCandle; // подписываемся на событие отрисовки свечей
}
// метод отрисовки свечей
private void DrawCandle(CandleSeries series, Candle candle)
{
if (series == _series)
{
this.GuiAsync(() =>
{
_chart.ProcessCandle(_candlesElem, candle);
});
}
}
// Кнопка "Остановка" - Метод остановки робота
private void StopRobot_Click(object sender, RoutedEventArgs e)
{
// если трейдер подключен
if (_trader != null)
{
if (_trader != null && _security!=null && _trader.RegisteredMarketDepths != null) _trader.UnRegisterMarketDepth(_security); // если стакан зарегестиррован - отключаем экспорт со стакана
if (_strategy != null && _strategy.ProcessState == ProcessStates.Started) _strategy.Stop(); // если стратегия запущена - останавливаем стратегию
if (_trader.Orders != null) _trader.CancelOrders(); // если есть активные ордера - отменяем ордера
_trader.StopExport(); // останавливаем экспорт
_trader.Dispose(); // освобождение занятых ресурсов
}
}
// Метод на случай закрытия окна робота
private void ProgramWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// если трейдер подключен
if (_trader != null)
{
if (_trader != null && _security != null && _trader.RegisteredMarketDepths != null) _trader.UnRegisterMarketDepth(_security); // если стакан зарегестирован - отключаем экспорт со стакана
if (_strategy!=null && _strategy.ProcessState == ProcessStates.Started) _strategy.Stop(); // если стратегия запущена - останавливаем стратегию
if (_trader.Orders != null) _trader.CancelOrders(); // если есть активные ордера - отменяем ордера
_trader.StopExport(); // останавливаем экспорт
_trader.Dispose(); // освобождение занятых ресурсов
}
}
// Кнопка "Запуск робота" - метод запуск робота
private void StartRobo_Click(object sender, RoutedEventArgs e)
{
// проверяем подключен ли квик трейдер, задан ли портфель, инструмент
if (_trader == null)
{
MessageBox.Show("Терминал не задан");
return;
}
if (_trader.Portfolios == null)
{
MessageBox.Show("Портфель не задан");
return;
}
if (_trader.Securities == null)
{
MessageBox.Show("Инструмент не задан");
return;
}
// код запуска стратегии
if (_strategy == null)
{
_series = new CandleSeries(typeof(TimeFrameCandle), _security, _timeFrame); // создаем поток свечей и указываем что тип TimeFrameCandle
_candleManager.Start(_series, _starttime, _endtime); // запускаем CandleManager
System.Threading.Thread.Sleep(25000); // делаем паузу на 20 сек. перед тем как запустить стратегию - чтобы серия заполнилась свечками
_strategy = new DartWeiderStretegy(_candleManager, _timeFrame, _series) // создаем стратегию
{
Volume = _sharecount, // количество контрактов которое мы указали
Security = _security,
Portfolio = _portfolio,
Trader = _trader,
Interval = _timeRefreshStrategy // интервал который мы указали
};
// если стратегия не запущена - запускаем
if (_strategy.ProcessState == ProcessStates.Stopped)
{
// запускаем процесс получения стакана, необходимый для работы алгоритма котирования
_trader.RegisterMarketDepth(_security);
_strategy.Start();
}
}
}
// метод измеенеия инструмента в ComboBox
private void Securities_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string sec = Convert.ToString(Securities.SelectedItem); // создаем временную текстовую переменную и присваиваем ей название выбраного елемента (напр. RIH3@RTS)
sec = sec.Replace("@RTS", string.Empty); // вырезаем хвост "@RTS"
_security = _trader.Securities.First(s => s.Code == sec && s.Type == SecurityTypes.Future); // присваеваем переменной _security имя выбраного инструмента
}
// метод измеенеия портфеля в ComboBox
private void Portfolios_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
_portfolio = _trader.Portfolios.FirstOrDefault(p => p.Name == Convert.ToString(Portfolios.SelectedItem)); // присваеваем переменной _portfolio имя выбраного портфеля
}
//метод изменения позиции в тектовом поле "Количество контрактов"
private void PositionSize_TextChanged(object sender, TextChangedEventArgs e)
{
try
{
_sharecount = Convert.ToInt32(PositionSize.Text); // присваиваем переменной размер позиции указанной в текстовом поле
}
catch
{
MessageBox.Show("Неправильный размер позиции");
}
}
}
}
Strategy.csCode
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Configuration;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Candles;
using Ecng.Xaml;
using StockSharp.Quik;
using StockSharp.BusinessEntities;
namespace WpfApplication1
{
class DartWeiderStretegy : TimeFrameStrategy
{
// переменные
public Order _order; // текущая заявка
public Order _stopOrder;
public TimeSpan _timeFrame; // таймфрейм
public CandleManager _candleManager; // менеджер свечек
public CandleSeries _series; // поток свечек
bool stop = false; // открывать ли новую позицию
// конструктор для работы стратегии
public DartWeiderStretegy(CandleManager candleManager, TimeSpan timeFrame, CandleSeries series) : base(timeFrame)
{
_candleManager = candleManager;
_timeFrame = TimeFrame;
_series = series;
}
/// Запуск стратегии
protected void OnStarting()
{
base.OnStarted();
}
// Выполнение стратегии
protected override ProcessResults OnProcess()
{
#region ситуация для покупки
if (
stop == false // если количество открытых позиций < 1
// тут еще несколько условий (код МТС)
)
{
// создаем заявку на покупку
_order = this.CreateOrder(OrderDirections.Buy, _series.GetCandle<TimeFrameCandle>(1).ClosePrice, base.Volume);
// регистрируем ее
base.RegisterOrder(_order);
// проверяем выполнение заявки
if (_order.IsMatched()
{
//Выставляем стоп-лосс и тейкпрофит через метод
_stopOrder = this.CreateStopLimitAndTakeProfit(_order.Price);
// регистрируем его
base.RegisterOrder(_stopOrder);
}
}
#endregion
return ProcessResults.Continue;
}
// Метод выставления стопа и тейк-профита
public Order CreateStopLimitAndTakeProfit(decimal openPrice)
{
decimal stopPrice = Convert.ToDecimal(openPrice) - 10;
decimal tpPrice = Convert.ToDecimal(openPrice) + 30;
return new Order
{
Type = OrderTypes.Conditional,
Volume = base.Volume,
Price = Convert.ToDecimal(stopPrice-1),
Security = base.Security,
Portfolio = base.Portfolio,
Direction = OrderDirections.Sell,
StopCondition = new QuikStopCondition
{
Type = QuikStopConditionTypes.LinkedOrder,
LinkedOrderPrice = tpPrice,
StopPrice = stopPrice,
},
};
}
}
}
|