работа с событиями~/topic/4110/rabota-s-sobytiyami/Copyright @ StockSharp Platform LLC 2010 - 20242024-03-28T14:27:12Zhttps://stocksharp.com/images/logo.pnghttps://stocksharp.com/posts/m/29011/Фактически вывод графики и рассчёты в алгоритме происходят одновременно. Круто! Спасибо.2014-01-13T10:10:24Z2014-01-13T10:10:24Zpft_manhttps://stocksharp.com/users/28735/info@stocksharp.comФактически вывод графики и рассчёты в алгоритме происходят одновременно. Круто! Спасибо.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/29003/А вот, кстати, возвращаясь к теме топика, такой вопрос возник. Допустим, есть у нас метод, подписанн...2014-01-13T04:26:15Z2014-01-13T04:26:15ZIvanBhttps://stocksharp.com/users/26984/info@stocksharp.com<div class="quote"><span class="quotetitle">pft_man <a href="https://stocksharp.com/posts/m/29002/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">А вот, кстати, возвращаясь к теме топика, такой вопрос возник. Допустим, есть у нас метод, подписанный на событие изменения стакана.<br /><br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
private void ProcessMarketDepth(MarketDepth md)
{
this.GuiAsync(() =>
{
// здесь что-то делаем в GUI-потоке
// например, выводим изменение стакана на форму
});
// здесь тоже что-то делаем
// например, считаем весь объём в бидах и офферах
}
</pre>
</div></div><br /><br />Вторая часть, где мы считаем объём в бидах и офферах будет выполняться не в GUI-потоке, а в том потоке, в котором этот метод ProcessMarketDepth вызвался? То есть программа будет работать так: при событии изменения стакана создаётся новый поток, в котором рассчитывается объём, и одновременно с этим в GUI-потоке произойдёт вывод на форму стакана? Всё правильно?</div></div><br />Вторая часть суждений не очень верна. Создается ли новый поток при изменении стакана или нет, нам, как пользователям, не известно, это заботы библиотеки. Для нас важно то, что метод ProcessMarketDepth, которым мы подписались на изменение события изменения стакана, будет вызываться.<br />После того как метод ProcessMarketDepth вызван, блок кода:<br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
// здесь что-то делаем в GUI-потоке
// например, выводим изменение стакана на форму</pre>
</div></div><br />отправляется на выполнение в пользовательском (GUI) потоке, сразу после того как выполнение кода передано потоку GUI (но код еще не обязательно выполнен), выполняется следующий код:<br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
// здесь тоже что-то делаем
// например, считаем весь объём в бидах и офферах </pre>
</div></div><br />Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/29002/А вот, кстати, возвращаясь к теме топика, такой вопрос возник. Допустим, есть у нас метод, подписанн...2014-01-12T21:08:52Z2014-01-12T21:16:06Zpft_manhttps://stocksharp.com/users/28735/info@stocksharp.comА вот, кстати, возвращаясь к теме топика, такой вопрос возник. Допустим, есть у нас метод, подписанный на событие изменения стакана.<br /><br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
private void ProcessMarketDepth(MarketDepth md)
{
this.GuiAsync(() =>
{
// здесь что-то делаем в GUI-потоке
// например, выводим изменение стакана на форму
});
// здесь тоже что-то делаем
// например, считаем весь объём в бидах и офферах
}
</pre>
</div></div><br /><br />Вторая часть, где мы считаем объём в бидах и офферах будет выполняться не в GUI-потоке, а в том потоке, в котором этот метод ProcessMarketDepth вызвался? То есть программа будет работать так: при событии изменения стакана создаётся новый поток, в котором рассчитывается объём, и одновременно с этим в GUI-потоке произойдёт вывод на форму стакана? Всё правильно?Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/28240/А пример Sample так же работает? Попробуйте, кстати, еще из последней версии запустить. Поменялась л...2013-11-15T14:11:59Z2013-11-15T14:11:59ZMikhail Sukhovhttps://stocksharp.com/users/201/info@stocksharp.comА пример Sample так же работает? Попробуйте, кстати, еще из последней версии запустить. Поменялась ли ситуация?Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/28237/Может кто уже сталкивался? Квик, на счёте позиции по нескольким бумагам, все нужны для стратегии. Ча...2013-11-15T13:32:35Z2013-11-15T13:32:35ZAxellhttps://stocksharp.com/users/373/info@stocksharp.comМожет кто уже сталкивался? Квик, на счёте позиции по нескольким бумагам, все нужны для стратегии. Часто при первом срабатывании события NewPositions приходят не все бумаги по которым есть позиции, через некоторое время опять срабатывает NewPositions и приходит уже все бумаги. Иногда все позиции по бумагам приходят толко после нескольких срабатываний NewPositions. Почему сразу не приходит вся коллекция Position и как с этим бороться?Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/28220/Подскажите. Есть два стандартных события: NewSecurities и NewPortfolios. Соответственно, в методе ка...2013-11-15T04:35:51Z2013-11-15T04:43:21ZIvanBhttps://stocksharp.com/users/26984/info@stocksharp.com<div class="quote"><span class="quotetitle">pft_man <a href="https://stocksharp.com/posts/m/28217/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">Подскажите. Есть два стандартных события: NewSecurities и NewPortfolios. Соответственно, в методе каждого события проверяем, пришёл ли нужный инструмент и портфель. Как сделать так, чтобы дальнейший метод CreateStrategy - создание и запуск стратегии - запускался только когда пришёл И нужный инструмент И нужный портфель? <br /><br /><div class='spoilertitle'><input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_f9064a74c95b4acebb0d2139ac47721c');" title='Show spoiler' /></div><div class='spoilerbox' id='spolier_f9064a74c95b4acebb0d2139ac47721c' style='display:none'><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
private void ConnectClick(object sender, RoutedEventArgs e)
{
Action<IEnumerable<Security>> newSecurities = null;
newSecurities = securities => this.GuiAsync(() =>
{
foreach (Security sec in securities)
{
if (sec.Code == "XXX")
{
_connection.Trader.NewSecurities -= newSecurities;
tbSecurity.Text = sec.ShortName;
security = sec;
}
}
});
Action<IEnumerable<Portfolio>> newPortfolios = null;
newPortfolios = portfolios => this.GuiAsync(() =>
{
foreach (Portfolio port in portfolios)
{
if (port.Name == "XXX")
{
_connection.Trader.NewPortfolios -= newPortfolios;
tbPortfolio.Text = port.Name;
portfolio = port;
}
}
});
_connection.Trader.NewSecurities += newSecurities;
_connection.Trader.NewPortfolios += newPortfolios;
_connection.ConnectSafe();
}
private void CreateStrategy()
{
// Создаём и запускаем стратегию
}
</pre>
</div></div></div></div></div><br />Если изначально поля portfolio и security имедют значение null, то можно сделать так:<br /><br /><div class='spoilertitle'><input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_eb0ceb55131945038f401b863cebeb09');" title='Show spoiler' /></div><div class='spoilerbox' id='spolier_eb0ceb55131945038f401b863cebeb09' style='display:none'><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
private void ConnectClick(object sender, RoutedEventArgs e)
{
Action<IEnumerable<Security>> newSecurities = null;
newSecurities = securities => this.GuiAsync(() =>
{
foreach (Security sec in securities)
{
if (sec.Code == "XXX")
{
_connection.Trader.NewSecurities -= newSecurities;
tbSecurity.Text = sec.ShortName;
security = sec;
if (portfolio!=null)
CreateStrategy();
}
}
});
Action<IEnumerable<Portfolio>> newPortfolios = null;
newPortfolios = portfolios => this.GuiAsync(() =>
{
foreach (Portfolio port in portfolios)
{
if (port.Name == "XXX")
{
_connection.Trader.NewPortfolios -= newPortfolios;
tbPortfolio.Text = port.Name;
portfolio = port;
if (security!=null)
CreateStrategy();
}
}
});
_connection.Trader.NewSecurities += newSecurities;
_connection.Trader.NewPortfolios += newPortfolios;
_connection.ConnectSafe();
}
private void CreateStrategy()
{
// Создаём и запускаем стратегию
}
</pre>
</div></div></div><br /><br />И, думаю, надо предостеречься, чтобы стратегия не создавалась повторно, используя либо проверку переменной стратегии на нуль или через флаг.<br /><br />PS. Пожалуйста используйте СПОЙЛЕР для скрытия большого кода, чтоб он не был всегда виден, теги спойлера доступны в панели инструментов редактора поста.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/28217/Подскажите. Есть два стандартных события: NewSecurities и NewPortfolios. Соответственно, в методе ка...2013-11-14T21:16:14Z2013-11-15T04:36:15Zpft_manhttps://stocksharp.com/users/28735/info@stocksharp.comПодскажите. Есть два стандартных события: NewSecurities и NewPortfolios. Соответственно, в методе каждого события проверяем, пришёл ли нужный инструмент и портфель. Как сделать так, чтобы дальнейший метод CreateStrategy - создание и запуск стратегии - запускался только когда пришёл И нужный инструмент И нужный портфель? <br /><br /><div class='spoilertitle'><input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_eaaba971ee1b4995af4daa132e885793');" title='Show spoiler' /></div><div class='spoilerbox' id='spolier_eaaba971ee1b4995af4daa132e885793' style='display:none'><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
private void ConnectClick(object sender, RoutedEventArgs e)
{
Action<IEnumerable<Security>> newSecurities = null;
newSecurities = securities => this.GuiAsync(() =>
{
foreach (Security sec in securities)
{
if (sec.Code == "XXX")
{
_connection.Trader.NewSecurities -= newSecurities;
tbSecurity.Text = sec.ShortName;
security = sec;
}
}
});
Action<IEnumerable<Portfolio>> newPortfolios = null;
newPortfolios = portfolios => this.GuiAsync(() =>
{
foreach (Portfolio port in portfolios)
{
if (port.Name == "XXX")
{
_connection.Trader.NewPortfolios -= newPortfolios;
tbPortfolio.Text = port.Name;
portfolio = port;
}
}
});
_connection.Trader.NewSecurities += newSecurities;
_connection.Trader.NewPortfolios += newPortfolios;
_connection.ConnectSafe();
}
private void CreateStrategy()
{
// Создаём и запускаем стратегию
}
</pre>
</div></div></div>Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/28133/А метод - обработчик события запускается в новом потоке, правильно? В общем случае не обязательно, с...2013-11-11T05:33:00Z2013-11-15T04:26:37ZIvanBhttps://stocksharp.com/users/26984/info@stocksharp.com<div class="quote"><span class="quotetitle">pft_man <a href="https://stocksharp.com/posts/m/28122/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">А метод - обработчик события запускается в новом потоке, правильно? <br /></div></div><br />В общем случае не обязательно, смотря как реализовано, если относительно S#.API, то там, фактически все вызываются вне потока GUI.<br /><br /><div class="quote"><span class="quotetitle">pft_man <a href="https://stocksharp.com/posts/m/28122/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">И если мы, например, хотим что-то вывести на нашу форму, то для того чтобы синхронизировать этот новый поток с GUI потоком, мы используем метод GuiAsync? Простые вещи, но начинают доходить только после 2-3го просмотра видео ;)</div></div><br />Да, верно )Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/28122/А метод - обработчик события запускается в новом потоке, правильно? И если мы, например, хотим что-т...2013-11-10T18:57:59Z2013-11-10T18:57:59Zpft_manhttps://stocksharp.com/users/28735/info@stocksharp.comА метод - обработчик события запускается в новом потоке, правильно? И если мы, например, хотим что-то вывести на нашу форму, то для того чтобы синхронизировать этот новый поток с GUI потоком, мы используем метод GuiAsync? Простые вещи, но начинают доходить только после 2-3го просмотра видео ;)Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/28114/Здравствуйте. Если я например, вместо использования MarketRule у стратегии WhenNewMyTrades, подпишус...2013-11-10T05:19:37Z2013-11-10T05:19:37ZIvanBhttps://stocksharp.com/users/26984/info@stocksharp.com<div class="quote"><span class="quotetitle">pft_man <a href="https://stocksharp.com/posts/m/28110/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">Здравствуйте. <br />Если я например, вместо использования MarketRule у стратегии WhenNewMyTrades, подпишусь на событие NewMyTrades, нужно ли мне где-то потом от него отписываться, например при остановке стратегии?</div></div><br />Все зависит от Вашей задачи. Если от старта к старту стратегии надо обрабатывать новые сделки разными способами, например, каждый раз Вы используете разные типы инструментов и для каждого типа своя логика обработки сделок, в таком случае надо отписываться от события и задавать новый обработчик.<br />Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/28110/Здравствуйте. В уроке про MarketRules было сказано, что они в основном были созданы, чтобы упростить...2013-11-09T18:16:31Z2013-11-09T18:16:31Zpft_manhttps://stocksharp.com/users/28735/info@stocksharp.comЗдравствуйте. <br /><br />В уроке про MarketRules было сказано, что они в основном были созданы, чтобы упростить работу с событиями, в частности, чтобы не подписываться и не отписываться на события. Если я например, вместо использования MarketRule у стратегии WhenNewMyTrades, подпишусь на событие NewMyTrades, нужно ли мне где-то потом от него отписываться, например при остановке стратегии?Copyright @ StockSharp Platform LLC 2010 - 2024