← 戻る

Где бродит свеча

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

_candleManager.Processing += (series, candle) =>

до значения индикатора

LongSma.Process((DecimalIndicatorValue)candle.ClosePrice);
ShortSma.Process((DecimalIndicatorValue)candle.ClosePrice);

このトピックは参考になりましたか?

トピックを共有

コメント (22)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

MaximMM
MaximMM

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

alex123456
alex123456 著者

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

esper
esper

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

alex123456
alex123456 著者

Вот исходник с доделками Quik\SampleSMA версии 4.1.2. Ждать пока все сделки совершатся.

esper
esper

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

alex123456
alex123456 著者

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

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

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

esper
esper

Так и поставьте точку останова на

Sma.Process((DecimalIndicatorValue)candle.ClosePrice);

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

MaximMM
MaximMM

Попробуйте вместо:

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
alex123456 著者

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
esper

alex123456: Sma.Process((DecimalIndicatorValue)candle.ClosePrice); - это параметр стратегии? Я думаю, что Да. Нет, это не параметр стратегии. alex123456: Значит при изменении его должно срабатывать это событие. Но оно не срабатывает с каждым изменением индикаторного значения. Вы добавили какое-то поле в производном классе, откуда стратегия должна знать что это такое, параметр это или нет? Сделайте свое событие, которое будете сами и вызывать когда надо, либо смотрите в сторону Strategy.Notify.

alex123456
alex123456 著者

в 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
esper
protected internal void Notify(string candle)
        {
            base.NotifyPropertyChanged(candle);
        }

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

Ответьте ещё на вопрос о объёме. Без логов от котирования ничего сказать нельзя.

alex123456
alex123456 著者

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

alex123456
alex123456 著者

Использовалось вот это котирование:

var strategy = new LastTradeQuotingStrategy(direction, Volume);

да при этом

var strategy = new MarketQuotingStrategy(direction, Volume);

практически никакой разницы

esper
esper

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

alex123456
alex123456 著者

А где их взять?

MaximMM
MaximMM

alex123456: А где их взять?

var strategy = new MarketQuotingStrategy(direction, Volume);

Для логирования сообщений необходимо добавить ``` strategy

alex123456
alex123456 著者

Вот куча лог файлов. Но там нет данных по значениям индикаторов. По этим данным всё равно не понятно почему стратегия котирования делает столько сделок в самом начале (потом все нормально по 1 объёму, но не понятно в какое время (почему в этот момент, а не в другой)). В конце первого котирования - позиция может быть нулевой (т.е. сколько купили столько и продали - Смысл?). Да, причём за каждую сделку берётся комиссия (например: 10 покупок и 10 продаж - комиссия за 210 +210=40 сделок и со стороны биржи и брокера). Если попробовать вот это, по логике должна совершиться 1 сделка,

// регистрируем заявку (обычным способом - лимитированной заявкой)
RegisterOrder(this.CreateOrder(direction, (decimal)Security.GetCurrentPrice(direction), Volume));

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

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

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

EugeneP
EugeneP

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

esper
esper

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

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

alex123456
alex123456 著者

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