← Zurück

Исполнение Strategy по Событию, а не по Интервалу.

Алгоритм который я использую подразумевает вызов метода process() класса Strategy не по интервалу а по событию изменение цены. Каким образом можно осуществить это?

War dieses Thema hilfreich?

Thema teilen

Kommentare (24)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

Запоминается цена на первой итерации. Каждый раз она сравнивается с текущими. Случилось условие - сработал алгоритм.

sergun
sergun

Но повлиять на то, что process() вызывается именно через промежутки времени никак нельзя? Кастомизировать его вызов именно по событию определенного типа..

Ведь если задаться даже небольшим интервалом, все равно можно пропустить существенное для стратегии событие.

takanaev
takanaev

Также была потребность реализации без-таймфреймовой стратегии, посмотрел на класс Strategy в библиотеке и сделал свой.

sergun
sergun

В смысле в виде наследника Strategy? Или вообще не использовали Strategy?

takanaev
takanaev

Совсем не использовал Strategy/

Mikhail Sukhov
Mikhail Sukhov

Если вообще отказаться от интервала - то что такая стратегия будет мониторить?

HaMMeR
HaMMeR Autor

Событие изменение цены. Я понимаю что можно сделать это и по другому, например как в посте 2, Но тут программа будет попусту вызывать process() каждые n времени. А так если цена не изменяется, то и не надо вызывать process(). Пример грубый, но нужный.

Mikhail Sukhov
Mikhail Sukhov

А какое событие будете использовать при этом?

takanaev
takanaev

У меня просто после соединения и получения всех ЦБ была необходимость как можно часто высчитывать некий индикатор и принимать решение о позиции. Поэтому просто сделал что-то вроде этого:


net Thread(Robot).Start();
...
void Robot()
{
    while(true)
    {
        // считаем наши индикаторы
        // принимаем решение о позиции
    }


Но это просто у меня была такая необходимость как можно чаще мониторить ситуацию. Поэтому если уж использовать существующую библиотеку, то может просто построить некий базовый класс стратегий без интервала, а поверх интервальный, кому нужно.

Mikhail Sukhov
Mikhail Sukhov
  1. Фактически, реализовали то же самое, что и StrategyManager.
  2. Укажите интервал TimeSpan.Zero для Strategy и получите такой же вечный цикл без ожидания.
  3. С Квиком может и не принести желаемого (уверен почти на 100). Не умеет он так быстро данные перегонять.
Dmitriy Klimov
Dmitriy Klimov

Если я пишу свою стратегию как производную от класса Strategy и хочу вызывать алгоритм не через какой-то промежуток времени, а по своим условиям, я могу просто задать заведомо большое значение свойству Strategy.Interval и вызывать Strategy.Process тогда, когда мне это нужно. Так получается?

Mikhail Sukhov
Mikhail Sukhov

Лучше опишите, какого типа условия. Абстрактно, да, задавайте интервал поменьше, и мониторьте ситуацию.

ustas
ustas

Сорри за то что влезаю, тут смысл вопроса был, как я понимаю, как раз в том чтобы можно было задать интревал ПОБОЛЬШЕ (а не поменьше как Вы написали). Или Вообше от него отказаться. Чтобы не дергаться лишний раз а только тогда когда НУЖНО.

А нужно, например, когда в стакане что то появиться к примеру. Поэтому типа сделать event на стакан, и вызывать стратегию событием а не по интервалу. Правильно ли, что это можно делать с помощью вызова Startegy.Process ?

Спасибо и с уважением! Эта задача стала достаточно актуальна в свете того что управление заявками например в 2.1 рекомендуется реализовывать через стратегии

Mikhail Sukhov
Mikhail Sukhov

А в чем проблема, если эта вещь будет часто вызываться и смотреть на зарегистрированные условия? Нагрузку то на процессор все равно не создаст.

ustas
ustas

Чаще чем меняется стакан?

Какой интервал порекомендуете?

Спасибо и с уважением!

Mikhail Sukhov
Mikhail Sukhov

Поставьте 300 миллисекунд. Не грузит - уменьшите. Грузит - увеличьте.

Dmitriy Klimov
Dmitriy Klimov

Лично я интервал поставил заведомо большой, а стратегия перезапускает алгоритм сама автоматически по событию изменения данных в стакане.

ustas
ustas

Так дело не в том какой интервал, просто хочется работать по событию trader_QuotesChanged(MarketDepth obj) например

а он может быть чаще/реже любого интервала

Спасибо и с уважением!

ustas
ustas

Спасибо.

а что значит "стратегия перезапускает алгоритм"? Какой метод используется? strategy.Process? или что то другое?

С уважением!

Dmitriy Klimov
Dmitriy Klimov

По логике S# алгоритм стратегии прописывается в методе OnProcess (смотрите пример SampleSMA). При запуске стратегия подписывается на событие обновления стакана, и при наступлении этого события вызывает этот метод.

ustas
ustas

Спасибо, я так и думал.

Просто до этого Вы писали про "Strategy.Process" поэтому я и хотел уточнить.

С уважением!

Serg
Serg

а если стратегия подписалась на два стакана? и при изменении любого вызывается 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();

Короче на одну строку, меньше цифр, а разницу в скорости вы никогда в жизни не увидите.

Serg
Serg

огромное спасибо. буду пробовать