Где бродит свеча
Atom Ответить
27.08.2012


Пример SMA для Quik.
Тайм-фрейм 5 секунд.
Графики все отключены (с ними память жрёт ококо 600 Мб - 1 Гб и программа висит). Без графиков память 150 Мб.
После старта стратегии прошло 2 минуты.
Вопрос: Где бродят данные свечи, поступившие с
Код
_candleManager.Processing += (series, candle) =>

до значения индикатора
Код
LongSma.Process((DecimalIndicatorValue)candle.ClosePrice);
ShortSma.Process((DecimalIndicatorValue)candle.ClosePrice);


Теги:


Спасибо:




22 Ответов
MaximMM

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


Смотрите документацию:
Свечки>График.
Спасибо:

alex123456

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


Объясню вопрос другими словами.
candlemanger за 60 сек переработал 12 5-секундных свечей,
а strategy за 60 сек только одну(или две, три, но меньше 12).
Где клинет?
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 29.08.2012
Ответить


Телепаты в отпуске. По сообщениям не понятно в чем проблема. Нет никакого описания как это воспроизвести. Нет никакого кода, который бы показал суть ошибки. Есть только видео, на котором опять же ничего не понятно.
Спасибо:

alex123456

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


Вот исходник с доделками Quik\SampleSMA версии 4.1.2.
Ждать пока все сделки совершатся.
SampleSMA2.zip 7,6MB (0)
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 29.08.2012
Ответить


Никуда ничего не пропадает, просто время свечки из стратегии берется только при изменении параметров стратегии, которые, видимо, меняются довольно редко.
Спасибо:

alex123456

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


Стратегия строится на основе простых скользящих средних, которые заполняются данными из свечек (candle.ClosePrice).
Т.е. с приходом свечки срабатывает событие
Код
_candleManager.Processing...
и строится свечка, после должны автоматически вычисляться скользящие средние
Код
Sma.Process((DecimalIndicatorValue)candle.ClosePrice);

после проверяются следующие условия:
Код
var isShortLessThenLong = ShortSma.LastValue < LongSma.LastValue;
			// если произошло пересечение
			if (_isShortLessThenLong != isShortLessThenLong)
....

и т.д. с каждой свечкой.
Это проверяется с помощью останова и шагом с заходом.
Причём стратегия не может знать какие данные пришли ( может короткая пересекла длинную или наоборот), т.е. она должна обрабатывать каждую свечку и вовремя.
Да, ещё стратегия совсем простая, в ней нет никаких наисложнейщих вычислений и обрабатывает всего одну бумагу.
Т.е. задержка должна быть милисекунда.
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 29.08.2012
Ответить


Так и поставьте точку останова на
Код
Sma.Process((DecimalIndicatorValue)candle.ClosePrice);

посмотрите, как часто она вызывается. А обрабатывать событие _strategy.PropertyChanged для получения последней свечки из стратегии не совсем корректно, кто его вызывать будет когда туда новая свеча приходит?
Спасибо:

MaximMM

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


Попробуйте вместо:
Код
candleManager.Processing += (series, candle) =>
{

this.GuiAsync(() => { TimeCandle.Content = candle.OpenTime.ToLongTimeString(); });

};


Написать:
Код
_candleManager.Processing += DrawCandle;

...

private void DrawCandle(CandleSeries series, Candle candle)
{
if (candle.State == CandleStates.Finished) this.GuiAsync(() => TimeCandle.Content = candle.OpenTime.ToLongTimeString(); );
}
Спасибо:

alex123456

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


MaximMM Вашу мысль попробовал - тоже самое.
_strategy.PropertyChanged - это событие изменения параметров стратегии.
Sma.Process((DecimalIndicatorValue)candle.ClosePrice); - это параметр стратегии?
Я думаю, что Да.
Значит при изменении его должно срабатывать это событие.
Но оно не срабатывает с каждым изменением индикаторного значения.
Если поставить остановы на
Код
this.GuiAsync(() => { TimeCandle.Content = candle.OpenTime.ToLongTimeString(); });

и
Код
LongSma.Process((DecimalIndicatorValue)candle.ClosePrice);

и
Код
TimeCandleStrategy.Content = _strategy._candle;

то первые два работают в цикле всегда, а третье по своему тайному алгоритму.
Ещё возник вопрос по объёму стратегии (по умолчанию: Volume = 1), но если посмотреть на сделки, то их 5, 7, или 10 на одной свечке(т.е. при одном расположении скользящих средних).
Откуда такое количество сделок?
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 30.08.2012
Ответить


alex123456 Перейти

Sma.Process((DecimalIndicatorValue)candle.ClosePrice); - это параметр стратегии?
Я думаю, что Да.

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

