← 戻る

ParabolicSar

Лежит файл в репозитарии, кода нет. Кто знает как его написать, может поможете?

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

トピックを共有

コメント (26)

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

Rinas Andrey
Rinas Andrey

Могу взяться за него. Расчеты можно взять из NT7.

Mikhail Sukhov
Mikhail Sukhov 著者

Rinas Andrey: Могу взяться за него. Расчеты можно взять из NT7.

Отлично! Какой у вас логин на КодеПлексе?

Rinas Andrey
Rinas Andrey

логин andreifx

Mikhail Sukhov
Mikhail Sukhov 著者

Rinas Andrey: логин andreifx

Добавил.

Rinas Andrey
Rinas Andrey

Спасибо, на днях займусь.

Rinas Andrey
Rinas Andrey

Залил. Я правильно понял, нужно было в папку dev заливать?

Mikhail Sukhov
Mikhail Sukhov 著者

Rinas Andrey: Залил. Я правильно понял, нужно было в папку dev заливать?

Да, все правильно. Спасибо за индюк.

Alexander
Alexander

Исправил код, он не компилировался. Просьба проверять код на компиляцию перед тем как он кладётся в репозиторий.

Rinas Andrey
Rinas Andrey

Alexander Mukhanchikov: Исправил код, он не компилировался. Просьба проверять код на компиляцию перед тем как он кладётся в репозиторий.

Да, сори, первый блин получился немного комом)

Alexander
Alexander

Rinas Andrey:

Alexander Mukhanchikov: Исправил код, он не компилировался. Просьба проверять код на компиляцию перед тем как он кладётся в репозиторий.

Да, сори, первый блин получился немного комом)

Ерунда, спасибо за индикатор :)

Mikhail Sukhov
Mikhail Sukhov 著者

Alexander Mukhanchikov: Ерунда, спасибо за индикатор :)

Код поломал Daenur. Я его поправил, но так как не знаю алгоритма, мог поправить неправильно.

OvcharenkoVI
OvcharenkoVI

Mikhail Sukhov:

Alexander Mukhanchikov: Ерунда, спасибо за индикатор :)

Код поломал Daenur. Я его поправил, но так как не знаю алгоритма, мог поправить неправильно.

Вроде все ок. Спасибо, Михаил

paveld
paveld

Попробовал использовать ParabolicSar в стратегии. Сравнил значение индикатора в Quik, со значением LastValue в момент открытия новой свечи. Почему-то значение LastValue отстает от значения в Quik на одну свечку. Те значение в LastValue, было в Quik на предыдущей свече. Подскажите пожалуйста почему так происходит и как это обойти?

Индикатор заполняется так:


  IndicatorManager _indicatorManager = new IndicatorManager();
  Parabolic = new ParabolicSar();
  _indicatorManager.RegisterIndicator(Parabolic, new CandleSeriesIndicatorSource(_candleSeries));

Кот Матроскин
Кот Матроскин

Все исходники индикаторов были на codeplex в свободном доступе

paveld
paveld

Кот Матроскин: Все исходники индикаторов были на codeplex в свободном доступе по исходникам не могу определить причину. моет кто уже сталкивался

paveld
paveld

Добился точного совпадения дважды вызывая Process() первый раз на закрытии свечи так:


    protected void OnCandleFinished(Candle candle) {
      Parabolic.Process((CandleIndicatorValue) candle);
    }

второй раз на открытии так:


  protected void OnCandleStarted(Candle candle) {
    if (Parabolic.IsFormed)
      Parabolic.Process((CandleIndicatorValue) candle);
  }

Если условие Parabolic.IsFormed убрать - то считается не верно. По исходникам пока не разобрался почему так происходит

Moadip
Moadip

Так как вы все таки рассчитываете значения индикатора, через IndicatorManager или вызывая Process?

Если через IndicatorManager, то значение индикатора надо брать не из индикатора через LastValue, а через токен. Цитата из справки: Значения индикатора следует брать только из токена, сам параметр может не обновляться. Ссылка

Так регистрирую индикатор в IndicatorManager


            _tokenSar = indicatorManager.RegisterIndicator(
                new ParabolicSar(),
                new CandleSeriesIndicatorSource(_series, candle => candle.ClosePrice));

В стратегии правило


            _series
                .WhenCandlesFinished()
                .Do(OnFinishCandle)
                .Apply(this);

