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
|
Дата: 11.06.2010
Если вообще отказаться от интервала - то что такая стратегия будет мониторить?
|
|
|
|
HaMMeR
|
Дата: 11.06.2010
Событие изменение цены. Я понимаю что можно сделать это и по другому, например как в посте 2, Но тут программа будет попусту вызывать process() каждые n времени. А так если цена не изменяется, то и не надо вызывать process(). Пример грубый, но нужный.
|
Автор топика
|
|
|
Mikhail Sukhov
|
Дата: 11.06.2010
А какое событие будете использовать при этом?
|
|
|
|
takanaev
|
Дата: 11.06.2010
У меня просто после соединения и получения всех ЦБ была необходимость как можно часто высчитывать некий индикатор и принимать решение о позиции. Поэтому просто сделал что-то вроде этого: Code net Thread(Robot).Start(); ... void Robot() { while(true) { // считаем наши индикаторы // принимаем решение о позиции }
Но это просто у меня была такая необходимость как можно чаще мониторить ситуацию. Поэтому если уж использовать существующую библиотеку, то может просто построить некий базовый класс стратегий без интервала, а поверх интервальный, кому нужно.
|
|
|
|
Mikhail Sukhov
|
Дата: 11.06.2010
1. Фактически, реализовали то же самое, что и StrategyManager. 2. Укажите интервал TimeSpan.Zero для Strategy и получите такой же вечный цикл без ожидания. 3. С Квиком может и не принести желаемого (уверен почти на 100). Не умеет он так быстро данные перегонять.
|
|
|
|
Dmitriy Klimov
|
Дата: 03.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
|
Дата: 15.07.2010
Лично я интервал поставил заведомо большой, а стратегия перезапускает алгоритм сама автоматически по событию изменения данных в стакане.
|
|
|
|
ustas
|
Дата: 15.07.2010
Так дело не в том какой интервал, просто хочется работать по событию trader_QuotesChanged(MarketDepth obj) например
а он может быть чаще/реже любого интервала
Спасибо и с уважением!
|
|
|
|
ustas
|
Дата: 15.07.2010
Спасибо.
а что значит "стратегия перезапускает алгоритм"? Какой метод используется? strategy.Process? или что то другое?
С уважением!
|
|
|
|
Dmitriy Klimov
|
Дата: 15.07.2010
По логике S# алгоритм стратегии прописывается в методе OnProcess (смотрите пример SampleSMA). При запуске стратегия подписывается на событие обновления стакана, и при наступлении этого события вызывает этот метод.
|
|
|
|
ustas
|
Дата: 15.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
огромное спасибо. буду пробовать
|
|
|