Сообщество. StockSharphttps://stocksharp.ru/handlers/atom.ashx?category=community&page=169Copyright @ StockSharp Platform LLC 2010 - 20242024-03-28T22:46:33Zhttps://stocksharp.ru/images/logo.pnghttps://stocksharp.ru/topic/3303/Как узнать что экспорт работает и все данные получены?2013-01-15T06:33:27Z2013-01-15T06:33:27ZMenDelhttps://stocksharp.ru/users/6356/info@stocksharp.ruКак узнать что экспорт работает и все данные получены и можно запускать стратегию.<br />IsExportStarted не помогает.<br />Я нашел выход для себя, как только я получаю новые позиции, значит можно запускать стратегию,<br />но когда позиций нет.https://stocksharp.ru/topic/3302/Запаздывание получения биржевых данных в коде одного из примеров2013-01-14T20:20:26Z2013-01-14T20:20:26Zdeveloper_29https://stocksharp.ru/users/16728/info@stocksharp.ru Здравствуйте.<br /> Недавно начал ознакамливаться с документацией S# (для Quik), в основном осталось положительное впечатление. <br /> Но в примере SampleSMA из документации я дописал к стратегии код, который перед каждой проверкой на пересечение <br />(строчка if (_isShortLessThenLong != isShortLessThenLong)) должен записывать в файл значения Bid и Ask. Свечи используются 5-минутные, но запись ведётся с запозданием примерно в полторы минуты. Соединение нормальное, время на компьютере и время на бирже совпадают, в Quik данные приходят вовремя, запаздывание одинаковое от свечки к свечке. С чем это связано и как это исправить?https://stocksharp.ru/topic/3301/Импорт таблицы перестал работать2013-01-14T18:26:58Z2013-01-14T18:26:58ZТворогhttps://stocksharp.ru/users/6511/info@stocksharp.ruКод состоит из следующих элементов:<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
private QuikTrader _trader;
private readonly MyTradesWindow _myTradesWindow = new MyTradesWindow();
_trader.NewMyTrades += trades => this.GuiAsync(() => _myTradesWindow.Trades.AddRange(trades));
string tstr = "А вот и мои сделочки: \n";
foreach (var myTrade in _myTradesWindow.Trades)
{
var trade = myTrade.Trade;
tstr = tstr + string.Format("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.\n", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
}
tradestb.Text = tstr;
</pre>
</div></div><br /><br />В итоге в TextBox выводится только инициализированная строка tstr, без сделок. Весь день ушёл на поиск причины, хотя ещё в пятницу табличка выводилась. Код не менял. В то же время стакан, например, выводится как надо. В чём может быть проблема?https://stocksharp.ru/topic/3300/Не срабатывает правило WhenRegisterFailed2013-01-14T17:47:37Z2013-01-14T17:47:37ZNewManhttps://stocksharp.ru/users/6449/info@stocksharp.ruS# 4.1.7(21699)<br /><br />Формируется MoveOrder и отсылается на биржу, однако oldOrder успевает исполниться.<br />Приходит об этом сообщение, срабатывает правило WhenMatched.<br />Приходят сообщения о том, что newOrder не был принят, а oldOrder не был отменен.<br />Правило WhenRegisterFailed для newOrder не срабатывает, а надо бы :(<br /><br />11:01:11.835| |Strategy1 |Перерегистрация заявки 39364813 с ценой 158450 на цену 158440.<br />11:01:11.835| |Strategy1 |Перерегистрация проскальзывания заявки 39364813 (0xA41CCE) на заявку (0x834A80).<br />11:01:11.835| |Strategy1 | <ReRegisterOrder> oldORDER: 39364813/3159890173 Покупка Цена=158450 Объем=1 Сост=Active Бал=1; newORDER: TrId=39364815, Price=158440<br />11:01:11.846| |Strategy1 |Новая Buy сделка 8268175 по цене 158450 на 1 заявки 39364813.<br />11:01:11.846| |Strategy1 |Новая позиция: FZ000ff-RIH3@RTS=-1.<br />11:01:11.847| |Strategy1 |Заявка 39364813 больше не активна.<br />11:01:11.847| |Strategy1 | WhenMatched: 39364813/3159890173 Покупка Цена=158450 Объем=1 Сост=Done Бал=0<br />11:01:11.850| |Strategy1 |Регистрация новой Limit (0x115B647) заявки на Buy с ценой 158440 и объемом 1.<br />11:01:11.850| |Strategy1 | <RegisterOrder>: 39364816/0 Покупка Цена=158440 Объем=1 Сост=None Бал=1<br />11:01:11.952|Error |Strategy1 |Заявка 39364815 (0x834A80) не была принята по причине StockSharp.Plaza.PlazaException: Произошла ошибка. Код 50, описание 'Не найдена заявка для перестановки.'..<br />11:01:11.978|Error |Strategy1 |Заявка 39364813 не была отменена по причине StockSharp.Plaza.PlazaException: Произошла ошибка. Код 50, описание 'Не найдена заявка для перестановки.'..<br /><br /><br />var ruleRegisterFailed = order.WhenRegisterFailed();<br />ruleRegisterFailed<br /> .Do(_orderFail =><br /> {<br /> this.AddOrderInfoLog(_orderFail.Order, " WhenRegisterFailed:");<br /> })<br /> .Once()<br /> .Apply(this);https://stocksharp.ru/topic/3299/Quik: newStopOrders не ходят2013-01-14T16:46:59Z2013-01-14T16:46:59ZDenhttps://stocksharp.ru/users/6003/info@stocksharp.ruУважаемые разработчики!<br /><br />S# 4.1.7 (trunk), Quik 6.4<br /><br />События <b>newStopOrders</b> не ходят.<br />При этом события <b>stopOrdersChanged</b> исправно прилетают.<br /><br />Посмотрите, пожалуйста, в чем дело.https://stocksharp.ru/topic/3298/Ошибка базы данных2013-01-14T13:32:26Z2013-01-14T13:32:26Zanotharhttps://stocksharp.ru/users/6089/info@stocksharp.ruСкачал последнюю гидру. Снес базу скулайта.<br />Возникла ошибка:<br />17:26:24.219|Error |StockSharp|System.Data.SqlClient.SqlException (0x80131904): При установлении соединения с SQL Server произошла ошибка, связанная с сетью или с определенным экземпляром. Сервер не найден или недоступен. Убедитесь, что имя экземпляра указано правильно и что на SQL Server разрешены удаленные соединения. (provider: SQL Network Interfaces, error: 26 - Ошибка при обнаружении указанного сервера или экземпляра)<br /> в System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)<br /> в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()<br /> в System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity)<br /> в System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, SqlConnection owningObject)<br /> в System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout)<br /> в System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, TimeoutTimer timeout, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)<br /> в System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)<br /> в System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)<br /> в System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)<br /> в System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)<br /> в System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)<br /> в System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)<br /> в System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)<br /> в System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)<br /> в System.Data.SqlClient.SqlConnection.Open()<br /> в StockSharp.Hydra.MainWindow.CheckDatabase()<br /> в StockSharp.Hydra.MainWindow.InitializeDataSource()<br /> в StockSharp.Hydra.MainWindow.<MainWindowLoaded>b__5()<br /> в System.Threading.Tasks.Task`1.InvokeFuture(Object futureAsObj)<br /> в System.Threading.Tasks.Task.InnerInvoke()<br /> в System.Threading.Tasks.Task.Execute()<br /><br />Причем нигде коннекта к SqlServer у меня нету и никогда не было.https://stocksharp.ru/topic/3297/Торговые роботы на PLAZA22013-01-14T12:43:31Z2013-01-14T12:43:31Zesperhttps://stocksharp.ru/users/5990/info@stocksharp.ruКод проекта из второго вебинара в прикрепленном архиве. Статья будет в ближайшее время по мере готовности.<br /><br />Запись вебинара можно посмотреть <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAAAi48_KzWju0atoYfAbY8tak8rUqbMyrfWCm7b3CVv_TjLKnx0AJC858J1RFEOd3udNLPDAZWj2rHfPDjqpPnpH-9zukPyB6frWT1jjqSaEC4pBn2jDH71skoD2DCxAXIY3IIw48j1FfrFPl6Vqs94rNd5Mp9doGwBAWb74AJE0Dg" title="http://smart-lab.ru/r.php?u=http%253A%252F%252Fconnect1.webinar.ru%252Fplay%252Fvalez%252F27224-kino%2526nbsp%253B">здесь</a>.https://stocksharp.ru/topic/3296/Не работает ExtensionInfo2013-01-14T12:33:22Z2013-01-14T12:33:22ZDenhttps://stocksharp.ru/users/6003/info@stocksharp.ruУважаемые разработчики!<br /><br />Пытаюсь переехать с S# 4.1.1 на 4.1.7 (codeplex trunk)<br /><br />Летят эксепшены <b>"The given key was not present in the dictionary"</b><br /><br />Код банальный, при переезде никак не менялся:<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
var columns = this.Trader.SecuritiesTable.Columns;
columns.Add(DdeSecurityColumns.Yield);
var ecolumns = this.Trader.EquityPortfoliosTable.Columns;
ecolumns.Add(DdeEquityPortfolioColumns.BlockedCurrency);
</pre>
</div></div><br /><br />При данных обращениях к этим данным получаю исключения:<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
sec.ExtensionInfo[DdeSecurityColumns.Yield]
portfolio.ExtensionInfo[DdeEquityPortfolioColumns.BlockedCurrency]</pre>
</div></div><br /><br />Стек-трейсов нет, т.к. это обращение непосредственно в сам словарь...<br /><br />Посмотрел содержимое словаря для <b>sec </b>- в нем нет ключа <b>Yield</b>.<br /><br />Аналогично для <b>portfolio</b> c <b>BlockedCurrency</b>.<br /><br />Есть ли какие-либо новые ограничения по использованию дополнительных полей в таблицах?https://stocksharp.ru/topic/3295/Почему свечи импортируются только за текущий день2013-01-13T18:46:34Z2013-01-13T18:46:34ZRoboKrolikhttps://stocksharp.ru/users/16730/info@stocksharp.ruПри построении торгового робота возник вопрос - почему свечи импортируются только за текущий день?<br /><br />Свечи делаю так<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
private TimeSpan _timeFrame = TimeSpan.FromMinutes(60); // таймфрейм
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);
readonly DateTime _endtime = new DateTime(2013, 1, 10);
// Создание области графика и добавление ее в _chart
_area = new ChartArea();
_chart.Areas.Add(_area);
// Создание элемента графика представляющего свечки и добавление его в область графика
_candlesElem = new ChartCandleElement();
_area.Elements.Add(_candlesElem);
_candleManager = new CandleManager(_trader); // создаем менеджер свечек
_candleManager.Processing += DrawCandle; // подписываемся на событие отрисовки свечей
// метод отрисовки свечей
private void DrawCandle(CandleSeries series, Candle candle)
{
if (series == _series)
{
this.GuiAsync(() =>
{
_chart.ProcessCandle(_candlesElem, candle);
});
}
}
_candleManager.Start(_series, _starttime, _endtime); // запускаем CandleManager
_strategy = new DartWeiderStretegy(_candleManager, _timeFrame, _series) // создаем стратегию
</pre>
</div></div>https://stocksharp.ru/topic/3294/RawConvertableCandleBuilderSource2013-01-13T17:39:24Z2013-01-13T17:39:24ZИван З.https://stocksharp.ru/users/6502/info@stocksharp.ruПодскажите, пожалуйста!<br /> У меня есть готовая коллекция IEnumerable<Candle> Candles, содержащая свечи 10мин. Я хочу их запихнуть в источник.<br />Как я понимаю это можно сделать через RawConvertableCandleBuilderSource<TSourceValue>. Но как именно это сделать ни где не нашел, ни в документации, ни на форуме. Везде пишут про сделки RawConvertableCandleBuilderSource<Trade>. А что в моем случае писать вместо TSourceValue? <br /><br />Пробовал <br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
var cbs = new RawConvertableCandleBuilderSource<Candle>(security, startTime, endTime, Candles);</pre>
</div></div><br /><br />Выдает исключение:<br />Вызвано: "Объект должен реализовывать интерфейс IConvertible." (System.InvalidCastException) Сообщение об исключении = "Объект должен реализовывать интерфейс IConvertible.", Тип исключения = "System.InvalidCastException", Данные среды выполнения Windows для исключения = "" <br /><br />Может кто сталкивался подскажите!<br /><br />P.S. С наступающим Старым Новым годом! [biggrin] https://stocksharp.ru/topic/3293/Как устроено тестирование стратегии?2013-01-12T22:55:44Z2013-01-12T22:55:44ZFlashPlayerhttps://stocksharp.ru/users/16669/info@stocksharp.ruПодскажите пожалуйста такой момент:<br /><br />Предположим, я хочу протестировать какую-то стратегию на исторических данных. Создаю эмулятор трейдер, подсасываюсь к сохраненной истории. Запускаю эмулятор трейдер. Если просто его запустить - он пробежится от старт тайма до стоп тайма, отреагировав на все подписанные события (сделки, заявки итп итд) ну и остановится. А теперь, я дополнительно создам стратегию (пусть даже пустую), и в настройках стратегии скажу ей - используй этот же эмулятор трейдер. Запускаю стратегию. Что в этот момент технически происходит? В дополнительном потоке заново запускается эмулятор трейдер от времени старта до стопа, но теперь исполняя стратегию? То есть вопрос больше вот в чем - эмулятор запустить все равно нужно, но важно ли когда я запускаю стратегию? Не получится ли так, что я запускаю стратегию почти одновременно с эмулятором, но чуть позже и она не с старт тайма начинает работать, а с того времени, которое было в эмуляторе на момент запуска стратегии? <br /><br /><br />И еще один вопрос. При тестировании на исторических данных тестер всегда тестирует на стаканах? То есть если я имею из истории - только трейды - он из них постарается сделать стаканы и на них тестировать? Ведь как тестировать на трейдах - непонятно. А если есть ордерлог и трейды - чтобы тестер тестил на стаканах, построенных на ордерлоге, я должен это дополнительно указать - в противном случае он будет стараться строить стаканы по трейдам, так? То есть интересует - как устроены умолчания. Что по умолчанию берется для тестинга - какой тип сохраненной истории.<br /><br />Заранее спасибо за ответ.https://stocksharp.ru/topic/3292/SampleHistoryTestingParallel - как запустить?2013-01-11T18:04:06Z2013-01-11T18:04:06ZГеннадий Ванин (Gennady Vanin)https://stocksharp.ru/users/6413/info@stocksharp.ruНа всех версиях, начиная с 4.1.5, StockSharp при попытке открыть SampleHistoryTestingParallel выдаются ошибка в MainWindow.xaml на линии:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:css">
<my:EquityCurveChart x:Name="Curve" Grid.Row="4" Grid.ColumnSpan="3" /></pre>
</div></div> <br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><div class="innerquote">The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)<br /></div></div><br />При этом, на версиях 4.1.5-4.1.6 картинка ваще не показывается на Design surface<br /><br /><a href='http://i.imgur.com/F0fx1.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="http://i.imgur.com/F0fx1.jpg" style='max-width: 600px;' alt="S# 4.1.5 bug" title="S# 4.1.5 bug" /></a><br /><br />на последней версии 22122 уже показывается, <br />с уже более открытой информацией об ошибке:<br /><div class="quote"><span class="quotetitle">Цитата:</span><div class="innerquote">Could not load file or assembly 'Microsoft.Practices.Unity, Version=2.1.505.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.<br /> at <b>Ecng.Configuration.ConfigManager..cctor()</b></div></div><br /><br /><a href='http://i.imgur.com/sBLK9.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="http://i.imgur.com/sBLK9.jpg" style='max-width: 600px;' alt="StockSharp 22122 error" title="StockSharp 22122 error" /></a><br /><br /><a href='http://i.imgur.com/Z1mxv.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="http://i.imgur.com/Z1mxv.jpg" style='max-width: 600px;' alt="StockSharp 22122 error" title="StockSharp 22122 error" /></a><br /><br /><br />Самое весёленькое - на скрипте XAML показывается зелёная галочка <br /><b>"No errors or warnings"</b><br /><br />Как бы мне запустить проект, не потеряв ту самую историческую кривую?https://stocksharp.ru/topic/3291/При тестировании выдает исключение ContextSwitchDeadlock was detected2013-01-11T09:35:33Z2013-01-11T09:35:33Zproftshttps://stocksharp.ru/users/6174/info@stocksharp.ruС тестирование на тиках так и не разобрался из-за переполнения индикаторов... Пришлось тестировать на реале.<br /><br />Теперь к проблеме )))<br />Тестировал свои стратегии на старых версиях S#. Все было отлично. Решил полностью перейти на 4.1.6. Набросал простенькую стратегию на 15мин свечках. Шаблон взял полностью из SampleHistoryTesting. Свечки не рисую.<br />Начинается тест, первые два дня эквити рисуется достаточно быстро, потом начинает обновляться с интервалом секунд в 5 и в итоге форма вообще зависает, через минуту выскакивает это исключение:<br /><a href='http://gyazo.com/33487bf9f0488b3202765aa81a7b97c0' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'><img src="http://gyazo.com/33487bf9f0488b3202765aa81a7b97c0" style='max-width: 600px;' alt="Ошибка" title="Ошибка" /></a><br /><br />Код:<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:plain">
protected override void OnStarted()
{
//vcon.Open();
CommissionRule commissionRule = new CommissionRule { Type = CommissionTypes.PerTradeVolume, Value = new Unit(3m) };
_commissionManager.Rules.Add(commissionRule);
Sostoyanie = "кэш";
takeprofit = decimal.Parse(MainWindow.Instance.takeprofit_form.Text);
proskalz = decimal.Parse(MainWindow.Instance.proskalz.Text);
vol_kontr = decimal.Parse(MainWindow.Instance.vol_lotov.Text);
vcon.Open();
// Создание элемента графика представляющего свечки
_candlesElem = new ChartCandleElement();
MainWindow.Instance._area.Elements.Add(_candlesElem);
//MainWindow.Instance._area_ind.Elements.Add(_longMaElem);
//MainWindow.Instance._area_ind.Elements.Add(_shortMaElem);
this
.WhenNewMyTrades()
.Do(ProcessNewTrades)
.Apply(this);
_series
.WhenCandlesFinished()
.Do(ProcessCandle)
.Apply(this);
base.OnStarted();
}
private void ProcessCandle(Candle candle)
{
// if (candle.State == CandleStates.Finished) MainWindow.Instance.GuiAsync(() => MainWindow.Instance.Chart.ProcessCandle(_candlesElem, candle));
Indicator.Process(candle.ClosePrice);
MainWindow.Instance.GuiAsync(() =>
{
MainWindow.Instance.trades_time.Text = Security.LastTrade.Time.ToString();
MainWindow.Instance.pos2_form.Text = Sostoyanie;
MainWindow.Instance.position_form.Text = Position.ToString();
});
if (!START)
{
if (Indicator.Container.Count > 2)
{
START = true;
Security
.WhenNewTrades()
.Do(ProcessNewTrade)
.Apply(this);
}
}
}
private void Comission_raschet()
{
comission = 0;
foreach (MyTrade trade in MyTrades)
{
comission = comission + _commissionManager.ProcessMyTrade(trade);
}
//MainWindow.Instance.GuiAsync(() =>
//{
// MainWindow.Instance.comission_form.Text = comission.ToString();
//});
}
private void ProcessNewTrade()
{
if (Security.LastTrade == null)
{ goto propusk2; }
if (Security.LastTrade.Time.Hour == 19 && Security.LastTrade.Time.Minute == 0 && Security.LastTrade.Time.Second < 10)
{ goto propusk2; }
switch (Sostoyanie)
{
case "кэш":
{
if (...)
{
Sostoyanie = "Long";
Buy_Order(vol_kontr);
}
else if (...)
{
Sostoyanie = "Short";
Sell_Order(vol_kontr);
}
}
break;
case "Long":
{
if (...)
{
Sostoyanie = "кэш";
Sell_Order(vol_kontr);
}
}
break;
case "Short":
{
if (...)
{
Sostoyanie = "кэш";
Buy_Order(vol_kontr);
}
}
break;
}
propusk2:
//MainWindow.Instance.GuiAsync(() =>
//{
// MainWindow.Instance.trades_time.Text = Security.LastTrade.Time.ToString();
// //MainWindow.Instance.now_time.Text = DateTime.Now.ToString();
// MainWindow.Instance.pos2_form.Text = pos;
// MainWindow.Instance.position_form.Text = Position.ToString();
// MainWindow.Instance.komiss_form.Text = comission.ToString();
//});
}
private void Buy_Order(decimal volume)
{
EntryPrice = Security.LastTrade.Price; ;
this.AddInfoLog("Сигнал на покупку");
nomersdelki++;
order_open_long = this.CreateOrder(OrderDirections.Buy, Security.LastTrade.Price + proskalz, volume);
order_open_long.Security = Security;
this.RegisterOrder(order_open_long);
order_open_long
.WhenMatched()
.Do(pos_change_long)
.Apply(this);
this.AddInfoLog(PnLManager.PnL.ToString());
//string vsql = string.Format("insert into Rez2 (nomer_sdelki, data_vxoda,vremya_vxoda, cena_vxoda, High, Low,stop_price) Values ({0}, {1}, {2}, {3}, {4}, {5}, {6})",
// (nomersdelki), (Security.LastTrade.Time.ToString("dd.MM")), (Security.LastTrade.Time.ToString("HH.mmss")), (order_open_long.Price.ToString()), (candle_high),(candle_low),(stop_price));
//OleDbCommand vcom = new OleDbCommand(vsql, vcon);
//vcom.ExecuteNonQuery();
}
private void Sell_Order(decimal volume)
{
EntryPrice = Security.LastTrade.Price;
this.AddInfoLog("Сигнал на продажу");
nomersdelki++;
order_open_short = this.CreateOrder(OrderDirections.Sell, Security.LastTrade.Price - proskalz, volume);
order_open_short.Security = Security;
this.RegisterOrder(order_open_short);
order_open_short
.WhenMatched()
.Do(pos_change_short)
.Apply(this);
//string vsql = string.Format("insert into Rez2 (nomer_sdelki, data_vxoda,vremya_vxoda, cena_vxoda, High, Low,stop_price) Values ({0}, {1}, {2}, {3}, {4}, {5}, {6})",
// (nomersdelki), (Security.LastTrade.Time.ToString("dd.MM")), (Security.LastTrade.Time.ToString("HH.mmss")), (order_open_long.Price.ToString()), (candle_high), (candle_low), (stop_price));
//OleDbCommand vcom = new OleDbCommand(vsql, vcon);
//vcom.ExecuteNonQuery();
}
</pre>
</div></div>https://stocksharp.ru/topic/3290/HistoryTesting-что нужно инициализировать, чтобы не соединяться к терминалу?2013-01-11T06:48:13Z2013-01-11T06:48:13ZГеннадий Ванин (Gennady Vanin)https://stocksharp.ru/users/6413/info@stocksharp.ruТолько начал разбираться с тестированием на исторических данных<br /><br />Пока не нашёл примера - можно ли провести тестирование без соединения к терминалу<br />И, если можно то, что нужно инициализировать?<br /><br />Имеется SampleHistoryTesting, в котором устанавливается соединение с терминалом КВИК и экспортируются все таблицы из КВИК.<br />Почему нельзя обойтись EmulationTrader - без соединения и экспорта?<br /><br />Даже если использовать соединение и экспорт - то, какой минимум таблиц нужен для работы SampleHistoryTesting, чтобы не перегружать компьютер ненужными загрузками?https://stocksharp.ru/topic/3289/GuiDispatcher.AddPeriodicalAction2013-01-10T18:04:14Z2013-01-10T18:04:14ZFlashPlayerhttps://stocksharp.ru/users/16669/info@stocksharp.ruПодскажите пожалуйста - как работает GuiDispatcher.AddPeriodicalAction? Судя из названия метода - действие вызывается периодически - но с какой частотой. Пример использования встречается в SampleGui, где с помощью этого метода обновляется информация в открытых стаканах. Логика там, как я понимаю, следующая - ведется два синхронизированных словаря ключ-значение: один - инструмент/окно стакана, другой - рыночный стакан/окно стакана. <br /><br /><br /> private readonly SynchronizedDictionary<Security, QuotesWindow> _quotesWindows = new SynchronizedDictionary<Security, QuotesWindow>();<br /> private readonly SynchronizedDictionary<MarketDepth, QuotesWindow> _changedDepths = new SynchronizedDictionary<MarketDepth, QuotesWindow>(); <br /><br />Далее происходит подписка на обновление стаканов trader.MarketDepthsChanged += TraderOnMarketDepthsChanged, и вот совсем мне непонятно, что делается в TraderOnMarketDepthsChanged: <br /><br /> private void TraderOnMarketDepthsChanged(IEnumerable<MarketDepth> depths)<br /> {<br /> foreach (var depth in depths)<br /> {<br /> var wnd = _quotesWindows.TryGetValue(depth.Security);<br /><br /> if (wnd != null)<br /> _changedDepths[depth] = wnd;<br /> }<br /> }<br /><br />Что тут происходит, как я понимаю: рассматриваем каждый обновившийся стакан и ищем соответствующее ему окно стакана в _quotesWindows: <br /> var wnd = _quotesWindows.TryGetValue(depth.Security);<br /><br />Далее что происходит в этой строчке: _changedDepths[depth] = wnd; ? Откуда мы знаем, что в словаре _changedDepths есть элемент с ключом depth? И зачем на каждом обновлении стакана depth мы переприсваиваем значение wnd в словаре? Ну и самый главные вопрос - как потом в wnd появляются новые котировки с обновленного depth? Как работает .AddPeriodicalAction?<br /><br />Просто я думал логика должна была быть примерно такая - достаточно держать лишь один словарь - _quotesWindows и при получении обновленного MarketDepth - найти соответствующий ему элемент в _quotesWindows и обновить _quotesWindows.Value. Разве не так?<br /><br />Я еще только начинаю разбираться в программировании такого уровня, так что сильно не бейте и спасибо за помощь.<br />https://stocksharp.ru/topic/3288/Не могу понять почему не видно свечей2013-01-08T15:49:09Z2013-01-08T15:49:09ZRoboKrolikhttps://stocksharp.ru/users/16730/info@stocksharp.ruПишу каркас для торговой стратегии.<br /><br />Вот так создаю свечи:<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public partial class MainWindow : Window
{
// Объявление переменных
private CandleManager _candleManager; // менеджер свечек
private void Connect_Click(object sender, RoutedEventArgs e) // жму на кнопку подключения
{
_candleManager = new CandleManager(_trader); // создаем менеджер свечек для Трейдера
_candleManager.Processing += DrawCandle; // подписываемся на событие
private void StartRobo_Click(object sender, RoutedEventArgs e) // жму на кнопку запуска страты
{
CandleSeries series;
series = new CandleSeries(typeof(TimeFrameCandle), _security, _timeFrame);
_candleManager.Start(series);
Label3.Content = Convert.ToString(series.GetCandle<TimeFrameCandle>(1).ClosePrice);
</pre>
</div></div><br /><br />При запуске стратегии выскакивает вот такая ошибка<br /><br /><b>An unhandled exception of type 'System.NullReferenceException' occurred in WpfApplication1.exe<br /><br />Additional information: Ссылка на объект не указывает на экземпляр объекта.</b><br /><br />Не знаю что и делать. Я так понял что свечи не экспортируются.<br /><br />Какой экземпляр я не создал?<br /><br />Что делать?<br /><br />Код основного окна<br /><div class='spoilertitle'><input type='button' value='Показать спойлер' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_331809f6080a4d2b9520c4de061f713d');" title='Показать спойлер' /></div><div class='spoilerbox' id='spolier_331809f6080a4d2b9520c4de061f713d' style='display:none'><br />using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Text;<br />using System.Threading.Tasks;<br />using System.Windows;<br />using System.Windows.Controls;<br />using System.Windows.Data;<br />using System.Windows.Documents;<br />using System.Windows.Input;<br />using System.Windows.Media;<br />using System.Windows.Media.Imaging;<br />using System.Windows.Navigation;<br />using System.Windows.Shapes;<br />using System.Configuration;<br /><br />// using S#<br />using Ecng.Common;<br />using Ecng.ComponentModel;<br />using Ecng.Xaml;<br />using Ecng.Serialization;<br />using Ecng.Collections;<br />using StockSharp.Algo;<br />using StockSharp.Algo.Indicators;<br />using StockSharp.Algo.Indicators.Trend;<br />using StockSharp.Algo.Candles;<br />using StockSharp.Algo.Strategies;<br />using StockSharp.BusinessEntities;<br />using StockSharp.Quik;<br />using StockSharp.Logging;<br />using StockSharp.Xaml;<br /><br /><br />namespace WpfApplication1<br />{<br /><br /> public partial class MainWindow : Window<br /> {<br /><br /> // Объявление переменных<br /><br /> private QuikTrader _trader; // квик трейдер<br /><br /> private TimeSpan _timeFrame = TimeSpan.FromMinutes(1); // таймфрейм<br /> private TimeSpan _timeRefreshStrategy = TimeSpan.FromSeconds(1); // частота обновления стратегии<br /> <br /> int _sharecount; // количество торгуемых контрактов<br /> private DartWeiderStretegy _strategy; // обявляем стратегию<br /> <br /> private Security _security; // инструмент<br /> private Portfolio _portfolio; // портфель<br /><br /> private CandleManager _candleManager; // менеджер свечек<br /> <br /><br /> public MainWindow()<br /> {<br /> InitializeComponent();<br /> <br /><br /> }<br /><br /> // Кнопка "Подключение" - Метод подключения к квику<br /> private void Connect_Click(object sender, RoutedEventArgs e)<br /> {<br /> if (_trader == null)<br /> {<br /> _trader = new QuikTrader(QuikTerminal.GetDefaultPath());<br /><br /> //Подписываемся на событие появления новых портфелей<br /> _trader.NewPortfolios += portfolios => this.GuiAsync(() => {Portfolios.ItemsSource = _trader.Portfolios;});<br /><br /> //Подписываемся на событие появления новых инстументов<br /> _trader.NewSecurities += securities => this.GuiAsync(() => {Securities.ItemsSource = _trader.Securities;});<br /> <br /> }<br /><br /> try<br /> {<br /> // подключаем квик<br /> _trader.Connect();<br /> }<br /> catch (System.IO.IOException err)<br /> {<br /> MessageBox.Show("Не удается подключиться к квику" + err.Message);<br /> }<br /><br /> //Начинаем Экспорт данных<br /><br /> _trader.StartExport(); //получение он-лайн данных из квика Инструменты,Заявки , Портфели и так далее<br /><br /> _candleManager = new CandleManager(_trader); // создаем менеджер свечек для Трейдера<br /><br /> _candleManager.Processing += DrawCandle; // подписываемся на событие<br /><br /><br /> }<br /><br /><br /> private void DrawCandle(CandleSeries series, Candle candle)<br /> {<br /> this.GuiAsync(() =><br /> {<br /><br /> // _chart.ProcessCandle((ChartCandleElement)_chart.Areas[0].Elements[0], candle);<br /><br /> });<br /> }<br /><br /> // Кнопка "Остановка" - Метод остановки робота<br /> private void StopRobot_Click(object sender, RoutedEventArgs e)<br /> {<br /> if (_trader != null)<br /> {<br /> //отключаем экспорт со стакана и останавливаем стратегию<br /> _trader.UnRegisterMarketDepth(_security);<br /> if (_strategy.ProcessState == ProcessStates.Started) _strategy.Stop();<br /> if (_trader.Orders != null) _trader.CancelOrders();<br /> _trader.StopExport(); <br /> }<br /> }<br /><br /> // Метод на случай закрытия окна робота<br /> private void ProgramWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)<br /> {<br /> if (_trader != null)<br /> {<br /> //отключаем экспорт со стакана и останавливаем стратегию<br /> _trader.UnRegisterMarketDepth(_security);<br /> if (_strategy.ProcessState == ProcessStates.Started) _strategy.Stop();<br /> if (_trader.Orders != null) _trader.CancelOrders();<br /> _trader.StopExport();<br /> }<br /> }<br /><br /> // Кнопка "Запуск робота" - метод запуск робота<br /> private void StartRobo_Click(object sender, RoutedEventArgs e)<br /> {<br /> // проверяем подключен ли квик трейдер, задан ли портфель, инструмент<br /> if (_trader == null)<br /> {<br /> MessageBox.Show("Терминал не задан");<br /> return;<br /> }<br /><br /> if (_trader.Portfolios == null)<br /> {<br /> MessageBox.Show("Портфель не задан");<br /> return;<br /> }<br /><br /> if (_trader.Securities == null)<br /> {<br /> MessageBox.Show("Инструмент не задан");<br /> return;<br /> }<br /><br /> // код запуска стратегии<br /><br /> if (_strategy == null)<br /> {<br /><br /> CandleSeries series;<br /><br /> series = new CandleSeries(typeof(TimeFrameCandle), _security, _timeFrame);<br /><br /> _candleManager.Start(series);<br /><br /><br /> Label3.Content = Convert.ToString(series.GetCandle<TimeFrameCandle>(1).ClosePrice);<br /> <br /> this.GuiAsync(() =><br /> {<br /><br /><br /><br /> _strategy = new DartWeiderStretegy(_candleManager, _timeFrame)<br /> {<br /> Volume = _sharecount,<br /> Security = _security,<br /> Portfolio = _portfolio,<br /> Trader = _trader,<br /> Interval = _timeRefreshStrategy<br /> };<br /><br /> <br /><br /> <br /> });<br /><br /> <br /><br /> }<br /><br /><br /> if (_strategy.ProcessState == ProcessStates.Stopped)<br /> {<br /> // запускаем процесс получения стакана, необходимый для работы алгоритма котирования<br /> //_trader.RegisterQuotes(_strategy.Security);<br /> _trader.RegisterMarketDepth(_security);<br /> _strategy.Start();<br /> }<br /><br /> }<br /><br /><br /> private void Securities_SelectionChanged(object sender, SelectionChangedEventArgs e)<br /> {<br /> string sec = Convert.ToString(Securities.SelectedItem);<br /> sec = sec.Replace("@RTS", string.Empty);<br /> _security = _trader.Securities.First(s => s.Code == sec && s.Type == SecurityTypes.Future);<br /> }<br /><br /> private void Portfolios_SelectionChanged(object sender, SelectionChangedEventArgs e)<br /> {<br /> _portfolio = _trader.Portfolios.FirstOrDefault(p => p.Name == Convert.ToString(Portfolios.SelectedItem));<br /> }<br /><br /> private void PositionSize_TextChanged(object sender, TextChangedEventArgs e)<br /> {<br /> try<br /> {<br /> _sharecount = Convert.ToInt32(PositionSize.Text);<br /> }<br /> catch<br /> {<br /> MessageBox.Show("Неправильный размер позиции");<br /> }<br /> }<br /><br /> private void Button_Click_1(object sender, RoutedEventArgs e)<br /> {<br /> <br /><br /><br /> }<br /> <br /> }<br /><br />}<br /><br /></div><br /><br />Код стратегии<br /><div class='spoilertitle'><input type='button' value='Показать спойлер' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_f47b9ee52a5c4bc389ae75ae34338f44');" title='Показать спойлер' /></div><div class='spoilerbox' id='spolier_f47b9ee52a5c4bc389ae75ae34338f44' style='display:none'><br />using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Text;<br /><br />using StockSharp.Algo;<br />using StockSharp.Algo.Strategies;<br />using StockSharp.Algo.Candles;<br />using Ecng.Xaml;<br />using StockSharp.Quik;<br />using StockSharp.BusinessEntities;<br /><br />namespace WpfApplication1<br />{<br /> class DartWeiderStretegy : TimeFrameStrategy<br /> {<br /><br /> <br /> decimal openPrice; // цена открытия свечи<br /> decimal lastPrice; // цена предПРЕДпоследней свечи<br /><br /> private Order _order; // текущая заявка<br /><br /> private TimeSpan _timeFrame; // таймфрейм<br /><br /> private CandleManager _candleManager;<br /><br /> // конструктор для работы стратегии<br /> public DartWeiderStretegy(CandleManager candleManager, TimeSpan timeFrame) : base(timeFrame)<br /> {<br /> _candleManager = candleManager;<br /><br /> _timeFrame = TimeFrame;<br /> }<br /><br /> /// <summary><br /> /// Запуск стратегии<br /> /// </summary><br /> protected void OnStarting()<br /> {<br /> base.OnStarted();<br /> }<br /><br /> // Выполнение стратегии<br /> protected override ProcessResults OnProcess()<br /> {<br /><br /> <br /><br /> /*<br /><br /> //Определяем количество открытых позиций по инструменту<br /> int openPos = Convert.ToInt32(this.MyTrades.GetPosition());<br /> <br /> //Получаем цену открытия этой свечи<br /> openPrice = _lastCandle1.ClosePrice;<br /><br /> //Получаем цену открытия предПРЕДпоследней свечи<br /> lastPrice = _lastCandle2.ClosePrice;<br /><br /> //Если есть 2 свечи и нет открытых позиций<br /> if (_lastCandle1!=null && _lastCandle2!=null && openPos == 0)<br /> {<br /> // Если свеча выше предыдущей открываем лонг<br /> if (openPrice > lastPrice)<br /> {<br /> // создаем заявку на покупку<br /> _order = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), base.Volume);<br /> <br /> // регистрируем ее<br /> base.RegisterOrder(_order);<br /><br /> if (_order.IsMatched() == true)<br /> {<br /><br /> //Выставляем стоп-лосс и тейкпрофит через метод<br /> _order = this.CreateStopLimitAndTakeProfit(openPrice);<br /><br /> // регистрируем его<br /> base.RegisterOrder(_order);<br /> }<br /> }<br /> }<br /> * <br /> * */<br /><br /><br /> return ProcessResults.Continue;<br /> }<br /><br /><br /> private Order CreateStopLimitAndTakeProfit(decimal openPrice2)<br /> {<br /> decimal stopPrice = Convert.ToDecimal(openPrice2) - 20;<br /> decimal tpPrice = Convert.ToDecimal(openPrice2) + 20;<br /><br /> return new Order<br /> {<br /> Type = OrderTypes.Conditional,<br /> Volume = base.Volume,<br /> Price = Convert.ToDecimal(stopPrice),<br /> Security = base.Security,<br /> Portfolio = base.Portfolio,<br /> Direction = OrderDirections.Sell,<br /> StopCondition = new QuikStopCondition<br /> {<br /> Type = QuikStopConditionTypes.LinkedOrder,<br /> LinkedOrderPrice = tpPrice,<br /> },<br /> };<br /> }<br /><br /><br /> <br /> <br /> }<br />}<br /><br /></div>https://stocksharp.ru/topic/3287/TRANStoQUIK.dll и WIN 7 64 бита2013-01-08T11:17:11Z2013-01-08T11:17:11Zqpilehttps://stocksharp.ru/users/6397/info@stocksharp.ruЗдравствуйте!<br />Торговый робот без проблем работает на 32 битах, а на 64 то не находит библиотеку, то отказано в доступе. В чем может быть проблема?https://stocksharp.ru/topic/3286/Какие ресурсы нужны простому роботу на S#2013-01-04T10:20:30Z2013-01-04T10:20:30Zvotorhttps://stocksharp.ru/users/5938/info@stocksharp.ruКакие ресурсы будут достаточны для простого робота на S#? Например, пересечение скользящих средних на 1 тикере 15мин.<br /><br />И каие ресурсы для робота с 7-10 простых стратегияими на 7-10 тикерах 15-60 мин, если работать будет все через Quik? Хватит ли ресурсов виртуальной машины ОЗУ 512 Мб, HDD 40Гб, 2400Mhz на технологии VDS Hyper-V ( Windows )https://stocksharp.ru/topic/3284/Автоверсионность файлов2012-12-27T18:36:01Z2012-12-27T18:36:01ZVassilSanychhttps://stocksharp.ru/users/6491/info@stocksharp.ruПростой способ автоверсионности:<br />1. Скачать и установить task<br /><a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAACpsIlyOU4j3o0mGaMq82TJMKH_goeYLlw5ST7m1fortnWBB7PYz7hVci1NJ_wQcYG276GUmLgSgchGubj_WxSRDCfL8ITdh8f43zCalPukBn9LfmFNBI9aO70QCmOSgWPjexCdBpzaUntGCtn8Y8gm" title="http://archive.msdn.microsoft.com/AssemblyInfoTaskvers/Release/ProjectReleases.aspx?ReleaseId=232">AssemblyInfoTask</a><br />2. Найти установленный файл <em>Microsoft.VersionNumber.targets</em><br />3. Скопировать его в папку солюшна<br />4. Прописать в проектах (в самом конце)<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:xml">
<Import Project="$(SolutionDir)\Microsoft.VersionNumber.Targets" />
</Project></pre>
</div></div><br />5. Отредактировать <em>Microsoft.VersionNumber.targets</em> по желанию. Например так<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:xml">
......
<PropertyGroup>
<AssemblyMajorVersion>0</AssemblyMajorVersion>
<AssemblyMinorVersion>1</AssemblyMinorVersion>
<AssemblyBuildNumber></AssemblyBuildNumber>
<AssemblyRevision></AssemblyRevision>
<AssemblyBuildNumberType>DateString</AssemblyBuildNumberType>
<AssemblyBuildNumberFormat>MMdd</AssemblyBuildNumberFormat>
<AssemblyRevisionType>AutoIncrement</AssemblyRevisionType>
<AssemblyRevisionFormat>000</AssemblyRevisionFormat>
</PropertyGroup>
<!-- Properties for controlling the Assembly File Version -->
<PropertyGroup>
<AssemblyFileMajorVersion>0</AssemblyFileMajorVersion>
<AssemblyFileMinorVersion>1</AssemblyFileMinorVersion>
<AssemblyFileBuildNumber></AssemblyFileBuildNumber>
<AssemblyFileRevision></AssemblyFileRevision>
<AssemblyFileBuildNumberType>DateString</AssemblyFileBuildNumberType>
<AssemblyFileBuildNumberFormat>MMdd</AssemblyFileBuildNumberFormat>
<AssemblyFileRevisionType>AutoIncrement</AssemblyFileRevisionType>
<AssemblyFileRevisionFormat>000</AssemblyFileRevisionFormat>
</PropertyGroup>
<!-- Properties for controlling COM visibility -->
<PropertyGroup>
<AssemblyComVisible></AssemblyComVisible>
<AssemblyGuid></AssemblyGuid>
</PropertyGroup>
<!-- Propeties for controlling extended assembly attributes -->
<PropertyGroup>
<AssemblyCompany>Pushkin</AssemblyCompany>
<AssemblyTrademark>Alex</AssemblyTrademark>
<AssemblyConfiguration></AssemblyConfiguration>
<AssemblyCopyright>Pushkin © 2012</AssemblyCopyright>
<AssemblyCulture></AssemblyCulture>
<AssemblyDescription></AssemblyDescription>
<AssemblyProduct>PushkinRobot</AssemblyProduct>
<AssemblyTitle></AssemblyTitle>
</PropertyGroup>
.......
</pre>
</div></div><br />Частично дёрнуто <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAADaUgqeUiMvqHjAqLN3xr_cYQ12WhxUIL45Q--L0kVVWsZ0jh_Oa4Ud_HUMnd8RyhDZWfh4aMV0tySxT8_bEjQmlzBZvUY3wKTKbV47pihEGujBvM9mU-e9szdWH74DPxnhbmlZl0jpBPMQn3HnHlk0" title="http://stackoverflow.com/questions/4562845/how-can-i-change-assembly-version-number-using-assemblyinfotask">отсюда</a><br />Только проследите, чтоб в каждом номере версии было не более 4 цифр (код по ссылке нормально не работает).<br />В итоге у вас при каждом билде номер версии будет изменяться в соответствии с шаблоном. Причём и номер версии файла тоже.<br />И информацию о продукте также можно будет редактировать только в одном месте.<br />https://stocksharp.ru/topic/3283/Изменения API2012-12-27T17:59:02Z2012-12-27T17:59:02ZVassilSanychhttps://stocksharp.ru/users/6491/info@stocksharp.ruВообще изменения существующего API в серьёзных проектах не приветствуются.<br />Но если они жизненно необходимы, то это делается так:<br />- устаревший метод/класс помечается атрибутом Obsolete ([System.Obsolete("use class B")]). При билде в Visual Studio это будет видно в warnings. <br />- содержимое устаревшего метода заменяется рабочей обёрткой над новым функционалом<br />- при выпуске мажорной версии (например 1.7 -> 2.0) устаревший код окончательно выбрасывается с указанием в описании релиза.<br />Вот как-то так.