Обработчик


        private void OnFinishCandle(Candle candle)
        {
            if(_tokenSar.Indicator.IsFormed)
            {
                var value = indicatorManager.Container.GetValue(_tokenSar, 0).Second.GetValue<decimal>();
                this.AddInfoLog(string.Format("Свечка закончена. OpenTime = {0}, State = {1} , parabolic = {2}", candle.OpenTime, candle.State, value));
            }
        }

Лог


16:48:29.853 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:33:00, State = Finished , parabolic = 133651,213120
16:48:29.858 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:34:00, State = Finished , parabolic = 133636,14033280
16:48:29.865 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:35:00, State = Finished , parabolic = 133621,9719128320
16:48:29.871 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:36:00, State = Finished , parabolic = 133608,653598062080
16:48:29.881 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:37:00, State = Finished , parabolic = 133596,13438217835520
16:48:29.885 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:38:00, State = Finished , parabolic = 133584,3663192476538880
16:48:29.891 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:39:00, State = Finished , parabolic = 133573,304340092794654720
16:48:29.899 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:40:00, State = Finished , parabolic = 133562,90607968722697543680
16:48:29.910 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:41:00, State = Finished , parabolic = 133546,6735933122488174018560
16:48:29.916 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:42:00, State = Finished , parabolic = 133360
16:48:29.928 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:43:00, State = Finished , parabolic = 133364,40
16:48:29.935 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:44:00, State = Finished , parabolic = 133373,4240
16:48:29.948 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:45:00, State = Finished , parabolic = 133382,087040
16:48:29.965 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:46:00, State = Finished , parabolic = 133390,40355840
16:48:29.985 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:47:00, State = Finished , parabolic = 133405,3793448960
16:48:29.997 |            | MS_RIU2@RTS_SPBFUT00881 | Свечка закончена. OpenTime = 15.06.2012 23:48:00, State = Finished , parabolic = 133415

S# - OpenTime = 23:48:00, parabolic = 133415 Quik - 23:48 133415

48 минута, т.к. последняя свечка в 23:49 не закрылась(последний тик в 23:49:49)

PavelAd
PavelAd
PavelAd

Moadip: Если через IndicatorManager, то значение индикатора надо брать не из индикатора через LastValue, а через токен. Вопрос, а брать через токен так:

      
_indicatorToken = _indicatorManager.RegisterIndicator(Parabolic, new CandleSeriesIndicatorSource(_candleSeries));
....
var v = ((ParabolicSar) _indicatorToken.Indicator).LastValue;

??

Moadip
Moadip

_tokenSar = _indicatorManager.RegisterIndicator(
    new ParabolicSar(),
    new CandleSeriesIndicatorSource(_series, candle => candle.ClosePrice));

...

var last = _indicatorManager.Container.GetValue(_tokenSar, 0).Second.GetValue<decimal>();

PavelAd
PavelAd
PavelAd

Moadip: ... Cложновато :) по сравнению с LastValue;

А как лучше использовать в стратегиях через IndicatorManager или через Process? Влияет ли выбранный способ на скорость работы?

Moadip
Moadip

Думаю все таки через IndicatorManager, т.к. доступны прошлые значения.

Насчет скорости, не думаю что IM как то отрицательно влияет на скорость. Можно посмотреть исходники, они открыты, там нет каких то ресурсоемких вычислений. Делается все тоже самое. Подписка на источник и расчет значений(через тот же Process). Только еще значения складываются в контейнер, к которому потом есть доступ.

JackSparrow
JackSparrow

Moadip: Думаю все таки через IndicatorManager, т.к. доступны прошлые значения.

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

profts
profts

Не совпадают значение параболика. В WealthLab параметры индикатора:
AccelUp = 0.01 AccelDown = 0.01 AccelMax = 0.05

Индикатор создаю с параметрами:

_tokenSar = indicatorManager.RegisterIndicator( new ParabolicSar , new CandleSeriesIndicatorSource(series, candle => candle.ClosePrice));

И что за параметр Acceleration? Во всех источниках у индикатора 2 параметра: шаг и максимум.

OvcharenkoVI
OvcharenkoVI

попробуйте Acceleration = 0.02, он везде такой

OvcharenkoVI
OvcharenkoVI

попробуйте Acceleration = 0.02, он везде такой

Memory
Memory

Во всех источниках по разному. В частности, у вас в посте у индюка тоже три праметра.😀 В основном эти три параметра - начальное значение ускорения, шаг ускорения и максимальное значение ускорения. Здесь Acceleration похож на начальное значение.