Я добавил в SampleConsole события NewCandles и CandlesChanged. Сделки совершаются, но эти события не вызываются. Сразу кидаю код.
namespace SampleConsole
{
using System;
using System.Linq;
using System.Threading;
using Ecng.Common;
using StockSharp.BusinessEntities;
using StockSharp.Quik;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Reporting;
using StockSharp.Algo.Strategies;
class Program
{
private readonly static TimeSpan _timeFrame = TimeSpan.FromMinutes(5);
private static Security _lkoh;
private static Portfolio _portfolio;
private static MarketDepth _depth;
private static CandleManager _candleManager;
static void Main()
{
try
{
// для теста выбираем бумагу Лукойл
const string secCode = "LKOH";
var quikPath = QuikTerminal.GetDefaultPath();
if (quikPath.IsEmpty())
{
Console.WriteLine("Не найден ни один запущенный Quik");
return;
}
Console.WriteLine("Запущенный Quik найден по пути " + quikPath);
Console.Write("Введите номер счета, через который будет выставлена заявка: ");
var account = "1636";
using (var waitHandle = new AutoResetEvent(false))
{
// создаем шлюз к Quik-у
using (var trader = new QuikTrader(quikPath))
{
// необходимо раскомментировать, если идет работа с РТС Стандарт
//trader.FormatTransaction += builder => builder.RemoveInstruction(TransactionBuilder.ExecutionCondition);
// подписываемся на событие успешного подключения
// все действия необходимо производить только после подключения
trader.Connected += () =>
{
_candleManager = new CandleManager(trader);
Console.WriteLine("Подключение было произведено успешно.");
// извещаем об успешном соединени
waitHandle.Set();
};
Console.WriteLine("Производим подключение...");
trader.Connect();
// дожидаемся события об успешном соединении
waitHandle.WaitOne();
trader.NewPortfolios += portfolios =>
{
if (_portfolio == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_portfolio = portfolios.FirstOrDefault(p => p.Name == account);
if (_portfolio != null)
{
Console.WriteLine("Портфель {0} появился.", account);
// если инструмент и стакан уже появились,
// то извещаем об этом основной поток для выставления заявки
if (_lkoh != null && _depth != null)
waitHandle.Set();
}
}
};
// подписываемся на событие появление инструментов
trader.NewSecurities += securities =>
{
if (_lkoh == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_lkoh = securities.FirstOrDefault(sec => sec.Code == secCode);
if (_lkoh != null)
{
Console.WriteLine("Инструмент Лукойл появился.");
// запускаем экспорт стакана
trader.RegisterQuotes(_lkoh);
_candleManager.RegisterTimeFrameCandles(_lkoh, _timeFrame);
if (_portfolio != null)
waitHandle.Set();
}
}
};
// подписываемся на событие появления моих новых сделок
trader.NewMyTrades += myTrades =>
{
foreach (var myTrade in myTrades)
{
var trade = myTrade.Trade;
Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
}
};
// подписываемся на событие обновления стакана
trader.QuotesChanged += depths =>
{
if (_depth == null && _lkoh != null)
{
_depth = depths.FirstOrDefault(d => d.Security == _lkoh);
if (_depth != null)
{
Console.WriteLine("Стакан Лукойла появился.");
// если портфель уже появился, то извещаем об этом основной поток для выставления заявки
if (_portfolio != null)
waitHandle.Set();
}
}
};
Console.WriteLine("Дожидаемся появления в программе инструмента Лукойл и портфеля {0}...".Put(account));
_candleManager.NewCandles += (token, candles) =>
{
Console.WriteLine("Событие NewCandles произошло");
};
_candleManager.CandlesChanged += (token, candles) =>
{
Console.WriteLine("Событие CandlesChanged произошло");
};
// запускаем экспорт по DDE
trader.StartExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable);
// дожидаемся появления портфеля и инструмента
waitHandle.WaitOne();
// 0.1% от изменения цены
const decimal delta = 0.001m;
// запоминаем первоначальное значение середины спреда
var firstMid = _lkoh.BestPair.SpreadPrice / 2;
Console.WriteLine("Первоначальное значение середины спреда {0:0.##}", _lkoh.BestBid.Price + firstMid);
while (true)
{
var mid = _lkoh.BestPair.SpreadPrice / 2;
// если спред вышел за пределы нашего диапазона
if (
((firstMid + firstMid * delta) <= mid) ||
((firstMid - firstMid * delta) >= mid) ||(0==0)
)
{
var order = new Order
{
Portfolio = _portfolio,
Price = _lkoh.ShrinkPrice(_lkoh.BestBid.Price + mid),
Security = _lkoh,
Volume = 1,
Direction = OrderDirections.Buy,
};
trader.RegisterOrder(order);
Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
Thread.Sleep(1000);
try
{
if (!order.IsMatched() && (order.State == OrderStates.Active))
trader.CancelOrder(order);
}
catch (Exception ex)
{
Console.WriteLine("Заявка не может быть снята");
}
}
else
Console.WriteLine("Текущее значение середины спреда {0:0.##}", _lkoh.BestBid.Price + mid);
// ждем 1 секунду
Thread.Sleep(1000);
}
// останавливаем экспорт по DDE
trader.StopExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
var getch = Console.ReadLine();
}
}
}
Comentarios (12)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
а что выводится в консоль?
Сначала то, что все инструменты и портфель появились, а потом идут Заявки подряд(с интервалом в пару секунд). "Заявка {0} зарегистрирована". И иногда "Заявка не может быть снята". (Если сделка уже свершилась, а я попытался снять). И в случае если сделка свершилась в консоль выводится "Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.".
Лучше из консоли скопировать, чтоб точно было.
Что выводит ProcessDataError? Что возвращает RegisterTimeFrameCandles? Версия S#?
Добавил распечатку RegisterTimeFrameCandles Версия C# 3.2.5 Ошибок вроде никаких. вот консоль
Свечки строятся по потоку всех сделок инструмента
Мне нужно получать информацию о свечках. В коде (141-150 строчки) еcть свечные события. Я планирую получать значения свечек через них. Но как видно из распечатки консоли они не происходят. Как преодолеть эту проблему? Спасибо!
Я ведь ответил: <mark>Свечки строятся по потоку всех сделок инструмента</mark>
У вас экспорт таблицы всех сделок не стартует => откуда изволите получать информацию для построения свечек? :)
Прошу прощения, с первого раза не понял) а как называется таблица всех сделок? я так понял, что просто должен ее в "trader.StartExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable);" вставить) Спасибо огромное!
TradesTable или просто trader.StartExport(); - все таблицы стартуют
Спасибо! Все заработало!
Возник еще один вопрос. Как в данный код внедрить стратегию SmaStrategy? Я перед циклом вставляю следующее
но стратегия не работает. Спасибо! Прошу прощения за много глупых вопросов.
посмотрите SampleSma - как раз пример запуска стратегии