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


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

Теги:


Спасибо:




24 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 08.06.2010
Ответить


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

Спасибо:

sergun

Фотография
Дата: 09.06.2010
Ответить


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

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

Спасибо:

takanaev

Фотография
Дата: 10.06.2010
Ответить


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

Спасибо:

sergun

Фотография
Дата: 10.06.2010
Ответить


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

Спасибо:

takanaev

Фотография
Дата: 10.06.2010
Ответить


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

Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 10.06.2010
Ответить


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

Спасибо:

HaMMeR

Фотография
Дата: 11.06.2010
Ответить


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

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 11.06.2010
Ответить


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

Спасибо:

takanaev

Фотография
Дата: 11.06.2010
Ответить


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

Код

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



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

Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 11.06.2010
Ответить


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

Спасибо:

Dmitriy Klimov

Фотография
Дата: 02.07.2010
Ответить


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

Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 05.07.2010
Ответить


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

Спасибо:

ustas

Фотография
Дата: 14.07.2010
Ответить


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

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

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

Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 14.07.2010
Ответить


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

Спасибо:

ustas

Фотография
Дата: 14.07.2010
Ответить


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

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

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

Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 14.07.2010
Ответить


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

Спасибо:

Dmitriy Klimov

Фотография
Дата: 14.07.2010
Ответить


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

Спасибо:

ustas

Фотография
Дата: 14.07.2010
Ответить


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

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

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

Спасибо:

ustas

Фотография
Дата: 14.07.2010
Ответить


Спасибо.

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

С уважением!

Спасибо:

Dmitriy Klimov

Фотография
Дата: 14.07.2010
Ответить


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

Спасибо:

ustas

Фотография
Дата: 14.07.2010
Ответить


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

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

С уважением!

Спасибо:

Serg

Фотография
Дата: 24.08.2010
Ответить


а если стратегия подписалась на два стакана? и при изменении любого
вызывается OnProcess. Как сделать так чтобы в момент обновления
первого стакана и и работы OnProcess обновился второй но НЕ вызвал
OnProcess?
Спасибо:

Иванов Андрей

Фотография
Дата: 25.08.2010
Ответить


В своём наследнике 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

Фотография
Дата: 25.08.2010
Ответить


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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy