Алгоритм который я использую подразумевает вызов метода process()
класса Strategy не по интервалу а по событию изменение цены.
Каким образом можно осуществить это?
Но повлиять на то, что process() вызывается именно через промежутки
времени никак нельзя?
Кастомизировать его вызов именно по событию определенного типа..
Ведь если задаться даже небольшим интервалом, все равно можно
пропустить существенное для стратегии событие.
Событие изменение цены.
Я понимаю что можно сделать это и по другому, например как в посте 2,
Но тут программа будет попусту вызывать process() каждые n времени.
А так если цена не изменяется, то и не надо вызывать process().
Пример грубый, но нужный.
У меня просто после соединения и получения всех ЦБ была необходимость
как можно часто высчитывать некий индикатор и принимать решение о
позиции. Поэтому просто сделал что-то вроде этого:
net Thread(Robot).Start();
...
void Robot()
{
while(true)
{
// считаем наши индикаторы
// принимаем решение о позиции
}
Но это просто у меня была такая необходимость как можно чаще
мониторить ситуацию.
Поэтому если уж использовать существующую библиотеку, то может просто
построить некий базовый класс стратегий без интервала, а поверх
интервальный, кому нужно.
Если я пишу свою стратегию как производную от класса Strategy и хочу
вызывать алгоритм не через какой-то промежуток времени, а по своим
условиям, я могу просто задать заведомо большое значение свойству
Strategy.Interval и вызывать Strategy.Process тогда, когда мне это
нужно. Так получается?
Сорри за то что влезаю,
тут смысл вопроса был, как я понимаю, как раз в том чтобы можно было
задать интревал ПОБОЛЬШЕ (а не поменьше как Вы написали). Или Вообше
от него отказаться.
Чтобы не дергаться лишний раз а только тогда когда НУЖНО.
А нужно, например, когда в стакане что то появиться к примеру. Поэтому
типа сделать event на стакан, и вызывать стратегию событием а не по
интервалу.
Правильно ли, что это можно делать с помощью вызова Startegy.Process ?
Спасибо и с уважением!
Эта задача стала достаточно актуальна в свете того что управление
заявками например в 2.1 рекомендуется реализовывать через стратегии
По логике S# алгоритм стратегии прописывается в методе OnProcess
(смотрите пример SampleSMA). При запуске стратегия подписывается на
событие обновления стакана, и при наступлении этого события вызывает
этот метод.
а если стратегия подписалась на два стакана? и при изменении любого
вызывается OnProcess. Как сделать так чтобы в момент обновления
первого стакана и и работы OnProcess обновился второй но НЕ вызвал
OnProcess?
В своём наследнике Strategy делаете поле int _inUse;
В начале переопределённого OnProcess() пишете примерно так:
int inUse = Interlocked.CompareExchange(ref _inUse, 1, 0);
if (inUse == 0)
{
try
{
// ваша логика
finally
{
Interlocked.Exchange(ref _inUse, 0);
Это самый эффективный способ блокирования от параллельной работы. Ещё
есть метод для ленивых, с семафором. Объявляете филд SemaphoreSlim
_lock = new SemaphoreSlim(1,1);
В OnProcess примерно так:
if (_lock.Wait(0))
{
try
{
// логика
finally
{
_lock.Release();
Короче на одну строку, меньше цифр, а разницу в скорости вы никогда в
жизни не увидите.
Comments (24)
Login or Create account, Log in or register to leave a comment
Запоминается цена на первой итерации. Каждый раз она сравнивается с текущими. Случилось условие - сработал алгоритм.
Но повлиять на то, что process() вызывается именно через промежутки времени никак нельзя? Кастомизировать его вызов именно по событию определенного типа..
Ведь если задаться даже небольшим интервалом, все равно можно пропустить существенное для стратегии событие.
Также была потребность реализации без-таймфреймовой стратегии, посмотрел на класс Strategy в библиотеке и сделал свой.
В смысле в виде наследника Strategy? Или вообще не использовали Strategy?
Совсем не использовал Strategy/
Если вообще отказаться от интервала - то что такая стратегия будет мониторить?
Событие изменение цены. Я понимаю что можно сделать это и по другому, например как в посте 2, Но тут программа будет попусту вызывать process() каждые n времени. А так если цена не изменяется, то и не надо вызывать process(). Пример грубый, но нужный.
А какое событие будете использовать при этом?
У меня просто после соединения и получения всех ЦБ была необходимость как можно часто высчитывать некий индикатор и принимать решение о позиции. Поэтому просто сделал что-то вроде этого:
Но это просто у меня была такая необходимость как можно чаще мониторить ситуацию. Поэтому если уж использовать существующую библиотеку, то может просто построить некий базовый класс стратегий без интервала, а поверх интервальный, кому нужно.
Если я пишу свою стратегию как производную от класса Strategy и хочу вызывать алгоритм не через какой-то промежуток времени, а по своим условиям, я могу просто задать заведомо большое значение свойству Strategy.Interval и вызывать Strategy.Process тогда, когда мне это нужно. Так получается?
Лучше опишите, какого типа условия. Абстрактно, да, задавайте интервал поменьше, и мониторьте ситуацию.
Сорри за то что влезаю, тут смысл вопроса был, как я понимаю, как раз в том чтобы можно было задать интревал ПОБОЛЬШЕ (а не поменьше как Вы написали). Или Вообше от него отказаться. Чтобы не дергаться лишний раз а только тогда когда НУЖНО.
А нужно, например, когда в стакане что то появиться к примеру. Поэтому типа сделать event на стакан, и вызывать стратегию событием а не по интервалу. Правильно ли, что это можно делать с помощью вызова Startegy.Process ?
Спасибо и с уважением! Эта задача стала достаточно актуальна в свете того что управление заявками например в 2.1 рекомендуется реализовывать через стратегии
А в чем проблема, если эта вещь будет часто вызываться и смотреть на зарегистрированные условия? Нагрузку то на процессор все равно не создаст.
Чаще чем меняется стакан?
Какой интервал порекомендуете?
Спасибо и с уважением!
Поставьте 300 миллисекунд. Не грузит - уменьшите. Грузит - увеличьте.
Лично я интервал поставил заведомо большой, а стратегия перезапускает алгоритм сама автоматически по событию изменения данных в стакане.
Так дело не в том какой интервал, просто хочется работать по событию trader_QuotesChanged(MarketDepth obj) например
а он может быть чаще/реже любого интервала
Спасибо и с уважением!
Спасибо.
а что значит "стратегия перезапускает алгоритм"? Какой метод используется? strategy.Process? или что то другое?
С уважением!
По логике S# алгоритм стратегии прописывается в методе OnProcess (смотрите пример SampleSMA). При запуске стратегия подписывается на событие обновления стакана, и при наступлении этого события вызывает этот метод.
Спасибо, я так и думал.
Просто до этого Вы писали про "Strategy.Process" поэтому я и хотел уточнить.
С уважением!
а если стратегия подписалась на два стакана? и при изменении любого вызывается OnProcess. Как сделать так чтобы в момент обновления первого стакана и и работы OnProcess обновился второй но НЕ вызвал OnProcess?
В своём наследнике Strategy делаете поле int _inUse; В начале переопределённого OnProcess() пишете примерно так:
int inUse = Interlocked.CompareExchange(ref _inUse, 1, 0); if (inUse == 0) { try { // ваша логика
finally { Interlocked.Exchange(ref _inUse, 0);
Это самый эффективный способ блокирования от параллельной работы. Ещё есть метод для ленивых, с семафором. Объявляете филд SemaphoreSlim _lock = new SemaphoreSlim(1,1);
В OnProcess примерно так: if (_lock.Wait(0)) { try { // логика
finally { _lock.Release();
Короче на одну строку, меньше цифр, а разницу в скорости вы никогда в жизни не увидите.
огромное спасибо. буду пробовать