Вы добавили какое-то поле в производном классе, откуда стратегия должна знать что это такое, параметр это или нет? Сделайте свое событие, которое будете сами и вызывать когда надо, либо смотрите в сторону Strategy.Notify.
Спасибо:

alex123456

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


в class SmaStrategy добавляем метод:
Код
protected internal void Notify(string candle)
        {
            base.NotifyPropertyChanged(candle);
        }

в метод private void ProcessCandle(Candle candle) добавляем обращение к вышенаписанному методу
Код
Notify(_candle);

Тогда при изменении значения свечки сразу же изменяется параметр стратегии.
Т.е. работает цикл:
Код
this.GuiAsync(() => { TimeCandle.Content = candle.OpenTime.ToLongTimeString(); });---
---Sma.Process((DecimalIndicatorValue)candle.ClosePrice);---
---base.NotifyPropertyChanged(candle);---
---this.GuiAsync(() => { TimeCandleStrategy.Content = _strategy._candle; });

esper - спасибо!
Ответьте ещё на вопрос о объёме.
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 01.09.2012
Ответить


Код
protected internal void Notify(string candle)
        {
            base.NotifyPropertyChanged(candle);
        }

его не надо добавлять, он есть в базовой стратегии.

Цитата:
Ответьте ещё на вопрос о объёме.

Без логов от котирования ничего сказать нельзя.
Спасибо:

alex123456

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


Опять всё про стратегию, сделки и объёмы.
Автор топика
Спасибо:

alex123456

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


Использовалось вот это котирование:
Код
var strategy = new LastTradeQuotingStrategy(direction, Volume);

да при этом
Код
var strategy = new MarketQuotingStrategy(direction, Volume);

практически никакой разницы
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 01.09.2012
Ответить


Еще раз, без логов от стратегии котирования ничего сказать нельзя.
Спасибо:

alex123456

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


А где их взять?
Автор топика
Спасибо:

MaximMM

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


alex123456 Перейти
А где их взять?

Код
var strategy = new MarketQuotingStrategy(direction, Volume);

Для логирования сообщений необходимо добавить
Код
strategy
стратегию в LogManager.Sources
Спасибо:

alex123456

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


Вот куча лог файлов.
Но там нет данных по значениям индикаторов.
По этим данным всё равно не понятно почему стратегия котирования делает столько сделок в самом начале (потом все нормально по 1 объёму, но не понятно в какое время (почему в этот момент, а не в другой)). В конце первого котирования - позиция может быть нулевой (т.е. сколько купили столько и продали - Смысл?).
Да, причём за каждую сделку берётся комиссия (например: 10 покупок и 10 продаж - комиссия за 2*10 +2*10=40 сделок и со стороны биржи и брокера).
Если попробовать вот это, по логике должна совершиться 1 сделка,
Код
// регистрируем заявку (обычным способом - лимитированной заявкой)
RegisterOrder(this.CreateOrder(direction, (decimal)Security.GetCurrentPrice(direction), Volume));

но совершается 10-25сделок на одну свечу, причём как в сторону покупки так и продажи и результат позиция около 0.
Просьба к тем кто разобрался, объясните что делает котирование при старте стратегии (на пальцах, по подробнее, с примером).
То же самое о RegisterOrder?
В моём понимании должна быть вот такая серия стратегий:
1. Мониторинг цен в стакане(во всех сделках и т.д.) без совершения сделок.
2. Выбор наилучшей цены на покупку или продажу и совершение одной сделки по заданному объёму ни больше, ни меньше.
2а. Выставляется стоп-лосс.
3. При наступлении необходимого условия - позиция переворачивается или закрывается.
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 03.09.2012
Ответить


Больше похоже на проблемы в вызывающем коде. RegisterOrder точно один раз вызывается?
Спасибо:

EugeneP

Фотография
Курсы
Дата: 04.09.2012
Ответить


Да все таки похоже есть проблема в MarketQuotingStrategy..
пока тоже разобраться не могу с кучей заявок
Спасибо:

esper

Фотография
Программист
Дата: 04.09.2012
Ответить


Приводите логи, где видно что котирование набирает лишнего.

По логам, приведенным выше, складывается впечатление, что котирование запускается множество раз, как подтверждение этой мысли - проблема с RegisterOrder, который тоже вызывается множество раз, он то точно не может исполнить одну заявку несколько раз.
Спасибо:

alex123456

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


Всё в том же примере SampleSMA и в других тоже, начиная с 5-6 запуска программы зависает DDE сервер на 40-70сек.
Первые запуски DDE проходят за 2-3 секунды.
Так у всех или только у меня?
В чём проблема?
Автор топика
Спасибо:


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

loading
clippy